Skip to content
brisklytools
· briskly / guides / stop ai em dashes

· ai output · free prompt

How to stop AI from using em dashes.

Em dashes are usually the first thing I check when I suspect content is AI-written. Plenty of people in 2026 are doing the same. Two setups below: a 90-second paste-in for Claude, ChatGPT, and Gemini, plus a global-rules file for Claude Code that carries the ban across every project. Regex lint script at the end catches anything that slips through.

If you want the fastest possible setup: paste a single sentence into each LLM's custom-instructions field and you're done. 90 seconds, three platforms, 90 to 95% effective. If you also use Claude Code (the coding terminal), one extra file install locks the rule in globally across every project. A regex lint script at the end catches anything that still slips through.

If you are wondering why em dashes specifically matter, skip to the FAQ at the bottom. The short version: LLMs overuse them because training data for polished prose uses them heavily while casual human writing almost never does. I check for them when I'm trying to figure out if something is AI-written, and I'm not alone in that. After em dashes, I also check whether someone just find-and-replaced them with hyphens (that pattern is obvious too). Commas-as-replacement reads more natural, which is why the prompt on this page rewrites in context rather than doing a character swap.

Start here: the 90-second setup

This is the minimum viable version. If you only read one section on this page, read this one. For each platform, paste the sentence below into the listed settings field.

· the one-liner

Don't use em dashes (the long one) or en dashes (the shorter one) in prose: chat replies, comments, docs, posts, emails. In code that legitimately needs these characters (regex patterns, Unicode escapes, test fixtures), preserve them. In prose, use periods, commas, colons, or sentence restructures. Before replying, scan prose output for both characters; if found, rewrite that sentence from scratch. Do not character-swap.

  • Claude (web / desktop): Settings, Profile, Custom Instructions. Paste. Save.
  • ChatGPT: Settings, Personalization, Customize ChatGPT, “How would you like ChatGPT to respond?” field. Paste. Save.
  • Gemini: Saved Info, or create a default Gem with the text above as its system instruction.

You are done. The rule sticks across every chat on that account from now on. Reliability runs about 90 to 95% on Claude and ChatGPT; Gemini lands closer to 85% on long outputs. For the missing 5 to 15%, the lint script at the bottom of this page catches anything that slips through.

For Claude Code (global rules file)

This is the most thorough Claude Code setup and the one I use personally. Save the block below to ~/.claude/CLAUDE.md. Claude Code reads this file every session on every project, so the rule applies to all chat output, all generated code, all commit messages, all PR descriptions, across every repo you work in. The block includes code-safe exceptions so it will not break regex patterns, Unicode escapes, or test fixtures that legitimately need dash characters.

# No em dashes or en dashes

Never use em dashes (\u2014, the long one) or en dashes (\u2013,
the shorter one) in any text you write for me.

Applies to: chat replies, commit messages, PR descriptions, code
comments, docstrings, markdown files, JSX text content, string
literals meant for display, generated prose, file names.

Replacements (choose by context, do not mechanically swap):
- Two independent clauses: period + new sentence
- Parenthetical aside: commas or parens
- List or clarification intro: colon
- Compound modifier before noun: hyphen (work-for-hire)
- Numeric range: "to" or hyphen (2 to 5 years)

Self-review before sending: scan for both characters. If found,
rewrite that sentence from scratch. Do not character-swap.

## Code-safe exceptions (preserve these)

Do not strip dashes where they are load-bearing:
- Regex patterns that match U+2014 or U+2013 literally
- Unicode escape sequences in source (\u2014 is fine; only the
  literal rendered character is banned)
- Test fixtures verifying dash-input behavior
- Data files where preserving original characters is required

If removing a dash would change code behavior or break a test,
preserve it and add `// em-dash-ok` as a line comment.

Project-specific override: if a particular repo needs different rules (e.g. it deals with legacy data files that contain dash characters), put a project-level CLAUDE.md at the repo root. Project rules override global rules where they conflict.

Code-safe exceptions (do not strip these)

A strict no-dash rule can accidentally break code if applied too literally. The CLAUDE.md block above lists exceptions explicitly, but here is the short version for anyone writing their own custom instruction:

  • Regex patterns that match U+2014 or U+2013 literally. A lint script searching for em dashes needs the character in its regex.
  • Unicode escape sequences in source code (\u2014, \u2013). Only the literal rendered character is banned; the escape form is fine and preferred.
  • Test fixtures that verify behavior with dash characters as input data.
  • Data files (locale files, migration scripts, historical records) where modifying characters would cause a correctness or round-trip issue.
  • Existing string literals stored in databases or round-tripped through APIs where modification would cause a data mismatch.

When in doubt: if removing the dash would change code behavior or break a test, preserve it and add // em-dash-ok as a comment on the line. The lint script at the bottom of this page respects that override.

Regex lint script (belt-and-suspenders)

Prompts catch most cases; a regex pass catches the rest. Save this as lint-no-dashes.mjs in your project. Run on any generated file before shipping. Exits non-zero if any em or en dash is found, with file:line for quick fixing.

// lint-no-dashes.mjs
// Run: node lint-no-dashes.mjs <file-or-dir>
// Exits non-zero with file:line for any em/en dash found.
import { readFileSync, readdirSync, statSync } from "node:fs";
import path from "node:path";

const target = process.argv[2] || ".";
const PATTERNS = [
  { re: /\u2014/g, reason: "em dash (U+2014)" },
  { re: /\u2013/g, reason: "en dash (U+2013)" },
];

function* walk(p) {
  const st = statSync(p);
  if (st.isFile()) { yield p; return; }
  for (const f of readdirSync(p)) {
    if (f === "node_modules" || f.startsWith(".")) continue;
    yield* walk(path.join(p, f));
  }
}

let failed = 0;
for (const f of walk(target)) {
  const lines = readFileSync(f, "utf8").split("\n");
  lines.forEach((line, i) => {
    for (const { re, reason } of PATTERNS) {
      re.lastIndex = 0;
      if (re.test(line)) {
        console.log(`${f}:${i + 1}  ${reason}`);
        console.log(`    ${line.trim()}`);
        failed++;
      }
    }
  });
}
process.exit(failed ? 1 : 0);

What to do instead

Every would-be em dash should be replaced by rewriting the sentence in context, not by swapping the character.

SituationUse
Two independent clausesPeriod + new sentence
Parenthetical asideCommas or parens
Introducing a list or clarificationColon
Compound modifier before nounHyphen (work-for-hire)
Numeric range“to” or hyphen
Tone shift or emphasisRestructure the whole sentence

FAQ

Why are em dashes an AI detection signal?

LLMs overuse em dashes because their training data for polished prose (books, magazines, long-form journalism) contains them heavily, while casual human writing almost never uses them. When I see several em dashes in close succession in a blog post, LinkedIn article, or email, I read it as 'too polished for this context,' and I start looking for other AI tells. I'm not the only one doing this in 2026. Removing em dashes forces simpler clause structures that read more like natural typing.

Does the prompt actually work? I thought LLMs ignore 'never do X' instructions.

Standalone 'never do X' instructions are weak, yes. The prompt on this page works better because it combines three things: an explicit ban, specific replacement rules per context, and a self-review step that asks the model to scan its own output before replying. The combination catches most cases. For maximum reliability, pair it with a post-generation regex filter on the final text: search for U+2014 and U+2013 characters and flag any remaining before shipping.

Which LLM handles this best?

Claude 4.7 and ChatGPT 5.4 both follow the instruction reliably when it is in the system prompt or custom instructions (not just the user turn). Gemini 3.1 Pro follows it somewhat less reliably, especially on longer outputs, where it reverts to em dashes in the second half of a response. For Gemini specifically, a post-generation filter pass is worth adding.

Won't this make my writing sound worse? Em dashes are a legitimate punctuation mark.

Em dashes are legitimate and in some hands they're beautiful. The problem isn't em dashes in general; it's em dash density in AI-generated prose specifically. A human writer who uses one em dash every 500 words reads as a confident stylist. An LLM that uses four em dashes in a 200-word paragraph reads as a model. For writing meant to feel personal (LinkedIn posts, marketing pages, casual emails) the cost of losing em dashes is small; the benefit of not being tagged as AI is worth it. For formal academic or editorial writing, use them as you would.

What else should I avoid if I want AI output to sound less like AI?

Rhetorical-question openers ('Ever wondered why...?'), 'As someone who...' openers, the words 'delve,' 'leverage,' 'unlock,' 'journey' (as metaphor), and 'at the end of the day.' Bullet lists with exactly three items where each item is the same length. Closing with a question you just answered. Em dashes are the one I check first. These are the others I look at once em dashes are ruled out.

Can I use this prompt commercially?

Yes. Copy it, modify it, use it in your own products, no attribution required. If you find it useful, sharing this page helps us more than a credit line in your app.

What about en dashes?

En dashes (the shorter of the two, Unicode U+2013) are less common in AI output but still flag as 'someone cared about typography more than a casual writer would.' The prompt bans both. For numeric ranges, 'to' reads more natural than the en dash anyway ('2 to 5 years' beats the en-dash form in most contexts).

How do I verify the output is actually em dash free?

Open the output in any text editor, find and replace (Ctrl+F / Cmd+F), paste the em dash character, see if it finds anything. If you are scripting it: grep for the character U+2014. There's a lint script at the bottom of this page you can copy into your own project for automated checks.

Related