Strip AI writing tells
One em dash per page at most; plain words over stock AI words.
From seo-audit, reference: AI Writing Detection.
Highlight tells as you type
Edit the copy; click a mark to swap it.
Flagged
Em dashesmax 1
- Word tells
- 0
- Rewrite by hand
- 0
- Words
- 0
const PLAIN = { delve: "explore", leverage: "use", utilise: "use",
facilitate: "help", robust: "strong", seamless: "smooth",
crucial: "important", furthermore: "also", "prior to": "before",
"it is worth noting that": "note that", "a myriad of": "many" };
const FILLER = /\b(very|really|truly|extremely|incredibly)\b\s?/gi;
function lint(text) {
const words = new RegExp(`\\b(${Object.keys(PLAIN).join("|")})\\b`, "gi");
return {
emDashes: (text.match(/—/g) ?? []).length,
swaps: [...text.matchAll(words)].map((m) => [m[0], PLAIN[m[0].toLowerCase()]]),
filler: [...text.matchAll(FILLER)].map((m) => m[0].trim()),
};
}
Spend the one em dash
Pick commas or parentheses for each pair.
As draftedBad
Em dashesmax 1
EditedGood
Em dashesmax 1
copy
.replace(/\s*—\s*([^—]+?)\s*—\s*/g, ", $1, ")
.replace(/\s*—\s*/g, ", ");
Hear the rhythm
Edit either paragraph; each bar is one sentence.
Same length every timeBad
Short, long, shortGood
const lengths = copy.split(/(?<=[.!?])\s+/).map((s) => s.split(/\s+/).length);
const mean = lengths.reduce((a, b) => a + b, 0) / lengths.length;
const sd = Math.sqrt(lengths.reduce((a, n) => a + (n - mean) ** 2, 0) / lengths.length);
const flat = sd / mean < 0.3;
Why it matters, pros and cons
Why it matters
Readers tie these words to machine output, then trust the rest less.
Pros
- Copy sounds like a person.
- Shorter words, faster scanning.
- A word list runs cheaply in CI.
Cons
- One well-placed em dash is fine.
- Some flagged words are the precise term.
- Swapping words does not fix sentence structure.