sergebulaev/linkedin-marketing
Plan, draft, audit, and publish LinkedIn posts and comments. Use when the user wants to write a viral LinkedIn post, draft a comment or reply on any LinkedIn post URL, audit a draft against 2026 algorithm heuristics, remove AI tells, extract hook formulas from viral posts, or plan a week of content. Powered by the Publora API for publishing. User provides post/comment URLs, skill drafts content, user approves, then publishes.
npx skills add https://github.com/sergebulaev/linkedin-skills --skill linkedin-marketing
A bundle of 11 focused skills for LinkedIn content ops in 2026, built for Claude Code and Codex. Each skill is single-purpose, follows the draft → approval → publish pattern, and uses the Publora API for posting.
linkedin-post-writerlinkedin-comment-drafterlinkedin-reply-handlerlinkedin-humanizer (rewrite + --mode audit pre-publish review; folds in the former post-audit, emoji-detector, rules-explainer, and detector-tester sub-tools)linkedin-hook-extractorlinkedin-content-plannerlinkedin-thread-monitorlinkedin-engager-analyticslinkedin-profile-optimizerlinkedin-employee-advocacylinkedin-repurposerEvery action-taking skill follows three steps:
lib/url_parser.py to extract the post URN and any comment ID.Three tiers — pick one.
The skills work out of the box. No API keys, no signup. Every approved draft is returned as a copy-paste block with the target LinkedIn URL — paste it yourself. Great for trying the skills before committing to any backend.
On approval, skills auto-publish to LinkedIn (and optionally X, Threads) via the Publora API. Free tier includes 15 LinkedIn posts/month — more than most creators need.
.env: PUBLORA_API_KEY=sk_...
LINKEDIN_PLATFORM_ID=linkedin-...
pip install -r requirements.txtWhy Publora: LinkedIn has three URN types (activity/share/ugcPost), a reaction-bug where INSIGHTFUL returns 400, and a 2-level thread-flattening quirk that breaks most third-party implementations. Publora handles all of it. We built on top of their API so we didn't have to.
Prefer not to SaaS it? Ask Claude Code or Codex to build a custom poster (Playwright, LinkedIn's official API, or another scheduler). Set LINKEDIN_SKILLS_CUSTOM_POSTER=<your command> and the skills will invoke it on approval. This is a weekend of work. Publora is 2 minutes.
Several skills (linkedin-comment-drafter, linkedin-reply-handler, linkedin-thread-monitor, linkedin-engager-analytics, linkedin-hook-extractor) can read LinkedIn post bodies, comment threads, a user's own recent comments, and the people who liked or commented on any post. They use the Apify platform when an APIFY_TOKEN is set; otherwise they ask you to paste the relevant text.
.env: APIFY_TOKEN=apify_api_...
Actors used (all no-cookies, public, no LinkedIn login required):
| Use case | Actor | Approx 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 |
The thin client lives at lib/apify_client.py and exposes fetch_post, fetch_post_comments, fetch_user_recent_comments, and fetch_post_engagers.
—), en dashes, or double dashes — biggest AI tell... as soft pause when mid-sentence rhythm calls for it.leverage, fundamentally, streamline, harness, delve, unlock, foster.47% beats significant.10. Hook lives in the first 210 chars (before "… see more" on mobile).
(Canonical reference, plus comment-specific extensions: references/voice-rules.md. See also references/hook-formulas.md and references/algorithm-heuristics.md.)
LinkedIn ships three post URN types (the library handles all three):
| URN type | Example URL fragment | Example URN |
|---|---|---|
| activity | /posts/slug-activity-7448...-XX | urn:li:activity:7448... |
| share | /posts/slug-share-7449...-XX | urn:li:share:7449... |
| ugcPost | /feed/update/urn:li:ugcPost:7447... | urn:li:ugcPost:7447... |
Comment URLs:
/feed/update/urn:li:activity:POST_ID?commentUrn=urn%3Ali%3Acomment%3A%28activity%3APOST_ID%2CCOMMENT_ID%29
The library decodes the commentUrn fragment and returns both post_urn and comment_id.
parentComment, not the reply's URN.INSIGHTFUL is NOT a valid Publora reaction type. Use INTEREST instead (the client auto-maps).url_parser may be activity when the canonical URN is actually ugcPost. If posting fails with 404, fall back to resolving via lib.ApifyClient.fetch_post_comments(post_id=...) and read the canonical URN from any existing comment's comment_url.lib/publora_client.py, lib/apify_client.py — thin Python clients used by every skillPublishing powered by the Publora REST API. Algorithm insights via arXiv 2501.16450 (360Brew) and AuthoredUp 2026 reach data.
Take sergebulaev/linkedin-marketing from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip.
Without those the skill loads but fails at the first command.