Transcription History
A local dashboard of everything you've dictated — an Overall Stats hero, usage breakdowns, a daily-activity contribution graph, a Voice Profile, a searchable log, and karaoke playback of saved recordings.
Every completed transcription lands in a local dashboard you can search, filter, and play back — word-by-word — without anything leaving your machine. Open it from the Settings window → Transcription History tab; it updates the moment a dictation finishes.
The tab is a single scrollable page in this order: an Overall Stats hero, a Transcription models usage breakdown, a Content categories usage breakdown, a Daily Activity block (streak banner, contribution graph, and interactive calendar), a Voice Profile, the Transcriptions table, a Transformations table, and Limits & Retention.
Everything stays on disk
Transcribed text persists to userData/history.json; optional recordings live in
userData/recordings/ (16 kHz mono PCM WAV). Both stay local — nothing is uploaded, and
you can clear or delete entries at any time.
What gets recorded
Each finished transcription is appended as one entry:
| Field | Description |
|---|---|
| text | The final text (after LLM cleanup, if a Dictation feature ran). |
| originalText | The pre-LLM text. Present only when an LLM transformed the result; omitted otherwise. |
| timestamp | When the transcription completed. |
| durationMs | How long the spoken audio was. |
| wordCount | Number of words in the final text. |
| audioFilePath | Path to the saved WAV, when a recording was kept (see Retention below). |
| id | Stable identifier, used to de-duplicate. |
Overall Stats
The hero row at the top of the tab is three cards. Everything here aggregates whatever is currently in view — it recomputes against the active date range rather than the whole history.

- Overall WPM — a semicircular gauge of your aggregate speaking rate,
total words × 60,000 ÷ total ms. Shows—when the in-range duration is too short to be meaningful. - AI Impact — Fixes made is the headline; below it sit Words corrected and Dictionary fixes. These count what LLM cleanup and your dictionary changed across the entries in range.
- Total Words — the sum of every entry's
wordCount, headline, with a recent-trend sparkline beneath it and two mini-rows: Transcriptions (entry count in range) and Speaking Time (total spoken duration,Xh YYm ZZs, or<1sunder one second).
The sparkline reads recent activity, not the selected range
The Total-Words sparkline plots the last 30 days of daily word totals from the full history, so it stays a stable "recent activity" signal even when you filter the rest of the tab to a past window.
The headline figures in plain numbers:
Usage breakdowns
Two horizontal-bar sections sit below the hero, each one labeled track per category filled to its share of the in-range total. A section only appears when it has data.
- Transcription models — which STT model produced each entry.
- Content categories — the dictation LLM's content tag for each entry (Code, Email, Meeting…), with anything uncategorized grouped under Other.
Daily Activity
This block stacks three habit views. The streak banner and the contribution graph read your full history (they're all-time habit signals); only the interactive calendar below them drives the date range.
Streak banner
A flame and your current day streak as the focal number, with Longest streak sitting quietly to the right as the personal best to beat.
Contribution graph
A read-only GitHub-style yearly grid — Sunday-started week columns, Mon/Wed/Fri row labels, month labels along the top — shaded on a teal ramp. Hover a cell for the date and word count.
Interactive calendar
The same year of activity, but clickable: this is where you pick a date range to filter the tab.
The interactive calendar is a GitHub-style grid over a rolling 365-day window from today, with weeks starting on Sunday and five intensity levels. Days with zero activity are dimmed and not selectable.

transcriptionsChoose what drives the color intensity: transcriptions (entry count), words, or wpm. Session-only — not persisted between visits.
gregorianRender the grid on the gregorian or hijri calendar. Session-only.
Day boundaries are computed in local time, so a late-night session stays on the day you actually spoke it instead of splitting across a UTC midnight. Intensity is scaled relative to your busiest day in the 365-day window, not an absolute count — a quiet month still shows contrast.
Date range
Click a day to start a range, click another to end it; the range bar with the formatted dates and a Clear button appears while a manual range is active. Or pick one of nine preset chips:
| Preset | Window |
|---|---|
| Today | Current day, local time |
| Yesterday | Previous day |
| Last 7 days | Rolling 7-day window |
| Last 30 days | Rolling 30-day window |
| This month | 1st of the current month → today |
| Last month | Full previous calendar month |
| Month to date | 1st of the current month → now |
| Year to date | Jan 1 of the current year → now |
| Last year | Full previous calendar year |
Voice Profile
A personality snapshot of the in-range history, computed entirely on your machine — no LLM. Four tiles:
- Most used word — the word you lean on most, with its count.
- Catchphrase — your distinctive runner-up word.
- Most corrected word — the word the AI fixes for you most often.
- Peak time — the weekday and hour you dictate most.
Any tile with no data shows —.
Transcriptions
A scrollable list sorted newest-first. Each row carries the transcribed text, action buttons, and a metadata strip showing time, words, duration, and — when available — WPM and the model that produced it. Lists under 50 entries render directly; longer ones virtualize for smooth scrolling, capped at a 460 px scroll area.
A play button appears on the left of a row only when that entry has a saved recording. Other rows have no play button (see the gotchas below).

Copies the final text; the icon flips to a check for 1.6 s.
Right-click a row to also copy the pre-LLM originalText — useful for comparing raw vs.
cleaned-up output. Disabled when the entry has no original (i.e. no LLM ran on it).
Removes the entry and its WAV recording in one step.
Karaoke playback
Press play and the audio streams while the matching words highlight in sequence — the highlight sweep is the progress bar; there is no separate scrubber. Audio and per-word timings load lazily on the first play of each entry.
Playback routes through the output device set in Audio settings; if that device is unavailable it falls back to the system default. Word timings are computed on demand by a tiny timestamped-Whisper aligner (~40 MB, CPU) using cross-attention DTW, with a VAD-based fallback — alignment takes roughly 100–200 ms per clip and isn't cached, so it recomputes each play. If alignment fails, the clip still plays; it just won't highlight word-by-word.
Transformations
A separate table, in the same row style as the Transcriptions table, logs text transforms — selections you reshaped with a WinSTT-tree hotkey rather than dictated fresh. These rows carry no audio stats, so they have no play button and no recording. The table header has its own Clear action, and rows can be deleted individually.
Limits & Retention
These two controls live at the bottom of the tab and are the only persisted settings here.

1000general.historyMaxEntriesA stepper from 10 to 10,000. When you exceed the limit, the oldest entries are trimmed automatically. The store is hard-capped at 10,000 entries regardless.
capgeneral.recordingRetentionHow long saved WAV recordings are kept before cleanup. Options: When over limit (cap,
default), Keep forever (never), 3 days (days3), 2 weeks (weeks2), and
3 months (months3). Cleanup runs at app startup, when you change this setting, and on
an hourly sweep.
“Keep forever” still saves — retention only governs cleanup
Recordings are always saved when audio capture is on. The retention setting only
decides when they get cleaned up, never whether they're written. So “Keep forever”
(never) means exactly that — keep them indefinitely — not “don't save.” If you want
recordings purged aggressively, pick 3 days or When over limit; if you never want a
recording on disk at all, that's a separate audio-capture decision, not a retention value.
Cloud STT keeps text, not audio
When you transcribe through a cloud provider (ElevenLabs or OpenRouter), the text is still logged, but no audio is saved to disk — so those rows never show a play button. Saved recordings only exist for local transcriptions with audio capture enabled.
Clearing history
The Clear action in the Transcriptions table header wipes every stored entry and its recordings; the Transformations table has its own independent Clear.
Clearing is permanent
Clearing prompts for confirmation, then deletes all entries and their WAV files with no undo. Deleting a single row is likewise immediate and final.
Gotchas
| What you see | Why |
|---|---|
| No play button on a row | Audio capture was off, the source was cloud STT, or the recording was deleted or aged out by retention. |
| “Copy original” is disabled | No LLM ran on that entry, so there's no pre-LLM originalText to copy. |
| A late-night session lands on the previous day | Date-range and heatmap boundaries are computed in local time, not UTC. |
| A quiet month still shows contrast | Heatmap colors are relative to your busiest day in the 365-day window, not an absolute per-day count. |
Related
General settings
Recording modes and the broader behavior switches that surround history.
Audio & playback device
Pick the output device used for history playback and the input device for capture.
LLM cleanup
What populates an entry's pre-LLM originalText versus its final text.
Cloud STT
Why cloud transcriptions are logged but never save a recording.
Text-to-Speech
Read any selected text aloud with the on-device Kokoro-82M voice — 54 voices across 9 languages, all synthesized locally.
Dictionary
Teach WinSTT the names, jargon, and brands it keeps mishearing — corrected in context by your LLM cleanup pass, or by an on-device language model when cleanup is off.