debabble
Install no-AI-speak writing rules into your AI coding tools, per project or user-wide.
AI assistants write in a recognisable way: delve, seamless, it is important to note, not just X, but Y, emoji-headed READMEs, comments that
restate the line below them, commit messages that narrate instead of stating.
debabble keeps a curated set of rules against those habits and writes them into
the instruction files your tools already read, so the rules shape what gets
generated rather than being cleaned up afterwards.
Note that this helps with the annoyance of recognizing AI generated text everywhere, but it is still not a solution to create any true depth (or thickness).
Install
uv tool install debabble
Or run it without installing:
uvx debabble status
Use
debabble apply
That writes the default packs into .claude/rules/debabble.md in the current
project. To set up your tools once for every project:
debabble apply --global
To see what is installed and whether it is current:
debabble status
To take it back out:
debabble remove
Every command that writes accepts --dry-run, which shows the changes and
writes nothing.
Choosing tools
debabble targets
lists every supported tool and the exact file it writes for the current scope. Pick the ones you use:
debabble apply --target claude-code --target cursor --target agents-md --save
--save writes those choices into your config. Without it the targets apply
now but are not remembered, and a later plain debabble apply reconciles
against the config and takes them back out.
| Target | Project file | User-wide file |
|---|---|---|
claude-code |
.claude/rules/debabble.md |
~/.claude/rules/debabble.md |
claude-command |
.claude/commands/debabble.md |
~/.claude/commands/debabble.md |
cursor |
.cursor/rules/debabble.mdc |
kept in Cursor's settings; see below |
agents-md |
AGENTS.md |
~/.codex/AGENTS.md |
copilot |
.github/instructions/debabble.instructions.md |
covered by claude-code |
windsurf |
.windsurf/rules/debabble.md |
~/.codeium/windsurf/memories/global_rules.md |
gemini |
GEMINI.md |
~/.gemini/GEMINI.md |
hermes |
.hermes.md |
SOUL.md in your Hermes home |
cline |
.clinerules/debabble.md |
~/Documents/Cline/Rules/debabble.md |
roo |
.roo/rules/debabble.md |
~/.roo/rules/debabble.md |
amazon-q |
.amazonq/rules/debabble.md |
not available |
kiro |
.kiro/steering/debabble.md |
~/.kiro/steering/debabble.md |
Where a tool reads a directory of rule files, debabble owns one file in it and
nothing you wrote is at risk. Where a tool reads a single file you also write in
(AGENTS.md, GEMINI.md, .hermes.md), debabble keeps its content between
markers and replaces only what is between them.
claude-command is different from the rest: instead of rules that shape new
writing, it installs a /debabble command that rewrites text you already have.
Some tools keep their user-wide rules in application settings rather than in a file. For those, print the rules and paste them in:
debabble render --target cursor
render writes to standard output and never touches a file, so it is also the
way to pipe the rules somewhere debabble does not know about.
The rules
debabble packs # the packs, and which are on
debabble rules # every rule in effect
debabble rules vocabulary.hype-verbs # one rule in full
Rules come at two severities. A ban is absolute: never do this. A flag is
density guidance: fine once, a tell in clusters. The split matters, because
banning ordinary words teaches a model to write around the ban instead of
writing plainly.
The default is deliberately small
An instruction file is read on every request, and it lands in a system message that is usually long already. So the default is four packs, not ten:
| Packs | Rules | Cost per request | |
|---|---|---|---|
| Default | chat-artifacts, vocabulary, phrases, punctuation |
32 | about 11 kB, near 2k tokens |
| Everything | all ten | 85 | about 25 kB, near 6k tokens |
Those four cover the complaints people actually make: You're absolutely right,
delve and seamless, it is important to note that, and emoji everywhere.
The rest are off because they earn their place only in some projects:
| Pack | Turn it on when |
|---|---|
structure |
you want the shape-level tells too: not just X, but Y, reflexive triads, every section closing with a summary |
code-comments |
the tool writes code, and you are tired of comments that restate the line below them |
commits |
the tool writes commit messages or pull request descriptions |
docs-readme |
the tool writes READMEs, and you do not want "blazingly fast" or emoji headings |
minimal-docs |
you want it to stop creating documentation nobody asked for |
corporate-speak |
"circle back", "low-hanging fruit", "move the needle" |
Add what you need and keep it:
debabble apply --pack chat-artifacts --pack vocabulary --pack phrases \
--pack punctuation --pack code-comments --pack commits --save
Whether this trade is worth making depends on the project. A repository whose
main output is prose or documentation probably wants most of the packs; one
where the agent mostly edits code may want the default four and
code-comments. This repository runs the full set, because its output is
rules about writing.
If context is tight, --style minimal carries only the bans and roughly halves
whatever you have chosen.
Checking text
The same rules can be checked after the fact:
debabble lint .
It reports a rule, a file, a line, and the text that matched, and exits non-zero
when a banned rule matched, so it works as a CI gate. Flagged rules are reported
but do not fail the run unless you pass --strict. --format json gives
machine-readable output.
The linter is regex and counting, not a model. Rules it cannot judge honestly, such as sentence rhythm or whether a docstring was worth writing, are marked as guidance in their pack and skipped here rather than guessed at. It also knows the difference between using a word and naming one: code inside fences, inline code, string literals, and short quoted mentions are not read as prose.
To silence a line, put debabble-ignore in a comment on it or the line above.
To skip files entirely, list globs under [lint]:
[lint]
exclude = ["vendor/*", "CHANGELOG.md"]
Files debabble itself wrote are skipped automatically; they contain the rules, banned words and all.
As an MCP server
Instead of installing rules into files, an agent can ask for them directly:
uv tool install "debabble[mcp]"
claude mcp add debabble --scope user -- uvx --from "debabble[mcp]" debabble-mcp
The [mcp] extra is required; without it the server has no protocol library and
will not start.
Five tools are offered. get_style_rules returns the rules as instructions, so
an agent can pull them before writing without any file being installed. lint
and lint_files check text or files. explain_rule gives the reasoning and a
wrong/right example for one rule, along with TOML you can paste into your
config. list_rules summarises what is in effect. There is also a rewrite
prompt and a debabble://styleguide resource.
The server reads the same configuration as the CLI, so a project's own
debabble.toml applies. Pass project_dir to any tool when your editor starts
the server somewhere other than the project.
Making it yours
The shipped rules are a starting point. Three ways to change them, shortest first.
To ban a word:
debabble avoid supercharge
To change how hard a rule pushes, or switch it off entirely. This works on a single rule or on a whole pack:
debabble severity vocabulary.intensity-cluster off
debabble severity corporate-speak ban
To edit a rule outright, debabble rules <id> prints it as TOML in exactly the
format the config accepts, so you can paste it into debabble.toml and change
anything: the wording, the word list, the examples, the severity.
[[rules]]
id = "vocabulary.hype-verbs"
severity = "flag"
words = ["delve", "leverage", "showcase"]
instruction = "Say what the action actually is."
The same block with an id nobody has used defines a brand new rule. Drop a whole
pack file in .debabble/packs/ to share a set of rules through a repository.
Anything you can do in the file you can also do for one run:
debabble apply --pack vocabulary --pack phrases --severity phrases=flag --avoid synergize
Configuration
debabble init writes a starter debabble.toml with every section commented.
[profile]
packs = ["chat-artifacts", "vocabulary", "phrases"]
targets = ["claude-code", "cursor"]
style = "compact" # or "minimal" for the bans only, "full" to add examples
[severity]
"vocabulary.intensity-cluster" = "off"
[custom]
avoid = ["supercharge"]
allow = ["robust"] # keep using a word a shipped rule bans
A project with its own debabble.toml is self-contained: your personal global
config is ignored, so everyone who clones the repository generates identical
files. A project without one falls back to your global config, which is what
makes debabble apply --global useful as a personal default.
Config lives in debabble.toml at the project root, and globally at:
- Windows:
%LOCALAPPDATA%\debabble\debabble.toml - macOS:
~/Library/Application Support/debabble/debabble.toml - Linux:
~/.config/debabble/debabble.toml
What gets committed
.debabble/manifest.toml records what was installed where. Commit it: that is
what lets debabble status and debabble remove work for anyone who clones the
repository. Backups are machine-local, kept in .debabble/backups/, and
gitignored automatically.
Where the rules come from
The rules are written from published research rather than from taste alone.
Every pack carries its own references, which debabble rules <id> prints
along with the reasoning for a rule. The sources include Wikipedia's "Signs of
AI writing", the Kobak et al. study of excess vocabulary in scientific
abstracts, and the Antislop paper's measurements of how much more often some
phrases appear in model output than in human writing.
Vocabulary tells drift between model generations, so vocabulary rules carry an
era tag and the packs are versioned separately from the tool.
The project was inspired by Declaude, which had the good idea of keeping writing grievances as small editable rule files. Nothing is copied from it; the rules here are written fresh.
Development
uv sync --all-extras
uv run pytest
uv run ruff check
uv run debabble lint .
The last one is the point: debabble is held to its own rules in CI.
Licence
MIT.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file debabble-0.1.0.tar.gz.
File metadata
- Download URL: debabble-0.1.0.tar.gz
- Upload date:
- Size: 139.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32c3c94ac0cb2eca2107eaebc722c7050345a9f4986f61a99d9b6d57bef41595
|
|
| MD5 |
c0d1f711b93e647c2334b5a4ce323dae
|
|
| BLAKE2b-256 |
0e2198138898342c40bda7df3632a2af3f3708fa368e87bab2f59104007db15d
|
File details
Details for the file debabble-0.1.0-py3-none-any.whl.
File metadata
- Download URL: debabble-0.1.0-py3-none-any.whl
- Upload date:
- Size: 90.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b7c38bf4e813cd611a854d4d05bb583d7603ba930eeefa57d0cdf86efbc9c84
|
|
| MD5 |
af1ceb6eff4397fd4b76312eee6867ee
|
|
| BLAKE2b-256 |
926b5aa11d859b9d04a87ce10037f1289d4a12231256be4b83499cb10780723d
|