Start
Every harness ships with an LLM that could be the editor sitting next to you when you write. Mostly it isn’t. It cheerleads instead of cutting, paraphrases instead of pruning, and quietly produces prose that all sounds the same.
Pilcrow turns it into the editor. Mechanical checks for the patterns regex can pin down. LLM-judged ones for what regex can’t. Interpretive lenses anchored in the classical style guides: Strunk, Williams, Zinsser, Pinker, Orwell, King.
Works whether you wrote it, the model wrote it, or you co-wrote it. Detection-only. The engine never edits your text. Findings carry line, column, excerpt, and an optional suggestion; the LLM or you decide what to change.
Inspired by Paul Bakaus’s impeccable.Same idea, applied to writing instead of UI.
Install
Global:
npm install -g pilcrow-ink
The package is pilcrow-ink; the binary is pilcrow. Or per-project without installing:
npx pilcrow-ink audit drafts/
Then drop the skill into your AI harness:
cd your-project
pilcrow skills install
Auto-detects .claude, .cursor, .gemini, .agents, .opencode, .kiro, .pi, .qoder, .trae, .github. Pass --all for every supported provider, or --provider=.cursor for one specifically.
Without the npm package, pull the skill straight from GitHub. It is committed at skills/pilcrow/ and shipped verbatim:
npx skills add SamGalanakis/pilcrow
or as a Claude Code plugin marketplace:Either route copies the skill as-is. The deterministic linter still wants the pilcrow binary on PATH (npm i -g pilcrow-ink or npx pilcrow-ink); without it the interpretive lenses fall back to manual reads.
/plugin marketplace add SamGalanakis/pilcrow
/plugin install pilcrow@pilcrow
Claude Cowork installs from a zip, not from npm. Every release ships a pilcrow-cowork.zip; download it, then in Cowork choose Customize, Plugins, Install, and upload it.The zip bundles the compiled CLI, which has no npm dependencies, so the deterministic linter runs inside Cowork’s sandbox on node alone. Invoke with /pilcrow audit, /pilcrow polish, and the rest.
Project
Project commands act on the repo, not on a single passage. They capture the writer’s voice so editor proposals sound like the writer, and they shape a new piece end to end.Each writes to disk only after explicit confirmation. Single source of truth: VOICE.md.
document
Scan existing prose. Find recurring moves: phrases, cadences, punctuation tics. Draft VOICE.md with citations, plus Open questions for what the stats can’t answer: audience, stance, method.
/pilcrow document
teach
Interview the writer. Refine an existing VOICE.md by answering Open questions, confirming Signatures, and editing Taboos; or create one from scratch if there’s no corpus to scan. Use after document for the typical flow, or standalone for new projects.
/pilcrow teach
craft
Method-aware end-to-end writing. Picks outliner, discovery, iterative, or model-drafter at start, or reads method: from VOICE.md. Then runs four phases: shape, draft, critique, polish. Each phase gates on writer confirmation.
/pilcrow craft "topic or assignment"
Editor
Editor commands interpret findings through a tradition. Each loads its own playbook from skills/pilcrow/reference/<name>.md with methodology, output shape, and anti-patterns drawn from a named style guide. They’re not rule filters; each produces a different kind of report.
Invoke through the skill: /pilcrow <command> <path>.
Or invoke /pilcrow bare and the skill triages for you: it finds the prose in scope, runs lint, identifies the genre, and proposes an ordered sequence of editor commands tuned to the piece.Genre families map to default sequences: argumentative/ (essay, op-ed, review) → lead/argue/tighten/polish; reportorial/ (postmortem, news, changelog…) → lead/verify/tighten/polish; marketing/ → humanize/lead/polish; documentation/ (the Diátaxis four) → clarify/tighten/polish; correspondence/ (memo, email…) → lead/tighten/verify. Full tree on the Genres page. The plan gates on writer confirmation; you can reorder, skip, or substitute.
Three meta-disciplines stand behind every editor command. An editor-reflex catalog rejects stock LLM rewrite cadences: here’s the bottom line, the colon-summary, the imperative tricolon. A proposal ritual forces three candidate rewrites past reflex, genre, and voice gates before any ships. An editor slop test applies the same scrutiny to the command’s own output. If a reader would believe an LLM wrote the critique, the critique is the problem.
polish
Final pre-ship lens (Strunk & White, Zinsser). Scores the piece on nine dimensions, one per lens, 0–4 each, 0–36 total. Returns a five-tier verdict from Excellent to Critical, then triages findings into ship-blockers, worth-fixing, and taste-calls. Names the lowest-scoring dimensions so the writer knows which lens to run next.
/pilcrow polish drafts/post.md
humanize
Strip AI tells without sanding off voice (Wikipedia Signs of AI writing). Classifies findings by class: vocabulary, cadence, template, or fossil. Each class has its own rewrite shape.
/pilcrow humanize drafts/post.md
tighten
Cut zombie nouns and weak verbs (Williams Style). The character/action principle: name the actor, surface the buried verb.
/pilcrow tighten drafts/post.md
clarify
Reduce the reader’s working-memory load (Pinker Sense of Style, Orwell). Per-passage rewrites with mental-model commentary: what the reader has to hold, what the payoff is.
/pilcrow clarify drafts/post.md
pace
Restore rhythm (King On Writing, Strunk). Sentence-length histogram, paragraph-weight chart, split/merge proposals. The aural diagnostic listens for tongue-twisters, consonant clusters, and unintentional rhyme.
/pilcrow pace drafts/post.md
lead
Sharpen the opening (Zinsser on leads). Finds the real lede in the first paragraphs and proposes three alternative first sentences: news lede, scene lede, stakes lede.
/pilcrow lead drafts/post.md
verify
Surface load-bearing claims, the way newsroom fact-checkers do. Each numeric, dated, comparative, or attributed claim faces three questions: citation, specificity, plausibility. It lands in one of four buckets: unsupported, vague, hedged, unchecked.
/pilcrow verify drafts/post.md
aloud
Play the prose back via TTS in an interactive session. Four modes: walkthrough for paragraph-by-paragraph, full for end-to-end, targeted for the paragraphs pace flagged, compare for two passages back to back. Requires OPENAI_API_KEY and a system audio player.
/pilcrow aloud drafts/post.md
Audio is content-addressed and cached at /tmp/pilcrow/aloud/<sha256>.mp3; replays across sessions are free.The command detects an installed OpenAI speech skill in your harness or fetches a pinned snapshot.
argue
Map the argument (Toulmin, IBIS, Argdown). Confirms the thesis with a multi-choice gate, surfaces supports and load-bearing premises as an indented tree, generates the strongest genre-aware counter, and checks coverage: engaged, dodged, or missing.
/pilcrow argue drafts/post.md
/pilcrow argue drafts/post.md --argdown # also emit a .argdown file
CLI
Five commands run directly against prose. With no path they read stdin; with a directory they recurse it, scanning .md, .mdx, .markdown, .txt, .html, .htm.
audit
Run the rule catalog. Human-readable findings with line, column, excerpt, and an optional rewrite hint.
pilcrow audit drafts/post.md
pilcrow audit drafts/ --ignore-quoted
echo "Let me delve into the rich tapestry…" | pilcrow audit
Exits non-zero when an error-severity finding fires.--ignore-quoted skips phrases inside straight or curly double quotes; useful for prose that quotes AI tells without backticking them.
lint
Same scan as audit, JSON output for piping into another tool or back to a model.
pilcrow lint drafts/post.md | jq '.files[0].findings[] | select(.severity == "error")'
critique
Emit the LLM-critique prompt. It targets the patterns regex can’t reliably catch: buried lede, mixed metaphor, missing stakes, unsupported claims. The model returns JSON findings in the same shape as lint. Pass --genre <slug> to layer the active leaf’s rules on top of the base 22. The genre walk climbs the parent chain, so a leaf inherits anything its parent contributes.Browse every genre and its specific rules on the Genres page. Example additions: postmortem-counterfactual, cv-vague-impact, error-message-blame-user.
pilcrow critique drafts/post.md | claude
pilcrow critique drafts/post.md --rules=buried-lede,unsupported-claim
pilcrow critique drafts/incident.md --genre postmortem
rules
List every rule with id, severity, and one-line description.
pilcrow rules
pilcrow rules --json
Full catalog at the catalog page.
skills
Manage the pilcrow skill inside your AI harness.
pilcrow skills install # auto-detect and install
pilcrow skills update # re-sync after `npm update -g pilcrow-ink`
pilcrow skills check # show installed version + content-hash status
pilcrow skills cleanup # remove installs under deprecated names
install and update use a content hash, not just the version string, so they detect a copy that’s already on the current version but was edited locally.Modified installs are skipped with a notice; pass --force to overwrite. The hash covers every file in the skill, not just SKILL.md, so an edit anywhere in reference/ trips it. cleanup removes orphan skill folders left behind when pilcrow renames or merges a sub-skill; it verifies each candidate is pilcrow-owned before deleting, so user-owned skills with a colliding name stay safe.