- Pill placement now branches on the Dock: when the Dock is visible the pill keeps its 2 px gap above it, but when the Dock is hidden / on a side the pill drops all the way to ~3 px from the actual screen bottom (was ~15 px). No more floating in dead space.
What shipped.
Release notes, newest first. Auto-update lands within hours of every entry.
- Idle pill now sits 6 px lower (flush with the Dock top instead of 8 px above it), so it stops floating into the gap above the Dock.
- Smarter idle: when your cursor isn't anywhere near the pill, opacity fades down to ~0.22 and the hairline border softens — Kaho stops being visually in the way when you're working on the bottom-center of the screen. Move toward it and it lifts back to full opacity. Recording / hover / error states stay at full visibility — only the truly-ambient idle state adapts.
- Auto-language German dictations no longer start with stray
ï¸characters. The cleanup pipeline was emitting a leading invisible variation selector that an upstream layer re-interpreted as Latin-1, turning one invisible char into three visible Latin-1 mojibake chars at the start of every transcript. Sanitiser now strips both the genuine invisible char and the mojibake aftermath. - Also fixed a latent encoding bug in the tag-stripper that could mangle umlauts (ä, ö, ü) and other multi-byte UTF-8 characters when the response contained any non-ASCII content. Tag scan still byte-level, but content is now copied as whole UTF-8 sequences.
- Strips other zero-width / bidi-control characters anywhere in the output (ZWSP, ZWJ, BOM, bidi overrides) — these never come from speech and broke history-rail rendering in some fonts.
- Clicking Restart now after a staged update now relaunches Kaho instead of just quitting. The button was calling
quit_appwhen it should have been callingrelaunch()— fix applied to both the inline banner and the Settings → About control.
- Auto-update now actually installs. The packed tarball was including macOS AppleDouble sidecar files (
._Kaho.app) that Tauri's updater tried to unpack as a directory and choked on — leaving the staged update half-extracted and the UI bouncing back to "Update now". Tarballs now build withCOPYFILE_DISABLE=1and skip those sidecars cleanly. - App auto-relaunches after a successful update — no more "click again, manually quit, manually reopen" dance.
- Update failures no longer fail silently. If an install errors, the exact reason now shows in Settings → About instead of the button just reverting.
- Cleanup-output sanitiser rewritten: when the model echoes the prompt scaffolding back (Valentin's German-auto case), it now extracts the inner transcript instead of deleting it. The previous v1.7.4 version would have wiped the dictation entirely — caught before it shipped to real users.
- Server-side cleanup prompt hardened with an explicit "never wrap your reply in XML tags" rule so the echo stops happening at the source.
- Push-to-talk now self-heals when macOS drops a key-release event. Press the hotkey again and the in-flight recording transcribes cleanly instead of getting stuck on. The stop pipeline is also idempotent, so a stray double-event can't fire it twice.
- Cleanup pipeline strips stray
<context>/<transcript>tags if the model ever echoes the prompt scaffolding. Defense-in-depth — you should never see XML in your output. - Settings dropdowns and language pickers now use the Vellum terracotta accent on hover. No more navy-blue rows breaking the paper-and-ink palette.
- Account → Profile fields now have labels above each textarea, shorter italic placeholders, and lighter hint colour — so example text reads as a hint, not as saved data.
- History rail entries no longer overflow horizontally on long single-paragraph transcripts. Two-line clamp with proper word-break wrapping.
- Recording pill now shows a faint esc hint after the timer — tells you ESC will cancel the take.
- Settings → General → Translation has a new caption clarifying it applies to selected text via ⌃⌘T, not to the dictation output.
- History rail in the main window has a substring search at the top.
- Settings → About → "Check for updates" now shows a Vellum confirmation toast when you're already on the latest version — no more silent click.
- Click the idle pill → opens Settings on the Hotkey tab directly (was: default Account).
- Each release on this page is anchorable — hover the version chip to grab a # link.
- v1.7.1 shipped a single 1× PNG as the DMG background — Finder upscaled it on retina displays and the "Drag Kaho into Applications." headline looked pixelated. Now we ship a multi-image TIFF (1× + 2× layers paired via
tiffutil -cathidpicheck) and Finder picks the right density automatically.
- The DMG drag-to-Applications screen is now Vellum: cream paper, terracotta vignette, italic-serif headline ("Drag Kaho into Applications."), dashed terracotta arrow flying over the icons, mono utility caption, and a small Resolve mark watermark in the footer.
- Window resizes to 720 × 460 with 128 px icons positioned per the drop-4 spec (180/540 @ y 220).
- Background drawn as SVG and rendered at @1 + @2x — no more pixelation on retina.
- The inline language indicator on the pill (e.g. EN→DE or EN) is now a click target — clicking it opens the translate menu, the same affordance the standalone lang pill used to have. The rest of the pill still opens the main window on click.
- Settings layout rebuilt with a 180 px left sidebar instead of the horizontal tab strip. Active tab gets a terracotta accent rail and an ink tint; rows stack vertically with icon + label.
- Recording now waits for the cpal callback to actually fire before flipping into the active state. Previously, with Always-on microphone OFF, short dictations could finish before CoreAudio had delivered any samples — the pipeline saw an empty buffer, bailed with "no audio captured", and nothing pasted. Worst case is now a ~150 ms perceived delay on the first hotkey press; the recording is reliable.
- The macOS green microphone indicator no longer stays lit while Kaho is idle. The cpal stream opens on hotkey press and closes when the recording finishes — the indicator follows.
- Trade-off, surfaced as a Settings → General toggle: Always-on microphone. ON keeps the v1.5.4 pre-roll behavior (first word never clipped, indicator always lit). OFF (default) is privacy-first: indicator dark when idle, the first ~150 ms of speech can be lost to CoreAudio's cold-start.
- Settings, sign-in, permissions, and onboarding all reserve a 32 px drag region at the top so the system traffic lights have somewhere to sit and don't collide with the back button or content.
- Main window is now sidebar + detail. Left rail of recent transcripts (mono timestamps, two-line italic-serif preview, terracotta tag for translations); right pane shows the focused transcript with copy / rewrite / paste / delete actions.
- Toggle dictation mode. Settings → Hotkey → Trigger: Hold (default) or Tap. Tap-to-toggle starts on first press, stops on second; the configured hotkey is the same.
- Manual-start hotkey (⇧⌘D by default). Tap-to-toggle independent of the trigger setting; rebindable in Settings → Hotkey alongside the other combos.
- Pill error shake. When a recording fails, the pill shakes ±6 px horizontally over 400 ms before settling back into the error visual; auto-clears after 2 s.
- Sign-in and permissions screens are now Vellum. Paper background, italic-serif headlines, ink primary buttons — same look as the 4-step welcome flow.
- "No microphone connected" inline state card. Joins mic-blocked and offline as the third state Settings can surface inline (never as a system alert).
- The pointer cursor and CSS
:hoverstates now work on every floating surface — translate menu, rewrite prompt, translate preview, paste toast, pill tooltip — not just the mic pill. Each window flipsacceptsMouseMovedEventson its NSWindow at create time. - Global CSS adds a subtle
brightness(1.06)hover affordance to every<button>and disabled-cursor styling for disabled controls.
- Kbd chip now stays on a single line — labels like Right ⌘ no longer wrap into two rows when the parent flex shrinks.
- When the dictation language is anything other than auto, the pill shows the language inline (e.g. hold [Right ⌘] · EN). Translation indicator still wins when both are set.
- Reverted the v1.6.0 custom-chrome experiment after it broke show_main_window_cmd — main window opened invisibly. System chrome is back; the custom-chrome push will return once a few rough edges are sorted.
- First attempt at a fully custom Kaho title bar: K mark + title + crumb on the left, ghost minimize/zoom/close dots on the right. Reverted in v1.6.1 because pill clicks stopped reaching the main window. The work lives on as VellumWindow.tsx for the next pass.
- The audio stream now stays open for the lifetime of the app, with a 600 ms ring buffer running in the background. Press the dictation key and the last 600 ms of audio gets prepended to the recording — so the first word is captured even when CoreAudio's cold-start eats the leading 100–400 ms.
- The separate language pill window is gone. Translation status (e.g. EN→DE) now appears inline on the mic pill itself when you hover or record — one pill, all the information.
- The mic pill window now matches its visible UI: 50 × 50 in idle, 170 × 50 in every other state. No more transparent dead zone over the lang pill — clicks land where you'd expect.
- Recording start/stop and hover transitions both reposition the lang pill, so it never collides with the mic pill when the pill blooms.
- The language pill now sits 8 px from the visible mic capsule's left edge — not the always-170 px window edge — so it stays close to the small ambient idle dot instead of floating ~70 px away. Updates live as the mic pill blooms on hover or recording.
- The idle mic pill is now ambient — a hairline ghost capsule with just the terracotta dot at 70% opacity. "Quiet at rest. Loud when you ask."
- Hover blooms the full pill with the hold [Right ⌘] hint. The bounding click target is unchanged.
- 4-step first-run flow: welcome → permissions → choose hotkey → first dictation. Lives at 380×540, ~2 minutes start-to-finish, with a live preview of your first transcript.
- Inline state banners in Settings — microphone-blocked and offline states surface as Vellum cards instead of system alerts.
- New app icon: the Resolve mark on a paper gradient, generated from the Vellum master.
- Tray template icon redrawn from the same mark; macOS auto-tints for menubar light/dark.
- Update toast restyled to Vellum (terracotta accent, mono version chip, three states: ready / installing / restart).
- 404 and 5xx pages on wovero.com.
- Pointer cursor now appears when you hover the mic pill — the overlay window finally tracks mouse-moved events on macOS.
- In-app polish: the rewrite prompt and the dictionary "heard as" placeholder no longer name specific upstream models.
- Mic pill now shows your actual dictation key in the idle hint, not a hardcoded ⌥ space.
- Mic pill and language pill now share the same vertical centerline.
- Clicking the pill body opens the main window; recording is started by hotkey only.
- Full visual redesign: paper palette, terracotta accent, italic Source Serif headlines, Inter UI, mono kbd hints.
- Day theme by default; night-mode toggle in Settings → General → Appearance.
- New "Resolve" mark across the app, dock icon, DMG installer, and marketing site.
- Reskinned recording overlay, language pill, translate menu, rewrite prompt, and toasts.
- Tighter typography across Settings; clearer empty states.
- Reshape now reads the surrounding paragraph for tone-matching before applying the edit.
- Translation glossary picks up alternate phonetic forms automatically.
- Settings → Dictionary cache refresh fixed; new entries propagate within a second.
- Hold-to-translate: language pill shows e.g. EN→DE while active.
- Push-to-talk hotkey is now user-configurable in Settings → Hotkey.
- Brand transition from Wovero Dictate to Kaho.
- Stability fixes around dock-autohide and second-monitor positioning.
- First-launch onboarding flow walks through Microphone, Accessibility, and Input Monitoring.
- Smart dictionary: per-user phonetic glossary that survives re-installs.
- Rewrite-on-selection (⌃⌘M) with six quick actions plus free-text instructions.
- Screen-context awareness on supported apps for sharper reshape suggestions.
- Universal binary (Apple Silicon + Intel), Developer-ID signed and notarized.
- Hardened entitlements stop macOS revoking TCC grants on every restart.
- Auto-updater wired up with a signed updater key.