“what the hell is this damn thing” → “what the heck is this dang thing” “are you shitting me” → “are you shooting me” “son of a bitch” → “son of a biscuit”
Install
How it works
A deterministic text rewrite on the server’safterCleanup hook — the final text-rewrite stage, same place as dictionary replacement. No LLM, no added latency.
- Word-boundary matching — case-insensitive, so “class” and “hello” are never touched.
- Phrase priority — multi-word phrases beat their component words (“son of a bitch” → “son of a biscuit”, not “son of a meanie”).
- Case mirroring — “SHIT” → “SUGAR”, “Damn” → “Dang”.
- Variety — where a word has several alternatives, repeats cycle through them.
UI page
The plugin adds a Profanity Filter page to the app sidebar (shown once the plugin is enabled). It’s a full editor for the word list, so you don’t need to touch config or restart the app to change what gets swapped. The page lets you:- Add a word or phrase with one or more replacements (repeats cycle through them)
- Edit the replacements for any existing word inline
- Delete words you don’t want filtered
- Search the list
- Reset to defaults to restore the built-in list
window.freestyle host bridge to the plugin’s own CRUD endpoint and persisted with plugin storage, so it survives restarts and takes effect on the next dictation.
Configuration
The word list is managed from the UI page above. The only static option ispreserveCase, set via the [name, options] tuple form in the plugins setting:
Build from source
pkgroll --minify (server-side plugin code) followed by vite build (UI page).
Source
plugins/profanity-filter/ in the monorepo.