- TypeScript 54.4%
- JavaScript 32.1%
- Shell 13.3%
- Python 0.2%
To restposter fra N24.5s FUNN-liste, begge i scripts/brain, i én berøring.
1. slugify() var tapsgivende for alt annet enn engelsk: hver ikke-ASCII-bokstav
falt i [^a-z0-9]-kjøringen og ble en bindestrek. «Løkkene» ble «l-kkene», og
verre: ø og å ble BEGGE «-», så «møte» og «måte» kollapset til én id.
Nå: NFD + strip av kombinerende tegn (å, é, ñ), så en eksplisitt tabell for de
ikke-dekomponerbare (æ→ae, ø→o, œ→oe, ß→ss, đ/ð→d, þ→th, ł→l).
REKKEFØLGEN: translitterering kjører FØR kollapsen, så kollapsen forblir siste
gate. Presist om hva det beviser — utdata-whitelisten [a-z0-9-] bæres av
kollapsen selv, ikke av rekkefølgen; dagens tabell produserer bare [a-z], så
rekkefølgen ville ikke brutt whitelisten i dag. Den er en invariant for
FREMTIDIGE tabelloppføringer, og den er nå pinnet av test. Det er whitelisten
ingestion-guardens tall hviler på (0/81 %-escapes, 0/81 bilde-URL-er,
rapportert til guard-eieren som strukturelt); repo-vid grep bekrefter at
scripts/brain/src/id.ts er den ENESTE slugify-implementasjonen i repoet, så
attribusjonen holder.
ID-STABILITET (den åpne beslutningen, avgjort på bevis, ikke skjønn):
endre in-place — ingen versjonering av slugifieren, ingen migrering.
- Ingen mintede ider finnes på disk: $DATA/brain og $DATA/ingest inneholder
bare tomme kataloger (opprettet 23.06, null filer — initBrain lager kataloger
OG filer i ett kall, så brain-en er aldri blitt genuint initialisert her).
- Alle 27 profile-field-labels den shippede malen minter er ASCII (målt ved å
kjøre extractFields' faktiske regler mot malen) ⇒ endringen er et BEVIST
no-op for profil-laget. Fem golden-ider pinner det.
- observed-ider (consolidate) mintes fra brukerskrevne nøkler og ville endret
seg — men ingenting er persistert, så migrasjonsflaten er null rader.
Ærlig avgrensning: dette KRYMPER kollisjonsklassen, det lukker den ikke —
«møte» og «mote» møtes fortsatt, som de må for at stabiliteten over case og
whitespace skal holde. Og en label uten latinske tegn i det hele tatt
(«日本語») slugger fortsatt til tom streng, så to slike minter samme id —
pre-eksisterende, ikke innført her, men det hører hjemme ved siden av
«krymper, lukker ikke» framfor å stå uskrevet. Adopter-forbehold: repoet er offentlig, men brain init
er ikke session-start-wiret (SB-S2 eier det), så en persistert brain krever en
eksplisitt invokasjon.
2. okf_version: 0.1 lå som BRØDTEKST i rot-index.md. Kanonisk plassering er
frontmatter-blokken (OKF-form spec §6, v0.3) — upstreams ene utskårne unntak
fra «index-filer har ingen frontmatter», og unntaket er oppregnet til ÉN
nøkkel, så ingenting annet blir med (okf_layout blir i brødtekst per §12).
Verdien flytter, den bumpes ikke: vi blir på 0.1.
VERIFISERING
- TDD: 6 røde først, så grønt. Brain 134 → 142 (+8), floor 127 → 142.
- Mutasjonstestet mot de FAKTISKE kildefilene, ikke bare self-tester:
okf_version tilbake til brødtekst → 3 røde · fjern translitterering → 1 rød ·
flytt translitterering til ETTER kollapsen → 1 rød · restaurert → 142/0.
- De to okf-testene dette erstattet var VAKUØSE: /^okf_version:/m matcher en
frontmatter-linje like gjerne som en brødtekstlinje, og frontmatterType() leser
type:, så den ga null med eller uten blokk. Begge gikk grønt på begge
plasseringer — nøyaktig gjeldsklassen N24.5 feide. Meldingen «index.md carries
NO frontmatter» ble usann og er skrevet om.
- Delt gate (katalogen, read-only): node catalog/scripts/okf-check.mjs <bundle>
→ exit 0, «OK: valid OKF bundle», okf_version 0.1. Bevist at verdien leses FRA
frontmatter: fjern blokken → «MISSING». check-okf-parity-signaturen er
conceptCount|untyped|okfVersion|okfVersionAccepted — plassering inngår ikke, så
det å migrere først splitter ingen paritet (okr skriver fortsatt brødtekst).
- Ti suiter grønne: test-runner 303/0 · trends 300 · analytics 202 · hooks 191 ·
brain 142 · editions 72 · render 63 · specifics-bank 45 · tests 35 ·
contract-gate 33.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EgUSPs7vDejiHr7iZw8xUx
|
||
|---|---|---|
| .claude-plugin | ||
| agents | ||
| assets | ||
| commands | ||
| config | ||
| docs | ||
| hooks | ||
| references | ||
| render | ||
| scripts | ||
| skills | ||
| tests | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| GOVERNANCE.md | ||
| LICENSE | ||
| README.md | ||
| SECURITY.md | ||
LinkedIn Studio Plugin for Claude Code
Turn your expertise into LinkedIn authority — without the blank page, the guesswork, or the generic AI slop.
Solo-maintained, fork-and-own. This plugin is a starting point, not a vendor product. Issues are welcome as signals; pull requests are not accepted. See GOVERNANCE.md for the full model and what upstream provides.
AI-generated: all code produced by Claude Code through dialog-driven development. Full disclosure →
Most experts know they should post on LinkedIn — and quietly don't. The blank editor wins. LinkedIn Studio turns that chore into a system: structured workflows that take you from idea to published, in your own voice, calibrated to how LinkedIn's topic-relevance ranking model (2026) actually distributes content. Two engines under one surface — a feed engine for short-form posts, carousels, and video scripts, and a long-form engine that runs newsletter editions and essays through a serious editorial pipeline before they ever lock.
This is not a shortcut. Hand the wheel to the AI and you land where everyone who did the same lands — the forgettable middle. The plugin removes the friction; the judgment, the genuine engagement, and the effort that make content worth reading remain entirely yours.
Tip
New here? Run
/linkedin:onboarding— it walks you through profile optimization, personalization, and your first published post in one guided flow (~10 minutes).
Note
Pre-1.0. The earlier 1.0.0–4.1.0 numbering reflected ambition, not maturity. Honest about where it stands today: the architecture workstream (M0) is done — user data lives in a per-user data dir outside the plugin, with automatic migration — and the 29 pre-0.7.0 command surfaces have all passed both the interactive hardening gate (29/29) and independent cold-review (29/29) (
/linkedin:trends, shipped in 0.7.0, is not yet gated). What remains for 1.0.0 is a GUI. See CHANGELOG.md.
Two Engines
LinkedIn Studio is really two content engines sharing one surface. They have different speeds, different gates, and different goals.
⚡ The Feed Engine — short-form, fast, frictionless
For everyday presence. The point is velocity without losing quality: every content command auto-copies the result to your clipboard, asks at most two questions, and runs your draft through the same algorithm-aware quality gates before it leaves your editor.
| Want to… | Command | Time |
|---|---|---|
| React to an article or observation | /linkedin:quick |
~5 min |
| Write a substantial post | /linkedin:post |
10–15 min |
| Turn a URL into a reaction post | /linkedin:react |
~5 min |
| Build a carousel (highest engagement format) | /linkedin:carousel |
~15 min |
| Script a video | /linkedin:video |
~10 min |
| Fill a whole week in one sitting | /linkedin:batch |
~30 min |
📖 The Long-Form Engine — /linkedin:newsletter
For the pieces that build authority — newsletter editions, essays, series articles. This is what sets LinkedIn Studio apart from "AI writes your post" tools: an 18-phase pipeline where the draft is grounded in your real material before research (lived-specifics extraction) and then has to survive a gauntlet of quality gates before it locks.
skeleton gate ──▶ voice scrub ──▶ fact-check ──▶ editorial craft gate ──▶
persona resonance ──▶ cold adversarial review ──▶ visual assets ──▶ LOCK ──▶ hook conversion
(before prose) (de-AI) (sources) (is it well-made?)
(does it land?) (cold, headless)
Each gate exists because skipping it is expensive: spine errors are caught at the outline stage, not after a full draft; claims past the model's knowledge cutoff must be web-searched; an editor judges craft a resonance sweep can't see; and a frozen draft is re-read by reviewers carrying no drafting-session context (argument, language, facts, reader-fit) — inline at Step 6.5 or in a fresh session via /linkedin:headless-review for maximum independence.
Short-form lives in
/linkedin:post,:quick,:react,:carousel,:video. Long-form lives in/linkedin:newsletter./linkedin:multiplatformadapts short-form across platforms; long-form repurposing routes back to/linkedin:newsletter.
Quick Start
Prerequisites
- Claude Code with plugin support enabled
- Node.js 18+ (for hooks and analytics CLI; analytics requires
tsx:cd scripts/analytics && npm install)
Installation
Add the marketplace, then install the plugin:
claude plugin marketplace add https://git.fromaitochitta.com/open/ktg-plugin-marketplace.git
claude plugin install linkedin-studio@ktg-plugin-marketplace
Or add the marketplace and browse interactively with /plugin. Or enable directly in ~/.claude/settings.json:
{
"enabledPlugins": {
"linkedin-studio@ktg-plugin-marketplace": true
}
}
Get Started (5 minutes)
Run the onboarding wizard — it walks you through profile, setup, and your first post in one flow:
/linkedin:onboarding
Already Set Up?
| Goal | Command |
|---|---|
| Write a post | /linkedin:post |
| Quick 5-min post | /linkedin:quick |
| React to an article | /linkedin:react |
| Write a long-form edition | /linkedin:newsletter |
| View your stats | /linkedin:report |
| See all commands | /linkedin |
Commands
All 30 commands use colon notation: /linkedin:post, /linkedin:quick, etc. The surface is organized into five journeys (Start · Create · Engage · Measure · Grow); /linkedin:create and /linkedin:measure are guided front-doors that route you to the right command when you know the journey but not the exact command. Run /linkedin for the live router with your posting status.
Onboarding & Setup
| Command | Description |
|---|---|
/linkedin:onboarding |
Multi-step wizard — profile optimization, personalization, and your first post in one flow. |
/linkedin:first-post |
First-post accelerator — zero to published in 10 minutes with guided hand-holding. |
/linkedin:setup |
Populate asset templates with your real voice, case studies, and audience data (6 sub-workflows; calculates personalization score). |
/linkedin:profile |
profile/topic-relevance optimization checklist — About, Experience, Headline, content-history alignment. |
/linkedin |
Main router — posting status (streak, weekly progress) + the full command menu. |
Content Creation
| Command | Description |
|---|---|
/linkedin:create |
Create front-door. Routes you to the creation command that owns the format (post/quick/react/carousel/video/multiplatform/batch/newsletter). Delegates only. |
/linkedin:post |
Full interactive post creation — angle, format, drafting, refinement. Best for substantial posts (1,200–1,800 chars). |
/linkedin:quick |
5-minute quick post (3-line formula, 150–500 chars) + the 8 post-type templates. |
/linkedin:react |
URL-to-post pipeline — paste an article or link, get a reaction post. |
/linkedin:carousel |
Structured multi-slide carousel with per-slide copy + layout guidance; optional slide images via mcp-image. |
/linkedin:video |
Video script generator for 30s/60s/90s/2-min videos with pacing and visual cues. |
/linkedin:multiplatform |
Adapt LinkedIn content for X threads, newsletter sections, blog posts, slides, YouTube scripts. |
/linkedin:batch |
A full week of content in one session — one theme in, 3–5 posts out, written to the queue. |
/linkedin:pipeline |
Full end-to-end pipeline from idea to published post (ideation → publish → post-analysis). |
/linkedin:newsletter |
Long-form orchestrator — newsletter/essay/series article at series quality. Multi-session 18-phase pipeline; lived-specifics grounding BEFORE research, all gates BEFORE lock. |
/linkedin:headless-review |
Cold adversarial review package on a FROZEN draft (content-reviewer + language-reviewer + fact-reviewer + persona-reviewer) — run in a fresh session for maximum isolation. |
/linkedin:pivot |
Re-open a long-form edition after a substantive late change so cleared gates re-run before lock (heuristic: >20 % word-count or >2 new sections). |
Engage
| Command | Description |
|---|---|
/linkedin:calendar |
View/manage the scheduling queue + run the publish action (mark a post published, update state/streak, surface the first-hour plan). |
/linkedin:firsthour |
Post-publish first-hour / reply-loop sprint — timestamped targets, draft comments, timeline; hands off to post-feedback-monitor. |
/linkedin:outreach |
Collaborations + speaking under one paradigm — partner scoring, CFP search, formats, abstracts, pipeline tracker (unlocks ~1K). |
Measure
| Command | Description |
|---|---|
/linkedin:measure |
Measure front-door. Routes you to the right analytics command (import/report/analyze/audit/ab-test). Delegates only. |
/linkedin:import |
Import a LinkedIn analytics CSV export into structured JSON (auto-detects ~/Downloads, parses, flags anomalies). |
/linkedin:report |
Weekly performance report from imported data — metrics, top performers, trends, alerts. |
/linkedin:analyze |
Diagnose performance issues — algorithm penalties, profile-content mismatch, reach drops. |
/linkedin:audit |
Periodic strategy audit — top/bottom posts, topic distribution, format mix, trends. Run quarterly. |
/linkedin:ab-test |
Design and track A/B content experiments. |
/linkedin:competitive |
Competitive analysis of other creators in your niche — frequency, formats, hooks, differentiation gaps. |
Grow
| Command | Description |
|---|---|
/linkedin:strategy |
Growth + authority — phase guidance (0–1K → 10K+), trajectory-aware adjustments, signature-content compounding. |
/linkedin:monetize |
Monetization — scored readiness, stage-specific plans, lead magnets, DM conversion, revenue dashboards (unlocks ~1K). |
Agents
19 purpose-built agents power the commands — each with a fixed model and a focused job. The collaboration pipeline and a "which agent do I need?" map live in CLAUDE.md.
| Agent | Model | Responsibility |
|---|---|---|
content-optimizer |
Sonnet | Optimize posts — hooks, structure, CTAs |
strategy-advisor |
Sonnet | Growth strategy + phase guidance |
analytics-interpreter |
Sonnet | Audience patterns + weekly/monthly reports |
engagement-coach |
Sonnet | 5x5x5 + first-hour + CEA commenting |
content-planner |
Sonnet | Weekly/monthly content calendars |
network-builder |
Sonnet | Strategic networking + outreach |
content-repurposer |
Sonnet | Format conversion + evergreen refresh |
trend-spotter |
(inherits session) | Trending topics + opportunity scores |
demand-spotter |
(inherits session) | Demand-sweep «innenfra og ut»: reader's verbatim questions → pain-point map → vocabulary translation → arc map with honest market verdict |
voice-trainer |
Sonnet | Voice profile building + drift detection |
differentiation-checker |
Sonnet | Originality scoring + commodity detection |
video-scripter |
Sonnet | Video scripts with pacing + visual cues |
post-feedback-monitor |
Opus | Post-publish 48h monitoring |
fact-checker |
Opus | Claim verification, post-cutoff web search (longform) |
editorial-reviewer |
Opus | Craft gate — prose + narrative architecture (longform) |
persona-reviewer |
Opus | Reader-persona skeleton / resonance / conversion gate (longform) |
voice-scrubber |
Opus | De-AI scrub + Norwegian-chronicle voice (longform) |
content-reviewer |
Opus | Cold/headless argument-integrity review (longform) |
language-reviewer |
Opus | Cold/headless Norwegian-language review (longform) |
fact-reviewer |
Opus | Cold/headless re-verification + pivot-risk (longform) |
Boundaries (as of 2026-07)
LinkedIn Studio is honest about what it can and cannot do for a personal profile:
- Post-level analytics via API — exists, but is partner-gated (a vetted Community Management API app + a verified organization + a Page). Not self-serve for a solo profile, so the practical floor is the CSV export you drop into
/linkedin:import. Per-post saves are visible in native post analytics (count-only, since ~Sept 2025) but absent from the CSV and have no self-serve API — the tool does not auto-track them, but you can add aSavescolumn to the CSV manually and/linkedin:importingests it (omit it and saves stays unknown, never 0, never folded into engagement rate). - Auto-publish — technically possible via the
w_member_socialscope, so this is a design choice, not an API limit: the OAuth/token overhead plus LinkedIn's terms on automated posting make copy-to-clipboard + you-paste the right default. The calendar's "publish" action marks a post you posted as published — it never posts on your behalf. - In-network vs out-of-network reach — LinkedIn shows this split natively in post analytics (Discovery, under the impressions count; global rollout from June 2026), but as percentages and not in the CSV export — whether it will ever be exported is unverified. So it follows the saves pattern: add an
Out-of-network(orIn-network) column with the percentage you read off that panel and/linkedin:importingests it — omit it and the share stays unknown, never 0. It is not folded into the engagement rate: a high out-of-network share means the post reached new people (acquisition), high in-network engagement means it landed with the audience you already have (resonance). Roll-ups are impressions-weighted. - Dwell time — internal to LinkedIn for organic posts; not exportable, no count to transcribe, no API. Explicitly unmeasurable — the plugin does not estimate it.
- Also not covered: real-time/streaming analytics, automated engagement (ToS), profile editing via API, and team/multi-user workflows. The plugin generates recommendations and drafts; you apply them.
Content Quality Rules
Enforced through hooks and agent behavior, calibrated to documented topic-relevance signals:
| Rule | Threshold |
|---|---|
| Hook length | 110–140 characters |
| Post length (standard / quick) | 1,200–1,800 / 150–500 characters |
| No external links in body | body links correlate with lower reach → first comment |
| No corporate buzzwords | blocklist: leverage, synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach |
| Topic alignment | must align with your 5 core expertise areas |
| Topic rotation | no back-to-back same pillar; no pillar >50 % in 14 days (warn-only) |
| Voice consistency | AI-authenticity check + voice matching (voice-guardian hook) |
Example Workflows
Sunday content prep
/linkedin:batch # one theme → 3–5 posts, varying angles, into the queue
/linkedin:calendar # review the upcoming week
A long-form edition, done right
/linkedin:newsletter # multi-session: skeleton → spine prose → voice scrub →
# fact-check → editorial craft → persona resonance →
# cold adversarial review → visual assets → lock → hook conversion
Deeper Documentation
The README is the front door. The detail lives alongside it:
| For… | See |
|---|---|
| Architecture — agent pipeline & selection, 9 hooks, 6 skills, personalization scoring, configuration, analytics internals | CLAUDE.md |
| The 28-document knowledge base (algorithm signals, angles, frameworks, strategy guides) | references/ |
| Full version history and known gaps | CHANGELOG.md |
| Maintenance model, fork-and-own, what upstream provides | GOVERNANCE.md |
License
This project is licensed under the MIT License. The plugin architecture, content strategies, and algorithm analysis are original work. LinkedIn is a trademark of LinkedIn Corporation.
The algorithm rewards expertise, consistency, and authenticity. Everything else is noise.