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 dashes0max 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 dashes0max 1
EditedGood
Em dashes0max 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.