WinSTT logoWinSTT

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.

Searchable local history, activity stats, and karaoke playback for saved recordings.

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:

One entry per finished transcription, appended to userData/history.json.
FieldDescription
textThe final text (after LLM cleanup, if a Dictation feature ran).
originalTextThe pre-LLM text. Present only when an LLM transformed the result; omitted otherwise.
timestampWhen the transcription completed.
durationMsHow long the spoken audio was.
wordCountNumber of words in the final text.
audioFilePathPath to the saved WAV, when a recording was kept (see Retention below).
idStable 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.

The Overall Stats hero row at the top of the history tab: a semicircular Overall WPM gauge, an AI Impact card listing Fixes made, Words corrected, and Dictionary fixes, and a Total Words card with a recent-trend sparkline plus Transcriptions and Speaking Time.
The three hero cards recompute against the selected date range, not 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 ImpactFixes 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 <1s under 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:

151.4
Overall WPM
48,300
Total Words
1,250
Transcriptions
3h 12m 40s
Speaking Time

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.

  1. 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.

  2. 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.

  3. 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.

The Daily Activity block: a day-streak banner with a longest-streak figure, a GitHub-style yearly contribution graph, and the interactive calendar grid below it with a Metric selector and a Calendar selector.
A streak banner and yearly contribution graph above the interactive calendar. Click a day in the calendar to start a range; the Metric and Calendar selectors are session-only.
Metricdefault transcriptions

Choose what drives the color intensity: transcriptions (entry count), words, or wpm. Session-only — not persisted between visits.

Calendardefault gregorian

Render 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:

The selected range filters the Overall Stats hero, the usage breakdowns, the Voice Profile, and the Transcriptions table. Ranges are session-scoped — they reset when you reopen the tab.
PresetWindow
TodayCurrent day, local time
YesterdayPrevious day
Last 7 daysRolling 7-day window
Last 30 daysRolling 30-day window
This month1st of the current month → today
Last monthFull previous calendar month
Month to date1st of the current month → now
Year to dateJan 1 of the current year → now
Last yearFull 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).

The searchable history table: timestamped rows of transcribed text, each with a metadata strip (time, words, duration, WPM, model) and copy/delete buttons; rows with a saved recording show a play button on the left.
Newest-first rows with copy, delete, and — when a recording exists — a play button that drives the karaoke word highlight.
Copy

Copies the final text; the icon flips to a check for 1.6 s.

Copy original

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).

Delete

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.

The Max History Entries stepper and the Recording Retention selector at the bottom of the history tab — the only two persisted settings here.
The two persisted controls: a Max History Entries stepper and the Recording Retention selector.
Max History Entriesdefault 1000
general.historyMaxEntries

A 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.

Recording Retentiondefault cap
general.recordingRetention

How 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

Expected behavior that can look like a bug at first glance.
What you seeWhy
No play button on a rowAudio capture was off, the source was cloud STT, or the recording was deleted or aged out by retention.
“Copy original” is disabledNo LLM ran on that entry, so there's no pre-LLM originalText to copy.
A late-night session lands on the previous dayDate-range and heatmap boundaries are computed in local time, not UTC.
A quiet month still shows contrastHeatmap colors are relative to your busiest day in the 365-day window, not an absolute per-day count.

On this page