pilcrow.ink·v0.17·MIT

Pilcrow

Make your clanker your editor.

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.