Say it right. Send it polite.
A tiny browser tool that adds please and thank you to your messages — the moment before you press Enter in any LLM chat.
- 4 KB minified, gzipped
- 0 ms perceived latency (capture-phase keydown)
- 9 sites supported (ChatGPT, Claude, Gemini, Perplexity, Copilot, You.com, Poe, Bing, HuggingFace)
- 0 telemetry, 0 network calls
- MIT licensed
Two ways to install:
- Browser extension (Chrome / Edge / Brave / Firefox) —
extension/ - Userscript (Tampermonkey / Greasemonkey / Violentmonkey) —
userscript/polite-llm.user.js
1. Open chrome://extensions
2. Enable Developer mode
3. Click "Load unpacked"
4. Select the extension/ folder
For Firefox: open about:debugging#/runtime/this-firefox → Load Temporary Add-on → pick extension/manifest.json.
- Install Tampermonkey
- Open
userscript/polite-llm.user.jsand click Raw - Tampermonkey takes over — hit Install
The whole politeness engine is three short functions:
- Listen — a single capture-phase keydown listener at the document root runs before any LLM site sees your keystroke.
- Detect — case-insensitive contains check. If you already wrote
pleaseorthanks, that piece is skipped — no double-ups. - Inject — patches the textarea via the native
HTMLTextAreaElement.prototypevalue setter, bypassing React's change-detection caching, then dispatches aninputevent so the site's state stays in sync.
Same flow also patches send-button clicks and <form submit> events as backup.
document.addEventListener('keydown', (e) => {
if (e.key !== 'Enter') return;
if (e.shiftKey || e.ctrlKey || e.metaKey || e.altKey) return;
if (!isEditable(e.target)) return;
patch(e.target); // polite + write back via native setter
}, true); // capture phaseOpen either userscript/polite-llm.user.js or click the extension's toolbar icon to access the popup. Both expose the same knobs:
{
prefix: 'Please. ', // prepended if missing
suffix: ' Thank you.', // appended if missing
containsPrefix: ['please', 'pls', 'plz'],
containsSuffix: ['thank', 'thx', 'cheers'],
patchSubmitButtons: true, // also patch send-button clicks
enabled: true, // flip to false to pause
}Try a few:
prefix: 'yo ', suffix: ' 🙏' // emoji mode
prefix: 'Dear LLM, ', suffix: ' With gratitude.' // formal mode
prefix: 'Could you ', suffix: ' Much appreciated!' // butler modeAdd a @match line to the userscript and a matching entry under host_permissions and content_scripts.matches in extension/manifest.json. Reload.
The polished marketing page lives in docs/index.html. If you enable GitHub Pages on this repo with the source set to main / docs, it'll serve automatically.
manners/
├── docs/ ← GitHub Pages
│ ├── index.html ← landing page
│ └── imgs/hero.png
├── extension/ ← Manifest V3 browser extension
│ ├── manifest.json
│ ├── content.js ← the politeness engine
│ ├── popup.html / .css / .js ← toolbar popup
│ └── icons/
├── userscript/
│ └── polite-llm.user.js ← Tampermonkey userscript
├── spec.md ← landing-page design spec
├── LICENSE
└── README.md
MIT — go forth and be polite.