Every Sapphire release and what changed, newest first.
v2.1.3
Fixed
NDI theme regression. The NDI feed was rendering the default navy gradient with plain white text, ignoring the operator's theme selection. Root cause: NDI auto-re-enable persisted the on/off flag (v2.1.2 #102) but not the active preset, and the frontend's post-enable theme push only fired if Settings → Integrations happened to be mounted at that moment. Fixed in three layers: POST /ndi/enable now accepts an optional preset in the body so the sender starts themed; the active preset id is persisted to localStorage on every applyNdiTheme success; and auto-restore moved out of the Settings tab so it fires on every launch. New tests pin that the themed render path is taken before the first frame.
Banner didn't auto-disappear. Scrolling banners now clear automatically after their configured pass count completes (plus a small grace window). Static banners (scroll_count = 0) still persist until manually cleared. Late joiners after auto-clear no longer re-inflate the banner.
Improved
On Deck layout. Queued verses now render as a divider-separated list instead of padded cards — tighter density, easier scanning.
Attention-grabbing background on high-accuracy detections in Manual mode. When a direct match or a hit with confidence ≥ 95% lands in the queue, the row gets a strong background and a short-lived arrival ring so the operator's eye locks onto it.
Per-theme banner alerts opt-in. Each preset now has a "Banner alerts" On/Off toggle in the theme designer. Turn it off to keep banner alerts from appearing on any display using that theme.
Bible reader accepts more abbreviations.Jn3:16, Mt5:3, Lk15:11, 1Jn4:8, 2Pt3:9 and friends all resolve. Ambiguous 2-letter forms (Co, Th, Ti, Pt) are only accepted with an ordinal prefix, since defaulting them silently would pick the wrong epistle.
Changed
Verse-presentation shortcuts overhauled. The previous N/P + eight Shift+Arrow bindings were overloaded and confusing. New scheme: → / ← next/prev verse (unmodified — the primary action), ⇧→ / ⇧← next/prev chapter, Space take preview to air, Esc clear display. Removed: N, P, ⇧↑, ⇧↓, ⇧,, ⇧., ⇧↵.
Removed the CUE / PROGRAM / TAKE labels and Transition dropdown from the middle pane — the OBS-style polish added in v2.1.2 didn't land right and got in the way more than it helped.
v2.1.2
Fixed
No more "Broken pipe" spam. MLX Whisper's stdout progress writes were raising BrokenPipeError on sidecar shutdown, causing a flood of auto-filed GitHub bug reports for what was really one transport-teardown race. Pinned verbose=False, added a TRANSPORT_INTERRUPTED error class, and taught the frontend to treat transient reconnects as reconnects instead of hard errors (closes #91, #93, #94, #95, #96, #97).
"Open in browser" now works. The button silently failed in the packaged app because the fallback URL began with tauri://…, which the external-URL guard rightly rejected. Falls back to the sidecar's http origin, disables cleanly when no display link is ready, and shows a clear tooltip (closes #101 partial, F2).
Windows outputs. Main display window now surfaces real errors from the Rust open_display_window command so the JS window.open fallback fires instead of the click doing nothing. Multi-output fan-out (WS + NDI + OSC) now runs in parallel via asyncio.gather — no more staggered updates when several outputs are active (closes #100).
Windows title bar duplication. Removed the native OS title bar on Windows and Linux for parity with macOS. Custom minimize / maximize / close controls now live inside the in-app header (closes F1).
Banner reliability. Marquee no longer stops on Windows when "Show animations" is disabled; the Clear button is visible in the header while a banner is live; new Shift+C shortcut clears the banner instantly (closes #103).
Bible reader. Enter fires the current match to Live; ↑/↓ navigate the verse list; the extractor now parses references with no space between book and chapter (John3:16, 1Cor13:4) (closes #104).
Home tab active state. Sidebar Home item now highlights when on /home or during the / → /home redirect race (closes #87).
New
Shift+Arrow verse nudge.Shift+←/→ moves to the previous/next verse; Shift+↑/↓ moves between chapters. Shown in the shortcut overlay (F5).
Persisted output preferences. NDI, OSC, custom channels, transition type, display preset, and ASR backend now survive app restarts. NDI/OSC auto-re-enable on next launch unless the previous session failed to enable them (closes #102).
OBS-style CUE / PROGRAM labels + Take button in the middle pane, plus a transition dropdown (Cut for now) — visual polish for the operator's monitors (closes #98).
Improved
Cold-start latency. Added startup_perf timing spans across backend lifespan + Rust seed copy so we can measure regressions. Splash health-check poll dropped from 500 ms → 100 ms (backing off after 2 s / 7 s). Seed-data copy parallelised across top-level directories. cyndilib (NDI) import moved off the boot path — first-time cost paid only when NDI is toggled on. Main window lands directly at /home instead of /control → redirect.
v2.1.1
Improved
Control panel polish. Refinements across the Program / Preview monitors, On Deck staging queue, verse search, verse stage, theme designer, and the display route — smoother interaction on live services.
Display route. Streamlined display page rendering for the audience screen.
Setup flow. Small refinements to the first-run tour and setup screen.
Fixed
Search reference formats. Broader coverage for edge-case reference strings during blended-translation search.
New
Unit test coverage for frontend/src/lib/local-settings.ts — the operator preferences layer now has explicit round-trip tests.
v2.1.0
New
Redesigned control panel. Program / Preview monitors, an On Deck staging queue, a Bible reader panel, alerts, and blended search across all four bundled translations — from a single console designed for live operation.
Sermon Library. Save completed sermons (transcript + detected scriptures) for post-service review, with AI-generated quotable quotes and AI-generated outlines. Auto-save safety net catches unattended drafts.
App shell + navigation. Unified nav rail (Home, Live, Library) with zoom and system-status contexts, plus a transport bar and contextual dialogs.
Theme designer. Design and save custom display themes — colors, typography, layout, and text shadow — with a live preview stage and library.
Voice commands + custom cues. Say phrases like "next verse" or "clear" from the pulpit; define your own trigger phrases and outputs.
Two-tier onboarding. New guided first-run experience walks operators through capture, translation, and display setup.
Connection quality pill. Live WebSocket RTT badge on the status bar turns yellow when the link degrades, so slow verses are caught before the audience notices.
Offline banner. A thin warning strip when the machine goes offline — local features keep working; cloud AI / model downloads pause until online.
On Deck bulk-clear. One click to clear every unpinned staged verse.
Keyboard-first operation. Shortcuts panel + drag region, plus an O hotkey to jump into override search and auto-advance for hands-free flow.
Improved
VerseStage typography auto-scales to a 1920 × 1080 canvas so the same theme reads correctly at every projector resolution.
Fuzzy scripture search. Typo-tolerant, translation-blended results merged by reference.
Cloud AI hardening. OpenAI Whisper and OpenRouter sermon-AI requests are bounded by tight timeouts (30 s / 45 s) and retry once on transient failures — no more two-minute UI freezes on a hiccup.
Kokoro TTS installer resumes. Interrupted downloads resume from the .part file via HTTP Range instead of restarting the 337 MB payload.
Fetch hardening. Every network call now aborts on timeout so a captive-portal DNS blackhole can't wedge the UI.
Sermon card layout is now consistent across Home and Library.
Settings panel restructured into sectioned config surfaces.
Design tokens. New --primary-fg AA-contrast token, migrated across UI call sites.
Fixed
Captive-portal false positive at boot. The Tauri health probe now validates the JSON body ({"status":"healthy"}) rather than trusting a bare HTTP 200 — an intercepted login page no longer trips the "ready" gate.
Audio pipeline no longer hangs on cloud ASR stalls. The OpenAI Whisper client now has a 30 s per-request timeout; without it the WebSocket loop could freeze indefinitely on a stuck API session.
Auto-reconnect no longer burns retries while offline. When the browser reports offline the client parks a single retry for the next online event instead of exhausting its budget.
v2.0.12
Improved
Feedback button now uses a Send icon for clearer intent.
v2.0.11
New
Sermon Library. Save completed sermons (transcript + detected scriptures) for post-service review, with AI-generated quotable quotes and AI-generated outlines.
App shell redesign. Unified navigation rail with Home, Live (Control), Library tabs, plus a transport bar and contextual dialogs.
Blended verse search. Search across all four bundled translations (KJV, ASV, BBE, WEB) from the control panel, with results merged by reference.
Improved
Quote extraction now weights verses by how emphatically they were delivered, surfacing the most strongly emphasised lines as quotes.
Sermon card display unified between the Home and Library pages for a consistent browsing experience.
Fixed
Auto-update now correctly finds new versions, so the in-app updater no longer silently shows "You're up to date" when an update is actually available.
v2.0.10
New
Theme editor for the display screen. Design and save custom display themes — colors, typography, and layout — from the new theme designer, with live preview.
Keyboard-first operation. New shortcuts across the control panel, including an O hotkey to jump straight into override search, plus auto-advance for stepping through verses hands-free.
Settings → Data & Reset. Manage and reset local app data from a dedicated settings tab.
Improved
Smarter scripture override. Typo-tolerant, fuzzy book-name correction so near-misses still resolve to the right reference.
Help dialog now tracks your place with scrollspy navigation.
Fixed
Translation switching now applies cleanly across all broadcast paths.
Verse and translation changes are now reflected correctly on NDI and OSC outputs.
Resolved a book-drift issue on bare "verse N" references and a voice-disable edge case.
v2.0.9
New
In-app auto-update — no more re-installing. Sapphire now checks for new versions on launch and offers to update itself in place: click Install, watch the progress bar, and the app restarts on the new version. You can also check manually from Settings → Updates. Updates are cryptographically verified before they're applied. (Removing the macOS/Windows "unidentified developer" warning on first install is a separate, still-pending track — auto-update does not change that.)
v2.0.7
Real-time transcription latency overhaul — especially the cloud (Deepgram) transcription, which now stays fast and stable for the length of a service instead of slowing down and eventually stalling.
Fixed
Transcription no longer slows down (and eventually stalls) over a long session. The cloud transcription connection now stays alive through speech pauses instead of dropping and reconnecting with ever-longer delays, and audio that can't keep up is trimmed so the transcript never drifts behind the live audio. Previously it could die after a handful of pauses, making transcription progressively slower.
Cloud transcription now streams word-by-word in near real time. Audio is sent to the cloud in tiny chunks instead of one 2-second block, so words appear within a few hundred milliseconds of being spoken.
Changed
On-device transcription (Mac) hardened against slowdowns. A single slow moment can no longer back up the whole stream, and the worst-case processing time on unclear audio is capped.
Faster start-up on every session, plus a warning that flags a misconfigured (e.g. 48 kHz) virtual audio cable.
v2.0.6
Transcription-setup reliability, live translation switching, verse search, and voice clarity improvements.
New
Live install log. A scrollable feed now appears inside the install dialog and the Go Live gate, showing real download activity so you can see what's happening rather than watching a silent progress bar.
File counter during install. The download UI now shows "File N of M" alongside the existing progress bar.
Natural-language verse search in the manual override panel. The override field now accepts plain-language queries ("love one another") in addition to standard references.
Install + activate inside the setup wizard. The wizard now downloads and readies the speech-recognition engine in one step rather than deferring to a separate step.
Report-bug buttons on all error states across the install, download, and activation flows.
Fixed
Fixed a crash that could interrupt the speech-model download during setup, and made retries reliable.
Translation switch now updates the live display. Switching translation while a verse is showing immediately re-pushes that verse in the new translation to all screens.
Voice card reframed. The voice card now reads "Upgrade to Sapphire voice" and shows which voice is currently active ("Using browser voice" / "Voice off"), so it's clear narration isn't broken.
Cloud transcription (Deepgram, OpenAI) now activates without a restart after the key is entered in Settings.
Stepping through verses (prev/next) no longer stacks narration voices — the current one stops before the next verse is spoken.
v2.0.5
Diagnostics overlay polish, transcription-menu cleanup, and a visible version indicator. Follow-up to v2.0.4 closing six small bugs that surfaced once operators started using the diagnostics overlay in real services.
New
Visible app version indicator.Sapphire v2.0.5 now appears in the control panel footer and next to the Settings dialog title, so you always know which version you're running.
Changed
Transcription menu simplified. The redundant "Deepgram Nova-2 (Cloud)" option was removed; the remaining streaming option is now just "Deepgram (Cloud)". Existing saved selections keep working.
Keyboard shortcut hint is now platform-correct. It shows ⌘⇧D on macOS and Ctrl+Shift+D elsewhere, instead of always printing both.
Fixed
On Windows, fixed the app failing to start its backend on first launch. It now finds the bundled runtime correctly, with a clear error message if anything is missing.
Diagnostics overlay Copy and Close buttons now work on desktop — clicks on the draggable header no longer swallow them.
The diagnostics overlay can now be resized on desktop via a corner grip.
v2.0.4
Diagnostics and cloud-key polish. Adds an operator-facing diagnostics overlay (YouTube-style "stats for nerds") that shows the live transcription pipeline, and fixes the transcription-menu refresh that v2.0.3 left stale.
New
Diagnostics overlay (Cmd+Shift+D, or Settings → Diagnostics). A floating, draggable, resizable card showing the live transcription state under the hood — connection status, microphone activity, the active transcription engine, the latest transcript and detected reference (with confidence), and what Sapphire decided to do with it. Position, size, and visibility persist across reloads, and a "Copy snapshot" button copies the full state for bug reports.
Fixed
The transcription menu now refreshes when cloud keys change. Previously, cloud options stayed stuck on "— needs key" until you relaunched the app even after a successful key save; they now unlock immediately, keeping your current selection.
v2.0.3
Third polish release. Restores the multi-translation menu and the transcription menu that v2.0.2 left empty — both were caused by a silent startup crash.
Fixed
Fixed a startup crash that left the app with only KJV and an empty transcription menu (CRITICAL). The crash happened when an optional smart-search model wasn't present; the app now starts normally without it (smart verse search becomes available once that model is downloaded).
The transcription menu now always appears, showing a "Loading…" placeholder while the app starts (v2.0.2 claimed this but a leftover check still hid it).
Translation and transcription menus now retry while the app is starting. A single early hiccup used to leave them empty or stuck on KJV; they now retry automatically until the app is ready.
Known limitations
Builds remain unsigned. Same macOS Gatekeeper bypass as v2.0.1 (xattr -dr com.apple.quarantine).
Auto-update is disabled — manual download required to upgrade from v2.0.2.
v2.0.2
Second polish release. Fixes the silent voice picker after download, adds cloud transcription via your own Deepgram key, and fixes a double-voice bug on the first verse.
New
Bring-your-own-key Deepgram cloud transcription. A new API keys tab in Settings lets you paste a Deepgram key (stored locally on your machine), unlocking the cloud transcription options.
The transcription menu always shows the cloud options, marked "— needs key" when no key is set; choosing one opens the key entry automatically.
Voice-install step in the setup tour. The walkthrough now points at the voice download so it's not missed.
Changed
The Sapphire voice now turns on automatically once its files are downloaded. Previously you had to edit a config file and restart before the voice picker would appear.
The voice picker is always visible under Settings → Voice. When no voices are installed yet, it shows a hint pointing at the download instead of disappearing.
Setup tour overlay is darker, so the highlighted step stands out more clearly.
The setup tour now skips steps whose target isn't actually visible, so returning users with the voice already installed don't get an empty step.
Fixed
Fixed a double-voice on the first verse (CRITICAL when using the Sapphire voice). The browser voice and the Sapphire voice briefly spoke over each other at the start of every session; the browser voice is now suppressed when the Sapphire voice is available.
Known limitations
Builds remain unsigned. Same macOS Gatekeeper bypass as v2.0.1 (xattr -dr com.apple.quarantine).
Auto-update is disabled — manual download required to upgrade from v2.0.1.
v2.0.1
First polish release. Same operator UI as v2.0.0, addressing every issue surfaced by the first round of testing.
New
Multiple translations in the desktop app. The installer now bundles King James Version, World English Bible, American Standard Version, and Bible in Basic English (~31k verses each) plus cross-references. The translation menu now shows all four (was KJV-only).
"Setup tour" button in Settings. A new "Setup tour" tab runs the six-step walkthrough on demand — handy if you dismissed the automatic tour and want a refresher.
Voice install status in Settings. Settings → Voice now shows an "Installed and ready" confirmation, so you can check the voice state without scrolling the main panel.
Changed
Settings dialog redesigned into sidebar tabs (Display, Voice, Integrations, Setup tour) instead of one long scroll. Each tab scrolls independently and the dialog opens on Display every time.
Translation selector widened so the full translation name (e.g. "King James Version") fits without being cut off.
Fixed
Fixed the setup tour silently not running on first launch — it now appears as intended.
Fixed the splash screen opening tiny then resizing — the Sapphire wordmark, spinner, and status text now render correctly from the start.
Fixed the theme toggle showing through the Settings dialog.
Fixed the theme toggle sitting slightly lower than the other header icons.
Fixed the transcription menu overflowing on narrow screens — long names now truncate cleanly.
Fixed a background process being left running after quitting (CRITICAL). Previously the next launch could fail with "port already in use" until it was killed manually; Sapphire now shuts it down cleanly on quit.
Known limitations
Builds remain unsigned. macOS Gatekeeper rejects the .dmg with "Sapphire is damaged"; clear the quarantine flag to bypass: xattr -dr com.apple.quarantine /Applications/Sapphire.app Windows SmartScreen: click More info → Run anyway.
macOS Intel and Linux AppImage are not in this release.
Auto-update is disabled — installing v2.0.1 over v2.0.0 requires a manual download from the GitHub Release page.
v2.0.0
First desktop release (internal testing). macOS, Windows, and Linux installers. Builds are unsigned.
New
Desktop app for macOS, Windows, and Linux with the scripture engine bundled in.
Real-time scripture detection from live audio (on-device transcription on macOS, Windows, and Linux, or cloud transcription via OpenAI or Deepgram).