sergebulaev/linkedin-skillsPublic

Claude skills for LinkedIn. 11 Claude Code and Codex skills that write human-sounding LinkedIn posts, craft comments that get noticed, analyze your feed, and build a publishing cadence, all from your terminal. Content engineering by Creative Content Crafts. MIT.

AI summary: A collection of 12 specialized skills for Claude Code and Codex designed specifically to automate LinkedIn marketing.

Stars
4K
+246 today
Forks
668
Watchers
21
Open issues
0
Open PRs
1
Contributors
~19
Commits
131
Branches
2

PythonMITCreated Apr 14, 2026Last push 5d agoLatest release v1.1.15+546 stars this week+1.5K this month

Quick answers

What is linkedin-skills?
A collection of 12 specialized skills for Claude Code and Codex designed specifically to automate LinkedIn marketing.
What does linkedin-skills do?
This repository provides a specialized suite of 12 skills designed strictly for Claude Code and Codex to automate LinkedIn marketing tasks. It equips these advanced AI models with the ability to generate, analyze, and optimize content tailored explicitly for the LinkedIn platform algorithm. The tool is open-source under the MIT license, allowing developers to integrate complex social media capabilities directly into their terminal-based AI workflows. It focuses entirely on bridging general AI capabilities with targeted, effective professional marketing strategies.
Who is linkedin-skills for?
Marketers and developers looking to automate their professional LinkedIn presence using advanced AI models.
How do I get started with linkedin-skills?
codex plugin marketplace add sergebulaev/linkedin-skills && codex plugin add linkedin-skills@linkedin-skills
How popular is linkedin-skills on GitHub?
sergebulaev/linkedin-skills has 3,992 stars and 668 forks on GitHub, and gained 546 stars in the last 7 days.
What license does linkedin-skills use?
sergebulaev/linkedin-skills is released under the MIT license.

Star history

since Sep 15, 2026
01K2K3K4KSep 2026Sep 2026Sep 2026Oct 2026
4K stars as of Oct 3, 2026. Measured daily since Sep 15, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 10 commits2026-04-15: 4 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 1 commit2026-04-28: 0 commits2026-04-29: 1 commit2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 5 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 1 commit2026-05-20: 0 commits2026-05-21: 1 commit2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 1 commit2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 1 commit2026-07-01: 0 commits2026-07-02: 2 commits2026-07-03: 2 commits2026-07-04: 1 commit2026-07-05: 0 commits2026-07-06: 1 commit2026-07-07: 0 commits2026-07-08: 3 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 2 commits2026-07-14: 0 commits2026-07-15: 4 commits2026-07-16: 3 commits2026-07-17: 1 commit2026-07-18: 0 commits2026-07-19: 0 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 2 commits2026-07-24: 0 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 0 commits2026-07-29: 2 commits2026-07-30: 1 commit2026-07-31: 0 commits2026-08-01: 0 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 0 commits2026-08-06: 1 commit2026-08-07: 0 commits2026-08-08: 0 commits2026-08-09: 1 commit2026-08-10: 0 commits2026-08-11: 0 commits2026-08-12: 0 commits2026-08-13: 0 commits2026-08-14: 0 commits2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 7 commits2026-08-21: 1 commit2026-08-22: 1 commit2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 0 commits2026-08-28: 0 commits2026-08-29: 0 commits2026-08-30: 3 commits2026-08-31: 0 commits2026-09-01: 0 commits2026-09-02: 0 commits2026-09-03: 4 commits2026-09-04: 0 commits2026-09-05: 7 commits2026-09-06: 2 commits2026-09-07: 1 commit2026-09-08: 3 commits2026-09-09: 2 commits2026-09-10: 0 commits2026-09-11: 0 commits2026-09-12: 12 commits2026-09-13: 4 commits2026-09-14: 1 commit2026-09-15: 14 commits2026-09-16: 0 commits2026-09-17: 2 commits2026-09-18: 0 commits2026-09-19: 0 commits2026-09-20: 0 commits2026-09-21: 0 commits2026-09-22: 6 commits2026-09-23: 1 commit2026-09-24: 0 commits2026-09-25: 0 commits2026-09-26: 0 commits2026-09-27: 0 commits2026-09-28: 0 commits2026-09-29: 3 commits2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 0 commits2026-10-03: 0 commits
125 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Rising fast

    +546 stars this week

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

  • Repeat trending

    4 trending appearances

What linkedin-skills does

This repository provides a specialized suite of 12 skills designed strictly for Claude Code and Codex to automate LinkedIn marketing tasks. It equips these advanced AI models with the ability to generate, analyze, and optimize content tailored explicitly for the LinkedIn platform algorithm. The tool is open-source under the MIT license, allowing developers to integrate complex social media capabilities directly into their terminal-based AI workflows. It focuses entirely on bridging general AI capabilities with targeted, effective professional marketing strategies.

Marketers and developers looking to automate their professional LinkedIn presence using advanced AI models.

  • Claude Code compatibility: Integrates natively with Anthropic's Claude Code environment for seamless command-line use.
  • Codex support: Operates seamlessly with OpenAI's Codex models for versatile and flexible deployment options.
  • Targeted marketing skills: Includes 12 distinct capabilities focused entirely on LinkedIn growth, engagement, and analysis.
  • Open source licensing: Distributes under the MIT license to allow for unrestricted commercial and personal use.
  • Content optimization: Analyzes and improves post structures specifically for the unique LinkedIn platform algorithm.

Where teams use it

Automated post generation

Generate professional LinkedIn content using AI models integrated directly into existing workflows.

Marketing automation

Deploy specialized AI skills to manage and optimize social media campaigns autonomously.

Content strategy analysis

Evaluate past posts to determine the most effective formats and topics for audience engagement.

Profile optimization

Analyze and automatically suggest improvements for LinkedIn profile summaries and work experiences.

Getting started: codex plugin marketplace add sergebulaev/linkedin-skills && codex plugin add linkedin-skills@linkedin-skills

README

main branch

12 Claude Code and Codex skills for LinkedIn marketing — open source, MIT licensed

LinkedIn Marketing Skills for Claude Code and Codex

Latest release Claude Code Compatible Codex Compatible Claude Skills MIT License GitHub stars PRs Welcome

Claude skills for LinkedIn. 12 Claude Code and Codex skills that write LinkedIn posts, comments, and replies in your voice. They draft content, strip AI tells, and wait for your approval before anything gets published. No coding required.

On another platform too? The same team ships matching marketing skill bundles for X (Twitter) · Instagram · YouTube · TikTok · Threads · Facebook. Same voice engine, same approve-before-publish flow.

Install

Pick whichever way you use Claude Code or Codex:

Codex CLI

codex plugin marketplace add sergebulaev/linkedin-skills
codex plugin add linkedin-skills@linkedin-skills

To test a local clone before publishing changes:

git clone https://github.com/sergebulaev/linkedin-skills.git
cd linkedin-skills
codex plugin marketplace add .
codex plugin add linkedin-skills@linkedin-skills

claude.ai (web)

  1. Open claude.ai and click Customize in the sidebar
  2. Open the Plugins tab
  3. Click Add
  4. Choose Add marketplace → Add from a repository
  5. Paste sergebulaev/linkedin-skills there and sync
  6. Find the plugin under Discover, then click Add
  7. Done. The skills activate automatically when you ask about LinkedIn.

Note: Skills/Plugins require a paid Claude plan (Pro, Max, Team, or Enterprise) with code execution enabled.

Claude Desktop (Mac / Windows)

  1. Open Claude Desktop
  2. Click Customize in the left sidebar, then open the Plugins tab
  3. Click the Add dropdown at the top right and choose Add marketplace
  4. Select Add from a repository, paste sergebulaev/linkedin-skills, and sync
  5. Switch to the Discover tab and find the plugin in the list
  6. Click the + on the plugin card to install it
  7. Switch back to Yours to confirm it is listed and enabled
  8. Done. Start a new conversation and ask Claude to write a LinkedIn post.

The tab switch in steps 5 and 7 is the part that trips people: syncing a marketplace puts the plugin in the catalog (Discover), not in your installed list (Yours). The + in step 6 sits on the plugin card itself, not beside a section heading.

OpenClaw

  1. Open your OpenClaw working directory
  2. Clone the skills into it:
    git clone https://github.com/sergebulaev/linkedin-skills.git
  3. In OpenClaw settings, add this to your system prompt:
    You have LinkedIn marketing skills in ./linkedin-skills/.
    For any LinkedIn task, read the relevant skills/*/SKILL.md first.
    Use lib/url_parser.py for URL parsing,
        lib/apify_client.py for reading posts / comments / engagers,
        lib/publora_client.py for publishing actions.
    
  4. Done. Ask OpenClaw to write a LinkedIn post or comment.

Claude Code (CLI / VS Code / JetBrains)

/plugin marketplace add sergebulaev/linkedin-skills
/plugin install linkedin-skills@linkedin-skills

Or clone the repo and open it as your working directory — the skills activate with no plugin install, which is the route to use where /plugin is unavailable:

git clone https://github.com/sergebulaev/linkedin-skills.git
cd linkedin-skills

The repo ships a .claude/skills/ mirror of symlinks, so Claude Code finds all 12 skills on its own.

Hermes Agent

Hermes Agent (Nous Research) follows the agentskills.io open standard and loads skills/*/SKILL.md directly. Clone the bundle into your Hermes skills folder:

git clone https://github.com/sergebulaev/linkedin-skills.git ~/.hermes/skills/linkedin-skills

Coming from OpenClaw? hermes claw migrate imports these skills automatically. Then call /<skill-name> from any of your Hermes chat surfaces.

Any agent (skills CLI)

One command that works across Claude Code, Codex, Cursor, and any other agent that reads SKILL.md files:

npx skills add sergebulaev/linkedin-skills

Found this useful? Star the repo. Curated Claude Code and Codex directories rank and gate by star count, so a star is what makes these skills findable for the next person. It is the only thing we ask. No signup, no email.

What you can do

Once installed, just ask Claude Code or Codex for help with LinkedIn. The right skill activates automatically.

Write a post:

"Write me a LinkedIn post about why AI agencies are replacing traditional ones. Make it viral."

Comment on someone's post:

"Comment on this post: https://linkedin.com/posts/... — I want to add a thoughtful take."

Check a draft before publishing:

"Audit this post draft for AI tells and algorithm issues: [paste your text]"

Reverse-engineer a viral post:

"What hook formula does this post use? https://linkedin.com/posts/..."

Plan your week:

"Create a 7-day LinkedIn content plan. I'm a B2B SaaS founder targeting VPs of Marketing."

Rewrite your profile:

"Optimize my LinkedIn profile for inbound leads: https://linkedin.com/in/yourname"

Remove AI tells from any text:

"Humanize this text: [paste AI-generated draft]"

Every skill shows you a draft first and waits for your OK before doing anything. Nothing gets posted without your approval.

The 12 skills

Skill What it does
Post Writer Drafts viral-ready posts using 20 proven 2026 hook formulas (anaphora, R.I.P. obituary, year-over-year pivot, curiosity gap, emotional cold-open, controlled A/B, false-binary, and 13 more) plus a founders-edition angle library, picked by engagement goal
Comment Drafter Drafts a comment on any LinkedIn post from its URL
Reply Handler Drafts a reply to any comment, correctly handling LinkedIn's 2-level thread flattening. Or give it just a post URL and it sweeps the whole thread — every top-level comment and reply — filters out low-value ones, and drafts the rest in one batch
Post Audit Checks your draft against 2026 algorithm rules and AI-detection patterns before you publish
Humanizer Removes the AI tells human readers and LinkedIn's slop filter react to: 2026 AI vocabulary scored by paragraph density, reveal bridges, staccato fragment stacks, stacked triads, performed sincerity; caps em dashes instead of banning them. Does not promise to beat detectors (no edit reliably does). Bundles three sub-tools: AI-emoji density scorer, multi-detector spread tester (GPTZero, Originality.ai, ZeroGPT, Sapling, Copyleaks) that documents how much they disagree, and a rule-explainer reference for defending stylistic choices.
Hook Extractor Reverse-engineers the hook formula from any viral post. Returns a blank template you can fill with your own topic
Content Planner Creates a 7-day plan with daily post topics, formats, hooks, posting times, and comment targets
Engagement Monitor Two read-side workflows: (1) tracks your comment threads for author replies and drafts follow-ups in the 6-24h window; (2) pulls likers and commenters on any post and groups them by ICP fit (peer / aspirational / prospect).
Profile Optimizer Rewrites your headline, About section, Featured section, and Experience for 2026 conversion patterns
Employee Advocacy Plans a team LinkedIn program: 14-day launch, posting cadence, brand governance, ROI tracking
Repurposer Turns content from another platform (tweet, thread, YouTube video, blog, newsletter) into a native LinkedIn post: re-hooks for the fold, expands to the 900-1300 char sweet spot, moves links to the first comment, runs the humanizer
Interviewer Interviews you and keeps the answers in a Story Bank: roles, receipts with real numbers, turning points, scars, positions you would defend. Every other skill reads it, so drafts stop asking you for a specific number mid-request. Also runs a focused interview that turns one topic into a post spine. The only skill that works when you have never posted before, since it needs a career rather than an archive

Built for founders

If you are a founder, the bundle ships a dedicated founder layer. Your real constraint is rarely reach. It is a small number of high-stakes readers: the next investor, the next hire, the design partner who becomes a case study. The founder layer optimizes for trust with that narrow audience instead of impressions.

  • 10 founder angles (references/founder-topics.md) as fill-in templates: reprice the category, content-to-pipeline, audience of one, the scarce-shots math, the unglamorous bet, the limit of delegation, designed serendipity, the evasive-sentence test, the delegation line, the learning gate. Each maps to an engagement goal and a hook formula.
  • 4 structural hook formulas (F17-F20) that shape a post's logic: controlled A/B anecdote, false-binary dissolve, anecdote-meets-evidence bridge, diverging-curves close.
  • A founders-edition content plan (Conviction / Building in public / The math / Proof) in the Content Planner.

Just tell the Post Writer you are a founder, or ask the Content Planner for a "founder plan," and the skills reach for these first.

Community skills

Standalone skills built by other people on this bundle's conventions (same voice rules, same approval-card flow, same Not for X (use Y) disambiguation). They live in their authors' repos, so the core stays at 12 skills and one read/write pipeline. Install them next to this bundle the same way.

  • linkedin-outreach by @smfardeen7 - drafts 300-character connection-request notes (10 scenario templates) and post-accept follow-up sequences with day offsets and stop rules. Draft-only: LinkedIn has no invite or DM API, you paste and send.

Built one? Open a PR that adds a single line here.

Optional: read LinkedIn data with Apify

Four of the skills (Comment Drafter, Reply Handler, Hook Extractor, Engagement Monitor) can read post bodies, comment threads, your own recent comments, and the people who liked or commented on any post. Without an Apify token they fall back to asking you to paste the relevant text. With one, they fetch automatically.

Apify free tier ships with $5/month of credit, which goes a long way at $1-$5 per 1,000 results. The skills use four no-cookies actors:

Use case Actor Cost
Post body by URL supreme_coder/linkedin-post $1 / 1,000
Comments + replies on a post apimaestro/linkedin-post-comments-replies-engagements-scraper-no-cookies $5 / 1,000
Your own recent comments apimaestro/linkedin-profile-comments $5 / 1,000
Likers + commenters on any post scraping_solutions/linkedin-posts-engagers-likers-and-commenters-no-cookies $5 / 1,000

Setup: drop APIFY_TOKEN=apify_api_... into your .env. The thin client at lib/apify_client.py exposes fetch_post, fetch_post_comments, fetch_user_recent_comments, and fetch_post_engagers.

A typical creator running daily comment ops + a weekly engager-analytics sweep stays under $2/month, well inside the free tier.

Optional: auto-post with Publora

By default, skills draft content for you to copy-paste into LinkedIn. If you want Claude Code or Codex to publish directly to your LinkedIn (and optionally to X, Threads, Instagram), connect Publora. It takes about 2 minutes.

What is Publora?

Publora is a publishing API that handles LinkedIn's quirks (3 different URL formats, reaction type mismatches, thread flattening bugs). The free tier gives you 15 posts/month.

Publora also ships official MCP skills (npx skills add publora/skills): one skill per platform, covering the publish side only. This bundle is the layer above them, adding the reading, the writing craft and the approval flow.

Setup (2 minutes)

Before or after any of it, one command tells you where you stand:

python3 scripts/selftest.py          # install, accounts, tests, and which skills work right now
python3 scripts/selftest.py --fresh  # clone to a temp dir and check a genuinely clean install

It reports each of Apify, Publora and Pixfaro separately, using free endpoints that verify a key without doing any work, and it names what is missing rather than only that something is. Skills that need a layer you have not connected still work, by drafting for you to paste, and the report says which ones those are.

Two ways to connect, pick either

A connector, if you are on claude.ai or Claude Code. Publora and Pixfaro both publish one. Authorize it once in your connector settings and the skills use it: no key on disk, no .env, nothing to rotate. Publora's connector also carries post_stats and profile_stats, which the REST path below does not have.

An API key, if you are anywhere else — a plain terminal, CI, a script, or you would rather the credential lived in a file you control. That is the seven steps below.

They are not exclusive and neither is second-class. One caveat worth knowing: scripts/check_config.py and scripts/selftest.py read .env and the shell, so a connector is invisible to them. If they say "manual" while your posts are going out, the connector is doing the work and nothing is wrong.

Step 1. Sign up at https://app.publora.com/signup (free)

Step 2. Connect LinkedIn: click Channels in the left sidebar, then Add Channel, pick LinkedIn, authorize.

Step 3. Find your Platform ID: go to Channels, click your LinkedIn account. The ID looks like linkedin-ABC123DEF. Copy the whole thing including linkedin-.

Step 4. Get your API key: click Settings (gear icon, bottom-left), then API, then Create Key. Copy the sk_... string.

Step 5. Create a file called .env in the linkedin-skills folder:

PUBLORA_API_KEY=sk_paste_your_key_here
LINKEDIN_PLATFORM_ID=linkedin-paste_your_id_here

If you cloned the repo, you can copy the template instead:

cp .env.example .env

Then open .env and replace the placeholders with your real values.

Step 6. Install two small Python packages:

pip install requests python-dotenv

Step 7. Test it. Ask Claude Code or Codex:

"Schedule a test LinkedIn post via Publora 24 hours from now: 'testing the API connection — will cancel in dashboard'."

If Publora returns a scheduled-post ID, you're set. Cancel the post in the Publora dashboard before the scheduled time. If you get HTTP 401, your API key is wrong. If you get HTTP 400 about a missing platformId, your LINKEDIN_PLATFORM_ID isn't set. See Troubleshooting.

Optional: generate illustrations with Pixfaro

Posts with a visual get more dwell time. The Post Writer can generate an illustration for a draft (a feed image, a carousel slide, or a quote-card of your hook) and attach it automatically when publishing. Without a key it drafts the image prompt and asks you to generate it yourself, so nothing breaks.

Pixfaro is a single image API over multiple models (from flux-schnell at $0.004 to gpt-5-image). It composites your handle, brand color, or logo onto the image as a pixel-exact overlay, so a cheap base model still renders crisp text on a quote-card or thumbnail. Pull those brand fields from your Voice & Brand Profile (section 6) and every asset stays on-brand.

Setup: sign up at api.pixfaro.com/signup, create a key (name it linkedin, scope Generate), and put PIXFARO_TOKEN=pf_live_... in .env at the root of the linkedin-skills folder (next to this README; keys are shown once). Then python3 scripts/check_config.py calls Pixfaro's GET /v1/key and prints the key's name and scope when it is right. The thin client at lib/pixfaro_client.py and the wrappers lib.illustrate(prompt, kind=...) / lib.refine(image_id, instruction) return a hosted URL that flows straight into lib.publish(..., media_urls=[url]). refine edits a prior image by its id (cheaper than regenerating); results carry cost, balance_after, and a premium flag so the skills never quietly spend on a pricey model.

For text-led visuals (a quote-card of your hook), the skills skip the image model entirely and use Pixfaro's design templates: lib.quote_card("<hook>", handle="@you", style="brand") typesets the card server-side (POST /v1/renders), so the line is crisp at any length — same hosted-URL flow. lib.available_templates() lists templates and live prices. A brand logo can be uploaded once with lib.brand_logo("logo.png") (full-scope key); the returned logo_id goes into Voice & Brand Profile §6 and every overlay from then on stamps the real mark.

Voice rules

Every skill follows these rules automatically:

  1. Em dashes capped at about 1 per 100 words. The character stopped being a tell in 2026; the density is.
  2. Capitalize names. Always. Lowercase reads as disrespectful.
  3. No AI vocabulary: "leverage", "fundamentally", "streamline", "harness", "delve", "unlock", "foster".
  4. Specific numbers beat adjectives. "$14,200" beats "significant savings".
  5. One sharp insight per comment beats three vague ones.
  6. 200-350 chars for comments, 900-1,300 chars for posts.

Troubleshooting

Problem Fix
Skills don't activate when I ask about LinkedIn Make sure you installed via the Skills panel, /plugin install, or codex plugin add. Try starting a new conversation.
"Publora API key not provided" Your .env file is missing or in the wrong folder. It should be in the linkedin-skills/ root.
"401 Unauthorized" from Publora Your API key expired. Go to Publora Settings > API > Create a new key.
Image skills keep saying "No Pixfaro key set" although you added one The key was not loaded: .env must be at the linkedin-skills/ root and python-dotenv installed. python3 scripts/check_config.py now says exactly which — and, with a key, whether Pixfaro accepts it (GET /v1/key).
"401" from Pixfaro The key was copied short or revoked. Keys are shown once — mint a new one in the Pixfaro dashboard and paste the whole pf_live_... string.
"404 on comment/post" Your LINKEDIN_PLATFORM_ID is wrong. Go to Publora Channels and copy the full linkedin-... string.
"400 reactionType" error Known Publora quirk. The skills handle this automatically. If you're calling the API manually, use PRAISE (not CELEBRATE), INTEREST (not INSIGHTFUL).
pip install fails Use a virtual environment: python -m venv venv && source venv/bin/activate && pip install requests python-dotenv

Cross-cutting references


For developers: runtime compatibility, URL parsing, and internals

Runtime compatibility

linkedin-skills/
├── skills/          ← SKILL.md frontmatter; native to Claude Code and Codex, others read as markdown
├── .codex-marketplace/ ← generated nested Codex package (run scripts/sync_codex_marketplace.py)
├── lib/             ← pure Python, works in any agent runtime
├── references/      ← pure markdown, works anywhere
└── scripts/         ← pure Python CLI, works anywhere
Runtime Auto-discovers skills? Setup
Claude Code (CLI, Desktop, Web, IDE) Yes Install via plugin or clone. Skills activate on matching prompts.
Codex CLI Yes Install via codex plugin marketplace add sergebulaev/linkedin-skills and codex plugin add linkedin-skills@linkedin-skills.
Anthropic Managed Agents (/v1/agents) Yes Pass skill files in the agent context.
OpenClaw Manual Mount the repo, add system prompt pointing to skills/*/SKILL.md.
Cursor / Cline / Aider Manual Read SKILL.md files as prompt context; import lib/ as Python.
Manus No Upload references/ as knowledge base. Call Publora API directly.
LangChain / AutoGen No Use lib/ as a package; feed references/ as prompt context.

OpenClaw quickstart

git clone git@github.com:sergebulaev/linkedin-skills.git

# Add to OpenClaw system prompt:
# "You have LinkedIn marketing skills in ./linkedin-skills/.
#  Read the relevant skills/*/SKILL.md before any LinkedIn task.
#  Use lib/url_parser.py for URL parsing,
#      lib/apify_client.py for reading posts / comments / engagers,
#      lib/publora_client.py for publishing."

Generic Python agent quickstart

import sys; sys.path.insert(0, "path/to/linkedin-skills")
from lib import parse_linkedin_url, PubloraClient, ApifyClient

parsed = parse_linkedin_url("https://www.linkedin.com/posts/slug-activity-7448808898326654978-iW20")
print(parsed["post_urn"])  # urn:li:activity:7448808898326654978

# Read side (Apify)
apify = ApifyClient()  # reads APIFY_TOKEN from env
post = apify.fetch_post(post_url="https://www.linkedin.com/posts/...")
engagers = apify.fetch_post_engagers(post_url="https://www.linkedin.com/posts/...", max_items=50)

# Write side (Publora)
client = PubloraClient()  # reads PUBLORA_API_KEY from env
client.create_comment(post_urn=parsed["post_urn"], message="draft", platform_id="linkedin-xxx")

# Image side (Pixfaro) — optional, reads PIXFARO_TOKEN from env
from lib import illustrate
img = illustrate("Minimal flat-vector lighthouse, calm blue palette", kind="wide")
# img["url"] -> pass to publish(..., media_urls=[img["url"]])

URL handling

LinkedIn has three post URN types. The lib/url_parser.py handles all of them:

URL fragment URN
/posts/slug-activity-7448... urn:li:activity:7448...
/posts/slug-share-7449... urn:li:share:7449...
/feed/update/urn:li:ugcPost:7447... urn:li:ugcPost:7447...

Comment URLs include a commentUrn query param. The parser extracts both post_urn and comment_id.

Thread flattening

LinkedIn flattens reply threads to 2 levels. When replying to a reply, parentComment must point to the top-level comment URN, not the reply's URN. The linkedin-reply-handler skill handles this correctly.

Testing the parser

python lib/url_parser.py "https://www.linkedin.com/posts/<author-handle>_activity-<id>"

References

Who builds this

These skills come out of Creative Content Crafts, an engineering company. We build the machinery underneath a company's public voice: ICP parsing, engagement systems, content guardrails, and posting infrastructure. We do not sell the words themselves.

We call that layer content engineering. Writing collapsed to the price of a chat subscription. What stayed valuable is everything below it: pulling every post your market wrote this week, keeping a live list of the people who matter, engaging on it daily with judgment in the loop, and catching the risky drafts before the platform does.

On LinkedIn specifically, that is the whole job. We are engineers of LinkedIn growth, not a ghostwriting agency.

This repo is the thin top layer of that stack, open-sourced. The engine underneath is what we build for clients.

License

MIT. Powered by Publora.

Related open-source skill bundles

Part of a family of AI social-media marketing skill bundles for Claude Code and Codex:

Also: Anthropic Skills repo, the awesome-claude-skills directory.

View on GitHub

Recent activity

commits and pull requests

Discussions

all 2

Releases and announcements

62 total
  1. v1.1.15v1.1.15Sep 29, 2026

    ## The profile optimizer stops asking for a link it cannot open Reported in #55: the bundle was installed on claude.ai, a profile URL was pasted, and nothing came back. The skill was at fault, not the setup. Its Input section listed `Profile URL (or screenshots of sections)`. The read layer has four methods, all about posts, comments and engagers, and none about profiles. That URL was never readable, with an `APIFY_TOKEN` or without one. Input now says so plainly and asks for the pasted sections. The intake step refuses to score a section it has not been shown, rather than inferring one from the URL slug. ## One line of the same bug, elsewhere The voice-profile sub-skill told the agent to call `lib.fetch_user_recent_comments()`. That helper lives on `ApifyClient` and is not re-exported, so the call raised `AttributeError` for anyone who had set a token. It now reads `lib.ApifyClient.fetch_user_recent_comments()`, the form the other five reading skills already use. Both are checked from now on: every `lib.<helper>()` a document calls must be in `lib.__all__`, and the profile optimizer's Input must ask for a paste. 113 tests. ## Post audit discoverability #53 by [@Prasadkurap

  2. v1.1.14v1.1.14Sep 23, 2026

    ## The image layer now has tests Eight offline tests for the Pixfaro client, contributed by [@Prasadkurapati](https://github.com/Prasadkurapati) in #52: - an empty or over-long prompt is rejected before the request leaves the process - an identical generation comes back from the cache, unless `force_refresh=True` says otherwise - an edit rejects a hosted URL where an `img_...` id belongs - a 429 is retried, a 400 is not They run without a token and without touching the network. The suite goes from 102 tests to 110. ## README The Community skills section still said the core stays at 11 skills, two lines below two places that already said 12. It has been 12 since the humanizer merge. Fixed by [@safwanahmadsaffi](https://github.com/safwanahmadsaffi) in #47. ## Dependencies `hashgraph-online/ai-plugin-scanner-action`, `idna` 3.20, `urllib3` 2.8.0, `pyyaml` 6.0.3 (#48, #49, #50, #51). **Full changelog:** https://github.com/sergebulaev/linkedin-skills/compare/v1.1.13...v1.1.14

  3. #39 by @kishormorol, held since 13 September for a reason that stopped being true yesterday. **The objection was real, and it is gone.** A call named `unpublish` would have reported success for a post that stays live, because the endpoint behind it had no status guard — [publora/publora.com#478](https://github.com/publora/publora.com/issues/478). That fix merged and deployed on 16 September. Re-verified against production before merging, on a real published post: ``` DELETE /api/v1/delete-post/<published id> -> 409 {"error": "Published posts cannot be deleted through this operation.", "code": "POST_IS_PUBLISHED"} get-post -> 200, record intact ``` The client-side guard from v1.1.7 refuses before the call as well, so both ends hold. **The name still oversells the call, so the docstring says so outright.** `unpublish` cancels what has not gone out; it cannot take back what has. Once a post is live, deleting its record would destroy its media and its stats while the post stays up on LinkedIn — which is why both sides refuse. A live post comes down on LinkedIn, by hand. Three tests pin the limit rather than trusting the prose: a published post raises instead of returni

  4. Reported by @kishormorol in #40, and confirmed. Fill `references/voice-profile.md`, run `sync_codex_marketplace.py`, and your voice fingerprint, ICP, client names and every number in the Story Bank are staged in two tracked files. The two documented workflows point in opposite directions: the skills tell you to fill the profile, `CLAUDE.md` tells you to sync before committing. Following both is enough. **Worse than reported.** Both the root templates *and* the package copies are tracked, so the sync is not even required — a plain `git add -A` after filling one does it. And `check_no_secrets.py` reported "no credential patterns" throughout, because none of it *is* a credential. Two halves, because either alone leaves the hole open: - **The sync no longer copies them.** It restores the blank templates into the package from the git index instead, so a filled working copy cannot reach it and a fresh sync does not drop them either. - **`check_no_secrets.py` now fails** on any tracked template marked `filled: yes`, wherever it sits, and says how to get back to blank. This is the half that catches the no-sync path. ``` Tracked things that should not be in git: references/voice-prof

  5. A Tier 0 user who asks you to *publish* has hit a wall they may not know exists. Measured before this change: **they are never told.** The manual fallbacks are good enough that the gap never surfaces, and the one place it did surface opened with "Tired of copy-pasting?" — an advert rather than an answer. Root `SKILL.md` now carries the rule, so it applies to all twelve skills: - **Lead with it, once,** when the request was to publish, comment, react or generate and the layer is not connected. One sentence on what did not happen and what would change it, before the draft. - **Say nothing at all** when the user only asked to draft, plan, rewrite or audit. Nothing is missing then, and saying so is an advert. - **Once per conversation, not per draft** — a ten-comment sweep reads it zero more times. - **Never after a decline.** "Not now", "I'll paste it myself", or silence on the offer are all final for the session. - **Never block, never withhold.** Manual mode is a supported way to work, not a degraded one, and a user who keeps pasting is not doing it wrong. `manual_mode_message` was rewritten to match. It opens by saying pasting by hand works fine, then gives **both** routes rathe

Code frequency

additions and deletions
+6.9K-6.9KWeek of 2026-04-12: +4,544 linesWeek of 2026-04-12: -188 linesWeek of 2026-04-19: +0 linesWeek of 2026-04-19: -0 linesWeek of 2026-04-26: +3,446 linesWeek of 2026-04-26: -1,290 linesWeek of 2026-05-03: +0 linesWeek of 2026-05-03: -0 linesWeek of 2026-05-10: +1,792 linesWeek of 2026-05-10: -1,440 linesWeek of 2026-05-17: +6,855 linesWeek of 2026-05-17: -126 linesWeek of 2026-05-24: +0 linesWeek of 2026-05-24: -0 linesWeek of 2026-05-31: +0 linesWeek of 2026-05-31: -0 linesWeek of 2026-06-07: +0 linesWeek of 2026-06-07: -0 linesWeek of 2026-06-14: +0 linesWeek of 2026-06-14: -0 linesWeek of 2026-06-21: +4 linesWeek of 2026-06-21: -4 linesWeek of 2026-06-28: +987 linesWeek of 2026-06-28: -240 linesWeek of 2026-07-05: +558 linesWeek of 2026-07-05: -13 linesWeek of 2026-07-12: +708 linesWeek of 2026-07-12: -86 linesWeek of 2026-07-19: +2 linesWeek of 2026-07-19: -2 linesWeek of 2026-07-26: +263 linesWeek of 2026-07-26: -10 linesWeek of 2026-08-02: +1,093 linesWeek of 2026-08-02: -23 linesWeek of 2026-08-09: +21 linesWeek of 2026-08-09: -1 linesWeek of 2026-08-16: +1,401 linesWeek of 2026-08-16: -112 linesWeek of 2026-08-23: +0 linesWeek of 2026-08-23: -0 linesWeek of 2026-08-30: +2,460 linesWeek of 2026-08-30: -838 linesWeek of 2026-09-06: +2,552 linesWeek of 2026-09-06: -247 linesWeek of 2026-09-13: +5,598 linesWeek of 2026-09-13: -288 linesWeek of 2026-09-20: +169 linesWeek of 2026-09-20: -12 linesWeek of 2026-09-27: +102 linesWeek of 2026-09-27: -15 linesApr 12, 2026Sep 27, 2026
+32.6K lines added, -4.9K removed over the last year.

Commits per week

last 52 weeks
210Week of 2025-10-05: 0 commitsWeek of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 14 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 2 commitsWeek of 2026-05-03: 0 commitsWeek of 2026-05-10: 5 commitsWeek of 2026-05-17: 2 commitsWeek of 2026-05-24: 0 commitsWeek of 2026-05-31: 0 commitsWeek of 2026-06-07: 0 commitsWeek of 2026-06-14: 0 commitsWeek of 2026-06-21: 1 commitsWeek of 2026-06-28: 6 commitsWeek of 2026-07-05: 4 commitsWeek of 2026-07-12: 10 commitsWeek of 2026-07-19: 2 commitsWeek of 2026-07-26: 3 commitsWeek of 2026-08-02: 1 commitsWeek of 2026-08-09: 1 commitsWeek of 2026-08-16: 9 commitsWeek of 2026-08-23: 0 commitsWeek of 2026-08-30: 14 commitsWeek of 2026-09-06: 20 commitsWeek of 2026-09-13: 21 commitsWeek of 2026-09-20: 7 commitsWeek of 2026-09-27: 3 commitsOct 5, 2025Sep 27, 2026
125 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 1 commitsSun 1:00 — 0 commitsSun 2:00 — 0 commitsSun 3:00 — 0 commitsSun 4:00 — 0 commitsSun 5:00 — 1 commitsSun 6:00 — 0 commitsSun 7:00 — 1 commitsSun 8:00 — 3 commitsSun 9:00 — 1 commitsSun 10:00 — 0 commitsSun 11:00 — 0 commitsSun 12:00 — 0 commitsSun 13:00 — 0 commitsSun 14:00 — 3 commitsSun 15:00 — 0 commitsSun 16:00 — 0 commitsSun 17:00 — 0 commitsSun 18:00 — 0 commitsSun 19:00 — 0 commitsSun 20:00 — 0 commitsSun 21:00 — 0 commitsSun 22:00 — 0 commitsSun 23:00 — 0 commitsMon 0:00 — 0 commitsMon 1:00 — 0 commitsMon 2:00 — 0 commitsMon 3:00 — 2 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 0 commitsMon 8:00 — 0 commitsMon 9:00 — 2 commitsMon 10:00 — 0 commitsMon 11:00 — 0 commitsMon 12:00 — 0 commitsMon 13:00 — 0 commitsMon 14:00 — 0 commitsMon 15:00 — 5 commitsMon 16:00 — 0 commitsMon 17:00 — 0 commitsMon 18:00 — 0 commitsMon 19:00 — 0 commitsMon 20:00 — 0 commitsMon 21:00 — 1 commitsMon 22:00 — 1 commitsMon 23:00 — 0 commitsTue 0:00 — 1 commitsTue 1:00 — 0 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 0 commitsTue 7:00 — 3 commitsTue 8:00 — 0 commitsTue 9:00 — 0 commitsTue 10:00 — 3 commitsTue 11:00 — 2 commitsTue 12:00 — 4 commitsTue 13:00 — 4 commitsTue 14:00 — 1 commitsTue 15:00 — 5 commitsTue 16:00 — 5 commitsTue 17:00 — 0 commitsTue 18:00 — 1 commitsTue 19:00 — 0 commitsTue 20:00 — 6 commitsTue 21:00 — 0 commitsTue 22:00 — 0 commitsTue 23:00 — 3 commitsWed 0:00 — 1 commitsWed 1:00 — 0 commitsWed 2:00 — 0 commitsWed 3:00 — 1 commitsWed 4:00 — 0 commitsWed 5:00 — 1 commitsWed 6:00 — 0 commitsWed 7:00 — 1 commitsWed 8:00 — 1 commitsWed 9:00 — 0 commitsWed 10:00 — 0 commitsWed 11:00 — 4 commitsWed 12:00 — 1 commitsWed 13:00 — 0 commitsWed 14:00 — 3 commitsWed 15:00 — 0 commitsWed 16:00 — 0 commitsWed 17:00 — 0 commitsWed 18:00 — 1 commitsWed 19:00 — 0 commitsWed 20:00 — 3 commitsWed 21:00 — 0 commitsWed 22:00 — 0 commitsWed 23:00 — 0 commitsThu 0:00 — 1 commitsThu 1:00 — 3 commitsThu 2:00 — 1 commitsThu 3:00 — 0 commitsThu 4:00 — 0 commitsThu 5:00 — 4 commitsThu 6:00 — 2 commitsThu 7:00 — 0 commitsThu 8:00 — 0 commitsThu 9:00 — 2 commitsThu 10:00 — 0 commitsThu 11:00 — 0 commitsThu 12:00 — 0 commitsThu 13:00 — 3 commitsThu 14:00 — 0 commitsThu 15:00 — 3 commitsThu 16:00 — 3 commitsThu 17:00 — 0 commitsThu 18:00 — 0 commitsThu 19:00 — 0 commitsThu 20:00 — 2 commitsThu 21:00 — 0 commitsThu 22:00 — 0 commitsThu 23:00 — 0 commitsFri 0:00 — 0 commitsFri 1:00 — 0 commitsFri 2:00 — 0 commitsFri 3:00 — 1 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 0 commitsFri 8:00 — 0 commitsFri 9:00 — 0 commitsFri 10:00 — 2 commitsFri 11:00 — 0 commitsFri 12:00 — 0 commitsFri 13:00 — 0 commitsFri 14:00 — 0 commitsFri 15:00 — 0 commitsFri 16:00 — 0 commitsFri 17:00 — 0 commitsFri 18:00 — 0 commitsFri 19:00 — 0 commitsFri 20:00 — 1 commitsFri 21:00 — 0 commitsFri 22:00 — 0 commitsFri 23:00 — 0 commitsSat 0:00 — 0 commitsSat 1:00 — 0 commitsSat 2:00 — 0 commitsSat 3:00 — 1 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 1 commitsSat 7:00 — 0 commitsSat 8:00 — 0 commitsSat 9:00 — 0 commitsSat 10:00 — 0 commitsSat 11:00 — 0 commitsSat 12:00 — 0 commitsSat 13:00 — 7 commitsSat 14:00 — 3 commitsSat 15:00 — 3 commitsSat 16:00 — 3 commitsSat 17:00 — 1 commitsSat 18:00 — 0 commitsSat 19:00 — 0 commitsSat 20:00 — 1 commitsSat 21:00 — 0 commitsSat 22:00 — 1 commitsSat 23:00 — 0 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits79 (60%)
Community commits52 (40%)

131 commits in total over the last year.

DateListRankStars gained
Sep 23, 2026weekly#12+667
Sep 22, 2026weekly#12+667
Sep 16, 2026monthly#13+1,882
Sep 15, 2026monthly#13+1,882