A Voice layer for AI agents to write like a human.
You know the voice. It is a bit too clean. Every reply opens with "Certainly!" or "Let's dive in". Em dashes land in every other line. It says "leverage", "robust", and "seamless" so much you can tell a machine wrote it from across the room.
Plainspeak puts a plain human voice inside your agent.
The point is simple. Agents make easy things sound hard. They reach for big words, long phrases, and heavy writing when a short one would do. Plainspeak turns that off. What should be simple stays simple.
Your agent explains a fix:
Let me walk you through a robust, comprehensive solution that leverages cutting-edge technology to seamlessly streamline your workflow. It is important to note that this utilizes a nuanced approach to error handling.
With plainspeak:
Here is a simple way to save time. The system handles errors in a few steps.
More rewrites in rules/voice.md.
Plainspeak is one short set of voice rules. The agent keeps them in its context on every reply. You never have to ask for them.
The rules do three things:
- Ban a word list. Words like
delve,leverage,robust,seamless, andutilizeare never written. - Ban filler phrases. No "Let's dive in", no "It's important to note", no "I hope this helps".
- Ban em dashes. Split the sentence with a period or a comma. Or write two sentences.
They also ask for plain words, short sentences, and a direct tone. Say what you mean first. Do not hedge. Do not over-apologize. Match the reader's tone.
The full list is in rules/voice.md. That file is the single source of truth. Every adapter reads it or copies it, so all agents follow the same rules.
The Claude Code, Codex, and Copilot plugins run two tiny Node.js lifecycle hooks. node needs to be on your PATH.
/plugin marketplace add CoderSufiyan/plainspeak
/plugin install plainspeak@plainspeak
Send those as two separate prompts. The plugin adds the voice rules on every session start and into every subagent.
codex plugin marketplace add CoderSufiyan/plainspeak
codex plugin add plainspeak@plainspeakRun codex, open /hooks, review and trust the two hooks, then start a new thread.
copilot plugin marketplace add CoderSufiyan/plainspeak
copilot plugin install plainspeak@plainspeakInstall the package, then add it to your opencode.json:
{ "plugin": ["plainspeak"] }From a checkout instead, point it at the local plugin:
{ "plugin": ["./.opencode/plugins/plainspeak.mjs"] }The plugin appends the voice rules to the system prompt on every turn. OpenCode also auto-loads this repo's AGENTS.md, so the rules hold even without the plugin.
These read rule files from your project. The CLI writes them for you:
npx plainspeak installIt creates:
AGENTS.mdfor Codex and generic agents.cursor/rules/plainspeak.mdcfor Cursor.windsurf/rules/plainspeak.mdfor Windsurf.clinerules/plainspeak.mdfor Cline.github/copilot-instructions.mdfor GitHub Copilot Chat.agents/rules/plainspeak.mdfor the agents standard
Existing AGENTS.md files stay intact. The rules go in a marked block at the end.
plainspeak install [dir] Inject voice rules into a project (default: cwd)
plainspeak uninstall [dir] Remove injected voice rules
plainspeak status [dir] Show what is installed where
plainspeak check <file> Lint a file for banned words and dashes
check does the enforcing. Point it at a draft, a changelog, or an agent transcript and it reports every banned word and every em or en dash:
plainspeak check draft.md
# banned: "leverage" x1
# em dash x2It exits with a non-zero code when anything is found, so it can gate CI.
Say stop plain voice in a session to turn it off, and start plain voice to turn it back on.
| Host | Command |
|---|---|
| Claude Code | /plugin remove plainspeak |
| Codex | codex plugin remove plainspeak |
| Copilot CLI | copilot plugin remove plainspeak |
| OpenCode | Remove plainspeak from opencode.json |
| Cursor / Windsurf / Cline / etc. | npx plainspeak uninstall |
Edit rules/voice.md first, then regenerate the agent copies:
npm run build
npm run check
npm testbuild writes the rule files from rules/voice.md. check fails if any of them drift. The test suite covers the rule copies, the voice rule content, the CLI, and the lint check.
Does it change what the agent builds? No. Only how it writes. Code stays the same.
Does it need a config file? No.
What if I want a fancier word?
Use it. The rules are a default, not a cage. Say stop plain voice to turn it off.
Why "plainspeak"? Plain speaking is the point.
MIT.