-
Notifications
You must be signed in to change notification settings - Fork 1
Text Cleanup
This is the flagship Wispr-Flow-style workflow: press a key, talk, and have clean, punctuated text land in whatever app you are in. Text cleanup turns raw dictation into polished output through a layered pipeline of deterministic and LLM-driven steps.

The optional transcription cleanup pipeline has three levels:
| Level | Behavior |
|---|---|
| Light | Deterministic cleanup, applied locally — no LLM. |
| Medium | Runs the Light pass first, then sends the result to the configured LLM provider with a built-in readability prompt. |
| High | Runs the Light pass first, then sends the result to the configured LLM provider with a built-in concise-prose prompt. |
Medium and High always run the deterministic Light pass first, then send that lightened text to your configured LLM providers for the LLM pass. They use built-in system prompts baked into the cleanup service — Medium improves readability while preserving meaning, facts, tone, and terminology; High rewrites the text as concise, polished prose. If no provider is available, or the LLM call errors, both fall back to the deterministic Light result so cleanup never blocks dictation.
These built-in cleanup prompts are distinct from the seeded Auto Clean Up Text Prompts & AI actions action — that action is a separate, user-editable prompt; the Medium/High prompts are fixed in code.
The Light pass (CleanupService.CleanLight) is the local, no-LLM stage that Light always uses and Medium/High run first. It handles:
- Filler removal ("um", "uh", "er", "you know") and abandoned leading/trailing noise.
- "Scratch that" / self-correction backtracks ("X actually Y", "I mean") applied in place.
- Spoken punctuation ("comma", "period" / "full stop", "question mark", "exclamation mark/point", "colon", "semicolon"), applied only where the surrounding word context fits.
- Spoken numbers and bulleted / numbered list formatting when clearly signalled.
- Basic sentence casing and whitespace tidy-up.
Separately from the cleanup levels above, a deterministic post-processing step converts spoken numbers into digits before text is inserted or exported:
| Spoken | Result |
|---|---|
| "twenty three" | 23 |
| "dreiundzwanzig" | 23 |
| "veintitrés" | 23 |
It is controlled by Normalize spoken numbers to digits in Settings → Dictation and is on by default. Parsers ship for English, German, and Spanish only; other transcription languages pass through unchanged.
The parser is deliberately conservative — it won't rewrite text that is already adjacent to digits, and it leaves bare scale words alone — so ordinary prose isn't mangled. Because it runs as its own stable-ordered pipeline step, it applies at every cleanup level, including None, and to file-transcription and recorder output as well as dictation.
When a profile sets a translation target (see Profiles), the translation step must succeed for the dictation to complete. If the translation fails, the dictation is aborted and nothing is inserted — the untranslated source text is never emitted as a silent fallback. This mirrors how the LLM cleanup step is guarded.
Style presets bundle a cleanup level plus formatting flags per profile, so each Profiles context can dictate-and-format differently. Each preset resolves to a cleanup level plus a smart formatting flag (enables the spoken-punctuation / spoken-number / list formatting in the Light pass), a developer formatting flag, and a terminal-safe flag:
| Preset | Cleanup level | Flags |
|---|---|---|
| Raw | None | — |
| Clean | Light | smart formatting |
| Concise | High | smart formatting |
| Formal email | Medium | smart formatting |
| Casual message | Light | smart formatting |
| Developer | None | developer formatting |
| Terminal-safe | None | developer formatting + terminal-safe |
| Meeting notes | Medium | smart formatting |
Each preset can also carry optional cleanup-level and developer-formatting overrides on a per-profile basis, letting you force a different level or developer behavior than the preset's default. See Profiles for the per-profile override controls.

Developer-safe formatting (DeveloperFormattingService) converts spoken symbols, casing commands, and code tokens into code-friendly output, so dictation is usable in editors and terminals where literal symbols and specific casing matter. It covers:
-
Casing commands —
camel case ...,snake case ...,kebab case ...rewrite the following words ascamelCase,snake_case, orkebab-case. -
Spoken email addresses — "x at y dot com" becomes
x@y.com. -
Dotted code tokens — "foo dot bar" becomes
foo.bar(and numeric "two plus two" / "five minus one" become2+2/5-1). -
Symbol map — pipe
|, slash/, backslash\, brackets[ ], braces{ }, parentheses( ), single/double quotes' ", at@, hash#, dollar$, ampersand&, star*, colon:, semicolon;, comma,, underscore_, equals=, and "dash dash" →--.
These voice commands are parsed at the end of a dictation and carried out:
| Suffix | Effect |
|---|---|
press enter |
Sends Enter after the text. |
new paragraph |
Starts a new paragraph. |
new line |
Starts a new line. |
cancel |
Cancels the dictation. |
Spoken file references such as "at file dot ts" are mapped to file tags for editor and IDE workflows.
This mirrors the maintainer's daily-driver setup, tuned to feel as close to Wispr Flow as possible on Linux.
| Piece | What to use |
|---|---|
| LLM server | An OpenAI-compatible LLM server (Ollama). |
| Model |
mistral-small:24b. |
| Prompt | The seeded Auto Clean Up Text prompt action drives the cleanup. |
| Profile | The seeded Auto Format profile binds that prompt action to a hotkey (Ctrl+Alt+E), so dictation goes straight through cleanup before it is inserted. |
Both the Auto Clean Up Text prompt and the Auto Format profile ship seeded but disabled on a fresh install. Turn them on and point the cleanup at your own LLM. See LLM providers for configuring the OpenAI-compatible provider, and Prompts & AI actions for the prompt action and palette.
The seeded Auto Clean Up Text system prompt steers a general-purpose LLM to clean dictation the way Wispr Flow does, treating the dictation strictly as data to format — never as a request to answer. Its design:
- Treats the dictated text as raw data to clean and format, not as a question or instruction — a dictated question stays a question; a dictated command stays text. It never answers, decides, follows, or adds information.
- Strips filler words ("um", "uh", "like", "you know"), false starts, repeated words, and abandoned fragments.
- Applies spoken self-corrections in place ("actually", "I mean", "no wait", "scratch that"), swapping only the changed word or phrase and keeping the rest of the sentence intact.
- Fixes capitalization, punctuation, grammar, and spacing, and breaks long text into readable paragraphs at natural topic changes.
- Preserves your meaning, wording, and tone exactly — keeps contractions and casual words, and never expands or formalizes phrasing; never drops meaningful words such as trailing tag questions ("right?", "okay?").
- Detects message/email context (greeting, recipient, sign-off) and formats it as a message with natural paragraphs.
- Carries out spoken formatting commands and then deletes the command words — writing spoken numbers as digits, inserting spoken punctuation ("period", "comma", "question mark", "exclamation point"), and formatting bulleted/numbered lists only when clearly signalled.
The canonical copy lives in code at src/TypeWhisper.Core/Services/FirstRunDefaults.cs (AutoCleanupSystemPrompt), mirrored in docs/prompts/auto-clean-up-text.md.

- Prompts & AI actions — prompt actions, provider overrides, and the prompt palette.
- LLM providers — configuring the OpenAI-compatible (Ollama) provider that Medium/High cleanup and the cleanup prompt run against.
- Profiles — binding a cleanup style preset and prompt action to a context.
| Date | Change |
|---|---|
| 2026-06-17 | Initial version. |
| 2026-06-17 | Added cleanup, style-preset, and system-prompt screenshots. |
| 2026-06-17 | Removed unused screenshot placeholders. |
| 2026-06-17 | Added style-preset resolution table and smart-formatting flag, documented the built-in Medium/High prompts and Light-first/fallback behavior, attributed deterministic formatting to the Light pass, and expanded developer-safe formatting (casing, emails, code tokens, symbol map). |
| 2026-07-27 | v0.12.1: documented the deterministic spoken-number normalization step (en/de/es, on by default) and that a failed translation aborts the dictation instead of emitting the source text. |
Home · Repository · Issues · Releases · GPLv3
TypeWhisper for Linux is a community Linux port. Each page lists its own change history in the Changelog section above.
Getting Started
Using TypeWhisper
- Dashboard
- Dictation
- Global Hotkeys
- Text Insertion
- File Transcription
- Recorder
- History
- Dictionary & Term Packs
- Snippets
- Profiles
- Prompts & AI Actions
- Text Cleanup & Formatting
- Long-term Memory
Settings
Plugins
Automation
Platform & Troubleshooting
Project