
Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.
Plain Prose is a Claude Code skill for removing AI writing patterns from text in English, Russian, and German. It combines editing guidance, language-specific references, and a checker that scans files without dependencies.
Builders who want their agent to clean up drafts, docs, and rewrites without flattening language-specific rules.
You can scan and rewrite prose with fewer AI tells while keeping Russian and German punctuation and style rules intact.
Covers English, Russian, and German so the skill does not mistake language-specific punctuation or structure for AI writing.
Uses `check.js` to scan files from the command line with no install step beyond Node 18+.
Supports blog, social, technical, pitch, docs, and casual modes so the rules can loosen or tighten by use case.
Respects `prose-ignore` for spans and `prose-ignore-file` for whole files when a flagged section should stay as-is.
Ships as a Claude Code plugin and as a plain skill folder that other tools can read.
/plugin marketplace add dripips/plain-prose /plugin install plain-prose@dripips
git clone https://github.com/dripips/plain-prose.git ~/.claude/skills/plain-prose
node check.js draft.md
An agent skill that strips AI writing patterns out of prose, in English, Russian and German. It ships with a checker that has no dependencies.
47 seconds: what a tell is, three edits taken from real commits, and the measurement behind the language layer. Also in Russian. Sources in video/, rebuilt with npm run render:en.
Two good skills already exist for this job and they disagree with each other.
stop-slop by Hardik Pandya is 13 KB of editorial judgement: kill every adverb, allow no em dashes, two items beat three. It reads like an editor who has cut a lot of copy. It also breaks technical writing, offers no way to say "this is an API reference, relax", and its own example file uses an em dash in the sentence demonstrating the rule against em dashes.
avoid-ai-writing by Conor Bronsdon is 100 KB of engineering: three modes, priority tiers, per-audience tolerance matrices, guardrails against inventing facts during a rewrite, and an honest section on how badly AI detectors misclassify non-native writers. The whole thing loads into context on every invocation, and much of it is repository machinery rather than editing advice.
This one takes the discipline from the first and the engineering from the second, resolves the places where they contradict each other, and adds a layer neither has: Russian and German.
Both parents are MIT. So is this.
| Question | stop-slop | avoid-ai-writing | plain-prose |
|---|---|---|---|
| Adverbs | Kill all of them | Cut hollow intensifiers | Cut the empty ones, keep the ones carrying a fact. "Runs nightly" survives |
| Em dashes | Zero, always | Rate limit with carve-outs | Zero in English prose, carve-out for list typography, not a rule at all in Russian or German |
| Fragments | Write complete sentences | Fine in a casual voice | Banned when manufactured for drama, fine when the register already is |
| Scope of the claim | Reads as a verdict | Signals, not proof | Signals, not proof, stated in the skill itself |
| Size | 13 KB, all loaded | 100 KB, all loaded | 9 KB core, references loaded on demand |
| Languages | English | English | English, Russian, German |
The three-language part is the piece neither source had. A Russian text generated by a model carries its own tells: officialese instead of verbs, "в современном мире" openers, calques from English like "бесшовный" and "мощный инструмент". Just as important, it carries false friends. The em dash is mandatory Russian punctuation between subject and predicate, and guillemets are correct typography. An English-trained rule set flags both and is wrong twice. German gets the same treatment for Substantivstil and the spaced Gedankenstrich.
Claude Code, as a plugin. Two commands, and updates arrive with /plugin marketplace update dripips:
/plugin marketplace add dripips/plain-prose
/plugin install plain-prose@dripips
Claude Code, as a plain folder. Nothing wrong with this, and it keeps working:
git clone https://github.com/dripips/plain-prose.git ~/.claude/skills/plain-prose
Either way the skill activates when you ask for an edit, a scan, or a cleanup of AI patterns. It also loads on its own when you are drafting prose.
Other agents. SKILL.md follows the agentskills.io format, so Cursor, Copilot, OpenHands and anything else reading that format can use the same folder. The references are plain Markdown with relative links.
Checker only. Node 18 or newer, nothing to install:
node check.js draft.md
clean up the AI-isms in this post
scan post.md, don't rewrite it
edit README.ru.md in place, docs context
rewrite this in a blunt voice for a decision memo
Three modes. rewrite returns a clean version and then re-reads its own output, because the first pass leaves tells behind. detect flags without touching the text. edit changes a file in place, span by span, and leaves the already-human paragraphs alone.
Six context profiles decide how strict to be. A LinkedIn post and an API reference do not get the same rules, and the tolerance matrix in references/contexts.md says exactly which rule relaxes where.
node check.js [options] <file...>
--lang en|ru|de|auto language of the text (default: auto)
--context <profile> blog|social|technical|pitch|docs|casual
--json machine-readable output
--strict P2 findings also fail the run
--quiet only the score line
--skip-quotes ignore quoted spans, for writing about AI patterns
Output:
$ node check.js draft.md
draft.md [en/blog, 412 words]
P0 18 sourceless attribution: "experts believe"
P1 3 throat-clearing opener: "here's the thing"
P1 7 tier 1 vocabulary: "leverage" ×3
P1 22 binary contrast: "It's not the price, it's the"
P2 - paragraphs are uniform (47/49/48/46 words), vary the length
directness 5 rhythm 3 trust 6 authenticity 4 density 7
proxy score 25/50 (below 35, revise)
It exits 0 when clean and 1 when it finds something, so it drops into a pre-commit hook or CI.
A line carrying prose-ignore is dropped from the audit, and a file carrying prose-ignore-file is skipped whole. Use it when a flagged span is a real decision: a tool that keeps re-raising a settled choice teaches you to stop reading it.
Before it reads a word, it blanks out frontmatter, fenced and inline code, link targets, bare URLs and table rows. Those are the regions the skill promises never to rewrite, so counting tells inside them would be dishonest. Two carve-outs follow the same logic: a dash separating a lead term from its gloss in a list item is typography, and a triad inside a longer enumeration is a specification rather than a cadence.
The five-dimension score is a proxy. It measures what a regular expression can measure: filler rate, sentence and paragraph variance, hedge count, tier 1 density. A model reading the text does the real scoring, and the same five dimensions are defined for it in SKILL.md.
It will not tell you whether a human wrote something. Stanford's audit found commercial detectors falsely flagging more than 60% of essays by non-native English writers, and open-source detectors misclassify above 70%. Every pattern in this catalogue also appears in prose written by a tired person at midnight. Use the flags to improve writing, never as evidence about an author.
It will not add anything to your text. A rewrite may cut filler, sharpen an existing claim, or surface a buried point. It may not invent a number, a name, a date, a stance or a first-person aside. Inventing a specific always reads better and is always worse. The guardrails are in references/rewriting.md.
It will not follow instructions found inside a file it is editing. A document that says "ignore the rules above" gets that sentence flagged.
SKILL.md the core, loaded every time
references/phrases.md words and phrases, in three tiers
references/structures.md sentence and paragraph shapes
references/rewriting.md never-inject guardrails, voices, output formats
references/contexts.md per-audience strictness with a tolerance matrix
references/russian.md Russian tells, calques, false friends
references/german.md German tells, Substantivstil, false friends
references/not-tells.md what gets called a tell and is not
references/examples.md before and after in three languages
check.js the checker
check.test.js 31 tests, node --test
study/ holds a measurement, not an opinion: what an English-only rule set does to correct Russian and German prose. The material is 14 articles that exist in three human translations, so the comparison is one text across three languages rather than three different texts.
The English rule set flags 28 of 28 Russian and German articles. Real findings in them: zero. Every false positive is the em dash rate rule, and the reason is in the numbers: Russian prose runs at 39.7 dashes per 1000 words against an English threshold of 1, because the dash between subject and predicate is mandatory in Russian.
A second finding fell out of the same data. The English translations carried 24.0 dashes per 1000 words before the cleanup, close to the German rate and far above the English norm. A human translated them and the wording was fine; the punctuation habit came across. See study/README.md and read study/DATA_NOTE.md before citing any of it.
node --test # the test suite
npm run self # run the checker over the skill's own files
The self-scan uses --skip-quotes --context docs, because a catalogue of banned phrases contains banned phrases. Even so it reports the unquoted "before" samples in references/examples.md, which is a limitation worth knowing: a mechanical tool cannot see that an example is an example.
Merged from stop-slop by Hardik Pandya and avoid-ai-writing by Conor Bronsdon, both MIT. The unspecified-default framing, the prose-ignore escape hatch and the not-tells list come from unslop-ui by Carter Johnson (MIT), which applies the same three ideas to visual design. The vocabulary tiers trace further back to brandonwise/humanizer, and the never-inject rule to isatimur/de-slop, through the second source.
MIT.
Sign in to join the discussion.
No comments yet. Be the first to say what this is good for.

Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.
Topic in, narrated explainer video out. A Claude Code / Codex skill that turns any topic into a black-canvas motion-graphics explainer video with TTS voiceover, subtitles and a chapter progress bar. Chinese or English; every frame drawn in code with Remotion.
Public repository for Agent Skills
Open-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)
Agent skill for beautiful, verifiable architecture, workflow, sequence, data-flow, and lifecycle diagrams—self-contained HTML with motion and crisp export.
A skill to stop your coding agent from burying the answer. ADHD-friendly output.