unslopify
Audit and rewrite text to remove AI-writing patterns. A deterministic Python core finds the named failures. An agent skill runs the rewrite loop until a fresh-context judge cannot tell a model touched the text.
Install
pip install unslopify
30 seconds
$ unslopify draft.md
draft.md:1: [scene-setting] "In today's fast-paced digital world"
A weather-report opener about today's fast-moving world before the actual topic.
draft.md:1: [inflated-contrast] "is not just"
A plain statement dressed up as a reveal by denying a smaller version of itself first.
FAIL draft.md: 2 findings, 0 mechanics, 0 bank
Before:
In today's fast-paced digital world, this release is not just an
update. It is a testament to our team's unwavering commitment,
ensuring a seamless experience for every user.
After:
This release fixes the checkout crash and cuts page load from 3 s
to 1 s. Both changes came out of the June incident review.
What it checks
Four categories of named types. unslopify types prints all of them
with definitions and examples.
- formula: manufactured rhythm. Inflated contrast, negative parallelism, slogan fragments, stock triads, fake authority, canned conclusions, AI vocabulary clusters, significance inflation.
- substance: claims a reader cannot verify. Empty abstraction, tacked-on benefits, process instead of reason, unsupported claims.
- wording: buried points. Bureaucratic phrasing, hedge stacks, unexplained jargon, copula avoidance, overlong sentences.
- structure: packaging that delays the point. Scene-setting, request restatement, meta-announcements, redundant conclusions, over-structure.
Types are contextual signals with severities and thresholds, not a banned-word list. Mechanical checks run alongside: em and en dashes, curly quotes, sentence length, semicolon density, and 4-word phrases repeated inside one document.
CLI
unslopify DRAFT.md # audit; exit 0 pass, 1 findings
unslopify - < draft.txt # audit stdin
unslopify DRAFT.md --json # full report as JSON
unslopify DRAFT.md --brief # rewrite instructions for a model or human
unslopify DRAFT.md --fix # apply safe mechanical fixes only
unslopify DRAFT.md --bank # also check the cross-document phrase bank
unslopify commit DRAFT.md --id blog-2026-08 # bank a finished document
unslopify types # print the rubric
The phrase bank lives at ~/.unslopify/phrase_bank.jsonl (override with
UNSLOPIFY_HOME). Committing a finished document banks its 8-word
phrases, and future drafts that reuse any of them fail the --bank check.
This is what stops a writer, or an agent, from developing stamps.
Agent skill
SKILL.md turns any harness that supports skills into the full rewrite loop: audit, rewrite against named findings, judgment pass, uniqueness gate, fresh-context judge, final PASS. It also defines an always-on mode that applies the writing rules to every reply.
Install:
- Claude Code: copy
SKILL.mdinto~/.claude/skills/unslopify/, then invoke with/unslopify. - Cursor: paste the rules from SKILL.md Mode 1 into a project or user rule, and use the CLI in the terminal for audits.
- Codex / other: include SKILL.md in the system context and expose
the
unslopifyCLI.
Library
from unslopify import audit_text, build_brief, profile_from_sample
report = audit_text(open("draft.md").read(), source="draft.md")
print(report.verdict, report.counts_by_category)
print(build_brief(report)) # instructions for the rewrite pass
voice = profile_from_sample(open("my_writing.md").read())
All models are Pydantic v2. report.model_dump_json() gives a stable,
versioned record of every audit, which is also the hook for analytics
in hosted deployments.
Pipeline
The always-on mode is simpler: a standing rule loads the skill, and the skill's writing rules apply to every outgoing message.
Design notes
- The audit is deterministic. Same text in, same report out, no model calls, no network. Judgment-only types (meaning loss, jargon the regexes miss) are the agent's job and are marked as such in the rubric.
- The judge must be fresh. A model that watched the rewrite approves its own choices, so the skill requires a separate context for the final read.
- Voice is preserved, not replaced. The optional
VoiceProfilemeasures the author's sentence lengths, contraction rate, and first-person rate, and the rewrite aims at those numbers.
Further reading on plain technical writing: Google developer documentation style guide.
License
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 unslopify-0.1.0.tar.gz.
File metadata
- Download URL: unslopify-0.1.0.tar.gz
- Upload date:
- Size: 440.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e21b4cdbe174e88a6ebe6f4265049881b5e487452741b2b3ee6cec4edee8dda6
|
|
| MD5 |
19442be936818ec26a96b9c67f70abfb
|
|
| BLAKE2b-256 |
182799adc2bc265f50189c845304df1bdd5942367c543121cdf4f5e4770992a7
|
File details
Details for the file unslopify-0.1.0-py3-none-any.whl.
File metadata
- Download URL: unslopify-0.1.0-py3-none-any.whl
- Upload date:
- Size: 22.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aca4769e6e537ce44efc78860078fc5e7f906079fd5b67897475557b36586663
|
|
| MD5 |
91224ddab47a3f9389c2d856c46c9ada
|
|
| BLAKE2b-256 |
986fdfd4e84beb1f9d330d2761f5266aec8a0da171f2e123df76bfcf5e637206
|