I spent a month turning LinkedIn into software
Not a post generator. A ten-skill system for the whole grind, from picking an angle to figuring out who actually engaged. Open-source, MIT, free.
“LinkedIn is just consistency.” True, useless. Like saying the secret to marathons is running.
Posting isn’t one task. It’s eight. Pick the week’s angle. Find one nobody used yesterday. Write a hook that survives the “...see more” fold. Scrub the tells that scream a robot wrote this. Keep the link out of the body so you don’t tank your own reach. Publish it, which sounds trivial until you meet LinkedIn’s API. Reply while replies still count. Then work out which of the people who engaged are worth your time.
I did all eight by hand for months. Then I got tired and did what I always do: turned it into software.
A month later it’s linkedin-skills — ten open-source skills for Claude Code and Codex. This is what’s actually inside, because it grew into far more than I planned.
TL;DR — Ten skills covering the full loop: plan, write, de-AI, audit, publish, comment, reply, analyze, optimize, scale. Draft-and-approve, never autopilot. Runs draft-only with zero setup, or auto-publishes once you connect an account. Built on a month of research and LinkedIn's genuinely cursed API. Install in one line with
npx skills add sergebulaev/linkedin-skills, or as a Claude Code / Codex plugin.
1. The 400-post rabbit hole
I started with the writing, and got annoyed at how same everything read. So I pulled 400 posts that beat their own author’s baseline across ten verticals, tagged each one by its opening move, and cross-checked that against how it actually performed.
Baseline is the trick. A big account’s average day isn’t a small account’s breakout; skip that control and you just prove famous people get more likes. I wanted posts that overperformed for whoever wrote them.
One finding drowned out the rest: the first line is the entire product, and first lines run on formulas. The same 16 openings produced the outliers, vertical after vertical. Anaphora. The “the era of X is over” obituary. The ledger that writes “$4,217.38,” never “about four grand,” because the decimals feel true. The year-over-year confession. Contrarian-with-receipts. One give-it-away format multiplied a founder’s usual reach nearly 20x.
Then the part that rewired how I write:
Each formula earns a different currency. Some pull comments, some reposts, some quiet saves. Pick by topic alone and you write something technically viral that earns the wrong thing.
So the first question is never “what do I want to say.” It’s “what should this earn“ — then the formula, then the topic. That logic became skill one, post-writer. Writing turned out to be 10% of the job.
2. The other 90%
Every piece below started as a task I was sick of doing by hand:
content-planner — a week at a time: pillar, format, hook, CTA, timing, comment targets.
post-writer — the 16 formulas, chosen by goal.
humanizer — strips AI tells (this one became a monster).
audit mode — runs a draft against the 2026 algorithm checklist.
comment-drafter — first, in-voice comments on the right posts.
reply-handler — replies to the right comment in a flattened thread.
hook-extractor — paste a viral post, get its formula and a blank template.
engager-analytics — sorts everyone who engaged by whether they matter.
thread-monitor — flags the comments worth following up, while they’re warm.
profile-optimizer — headline, 7-part About, banner, the lot.
One spine holds them together: draft, show you, wait. Nothing publishes until you say “post.” I didn’t want a bot running my account. I wanted the boring 90% gone and the last call left to a human.
Underneath sit 34 reference files, ~4,300 lines of distilled research: hook skeletons, algorithm heuristics, voice rules, benchmarks. Not vibes. Sources.
The whole thing, in the open: ten skills, MIT, and every version tagged.
3. The month-eating part nobody sees
The hard part of anything touching LinkedIn isn’t the AI. It’s the plumbing.
LinkedIn has three URN types for one “post” (activity, share, ugcPost), and which you get depends on how it was made. Threads silently flatten to two levels, so your “reply to a reply” lands somewhere else entirely. Reacting INSIGHTFUL returns HTTP 400 while every other reaction works.
I refused to babysit that. So the write layer rides the Publora API — full disclosure, Publora is a product I work on, which is exactly why I built the publishing layer on it. You connect your LinkedIn account once, and its free tier covers more posting than most people ever need. The read layer uses Apify to pull posts, comments, and engagers with no login. Apify reads, Publora writes, the skills think. The real work was never “call the model.” It was making the unglamorous 90% reliable.
It ships in three tiers, so you can try before you commit: draft-only (zero setup, copy-paste block), Publora (two minutes, auto-publish), or build-your-own poster (a weekend, if you like pain).
4. The humanizer became a research project
I figured "strip the AI tells" was a regex and an afternoon. It became the most-researched thing in the repo, because "sounds like AI" is three different problems:
Pure leakage no human types: oaicite tokens, “as of my last knowledge update,” Mad-Libs blanks.
Corporate sludge that’s bad regardless of author: “leverage,” “in today’s fast-paced world,” the “it’s not just X, it’s Y” cadence.
Defendable style that detectors hate but Lincoln, Dickinson, and every scientist use: the em dash, the rule of three, “robust.”
So it runs three tiers — forensic (leakage, always on), strict (corporate-speak, default), aesthetic (defendable, opt-in) — and will defend a flagged rule with the actual citation. It scores emoji density against the AI signature. And it can fire your draft through five real detectors at once — GPTZero, Originality.ai, ZeroGPT, Sapling, Copyleaks, if you bring their API keys — then show where they disagree, because they always do, and the disagreement is the point.
Here it is on a draft I fed it. Before:
In today's fast-paced world, founders must leverage every advantage — and that's exactly what we did. We fundamentally streamlined our onboarding and unlocked massive results.
After:
Founders should use every edge they can get. So we rebuilt onboarding from scratch, and activation got faster.
Same claim. Gone: the filler opener, "leverage," "fundamentally," "streamlined," "unlocked," the em dash, and the vague "massive results." Quietly, this is the part I'm proudest of.
5. Reading the room
The analytics skills are the ones nobody expects, and the ones that changed how I use LinkedIn.
engager-analytics pulls everyone who liked or commented and sorts them: peers, aspirational, prospects, noise. Out comes an action list — follow back, comment-drop, or DM-able with a one-line opener. thread-monitor catches which comments earned an author reply and flags the 6-to-24-hour window where a follow-up still has momentum, before the thread goes cold.
That’s what people mean by “LinkedIn is relationships, not reach.” Nobody automates it because it’s fiddly. It was. I did.
6. Three things testing taught me
I pressure-tested the skills like code. Three findings worth stealing:
Vague rules leak; blunt lists hold. “Preserve the user’s voice” sounded wise, until pressure (founder on stage, four minutes, loves the draft) made one run in four read it as “don’t touch it” and ship slop. The audit skill’s blunt blocker list never flinched.
An unwritten rule doesn’t exist. The TikTok sibling kept passing “What do you think?” — not from caving, but because its scrub list had no dead-closer entry. Agents obey written rules with eerie precision, both ways.
Test before you refactor. Popular wisdom says prohibition lists backfire. I nearly rewrote all of mine on faith, A/B tested instead: dead even. Kept the lists, saved a week.
7. Installing it
In a Claude Code session (CLI, VS Code, or JetBrains), type these two slash commands — the first adds the marketplace, the second installs the bundle:
/plugin marketplace add sergebulaev/linkedin-skills
/plugin install linkedin-skills@linkedin-skillsOn Codex, the same two steps in your terminal:
codex plugin marketplace add sergebulaev/linkedin-skills
codex plugin add linkedin-skills@linkedin-skillsOr, genuinely one line, for any agent that reads the SKILL.md standard (Cursor, OpenClaw, and more):
npx skills add sergebulaev/linkedin-skillsThere’s also a click-through path for claude.ai and Claude Desktop (Skills → Add from GitHub → paste sergebulaev/linkedin-skills), and a zero-setup draft-only mode if you don’t want to connect anything yet. Full instructions are in the repo README.
So…
Try it on your next post; tell me if the formula it picked felt right.
Star the repo so you find it again — it helps others discover it: github.com/sergebulaev/linkedin-skills
Tell me what breaks. Every best finding here came from something failing in a way I didn’t predict.
A month ago this was a vague annoyance with my own feed. Now it’s ten skills, a family of seven, and 4,300 lines of things I never want to do by hand again. Save one blank-composer morning and it paid for itself.
Subscribe for the next one — I’m running the same play on cold email.








