By netbrain
Always-on em-dash remover. Strips the em-dash (U+2014) and horizontal bar (U+2015) from everything Claude writes and replaces each with the punctuation the sentence actually needs. A SessionStart hook injects the rule so it is active from the first turn.
Banish the em-dash. Keep the meaning.
A Claude Code skill that strips em-dashes (—) out of everything Claude writes and puts the right punctuation in their place. No more telltale —. The prose reads like a person typed it.
The em-dash is the loudest "an AI wrote this" tell in modern text. Models reach for — constantly, where a person would have used a comma, a colon, or just two sentences. This skill teaches the model to stop, and to replace each dash with the mark the sentence actually needed instead of deleting it and leaving a run-on behind.
Prompt: "Summarize the outage."
Without the skill:
The cache went cold at 02:14 — every request fell through to Postgres — and the connection pool drained within minutes.
With em-dashes-begone:
The cache went cold at 02:14. Every request fell through to Postgres, and the connection pool drained within minutes.
Same facts. Same rhythm. Zero em-dashes.
— (U+2014) or ― (U+2015) in prose it writes.well-known), minus signs (-40), and real ranges (1–10, Mon–Fri).Full rules: skills/em-dash-begone/SKILL.md.
This is a Claude Code skill. Copy the skill folder to where Claude Code looks for skills.
For all your projects (personal):
mkdir -p ~/.claude/skills
cp -r skills/em-dash-begone ~/.claude/skills/
For one project (checked in with the repo):
mkdir -p .claude/skills
cp -r skills/em-dash-begone .claude/skills/
Start a new Claude Code session and the skill is discoverable.
Trigger it once and it stays on for the session:
no em dashes please
or invoke the skill by name:
/em-dash-begone
Turn it back off any time:
allow em-dashes
The skill above is opt-in per session. To make it apply from the first turn of every session with no trigger, use the bundled SessionStart hook. Claude Code injects a SessionStart hook's stdout into the model's context, so the hook prints the rule and the rule is live before you type anything.
This is an alternative to the per-session install above, not an addition: pick one route. The hook does not need the skill folder copied into ~/.claude/skills; it reads SKILL.md straight from the repo, so the repo just has to stay where the hook points.
The hook is hooks/em-dash-activate.sh (pure bash, no Node required). Because it reads the rule from skills/em-dash-begone/SKILL.md, editing that one file updates whichever route you chose.
Standalone (this machine, points at the repo): add a SessionStart entry to ~/.claude/settings.json:
{
"hooks": {
"SessionStart": [
{
"matcher": "startup|resume|clear|compact",
"hooks": [
{ "type": "command", "command": "bash /ABSOLUTE/PATH/TO/em-dashes-begone/hooks/em-dash-activate.sh", "timeout": 10 }
]
}
]
}
}
The compact matcher re-injects the rule after context compaction, which is exactly when a model tends to drift back to em-dashes.
As a plugin (portable, shareable): the repo also ships the documented plugin layout, .claude-plugin/plugin.json plus hooks/hooks.json, so it can be installed from a marketplace with no settings.json editing on the installing machine. This path follows the current plugin hooks spec but is not yet smoke-tested end to end; the standalone hook above is the path verified in this setup.
A Claude Code skill is a Markdown file (SKILL.md) with a YAML description. When a request matches that description, Claude loads the skill's instructions into context and follows them; that is the per-session path. The SessionStart hook is the always-on path: it injects the same rule text as context at the start of every session. Both read from one source of truth, SKILL.md.
Modeled on caveman, which uses the same SessionStart injection trick. Caveman's hooks are Node; these are bash, so they run with no extra runtime.
MIT. See LICENSE.
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
npx claudepluginhub netbrain/em-dashes-begone --plugin em-dash-begoneAlways-on house voice for outbound text. Rewrites Jira issues, Slack messages, commit messages, PRs, code comments, and email into a clear, direct, low-fluff voice that adapts to each surface. Preserves technical detail and flags uncertainty. A SessionStart hook makes it the default from the first turn.
Ultra-compressed communication mode. Cuts ~75% of tokens while keeping full technical accuracy by speaking like a caveman.
Memory compression system for Claude Code - persist context across sessions
Multi-model consensus engine integrating OpenAI Codex CLI, Gemini CLI, and Claude CLI for collaborative code review and problem-solving.
Curate auto-memory, promote learnings to CLAUDE.md and rules, extract proven patterns into reusable skills.