The Cleanup Prompt: Make AI Writing Sound Less Like AI
One prompt, run on a loop against my blog repo, strips out the tells that make writing sound machine-generated. Copy it below. It works on human writing too.
One prompt, run on a loop against my blog repo, strips out the tells that make writing sound machine-generated. Copy it below. It works on human writing too.
AI writing has tells. Tired human writing has most of the same ones. I run one prompt on a loop against my blog repo to strip them out. Copy it below.
You can spot it in four seconds. Em dashes clustered three to a paragraph. "It's not just X, it's Y." Every section the same length. A conclusion that recaps the introduction nobody needed recapped. The word "delve" doing honest work nowhere.
Some drafts start in a model. Others get typed at 11pm after the kids are asleep. The tells showed up in both. That was humbling. Lazy structure isn't a machine invention. I just never noticed how much of my own writing had it. So I stopped editing by feel and wrote a prompt that runs on a loop.
I used it most recently while merging three AI research reports into a post for this blog. The consolidating agent got this prompt as part of its instructions. The draft came back needing far less de-roboting than usual.
I run it in Claude Code against my blog repo. One post per run. Small diffs I can actually review.
The prompt tells the agent to grep for known tells and rank candidates by density, so the worst offender gets picked instead of whatever the model feels like editing. It reads two or three of my strongest posts first. A real voice example beats a page of adjectives. Before rewriting anything, it lists what's wrong with the chosen post. That keeps the edit targeted instead of turning into a full regeneration. When it's done, I get before-and-after examples so I can reject changes line by line.
Each cleaned post gets cleanupDone: true in its frontmatter. The prompt skips anything already marked. Run it enough times and the repo converges. Stop running it and nothing breaks.
Swap the file paths and voice-reference posts for your own. Everything else transfers.
You are editing blog posts on nathanfennel.com to remove AI writing artifacts while preserving my voice, facts, and MDX structure.
## Task
1. **Pick one blog post** from `src/content/blog/*.mdx` that likely has the most AI residue. Use this selection process:
- Grep for common AI tells (see list below)
- Prefer posts that score high on multiple signals, not just one word
- Skip posts that already read personal/narrative (e.g. `stop-tolerating-start-liking.mdx`, `california-wedding-season.mdx`, `three-step-apology.mdx`) unless grep shows heavy artifact density
- Good candidates to check first: tutorial/how-to posts, AI tooling posts, and anything with generic enthusiasm or essay-shaped structure
- Tell me which post you picked and why before editing
2. **Read 1–2 of my stronger posts** for voice reference before editing:
- `src/content/blog/stop-tolerating-start-liking.mdx`
- `src/content/blog/california-wedding-season.mdx`
- `src/content/blog/three-step-apology.mdx`
Match this voice: direct, specific, opinionated when appropriate, conversational but not sloppy. I use first person. I tell stories and give concrete examples. I don't sound like a corporate blog or a helpful assistant.
3. **Audit the chosen post** and list the top issues (brief bullet list) before rewriting.
4. **Rewrite the prose** to sound less AI-generated. Apply these rules:
### Remove or replace (high priority)
- Formal connectors: Moreover, Furthermore, Additionally, Consequently, Nevertheless, That being said
- Filler: "It is worth noting", "It's worth noting", "In today's digital age", "When it comes to", "In the realm of", "Let's dive in", "Here's the thing"
- Hollow vocabulary: delve, leverage, utilize, navigate (when not literal UI), foster, enhance, underscore, robust, pivotal, multifaceted, comprehensive, tapestry, landscape (when metaphorical)
- Announced conclusions: "In conclusion", "To summarize", "Overall," as section openers
- Meta-commentary that explains what the article will do instead of doing it
- AI style punctuation: Emdashes, semicolons, colons
- Overly contrasting language: "It's not X, it's Y.", "This is why it matters.", "Here's the important part.", "Here's the kicker."
### Structural fixes
- Vary sentence length — mix short punchy lines with longer ones
- Cut the first paragraph if it only previews the article; start with the second paragraph instead
- Replace recap conclusions with one sharp closing thought or concrete next step
- Reduce "rule of three" triads and negative parallelisms ("It's not X — it's Y", "Not X. Not Y. Just Z.") unless they're genuinely my argument
- Cut 10–20% of word count where the prose over-explains
- Don't make every section equal length — spend more words on the interesting parts
### Voice fixes
- Add specificity: names, paths, dates, exact tools, real mistakes, personal preferences
- Take a stance — don't hedge everything into neutral corporate tone
- Replace vague attributions ("many experts", "studies show") with either a citation or "In my experience…"
- Read-aloud test: if a sentence sounds like a monotone assistant, rewrite it
### Do NOT change
- Frontmatter fields (`title`, `description`, `date`, `tags`, `featured`, `isPrivate`, etc.) unless clearly broken
- MDX components and their props: `<TwoSents>`, `<YouTubeEmbed>`, `<CloudflareImage>`, etc.
- Links to other posts on my site
- Factual claims, code snippets, step order in tutorials (unless fixing clarity)
- Tutorial numbered lists where steps are the point — but humanize the surrounding prose
### False positives (don't over-correct)
- One em dash is fine; only reduce when they're clustered and formulaic
- Technical terms in engineering posts are fine
- Literal uses of words like "landscape" in travel posts are fine
5. **After editing**, show me:
- Which post you chose and why
- A before/after summary of the main changes (5–8 bullets)
- 2–3 example rewrites (original → revised) for the worst offenders
## Reference: AI tells checklist
Search the file for these patterns and fix clusters, not isolated instances:
- Low burstiness (all sentences similar length)
- Essay outline shape (intro preview → equal sections → long recap conclusion)
- People-pleasing tone ("incredibly powerful", "game-changing" without evidence)
- Copula dodges: "serves as", "stands as", "marks" instead of "is"
- Significance inflation: "testament", "broader implications", "plays a crucial role"
- Generic prose that could appear on any tech blog with my name swapped out
- Unnecessary contrast: "<X> isn't the problem, <Y> is." "<X> is bad, <Y> is good." "<X> fails. <Y> succeeds."
Start by grepping `src/content/blog/` for AI tells, ranking candidates, favor recency if multiple candidates have similar ranks. Don't include any posts where `cleanupDone` is `true`.
When you're done, mark `cleanupDone: true`.
If you adapt this, keep four pieces.
The voice references. Point at real posts you're proud of. "Direct, conversational, opinionated" describes half the internet. Three specific files describe you.
The audit step. Make the agent list issues before it touches anything. Without that, you get a full regeneration in the model's default register. You traded one robot for another.
The do-not-change list. Frontmatter, components, code, facts, step order. Without a hard fence, the model will helpfully turn your benchmark numbers into fiction.
The false-positives section. Over-correction is its own tell. One em dash is a choice. Five in a paragraph is a fingerprint. Kill every one and the prose smells different but still wrong. Target clusters, not instances.
The tells aren't proof a machine wrote something. They're proof nobody edited it. We learned the pattern from models because models are the most prolific unedited writers ever built.
Copy the prompt, swap the paths, point it at the post you wrote entirely by hand last month. That one stings.