Releases: ethannortharc/fonos
Release list
Fonos v0.8.6
What's Changed
- chore(legal): single-line copyright across every platform's About by @ethannortharc in #74
Full Changelog: v0.8.5...v0.8.6
Fonos v0.8.5
What's Changed
- v0.8.5: workflow-path dictation stats, pill shadow artifact, emoji-free icons by @ethannortharc in #73
Full Changelog: v0.8.4...v0.8.5
Fonos v0.8.4
What's Changed
- fix: v0.8.3 external-review findings — meeting STT silent failure, updater staple, sentinel gate, release race by @ethannortharc in #72
Full Changelog: v0.8.3...v0.8.4
Fonos v0.8.3
Second review-round hardening: complete Apple STT platform gating, a unified agent request path, honest empty-input feedback (#67), an Anthropic capability notice (#69), and a release pipeline that verifies itself before going public.
Fixes
- Apple STT can no longer masquerade as configured off-macOS: both the
apple-speechsentinel and realprovider: "apple"profiles (the shape first-run actually seeds) are platform-gated in every resolution arm; meetings reject Apple-provider profiles on all platforms (they transcribe over HTTP) with a clear error instead of raw failures. - Agent requests match the plain LLM path byte-for-byte: one shared request-body builder owns URL, token-param, and temperature rules; Google routes through its
/v1beta/openai/compat endpoint and never gets OpenAI-only parameters. Fixes Google agents failing outright and o-series/nano OpenAI models rejecting agent calls. - Empty selection no longer flashes "no speech" (#67): a dedicated pill state says "No text selected" / 「未选中文本」, with a debounced OS notification carrying the fuller hint; the Test Run bench shows a distinct status.
- Agent panel discloses the Anthropic limitation (#69 mitigation): a dismissible bilingual notice appears when any resolution path an exchange might take lands on Anthropic (tools are currently dropped there — chat-only), live-refreshing on config changes.
- Setup Doctor hotkey conflicts: key aliases the parser treats as one physical key (return/enter, esc/escape, delete/backspace, arrows, punctuation) now canonicalize together.
- Clipboard restore falls back down the flavor ladder if the richest write fails, instead of leaving the clipboard clobbered.
Release engineering
- Releases are created as drafts by a single
prepare-releasejob (no more matrix race) and published only after an asset-completeness gate proves the DMG, updater tarball, both arches' deb/rpm/AppImage, and a 3-platformlatest.jsonare all present —release-macos.shnow owns the entire notarize → verify → publish path. (That gate correctly blocked this very release twice while an arm64 runner infra failure was retried.)
Full Changelog: v0.8.2...v0.8.3
Fonos v0.8.2
Linux hotkey-integration fixes from real-machine testing, an in-app-update relaunch fix, and refreshed cloud model defaults.
Linux fixes (live-verified on X11)
- Selection recipes no longer flash a bogus "no speech": hotkey dispatch for non-mic (selection-sourced) flows moved to key-up on Linux. The X11 hotkey grab (
XGrabKey) routes every keyboard event — including the synthetic Ctrl+C the selection grab sends — back to fonos while the combo is held, so a key-down dispatch always read an empty clipboard. macOS keeps key-down (CGEventTap intercepts without grabbing). The clipboard read also polls up to ~600 ms instead of one fixed 100 ms sleep, so slow clipboard owners (busy browser tabs) still land. - Fresh installs no longer grab eight global hotkeys you never chose: legacy default combos (
cmd+shift+a/g/t,option+n/m/l/s) are no longer seeded as trigger chips on machines without an existing config — under X11's cmd→Ctrl collapse they stole Ctrl+Shift+A (Chrome's tab search), Ctrl+Shift+T (reopen closed tab) and Alt+N/M/L/S system-wide, and a hold on Ctrl+Shift+A launched the voice agent out of nowhere. Upgrades and customized keys are untouched.
Updater
- In-app updates now relaunch properly: the hard process-exit fallback (needed to outlive detached teardown threads) stands down when tauri signals a restart, so "Install & Relaunch" actually reopens the new version.
Cloud presets
Default LLMs refreshed to current-generation models (verified against live catalogs 2026-07-16; every row remains an editable prefill):
- Cerebras →
gemma-4-31b· OpenRouter free →google/gemma-4-31b-it:free· OpenRouter (keyed) →google/gemini-3.5-flash· OpenAI →gpt-5.6-luna· Google →gemini-3.5-flash· Anthropic →claude-sonnet-5· Fireworks →kimi-k2p6
What's Changed
- fix(linux): selection flows dispatch on key-up; fresh installs stop seeding default hotkey chips by @ethannortharc in #66
- chore(scenarios): refresh cloud preset default LLMs to current-generation models by @ethannortharc in #68
Full Changelog: v0.8.1...v0.8.2
Fonos v0.8.1
Fixes from two post-0.8.0 review rounds, plus PR-level CI and community health files. (#65)
Onboarding fixes
- "Not now" on the Accessibility step now finishes the wizard instead of dead-ending in the guided task, which can never complete without Accessibility.
- One runtime-backed STT gate: the first-run gate, Apple-STT seeding, playground, and tray now all read the same fonos-core resolver that mirrors the dictation pipeline exactly — the
stt.defaultwidget's profile wins over the global default, and dangling profile references are detected instead of silently breaking dictation. - Playground got loading/ready/error states: hold-to-talk arms only after the seeded config is actually persisted, and microphone/engine failures show a visible error instead of vanishing.
- Linux honesty: hold-to-talk is disabled while no dictation engine is configured, and the playground no longer claims "processed on this Mac" on Linux.
- Honest privacy copy: the playground discloses Apple's server-side fallback when on-device recognition is unavailable; the seeded engine is renamed "Apple Speech (on-device first)".
Engineering
- PR-level CI is live: frontend tests + strict build (Ubuntu), clippy + tests + smoke build (macOS), and a Linux compile gate (
cargo checkagainst the webkit/gtk stack) — Linux regressions no longer wait for release day. cargo test --workspaceis green with no feature flags: stalepanic!placeholder tests are gone, and the hotkey tests now exercise the real parser.
Docs & community
- README: top download call-to-action and a "First dictation in 60 seconds" quickstart.
- New CONTRIBUTING.md, SECURITY.md, issue forms, and a PR template.
v0.8.0
Highlights
🧭 Onboarding, redesigned (#64)
- Magic-first first-run (≤2 min): mic + in-app playground with built-in on-device speech (zero download), accessibility step that shows the payoff before asking — and keeps working if you decline (popup fallback), then a guided real-world dictation task. Skippable at every screen; skipping jumps straight to engine setup.
- Guided engine setup: two-layer detection (reuses running/installed engines, never re-installs), platform-optimal defaults (Apple Silicon → oMLX, Linux → Ollama), hardware-aware model recommendations, and a pre-execution review card — every default editable (models, base URL, key), disk-checked, with automatic downgrade suggestions and one progress bar from install to ready.
- 7 cloud presets: OpenAI, OpenRouter, Anthropic, Google, Fireworks, Cerebras, and Custom (LAN/self-hosted OpenAI-compatible endpoints, key optional). Partial applies no longer touch roles you didn't configure — local dictation + cloud commands mix freely.
- Menu bar as the long-term carrier: live health panel (mic / dictation / AI / speech rows, click-through to fix), once-ever unlock notifications ("capability + a sentence you can say"), download progress in the tray.
- First-run timeline in Stats over a local-only funnel (data never leaves the device).
📓 Notebook unification (#63)
- The workflow Notebook widget and notebooks are now one thing: pick an existing notebook to co-write or type a new name — it's created on save.
- Notes is a document-flow reading view: borderless paragraphs, oldest-first, hover/keyboard-revealed actions, day headers.
- Notebooks can be deleted (entries return to History); deleting a meeting now cleans up its transcript segments.
🔧 Under the hood
- Fixed a tray-refresh deadlock, an event-tap that stayed dead after granting Accessibility, and detection false positives on shared ports.
- Real TypeScript gate for the frontend (the previous check ran on zero files) + latent test fixes.
Auto-update: users on ≥0.6.0 get this in-app (macOS + Linux AppImage).
Fonos v0.7.2
This release is all about Linux.
- Quitting actually quits — tray "Quit Fonos" used to leave the process alive with a frozen pill stuck on screen; windows now vanish immediately and the process is guaranteed to exit.
- No more overlapping pills — on X11 the pill's old frame could stay composited under the new one on every state change; Linux now forces the same redraw pass macOS always had.
- Every recipe hotkey now works on Linux — not just the two dictation keys: the pill key, dictation hold/toggle, and any hotkey you bind in Workbench (translate selection, explain selection, …) all run through the same workflow engine as macOS. Rebinds apply without a restart, and
kill -USR2now genuinely toggles dictation (the documented Wayland fallback was previously a no-op). - Hotkey dictation no longer runs legacy code — it used to drive a pre-engine pipeline that could wedge the pill at "Processing"; that path is retired entirely.
- Apple Speech stops pretending on Linux — picking it produced silent empty transcriptions; it now shows a clear error and is no longer offered where it can't work.
- Auto-update comes to Linux — the new AppImage updates in place from Settings → General, exactly like macOS. deb/rpm installs get a "download from GitHub" pointer instead. AppImage is now the recommended Linux install.
macOS (Apple Silicon) updates in-app; Linux: AppImage above (auto-updating), deb/rpm below.
Fonos v0.7.1
Fixes from the first days in the wild.
- Apple Speech works in installed apps — the built-in macOS speech recognizer could never locate its helper in a packaged build (dev runs masked it). If you picked Apple Speech and got nothing, this was why.
- The floating pill follows your displays — disconnect an external monitor (or change resolution) and the pill now re-anchors bottom-center on the surviving screen instead of stranding itself at coordinates for a display that no longer exists.
- "Open Safari." opens Safari — spoken app names keep their sentence punctuation out of the app lookup.
- "Open Google in Safari." routes properly — the agent is now guided (and corrected when it slips) to split the browser into
appand the site intourl, across any LLM profile. - A broken STT server tells you it's broken — Setup Doctor distinguishes "process running but port not listening" (the stale-launcher trap), dictation gives up on unreachable endpoints in 5 seconds with a clear pill error instead of spinning, and long transcriptions are no longer cut off by the old 15s ceiling.
Delivered via in-app update on macOS (Apple Silicon); deb/rpm below for Linux.
Fonos v0.7.0
The Workbench release
The app is reorganized around one mental model: tune widgets → assemble recipes → pull triggers.
- Home — the new landing page. Every recipe and every key that fires it, in one editable table, plus the floating pill's slot roller.
- Workbench — three tabs: Recipes | Widgets | Test Run. Widgets are shared, named instances ("used by N recipes"); recipes are the only assembly; triggers are chips on the recipe (hotkeys and pill slots).
- Test Run — a real bench: watch a recipe light up step by step with per-step input/output/timing, outputs intercepted by default with a "deliver for real" switch.
- Session recipes — call, agent and meeting are now composite widgets assembled by reference (pick your tuned STT/LLM by name, a voice profile for TTS). A new instant source means press-to-connect: the call is live before you speak.
- The legacy Dictation/Talk pages and the old modes system are gone; your existing hotkeys migrate to trigger chips automatically.
Meeting: who's speaking (first cut)
Meetings can now label remote speakers — 说话人 1/2/… (Speaker N) — live while the meeting runs, fully on-device (CoreML on the Neural Engine). Enable it on the meeting widget; download the model once from Models → Local models (HuggingFace mirror endpoint supported). Your mic stays "Me"; if anything about separation fails, the meeting simply continues with plain "Audio" labels. Requires macOS 14+. Accuracy is a first cut — tuning to follow.
Also fixed on the meeting front: system-audio capture actually works in packaged builds now (the dual-channel helper was never found at runtime; meetings silently heard only the microphone).
Call panel, finished
A compact satellite panel at the top-right, draggable, with a proper hang-up button — solid red circle, receiver-down handset — that ends the call and closes everything in one click. Barge-in interrupts the answer mid-speech.
Fixes
- Dock click / tray / pill now raise the main window on the Space you're on (macOS 14+ cooperative activation).
- Packaged apps now bundle the call echo-cancellation helper (installs on other machines silently lost AEC).
- Test Run: step highlight no longer clipped on top; live glow no longer bleeds through the graph.
- Agent panel: preset prompt chips respond again; replies render Markdown.
Delivered via in-app update on macOS (Apple Silicon); deb/rpm below for Linux.