Skip to content

Releases: csmashe/typewhisper-linux

v0.13.0

Choose a tag to compare

@github-actions github-actions released this 27 Jul 19:34

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:focused and
    object:text-changed on 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 is PASSWORD_TEXT or 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 corrections for 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 when org.a11y.Status.IsEnabled is 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+V is sent. The paste path now
    reads the clipboard back (bounded wl-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-failed wl-copy pasted 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 before Ctrl+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 after Ctrl+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's Active and
    LockedHint properties plus Lock/Unlock signals. 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
    input group. 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 before rm, so a foreign file
    that merely mentions the marker mid-body is no longer deleted.
  • Firefox accessibility setup preserves foreign force_disabled prefs,
    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 under Plugins/,
    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/.so including 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 the Plugins/ directory at
    all
    , and backup no longer exports executables either.
  • The data directories are forced to mode 0700. Directory.CreateDirectory
    honors the umask, so a 0002 umask 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. AudioPath is clamped separately so
    recordings stay owner-only even if the base path is later loosened. Startup
    fails closed: it stops, naming the path and the chmod that fixes it, only
    when group or other access is actually present on read-back — not merely when
    chmod threw, since FAT and some CIFS mounts accept chmod and 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.
  • *...
Read more

v0.12.1

Choose a tag to compare

@github-actions github-actions released this 09 Jul 16:15

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 debounced pactl subscribe watcher that falls back
    gracefully when pactl isn'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 previously rm -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 preserves Audio/, Data/, PluginData/,
    Plugins/, and your settings. Pass --purge (or --all) to
    uninstall-linux-app.sh when 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 via pactl; without pactl the
    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

Choose a tag to compare

@github-actions github-actions released this 08 Jul 20:24

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 uses Ctrl+Shift+C instead of Ctrl+C so 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/checkout v6 → v7 across all workflows,
    and publish-plugins.yml now packages a plugin's Scripts/ 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

Choose a tag to compare

@github-actions github-actions released this 06 Jul 13:56
e189d7f

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/input keyboard 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 via await …?.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 TextInsertedEvent payload's app field was renamed to AppName and 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.CombinePath.Join migration, static / immutability refactors, extra
    error-handling and cancellation guards, and expanded test and documentation
    coverage — with no intended change in behavior.

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 24 Jun 17:31
2c9a617

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 .partial staging 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

Choose a tag to compare

@github-actions github-actions released this 23 Jun 23:36

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) and large-v3-q5_0 (~1.1 GB). These run the full 32-layer
    large-v3 decoder rather than large-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 input group. The
    first-run setup installs a keyboard-scoped uaccess udev rule at
    /etc/udev/rules.d/61-typewhisper-input.rules that grants the active session
    read access to keyboard event nodes immediately — one admin prompt, no logout
    or reboot — with a GROUP="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 (Hyprland bindr, 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.Linux native CUDA library (the
    ~409 MB libggml-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

Choose a tag to compare

@github-actions github-actions released this 19 Jun 15:55

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}.json catalogs 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 new IPluginLocalizationAware SDK
    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 PluginLocalizationExtensions helpers (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

Choose a tag to compare

@github-actions github-actions released this 17 Jun 15:39
a714e25

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,
    plus ITranscriptionEngineSelectionIdentity / ILlmProviderSelectionIdentity
    and the GetTranscriptionSelectionId() / 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 existing plugin:{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-plugin settings.json stays 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.
  • PluginManager now 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

Choose a tag to compare

@github-actions github-actions released this 16 Jun 14:25
987c3ce

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 playerctl call was passed
    as a single argument string containing single quotes
    (--format '{{playerName}} {{status}}'). With UseShellExecute = false no
    shell strips those quotes, and .NET's argument parser only honors double
    quotes, so the format string was split into broken tokens and playerctl
    exited with an error — pausing nothing. The command is now built with
    ProcessStartInfo.ArgumentList so each argument is passed verbatim.
  • Audio ducking now actually lowers other audio. Ducking read each stream's
    current volume with pactl get-sink-input-volume <id>, but pactl has no
    such subcommand, so the read always failed, every stream was skipped, and
    nothing was ducked. Current volumes are now parsed from pactl list sink-inputs instead. Both services also force LC_ALL=C so 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

Choose a tag to compare

@github-actions github-actions released this 15 Jun 19:38
be88b7e

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 with Shift+Enter between 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 the wtype, xdotool,
    and ydotool backends.
  • 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.