## 2026.6.23 ### Highlights - Made Dictate private by default: an unset provider resolves to the on-device `faster-whisper` backend. - Changed the default push-to-talk shortcut from Ctrl+Right to **Ctrl+D** across the engine, daemon, preflight, doctor, Windows control, the push-to-talk dialog presets, the default config, and the UI. - Made recording resilient instead of hard-blocked: recording is never disabled by provider state. - Added a `dictate config` subcommand group for headless/agent setup: `set-key ` (format-validated, saved to the OS secret store), `set-provider private|online`, `set-model `, and `show` (provider mode, model, per-backend key presence, secret-store status). - Restored on-screen navigation that the native-decorations switch had hidden: the capture (mic) home now carries a settings gear and a Notes button, since the custom titlebar holding the old gear/search is hidden under native window decorations. - Note "Export" no longer claims success while writing nothing. ### Changes - Restored on-screen navigation that the native-decorations switch had hidden: the capture (mic) home now carries a settings gear and a Notes button, since the custom titlebar holding the old gear/search is hidden under native window decorations. The capture screen stays the home; Notes is a searchable list of recent dictations one tap away, and back returns to the mic. - Made the Wayland default push-to-talk shortcut Ctrl+D too, matching every other platform (it previously fell back to Ctrl+Space on Wayland). - Added a `dictate config` subcommand group for headless/agent setup: `set-key ` (format-validated, saved to the OS secret store), `set-provider private|online`, `set-model `, and `show` (provider mode, model, per-backend key presence, secret-store status). Output is plain and scriptable. - Added provider resilience via a new `ProviderSupervisor`: it tracks the preferred vs. active backend with on-device always available as the floor, classifies failures (auth / rate-limit / budget / unreachable), and applies class-aware exponential backoff with a single cancellable timer (never busy-polls). It probes for recovery opportunistically and on network-up, and emits `provider-degraded` / `provider-recovered` events to the UI over SSE. - Added live provider-health tracking end to end: an engine `health_sink` reports every online-backend transcription outcome, the UI server publishes `provider-health` SSE events on each state change, and the UI hydrates and updates from them. - Added a quiet "or hold Ctrl + D" shortcut hint (derived from the stored shortcut) to the ready state. - Made Dictate private by default: an unset provider resolves to the on-device `faster-whisper` backend. Online (xAI) transcription now requires an explicitly configured key. - Changed the default push-to-talk shortcut from Ctrl+Right to **Ctrl+D** across the engine, daemon, preflight, doctor, Windows control, the push-to-talk dialog presets, the default config, and the UI. - Made recording resilient instead of hard-blocked: recording is never disabled by provider state. A degraded provider now shows a one-shot flash-ring pulse and toast, an "On-device · unreachable" strip during recording, and a quiet config hint when online with no key — replacing the previous fully blocked home screen. - Long (note-mode) recordings now retry the remote provider up to twice with backoff before degrading to on-device; quick push-to-talk dictation keeps its existing fail-fast CPU fallback. The supervisor learns from every outcome. - Dropped the timestamp from the copy-last-note row and shortened the ready-state status copy. ### Fixes - Re-centred the cradle-mic desktop/app icon. It was shifted off-centre; the Linux package icons and the Windows `.ico` are regenerated from the canonical `assets/dictate.svg`, with the cradle rendering as a clean curve. - Note "Export" no longer claims success while writing nothing. The packaged webview has no file-download path, so it now copies the note as Markdown to the clipboard and says so ("Copied as Markdown"). - Fixed the engine-version test to assert against `RELEASE_VERSION` dynamically instead of a hardcoded version that went stale after CalVer bumps. ### Complete contribution record This audited record covers the complete 5286a55f72c86eb0ddf7fc287601a68d0a4851b9..f3e8e2d642e9521b5365b0021bac301aa7d6f39b history: 1 in-range PRs + 0 retained seed-only PRs = 1 unique PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact. #### Pull requests - **PR #14**