# Changelog All notable changes to D3RO Voice will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ### Planned - macOS / Linux support - Additional Whisper model management UI - Plugin system for custom pipelines ## [1.9.0] - 2026-09-27 > Published from an annotated tag. Installer and update metadata are served by the > canonical Forgejo feed; no binaries are committed to this repository. ### Added - **Preset commands you edit on the desktop are used on the phone.** Changing the prompt of Translate, Summarize, Professional rewrite or Explain code updates the same command on your phone; restoring the default restores it there too. ### Fixed - **Meeting transcripts edited on the desktop now show on the phone.** Edits, auto-polish and speaker labels were kept on the desktop only because the phone shows a meeting from its transcript segments; those are now updated with every change. ## [1.8.0] - 2026-09-27 > Published from an annotated tag. Installer and update metadata are served by the > canonical Forgejo feed; no binaries are committed to this repository. ### Added - **Knowledge base syncs with your phone.** Documents added on the desktop can be searched on the phone and web, and documents added there appear on the desktop and are indexed with the local model. Deleting one removes it everywhere. - **Recordings sync and play anywhere.** Desktop recordings are uploaded (up to 50 MB each, can be turned off in Settings > Cloud) so the phone can play them, and each history card has a play button that also plays recordings made on the phone. - **Shared settings.** Language (Korean/English), light/dark/system theme, auto-polish on or off and the active command follow the phone. ### Fixed - A document's text is kept even when the local embedding model is unavailable, so it can be indexed later without the original file. ## [1.7.0] - 2026-09-27 > Published from an annotated tag. Installer and update metadata are served by the > canonical Forgejo feed; no binaries are committed to this repository. ### Added - **Your desktop and phone now stay in step.** Signing in keeps history (with titles and favorites), the dictionary, meetings with their memos and documents, memo tags, your own commands and dictation/meeting templates the same on the desktop, the phone and the web. Changes made offline wait and upload later; what you delete on one device is deleted on the others; edits from the phone appear within seconds. - **The desktop appears in the phone's device list.** Disconnecting it from the phone signs the desktop out; signing out on the desktop removes it from the list. - **Records made before signing in come with you.** The first account that signs in on this computer receives the history, dictionary and meetings kept in local mode. - **Favorites on the desktop**, shared with the phone. - Settings > Cloud shows how many changes are waiting to upload or were refused. - **Live captions stream as you listen.** Words appear about a second after they are spoken and keep updating while the sentence is in progress; the part that is no longer changing is shown solid and the rest dimmed. A pause finishes the line, and long unbroken speech is split at natural boundaries instead of waiting six seconds. - **Captions are polished in context.** Each finished line is corrected by the local model using the lines before it (spacing, punctuation, misheard words); rewrites that change too much are ignored. It can be turned off in Settings. - **Live captions can use their own speech model.** Settings > STT now has a separate live-caption model, loaded next to the dictation model, so captions can run on a faster or more accurate model without changing dictation. The local speech engine is updated for this and is downloaded again once. ### Changed - **Suggestions page with Up/Down only.** Moving past the third candidate turns the page by itself, and at the last candidate the selection waits while more are still being generated. The separate Ctrl+Alt+Left/Right page shortcuts are gone; they also collided with the display-rotation shortcut of Intel graphics drivers. - The live-caption model is chosen next to the other caption settings in the General tab. ### Fixed - **Accepting a suggestion with Ctrl+Alt+Enter did not paste.** The paste was sent while Ctrl+Alt were still held, so the app received Ctrl+Alt+V. The panel now closes at once and the text is pasted as soon as the keys are released. - **Clicking a suggestion did nothing** when a new candidate arrived between pressing and releasing the mouse button; a candidate is now accepted on press. - **Suggestions rarely appeared in chat boxes that grow as you type.** The growing box was taken for a different field on every keystroke, which kept blocking suggestions as "not typing". Fields are now told apart by window and control, and a mouse click re-checks whether you have typed since. - **Cloud sync was mostly one-way.** Data created on the phone never reached the desktop after signing in, only the first meeting's memos and documents were uploaded, deletions were never shared, team meetings leaked into personal data, and live updates never connected. All fixed. - Exporting account data failed for accounts with meetings; the export keeps its original format again. ## [1.6.0] - 2026-09-24 > Published from an annotated tag. Installer and update metadata are served by the > canonical Forgejo feed; no binaries are committed to this repository. ### Added - **Up to 12 next-sentence suggestions, three per page.** The first candidate appears as soon as it is ready and the rest are generated one at a time in the background. `Ctrl+Alt+Up`/`Down` move between candidates, `Ctrl+Alt+Left`/`Right` flip pages, `Ctrl+Alt+Enter` accepts, and `Esc` closes the panel while it is showing. Accepting, typing on, or closing stops generation. Existing shortcuts that were still on the 1.5.0 defaults move to this layout automatically; customised ones are kept. - **A key guide inside the panel** built from your current shortcuts, so it follows whatever you rebind. - **The live caption window can be moved.** Hover it to reveal a small handle, drag it anywhere, and it reopens there next time; double-click the handle to return it to the bottom of the screen. The rest of the window still lets clicks through. - **Live captions say they are getting ready** from the moment you start them until the first line arrives, instead of showing an empty screen for several seconds. ### Changed - **The suggestion panel is redesigned**: numbered candidates with a clear selection bar, two-line items that no longer break Korean words mid-word, no empty header row, and a two-line footer for progress and keys. The panel stays where it first appeared while candidates stream in, and sits outside the input box when the app cannot report a caret position. - **The suggestion model stays loaded for 10 minutes and warms up on launch**, and on Ollama reconnect, so the first suggestion no longer times out on a cold reload. - **The personal phrase memory only learns everyday writing.** Terminals, code editors and the Agent Switchboard coding hub are excluded, and lines that are mostly symbols or an empty field's placeholder text are ignored. Phrases learned under the old rules that break these rules are removed on the next launch. - Suggestions are never offered in terminals. ### Fixed - **Suggestion shortcuts started dictation.** The voice service treated every shortcut it did not know as dictation, so the new suggestion keys switched on recording. - **Suggestions never appeared after updating to 1.5.0** on installs whose local speech engine was downloaded by an earlier version: the old engine lacked the focus-reading endpoint. An engine older than the app requires is now downloaded again automatically. - **Suggestions were cancelled while typing Korean** because the syllable still being composed changed the text; cancelled requests also no longer use up the rate limit. - **The panel appeared after a mouse click without typing**, could not be closed with X while generating, and showed a spinner next to finished candidates. - **Model runner windows flashed while typing** when D3RO had started Ollama itself. It now starts Ollama through Ollama's own tray app. - **The speech engine could start twice** when two parts of the app needed it at the same moment. ## [1.5.0] - 2026-09-23 > Published from an annotated tag. Installer and update metadata are served by the > canonical Forgejo feed; no binaries are committed to this repository. ### Added - **Next-sentence suggestions while you type.** With the feature turned on, a small ghost-text panel sits next to the caret in whatever app has focus and offers up to three ways to continue the sentence. `Ctrl+Alt+Right` accepts, `Down`/`Up` move between candidates, `Left` or the panel's X dismisses, and all four are ordinary rebindable shortcuts. The panel never takes focus and is click-through until you turn interaction on. - **Typed-text learning from the field you are in,** read through UI Automation and diffed as a snapshot, so committed Korean and Japanese IME text is counted correctly (key codes cannot reconstruct it). Password fields are refused before any read, and IME composition suppresses learning and suggestions until the character is committed. - **Weekly input insights** (`Settings > Input` and a dashboard card): keystroke, click and scroll totals, mouse travel converted to meters, top hours and apps, flow windows, edit friction (edits per 100 characters) and per-app suggestion quality. - **A personal phrase memory** built from your own typed sentences and voice history, ranked by frequency, recency (30-day half-life) and same-app usage, and offered as prompt hints. Phrases can be deleted individually or all at once. - **A privacy receipt** that reports the real number of retained rows and the 30-day retention rule, plus **smart exclusion**: only the app you are in can be suggested for the exclusion list, and only after repeated unreadable fields, never automatically. - **A shortcut safety audit** in Settings that flags invalid or conflicting bindings across every action. - **A local personal graph** that links your sentences by "follows" and shared-terms relationships, so related context can surface even when the current prefix differs. It is local SQLite only, with no embeddings or network. ### Changed - **Local model requests are now bounded and individually cancellable.** `LocalLLMService` gives every request its own abort controller, relays external cancellation, requires a `done` frame before a stream counts as successful, and clears incomplete streams. Generation and streaming are capped at 2048 tokens / 120 seconds and chat at 512 / 60 seconds. Text suggestions use `keep_alive: 2m` and no longer warm the model at startup. - **Voice conversations are single-flight** and pass their cancellation through to the active local chat request, so ending a conversation aborts its own inference instead of only changing what the UI shows. - Console windows are suppressed for the app's Windows helper processes (text to speech, voice actions, audio-device and active-window enumeration, and every ffmpeg path). ### Fixed - **Custom instructions ran the instruction instead of your text.** Every built-in instruction (translate, summarize, rephrase, explain code, free prompt) inserted the instruction's own wording rather than the processed result, and only `{{text}}` was ever substituted, which none of the presets use. The instruction is now the system prompt, the transcript is the text, and `{{text}}`, `{{userPrompt}}` and `{{targetLanguage}}` are resolved in one shared place. This path had never worked in any shipped release. - **The suggestion panel could refuse to close, revive itself, or appear on a bare click.** Holding the modifier that Windows turns into `Ctrl+Alt` no longer fires the voice shortcut underneath, closing the panel during generation discards that request instead of re-showing it, a click without typing no longer triggers a suggestion, and pressing Enter stops the same text from being suggested again. - **The global input hook is reference-counted**, so the shortcut service and input telemetry can attach at the same time without one disabling the other. ## [1.4.0] - 2026-09-21 ### Added - **Several shortcuts per action.** Every action now holds a list of bindings instead of a single one, so a second (or third) shortcut can be added with the `+` button and removed individually. - **Mouse buttons as shortcuts.** Side buttons (back / forward) can be bound on their own; right and middle click require a modifier. Left click cannot be bound because it drives every on-screen interaction. Mouse events cannot be swallowed, so a bound button still performs its original action — the settings screen says so before the binding is saved. - **Pick a key from a searchable list.** Besides pressing the key, a shortcut can now be chosen from a grouped dropdown with a search box inside it, which also makes keys reachable that are awkward to press while recording. - **The history and command popups are rebindable.** `Ctrl+Shift+V` and `Ctrl+Shift+C` were fixed in code and had no settings entry; they are now ordinary actions. The voice command shortcut, which had never been exposed in settings, is visible as well. ### Fixed - **Double-press hands-free never triggered.** Dictation and hands-free ship with the same default key and are told apart by the double press, but shortcut lookup stopped at the first match, so hands-free was unreachable in installed builds. Both actions now receive the event and are split by press type. - **Reserved system shortcuts could be assigned anyway.** The check compared joined key names, so pressing the modifiers in a different order let `Ctrl+C` and friends through. Combinations are now compared structurally. - **Turning shortcuts off also killed the popup shortcuts permanently.** Disabling global shortcuts released every registration in the process, including ones it did not own, and re-enabling never restored them. - **Enabling shortcuts after starting with them off left nothing bound.** - **Shortcut labels were frozen in the language they were recorded in** and did not follow the app language or platform conventions. They are now derived on display. - **The dashboard caption indicator never reflected the real state** because the event payload was stored instead of the state inside it. ### Changed - Shortcuts are stored as one list per action. Existing shortcuts are migrated automatically on first launch; no reconfiguration is needed. ## [1.3.7] - 2026-09-19 ### Fixed - **Recording and live caption overlays never worked in installed builds.** Popup pages loaded their scripts as classic `