Releases: csmashe/typewhisper-linux
Release list
v0.13.0
TypeWhisper Linux v0.13.0
TypeWhisper Linux 0.13.0 is a feature release built around learning from the
way you actually fix your dictation. When you type over a dictated word in
another app to correct it, TypeWhisper can now notice that edit and silently
learn the correction — Wispr-Flow style, without lifting a finger — then apply
it to every dictation that follows. A short toast tells you what was learned and
offers Undo, so nothing is learned behind your back.
The release also carries a large reliability and hardening sweep: a
lock-screen gate on the Wayland keyboard reader, fail-closed privileged setup
scripts, atomic writes across every user-data store so a crash mid-save can no
longer truncate your dictionary or snippets, a settings-restore path that
refuses to materialize executable code, and a clipboard-paste path that waits
for the paste to actually land before it moves on.
New Features
-
Target-app correction learning (opt-in). Dictate a word, then type over it
in the target app to fix it, and TypeWhisper learns the correction and applies
it to future dictations. After a qualifying insertion it anchors a baseline
read of the focused text field and opens a bounded tracking window; on commit
— focus leaving the app, or a short idle — it diffs baseline against final and
silently saves high-confidence recognition fixes into your [Dictionary]. The
observation is event-driven over AT-SPI (object:state-changed:focusedand
object:text-changedon one persistent D-Bus connection), so there is no
polling, no keyboard hook, and no subprocess per read.It ships off by default — it reads the focused field of other
applications — and is enabled with Learn corrections from other apps in
Settings → Dictation. Learned entries appear in the Dictionary like any
other correction, so they can be reviewed, disabled, or deleted.Several guards keep it conservative: password fields are excluded and fail
closed when the AT-SPI role isPASSWORD_TEXTor can't be determined; a
similarity gate rejects change-of-intent rewrites ("call mom" → "email
dad") while still keeping single-word spelling fixes; a widening guard
stops an idle commit from growing a learned replacement as you keep typing;
and edits that would introduce a line break are rejected outright. Learning
logs are redacted, so raw dictated and corrected text never reaches the trace
log. -
Learned-correction feedback with Undo. When something is learned you get a
brief on-screen confirmation —Learned "teh" → "the", or
Learned 3 correctionsfor a batch — with an Undo action that removes the
whole batch from the dictionary again. It renders as a small toast positioned
near the field you were editing, and falls back to a desktop notification on
tiling window managers where an override-positioned toast doesn't fit the
session. -
Accessibility-bridge setup. GTK apps expose their text regardless, but
Chromium/Electron apps (VS Code, and browsers) and Qt apps only build an
accessibility tree whenorg.a11y.Status.IsEnabledis on — and most
desktops, GNOME included, leave that flag off by default. When correction
learning is enabled and the flag reads as off, Settings → Dictation offers
an Enable accessibility bridge button, plus a Remove accessibility
bridge button afterwards. Removal is only ever offered for a flag
TypeWhisper itself set, and is refused outright while a screen reader appears
to be active. Chromium/Electron apps pick the flag up at launch, so they need
a restart; Qt apps apply it immediately. TypeWhisper also sweeps already-running
Chromium/Electron apps to unlock their trees when learning is turned on.
Reliability and Hardening
Text insertion and paste
- Clipboard paste is verified before
Ctrl+Vis sent. The paste path now
reads the clipboard back (boundedwl-paste) to confirm it actually serves
the dictated text, re-setting it once if not. This establishes a happens-before
chain so GTK processes the selection offer before the keystroke, and closes a
latent bug where a silently-failedwl-copypasted your previous clipboard
contents into the document instead. - The previous clipboard is restored only once the paste has landed, watched
through the AT-SPI text-changed signal armed beforeCtrl+V, rather than after
a fixed delay that could overwrite an in-flight transfer. It falls back to the
existing floor delay when AT-SPI isn't running, and an ownership check avoids
clobbering a clipboard you changed in the meantime. - Auto-enter waits for paste delivery before sending Enter. Previously Enter
was sent immediately afterCtrl+V; because GTK and Wayland targets read the
clipboard asynchronously, Enter could overtake the paste and submit an empty or
stale field, with the dictated text landing in the next message or lost
entirely. No delay is added — the existing floor simply moves ahead of Enter. - Multi-line insertion into terminals routes through clipboard paste, so
embedded newlines can't be delivered as a series of Enter keystrokes that
execute each line.
Session and privileged setup
- The Wayland keyboard reader is gated on session lock. A new
logind-backed session monitor tracks the login session'sActiveand
LockedHintproperties plusLock/Unlocksignals. On lock, evdev reader
file descriptors are closed synchronously (revoked udev ACLs don't affect
already-open fds), modifier and dispatcher key state is reset, and readers
re-enumerate on unlock. Dictation start is rejected while locked, insertion and
spoken commands are suppressed, and an active recording is aborted on lock —
on every backend, including SharpHook/X11. On hosts without logind the previous
always-allowed behavior is kept. - The
input-group fallback now requires proven seat-manager absence. A
failed keyboard-access re-probe on a host that does have systemd-logind or
elogind surfaces an actionable error instead of permanently granting the broad
inputgroup. Genuine non-logind hosts keep the fallback. - Privileged setup scripts fail closed on foreign config. The
ydotool
setup and the evdev udev-rule setup both validate their targets inside the
privileged script immediately before writing — symlink checks, regular-file
checks, and anchored first-line ownership-marker checks, with no separate
preflight to race. Foreign files are never truncated; refusals surface as
localized errors. Removal re-validates ownership beforerm, so a foreign file
that merely mentions the marker mid-body is no longer deleted. - Firefox accessibility setup preserves foreign
force_disabledprefs,
restoring what was there rather than overwriting it.
Your data on disk
- Every user-data store now writes atomically with rollback on failure —
dictionary, history, profiles, prompt actions, snippets, plugin settings and
secrets, and File Memory. A crash or a full disk mid-save can no longer leave a
truncated file behind. - A failed or canceled load no longer wipes the store. Plugin settings and
File Memory previously treated an unreadable file as "empty" and then saved
that emptiness over the original. - Recorder captures and watch-folder exports write to collision-safe paths
and commit atomically; watch-folder sources are deleted only after the export
has committed. Stop/save ownership in the recorder is serialized, and save
failures now report rather than passing silently. - Settings restore refuses to materialize executable code. Every archive
entry is validated before anything is extracted: entries underPlugins/,
entries outside the exporter's allowlist (settings.json[.bak],
linux-preferences.json,Data/,PluginData/), and a missing, malformed, or
oversized manifest each abort the whole restore with a localized error, writing
nothing. Executables (.dll/.soincluding versioned sonames/.dylib/.exe)
are never written — a plugin runtime installer trusts a file already on disk
without re-verifying its checksum, so a crafted native library would otherwise
run at next launch. Restore no longer writes to thePlugins/directory at
all, and backup no longer exports executables either. - The data directories are forced to mode
0700.Directory.CreateDirectory
honors the umask, so a0002umask left the tree group-writable — and write
access to a parent is what governs renaming its children, so a peer account
could swap out a child directory.AudioPathis clamped separately so
recordings stay owner-only even if the base path is later loosened. Startup
fails closed: it stops, naming the path and thechmodthat fixes it, only
when group or other access is actually present on read-back — not merely when
chmodthrew, since FAT and some CIFS mounts acceptchmodand silently
ignore it. - Plugin assets migrate from the sibling default root when you move the model
storage location, instead of being left behind.
Startup, shutdown, and transcription
- App exit runs through an awaited async teardown path, so shutdown can no
longer deadlock the UI thread. - Watch-folder auto-start is deferred and guarded, so a stale or unreachable
watch path can't block app startup; a failed start now reports why. - Profiles live-context polling moved off the dispatcher and runs only while
the section is visible. - Stop and cancel requests that race recording startup are remembered and
honored, instead of being dropped and leaving a recording running. - A streaming finalize deadline now fails over to batch transcription rather
than losing the utterance. - An LLM stream that hits EOF without a terminal frame is treated as a fault
instead of being accepted as a complete, truncated response. - *...
v0.12.1
TypeWhisper Linux v0.12.1
TypeWhisper Linux 0.12.1 is a maintenance and feature-refinement release. It
adds spoken-number normalization so dictated numbers land as digits, an
"Automatic (follow system default)" microphone mode that tracks your
system's default input device live — even mid-session — and it stops a failed
translation from silently inserting untranslated text. It also fixes uninstall
and in-place reinstall destroying your data, so your recordings, history, API
keys, and installed plugins now survive an update.
New Features
- Spoken-number normalization. A new post-processing step converts spoken
numbers into digits before text is inserted or exported — "twenty three"
becomes "23", "dreiundzwanzig" becomes "23", "veintitrés" becomes "23" — for
English, German, and Spanish. It runs as a stable-ordered pipeline step
and is on by default, with a Normalize spoken numbers to digits toggle
in Settings → Dictation. The parser is conservative: it won't rewrite text
that's already adjacent to digits, and it leaves bare scale words alone, so
ordinary prose isn't mangled. All strings are localized across English,
German, Spanish, and Russian. - Follow the system default microphone. The input-device picker gains an
Automatic (follow system default) option. When selected, TypeWhisper uses
whatever your desktop's default input device is and migrates live when that
default changes — plugging in a headset or switching devices in your sound
settings moves dictation over without a restart. The migration is
in-flight-safe: it never tears down an active capture stream, deferring the
switch until the current recording finishes. Default-device changes are
detected through a debouncedpactl subscribewatcher that falls back
gracefully whenpactlisn't installed.
Fixes
- A failed translation no longer inserts the untranslated source text. When
a translation target was set and the translation step failed, the error was
silently swallowed and the original, untranslated text was inserted anyway.
The pipeline now requires the translation step to succeed (mirroring the
existing LLM-cleanup guard) and aborts the dictation on failure instead of
emitting source text. - Uninstall and in-place reinstall no longer destroy your data. The
uninstaller previouslyrm -rf'd the entire XDG data directory — taking your
recordings, history, plugin API keys, and user-installed plugins with it — and
an in-place reinstall/update hit the same wipe. Uninstall now removes only the
app payload by default and preservesAudio/,Data/,PluginData/,
Plugins/, and your settings. Pass--purge(or--all) to
uninstall-linux-app.shwhen you do want a full removal.
Notes
- Spoken-number normalization ships parsers for English, German, and Spanish
only; other transcription languages pass through unchanged. - The live mid-session microphone switch depends on your system's
PipeWire/PulseAudio default-device signalling viapactl; withoutpactlthe
Automatic mode still resolves the default at the start of each recording, it
just can't migrate a stream already in flight.
v0.12.0
TypeWhisper Linux v0.12.0
TypeWhisper Linux 0.12.0 is a feature release built around voice-native
editing and transparency. You can now steer the app by voice — start a
dictation with a keyphrase ("TypeWhisper") and the rest is treated as a
command that edits your highlighted text or writes new text at the cursor,
rather than being typed out verbatim. And a new Inspect panel in History
lets you see exactly what was sent to the LLM for any entry — the raw→final
word diff, the exact prompt, the injected memory context, and the model's
reply — with local-vs-cloud labelling so you can tell what left the machine.
New Features
- Spoken command mode ("TypeWhisper" keyphrase). Every dictation is
checked for a spoken keyphrase prefix (default "TypeWhisper", editable in
Settings → Prompts, and it ships disabled). When the keyphrase is
present, the remainder is treated as a command: a lightweight LLM classifier
decides whether you meant to edit the current selection or create new
text, picks a matching saved prompt action if one fits, then transforms your
highlighted selection or generates fresh text at the cursor — streaming the
result into the overlay. Keyphrase matching is fuzzy and speech-to-text
tolerant (a slight mishearing like "type whisper" still matches), but tightens
as extra words fold in so ordinary dictation isn't swallowed as a command. A
create command never fires a copy, so it's safe in a terminal; an edit in a
terminal usesCtrl+Shift+Cinstead ofCtrl+Cso it copies the selection
instead of sending SIGINT. You can point commands at a specific model with the
Command model picker, or leave it on your default provider. - LLM context transparency — the History Inspect panel. Each History entry
gains an Inspect / view source panel that shows exactly what was sent to
the LLM: a word-level raw→final diff, and one provenance card per LLM call
with its stage (prompt action, cleanup, translation, or memory extraction),
the provider and model, a local-vs-cloud badge, the exact system and user
prompts, any injected memory context, and the model's response.
Provenance is captured at every LLM chokepoint, so the panel never
under-reports what left the machine. Capturing full prompts and injected
memory is more sensitive than the plain transcript, so it is opt-in: turn
on Capture LLM prompt provenance in Advanced settings (default off).
When it's off, the panel tells you so — and how to turn it on — rather than
looking as if no LLM ran. - Spoken commands are recorded in History. Commands run through the
keyphrase path now write a proper History entry with a violet "Command"
badge, so they're recognizable at a glance while the entry preview still shows
the result. The raw→final diff reads source text → result (the selected
text for an edit, the command for a create), and the LLM request/response is
captured for the Inspect panel like any other entry. Only commands that
actually landed are saved; cancels and failures are not.
Maintenance
- CI / packaging. Bumped
actions/checkoutv6 → v7 across all workflows,
andpublish-plugins.ymlnow packages a plugin'sScripts/directory
(failing closed if a plugin ships scripts that don't reach staging) so
local-model plugins publish with their runtime scripts. - Groq plugin bumped to 1.0.3 (version sync). The upstream Windows-only AAC
codec fallback was skipped — it doesn't apply on Linux, where Groq is sent raw
WAV. - A stock-hallucination filter now drops the "thank you"-style artifacts
Whisper emits on near-silent audio, and a shared string-distance helper backs
the fuzzy keyphrase matcher.
Notes
- All new interface strings are translated across English, German, Spanish,
and Russian. - Spoken commands can't read a selection that a TUI editor keeps internal (for
example a Neovim visual selection), because no OS-level copy can reach it; in
that case the command reports that clearly instead of acting on stale
clipboard contents.
v0.11.1
TypeWhisper Linux v0.11.1
TypeWhisper Linux 0.11.1 is a maintenance and bug-fix release. It rides on top
of a large internal code-cleanup pass, but the user-facing substance is a set of
fixes: it stops a corrupt prompt-actions file from wiping your saved prompts,
fixes plugins that only saved half of their settings, and prevents settings from
failing to load on a null value. It also smooths out first-run plugin install,
the Shortcuts tab, Firefox accessibility setup, and the translation target
picker, and surfaces many previously-silent failures in the in-app Error Log.
New Features
- Error Log category filter. About → Error Log gained a filter dropdown so
you can narrow the log to a single category, with an All categories option
and a notice when the selected category is empty. - More failures now surface in the Error Log. Errors that were previously
only written to trace output now appear in the in-app log: microphone /
recording start and preview failures, transcription-model-load and
transcription failures, plugin load and activation failures, prompt-action
load/save failures, and a new window-detection category. Fewer failures
now happen silently.
Fixes
- Fixed a corrupt or unreadable prompt-actions file wiping your saved prompt
actions. On a parse failure the in-memory cache was emptied, and the next
add or edit then overwrote the file on disk with that empty set. A load failure
now blocks writes so the existing file is preserved, and a blank file is
treated as "no actions yet" instead of corruption. - Fixed plugins that expose both a settings form and a settings collection
saving only one of them. The save path matched just the first interface, so a
plugin implementing both (for example the OpenAI-compatible plugin) silently
persisted either its scalar fields or its collection edits but not both. Each
is now saved independently. - Fixed settings failing to load when the app-insertion-strategies map is
null. A null JSON value made the dictionary copy-constructor throw during
deserialization; it now falls back to an empty map. - Fixed the Shortcuts tab stalling for about half a second when opened. The
keyboard-access probe (which opens every/dev/inputkeyboard node) was
running synchronously while the page rendered. It is now probed once off the UI
thread and cached, and re-checked each time the section is shown so the
no-access banner reflects access granted during onboarding instead of a stale
startup result. - Fixed first-run plugin auto-install not retrying after an offline or failed
launch. The "first run completed" flag was saved unconditionally, so a failed
registry fetch left you permanently with no auto-installed plugins. The flag is
now only set when nothing failed. - Fixed a system-command availability probe hanging past its timeout. Output
was read before the 500 ms wait, so a wedged child process that never closed
its output could block indefinitely; output is now drained asynchronously and
the process is killed on timeout. - Fixed Firefox accessibility setup being misdetected as already configured.
Two regex bugs are corrected: the existing-preference check missed the line
unless it sat at the very start of the file, and the "installed by TypeWhisper"
check matched on the marker comment alone — reporting the entry as installed
even after its preference line was gone, which Revert could then not remove. - Fixed the first model download or delete throwing a NullReferenceException.
Cancelling viaawait …?.CancelAsync()evaluated to awaiting a null task when
the cancellation source had not been created yet; it is now null-guarded. - Fixed the translation target picker listing languages it cannot produce.
The global and per-profile target dropdowns offered every catalog language,
including ones with no installed model that silently did nothing when picked.
The list is now derived from the models that actually exist. - Fixed a cross-thread crash risk in the Error Log view. Log entries can be
raised from background threads (transcription, detection, the plugin host); the
About view now marshals to the UI thread before updating its bound list. - Localized the ydotool probe-failure guidance, which was a hardcoded English
string shown to non-English users.
Plugin API
- The
TextInsertedEventpayload's app field was renamed toAppNameand now
carries the focused window title rather than the process name, matching the
other event payloads. Plugins that read this field will now receive the window
title.
Maintenance
- This release also includes a large internal code-cleanup and hardening pass —
Path.Combine→Path.Joinmigration, static / immutability refactors, extra
error-handling and cancellation guards, and expanded test and documentation
coverage — with no intended change in behavior.
v0.11.0
TypeWhisper Linux v0.11.0
TypeWhisper Linux 0.11.0 hardens the on-demand GPU runtime introduced in
0.10.0. It adds an in-app way to recover from a corrupted CUDA cache, makes the
large GPU downloads resumable and resilient to stalled connections, and fixes
CPU/GPU backend switching so it only asks for a restart when one is genuinely
needed. It also fixes a model-download status that could stay pinned at 100%
instead of flipping to Ready.
New Features
- Added a Clear GPU runtime action to the Dictation page that deletes the
cached CUDA runtime so the next launch re-provisions it from scratch. A cached
runtime library is never re-fetched once present (SHA-256 is only verified on a
fresh download), so a corrupt cached library would otherwise silently degrade
to permanent CPU fallback with no in-app repair. The button appears once a
provisioning engine has a runtime cached (mutually exclusive with Download
CUDA runtime), runs the deletes off the UI thread, and clears both the
engine's own GPU build and the shared CUDA math-library cache — attempting both
even if the first fails — so the actually-corrupt set is always removed. A
restart is still required to re-download, because libraries already loaded this
session are held until the process exits; after a successful clear the app
suppresses the re-download prompt until the next launch.
Improvements
- Large GPU artifact downloads (the sherpa-onnx GPU tarball, the whisper.cpp
CUDA package, and the CUDA wheels) are now resumable and watchdog-guarded.
Each download streams into a stable.partialstaging file with range-based
resume, so an interrupted multi-gigabyte fetch picks up where it left off
instead of starting over, gated behind a full-file verification so a corrupt
prefix can never be re-appended. A per-read idle watchdog aborts a half-open
socket in seconds rather than hanging on the long HTTP timeout ceiling, and a
30-second connect timeout bounds a connection that never establishes. A resumed
sherpa model download now starts its progress bar at the real on-disk position
instead of zero. - Because the CUDA cache is shared across both bundled plugins and can be touched
by two app processes at once, each download-and-extract critical section is now
guarded by a cross-process advisory file lock plus an already-installed
re-check, replacing an in-process lock that was duplicated per plugin assembly.
Fixes
- Fixed CPU↔CUDA backend switching falsely reporting "Restart TypeWhisper to
apply" when no restart was actually required. The pinned native runtime is now
tracked separately from the effective compute backend, so a recoverable
GPU-context fallback (a CUDA-pinned runtime running CPU compute) no longer asks
for a restart, while a poisoned native-library load or a provisioning failure
still does. The sherpa-onnx engine also no longer wires the CUDA ONNX Runtime
into a process that has switched away from CUDA mid-download. - Fixed a model that had just finished downloading sometimes staying pinned at
100% and never flipping to Ready. A late asynchronous download-progress
callback could fire after the load path had set the terminal Ready status and
overwrite it with a stale "downloading (100%)"; the download progress handler
is now gated so it stops reporting once the download has returned.
v0.10.0
TypeWhisper Linux v0.10.0
TypeWhisper Linux 0.10.0 is the GPU-acceleration release. NVIDIA CUDA now
accelerates both bundled local transcription engines — whisper.cpp and
sherpa-onnx (Parakeet, Canary) — and the GPU runtime is fetched on demand the
first time you select it instead of being shipped in every package, which cuts
the installed size by roughly two-thirds (about 650 MB to 210 MB). It also adds
the full Large V3 whisper.cpp models for cleaner short-cue handling, and
replaces the Wayland global-hotkey input-group requirement with a narrower
keyboard uaccess udev rule that takes effect immediately — no logout or
reboot.
New Features
- Added on-demand NVIDIA CUDA acceleration for the sherpa-onnx engine
(Parakeet TDT 0.6B and Canary 180M Flash), alongside the existing whisper.cpp
CUDA path. Both engines share an on-demand CUDA runtime provisioner: GPU
binaries are never bundled into the packages — they are fetched on first CUDA
use (SHA-256 verified) and cached under
~/.local/share/TypeWhisper/Runtimes/. Only the CUDA libraries you are
actually missing are downloaded, so a partial-CUDA host fetches just the gaps.
A Download CUDA runtime action on the Dictation page triggers the fetch
with progress; the engine pins its native provider per process, so switching
between CPU and CUDA takes effect after a restart, and any host without an
NVIDIA GPU stays on CPU with a clear status. - Added the full Large V3 whisper.cpp models to the catalog:
large-v3
(f16, ~3.1 GB) andlarge-v3-q5_0(~1.1 GB). These run the full 32-layer
large-v3decoder rather thanlarge-v3-turbo's distilled 4-layer decoder —
more accurate but heavier, a good fit when you have GPU headroom. The ~3 GB
f16 model fits an 8 GB GPU such as a GTX 1070, with the q5_0 variant offered
as a ~1 GB option. - Wayland global hotkeys no longer require joining the
inputgroup. The
first-run setup installs a keyboard-scopeduaccessudev rule at
/etc/udev/rules.d/61-typewhisper-input.rulesthat grants the active session
read access to keyboard event nodes immediately — one admin prompt, no logout
or reboot — with aGROUP="input"fallback for init systems without
systemd-logind. The rule is narrower and more secure than the input group
(keyboards only, session-scoped). Setup gates on whether keyboard nodes are
actually openable rather than on group membership, hot-swaps the evdev backend
in-session, and offers the rule to users with stale group membership instead
of forcing a logout.
Improvements
- Added a toggle in Settings → Shortcuts that shows or hides the
compositor-native push-to-talk bind snippets (Hyprlandbindr, Sway
--release), with an explanatory note, for users who prefer compositor
keybindings over reading input devices. - Reframed the Shortcuts banner and the evdev failure message around keyboard
access rather than group membership, and localized the new keyboard-access and
CUDA strings across English, German, Spanish, and Russian. - Documented per-desktop Wayland hotkey setup and the on-demand CUDA model in
the README.
Fixes
- Fixed the global-hotkey backend selector reusing disposed backend singletons:
it now mints a fresh backend per resolve and constructs only the selected one,
so switching backends no longer hands back a disposed instance or leaks the
SharpHook hook.
Removed
- Removed the bundled
Whisper.net.Runtime.Cuda.Linuxnative CUDA library (the
~409 MBlibggml-cuda-whisper.so) from the packages. whisper.cpp's CUDA
backend is now downloaded on demand on first CUDA use instead of shipping in
every build, cutting the installed size from roughly 650 MB to about 210 MB.
v0.9.0
TypeWhisper Linux v0.9.0
TypeWhisper Linux 0.9.0 is the interface-localization release. The whole desktop
UI can now be displayed in English, German, Spanish, or Russian — chosen from a
new Interface Language control in the General section, or left on Auto
(System) to follow your OS locale — and the language switches live, with no app
restart. Plugins localize their own settings panels too, so transcription-engine
and LLM-provider settings render in the same language as the rest of the app.
New Features
- Added an Interface Language setting to the General section. Choose Auto
(System), English, Deutsch, Español, or Русский; the change
applies immediately and re-renders every screen, dialog, and status message
without restarting the app. Auto (System) follows the OS UI locale captured
once at startup and falls back to English when the system language isn't one of
the shipped translations. - Localized the entire Linux desktop interface. New
Resources/Localization/{en,de,es,ru}.jsoncatalogs back every settings
section — Dashboard, Dictation, Shortcuts, Text insertion, File transcription,
Recorder, History, Dictionary, Snippets, Profiles, Prompts, Plugins, General,
Appearance, Advanced, and About — plus the first-run Welcome wizard, with
English as the fallback for any key a translation is missing. - Plugins now localize their own settings UI. Each bundled plugin ships
Localization/{en,de,es,ru}.json, and a newIPluginLocalizationAwareSDK
interface injects the catalog at load time — before, and independent of,
activation — so even a disabled plugin's settings panel renders localized
labels, descriptions, and validation messages instead of raw keys like
Settings.ApiKey. Plugin names and descriptions in the Plugins list localize
too. - Added Spanish (Español) as a fully supported interface and plugin language, and
extended plugin localization to Russian (Русский), alongside English and German.
Improvements
- Added the
PluginLocalizationExtensionshelpers (loc.L(key)and
loc.L(key, args)) to the plugin SDK so plugin code resolves localized strings
with a null-safe fallback to the key. - Switching the interface language also drives the process culture (used for date
and number formatting), on the current thread and process-wide, so background
work and later-created objects follow the chosen language too.
v0.8.0
TypeWhisper Linux v0.8.0
TypeWhisper Linux 0.8.0 is the provider-profiles-and-storage release. It lets a
single OpenAI-compatible plugin expose several named endpoints — a local Ollama
and a cloud server, say — each selectable as its own transcription engine and
LLM provider in dictation and prompts. It also lets you relocate large local
model assets onto another drive (migrating what's already downloaded), groups
Soniox subtitle output into usable cues, and adds a bulk clear action to the
file-transcription queue.
New Features
- Added OpenAI-compatible provider profiles. The OpenAI-compatible plugin can now
define multiple named endpoints (for example a local Ollama plus a cloud
server), each surfaced as its own selectable transcription engine and LLM
provider in the Dictation and Prompts sections. Per-profile API keys are stored
as host secrets and never echoed to the UI, and each profile's model catalog is
fetched best-effort on save and refreshed when a model dropdown opens. - Added plugin-SDK plumbing for plugins that contribute multiple selectable
roles:IAdditionalLlmProvidersProvider/IAdditionalTranscriptionEnginesProvider,
plusITranscriptionEngineSelectionIdentity/ILlmProviderSelectionIdentity
and theGetTranscriptionSelectionId()/GetLlmSelectionId()extensions.
Model-id build and resolve sites now key off a stable selection ID rather than
the plugin ID, so a normal plugin's existingplugin:{id}:{model}selections
resolve unchanged. - Added a configurable model storage location. Large local model assets
(whisper.cpp / Sherpa / Gemma / Supertonic models and runtimes) can be moved
off the default app-data path onto another drive from a new Model storage
group in the Dictation section, with already-downloaded models migrated to the
new folder. Small per-pluginsettings.jsonstays under AppData so an
unplugged custom drive can't lose plugin config. - Added a Clear finished action to the file-transcription queue. It bulk-removes
terminal items (completed, cancelled, error, unsupported) while leaving queued
and in-progress work running, and only appears when there's something to clear.
Improvements
- Soniox SRT/VTT export now groups word tokens into subtitle-sized cues instead
of emitting one segment per word. Segments split on a pause longer than 0.75s,
at a sentence terminator once long enough, or when a cue exceeds its
character/duration cap; tokens with a non-positive timing range are dropped.
(Soniox plugin bumped to 1.0.3.)
Fixes
- Hardened the model-storage paths: plugin IDs containing path separators are
rejected, and model migration guards against nested-folder recursion. PluginManagernow filters out null providers when folding in the additional
transcription engines and LLMs contributed by multi-role plugins, and model
lookups disambiguate by engine when more than one advertises the same model ID
rather than silently misrouting.
v0.7.7
TypeWhisper Linux v0.7.7
TypeWhisper Linux 0.7.7 is a small fix release for the "while recording" audio
controls. Both Reduce other audio while recording (ducking) and Pause
media playback while recording silently did nothing on Linux — the underlying
commands failed and the errors were only logged to the debug output. Both now
work, and the ducking strength control has been reworked so it no longer
defaults to near-silence. Nothing else changes.
Fixes
- Media pause now actually pauses players. The
playerctlcall was passed
as a single argument string containing single quotes
(--format '{{playerName}} {{status}}'). WithUseShellExecute = falseno
shell strips those quotes, and .NET's argument parser only honors double
quotes, so the format string was split into broken tokens andplayerctl
exited with an error — pausing nothing. The command is now built with
ProcessStartInfo.ArgumentListso each argument is passed verbatim. - Audio ducking now actually lowers other audio. Ducking read each stream's
current volume withpactl get-sink-input-volume <id>, butpactlhas no
such subcommand, so the read always failed, every stream was skipped, and
nothing was ducked. Current volumes are now parsed frompactl list sink-inputsinstead. Both services also forceLC_ALL=Cso the output is
parsed in a stable locale.
Improvements
- The ducking strength control is now "Reduce other audio by %". The slider
previously set the surviving volume fraction on a 0–50% range with a 20%
default. Because PipeWire/PulseAudio volume is perceptual, those low values
map to near-silence (10% ≈ −60 dB, 20% ≈ −40 dB), so even the default nearly
muted other audio. The control now reads as a reduction amount (higher =
quieter) over a 20–90% range, defaulting to a 60% reduction (other audio plays
at 40%, ≈ −21 dB) — a clearly audible duck rather than a mute.
Not Ported From Windows
- Windows release channels and Velopack update-channel controls are not part of
this Linux branch; the Linux app checks GitHub Releases for updates but installs
them manually. - Windows-specific workflow automation and packaging changes remain Windows-only.
v0.7.6
TypeWhisper Linux v0.7.6
TypeWhisper Linux 0.7.6 is a small fix-and-polish release focused on text
insertion and the dictation overlay. Multiline transcripts now keep their line
breaks instead of submitting the text early, and the overlay stays put across
workspaces and recovers its position when your displays change. Nothing else
changes.
Improvements
- Multiline text now inserts as real line breaks. A dictated transcript that
contains newlines is now typed withShift+Enterbetween lines instead of a
bare Enter, so the text lands as a single multiline block rather than being
submitted line-by-line in chat apps, message boxes, and editors. Carriage
returns (CRLF and lone CR) are normalized to LF first, and text without any
newlines is still typed in a single call. Works across thewtype,xdotool,
andydotoolbackends. - The dictation overlay stays visible across workspaces. On X11 the overlay
window is now marked sticky, so it remains on screen when you switch virtual
desktops instead of disappearing with the workspace it was created on.
Fixes
- The dictation overlay recovers its position when displays change. It
previously only repositioned on open, resize, and settings changes, so a
monitor hotplug, resolution change, resume from sleep, or session unlock could
leave it off-screen or stranded on a monitor that no longer exists. It now
re-clamps to a valid work area (or the saved screen) whenever the set of
screens changes. Ports the intent of upstream TypeWhisper#222 to the Linux/Avalonia
overlay.