Changelog

Every Sapphire release and what changed, newest first.

v2.2.0

New
  • Show a verse one portion at a time on big stage screens. For a screen where the text is very large and bold — like a preacher's confidence monitor — the whole verse often won't fit. You can now set any output to break the verse into readable portions (splitting at natural pauses — commas, clause and sentence ends) and step through them, portion by portion, while your other screens keep showing the full verse. Turn it on per output in the Output Center (Off / Auto / Manual); Auto sizes each portion to that screen's font, Manual lets you set the words per portion. Advance from the output's tile (◀ ▶) or the [ / ] keys.
  • Many more built-in fonts. Eleven new typefaces are ready to pick in the Theme Designer — editorial serifs (Playfair Display, EB Garamond, Cormorant, Lora, Merriweather), clean sans (Inter, Work Sans, Source Sans), and bold display faces for stage screens (Oswald, Bebas Neue, Archivo Black) — on the audience display and NDI feeds alike.
  • Bigger text. Verse size now goes up to 800px and the overall "Scale all" control up to 3× — ample for large, bold stage displays.

v2.1.9

Improved
  • Scripture suggestions keep up with the preacher. Relevant verses now begin appearing in On Deck while a point is still being made — not only after a pause — so the operator has them ready the moment they're needed.
  • Suggestions match what's actually being said. When a passage is paraphrased or alluded to without a chapter-and-verse, Sapphire now surfaces the verse that best fits the flow of the message, and a book mention (e.g. "as Isaiah says…") offers that book's verses ordered by what's being preached rather than a fixed list. It stays fully on-device — no internet required.
Fixed
  • Display windows now work on Windows. Opening an output from the Output Center produced a blank window that refused to close — and once it happened, Sapphire stopped responding to anything else, including noticing screens being plugged in. All three symptoms were the same underlying fault, now fixed, so outputs open, show the verse, and close normally.
  • Screens are listed by name. The screen picker showed Windows' internal device path (\\.\DISPLAY2) instead of the monitor's name. It now reads the real product name — "HP 532sf" — and your laptop's own screen shows as "Built-in Display", so the two are actually tellable apart.
  • Plug in a projector and it appears on its own. Connecting an HDMI screen while Sapphire is running now shows up in the picker within a couple of seconds. Previously it was only noticed at startup, so a screen plugged in mid-setup never appeared at all.
  • A screen that has been unplugged says so. An output still pointing at a disconnected screen now shows "Screen not connected" on the card and keeps that screen listed as "not connected" in the picker, instead of silently vanishing from the list as though the choice had been forgotten.
Changed
  • Projecting to a screen and opening a window are now clearly different things. Choosing a screen fills it edge to edge with no window chrome, the way a projector should look. Choosing New Window gives an ordinary window with a title bar you can drag, resize and close.
  • A full-screen projection can always be dismissed. Press Esc on the projection to drop it back to a normal window, or use Exit full screen / Close output on the output's card. Closing an output no longer means deleting it, so its theme and screen assignment survive. If a projection covers the screen your console is on, Sapphire now warns you and names the way out.
  • You decide what Sapphire shares. Settings → Privacy now has a clear switch for anonymous diagnostics — the app version, your operating system, and which features a session used (never any audio or transcript) — alongside the existing option to share anonymized session transcripts. Both are on by default so we can see what to improve, and either can be turned off at any time.

v2.1.8

Fixed
  • Microphone access is far more reliable on macOS. Sapphire now ships the proper microphone permission so the system prompt appears the first time you go live. If access was denied, the notice spells out how to fix it — enable Sapphire under System Settings → Privacy & Security → Microphone — and adds a one-click Relaunch button, because macOS only applies the change after Sapphire restarts.
  • "Refresh" now actually re-asks for microphone access. Pressing Refresh next to the microphone picker (on the console or in Settings → Audio & Voice) re-requests access — so a dismissed or blocked permission prompt can be retried right there, and newly plugged-in microphones still appear. Previously Refresh only re-scanned devices and couldn't bring back a prompt.
  • Live transcription survives brief network blips. The Deepgram connection now tolerates more transient drops during quiet passages of a sermon before giving up, so a momentary hiccup no longer ends transcription for the service. If it does stop, a persistent notice offers a one-click Resume listening.

v2.1.7

New
  • A far more useful Sermon Library. After a service, the scriptures Sapphire detected are cleaned up for review — duplicates removed, references grouped by book, and consecutive verses collapsed into a single passage (with each verse's number kept inline so it still reads like your Bible). You can sort them by the order they were preached, alphabetically, or in Bible order.
  • Search the transcript properly. Transcript search now counts matches and lets you jump between them (next / previous), so finding a moment in a long message is quick.
  • Copy and export in one click. Copy all quotes — or export them as text or Markdown — and copy or export a sermon outline (now including Word / .docx), each with a clear "saved to your Downloads" confirmation.
  • Highlight the words that matter. You can now emphasise more than one part of a verse on screen at once, and the highlight colour follows your theme (set it in the Theme Designer).
Fixed
  • No more lost sermons. Saving a second sermon after a first could overwrite it — and even carry over the first sermon's AI outline. Each saved sermon now keeps its own place in the Library, and the console starts fresh for the next one automatically.
  • "Output live" off now turns everything off. Switching output off blanks every screen — the audience displays and all NDI feeds — and the Output Center now clearly shows each feed as blanked instead of still reading "live."
Changed
  • Clearer Library navigation. From the Library, Back returns to the console; from an open sermon, Back returns to the Library.

v2.1.6

New
  • Help improve verse detection (optional, off by default). A new privacy setting under Settings → Feedback lets you share a service's transcript and the verses Sapphire detected — anonymously, with no audio and no personal details — so scripture-detection accuracy can be reviewed and improved. You can turn it off again any time.
  • Clear install help right where you download. Clicking a download button now shows exactly what to do next — where to find the file and, on Mac, how to open it if macOS blocks the first launch (right-click → Open, a one-line Terminal fix, or an advanced one-line installer that skips the warning entirely). A "Mac says it's damaged?" helper also sits under the Mac download button.
Fixed
  • A smoother first launch on Mac. The Mac app is now code-signed (ad-hoc), which on most macOS versions turns the alarming "Sapphire is damaged" message into the ordinary "unidentified developer" prompt you can get past with a right-click → Open. (Removing the warning entirely still needs Apple notarization, which is on the roadmap.)

v2.1.5

Fixed
  • Cloud transcription is working again. Live transcription with the cloud (Deepgram) engine had stopped for everyone because of a fault in the hosted service that hands out access — it now stays available even when its usage-tracking store is briefly unreachable, so transcription keeps running instead of silently stopping.
  • A clearer message when cloud transcription can't start. If the cloud engine genuinely can't be reached, the console now says so ("Cloud transcription is temporarily unavailable…") instead of a vague "Transcription stopped," so you know to retry or switch engines.
  • Windows: the Library button works. On Windows, opening the Sermon Library could do nothing if a background save was slow — navigation is no longer held up by saving, so the button always responds.
  • Windows: "Reset Sapphire" is much faster. Clearing and resetting no longer scans every network connection on the machine; it targets only Sapphire's port, so reset completes quickly.
Changed
  • Straight to the console on launch. The first-run setup wizard has been removed — Sapphire opens directly to the Live console. Display and scripture fonts are now bundled with the app, so they render correctly offline and on a fresh machine.
New
  • Automatic outage alerting for the team. A scheduled watchdog now checks the cloud-transcription service every 15 minutes and raises an alert if it goes down, so an outage is caught before users report it.

v2.1.4

New
  • Output Center. One place for every screen your session feeds — press ⇧O on the Live console (or "Manage outputs" at the foot of the console's multiview rail). Compact cards in a grid — about six outputs visible at once — for the Main Display and any outputs you add, each with its live themed preview, theme picker, and controls. Adding an output is two clicks: "+ Add output" → "Stage display" or "NDI feed". (Replaces the Settings → Outputs tab and the NDI toggle that lived in Settings → Integrations.)
  • Add NDI feeds yourself — no built-in feed to manage. A fresh install now starts with just the Main Display; you add NDI feeds when you need them (NDI ships built in and needs no setup). Existing setups that had NDI on are converted automatically into a real "NDI Feed" output the first time you open, so nothing you were broadcasting disappears.
  • Rename any output. Every output card — including the Main Display — renames in place; type a new name and it sticks.
  • Live multiview on the console. A collapsible rail to the left of Program Preview shows every output's realtime picture at once — each under its own theme, with a live/off dot — so you can watch what all screens are showing without opening anything. Click a tile to jump straight to that output's controls in the Output Center.
  • Draw on your themes. The Theme Designer is now a real graphic editor: draw rectangles, ellipses, and lines behind the scripture (pick a tool from the strip in the top-left of the canvas, or press R / O / L, V to go back to Select). Drag any shape to move it, drag its edges or corners to resize (Shift keeps the proportions), and set fill, opacity, corner rounding, size, position, and rotation from the inspector. Shapes show up as their own layers you can hide, reorder, and delete.
  • The lower third is no longer a locked mode. "Lower third" is now just a one-click arrangement — a band plus bottom-anchored text — that you can fully edit afterwards (move it, recolour the band, resize anything). Existing lower-third themes convert automatically and look the same. Use "Arrange as lower third" / "Reset to centred" in the inspector's Arrange section.
  • Pick themes by sight, not by name. Everywhere a theme is chosen the picker shows live thumbnails of each theme instead of a name-only dropdown.
  • Mic quick-switch. The Start Listening button grew a caret (the Zoom/Meet idiom): pick a different microphone in two clicks, mid- service, without opening Settings.
  • New theme templates. "New" in the Theme Designer now offers starting points — the current theme, any built-in, or blank — and the name is pre-selected so typing renames it immediately.
  • Figma-style left bar in the Theme Designer. The left side now works like a design tool, stacked top to bottom: the theme's name, its Layers (reference, label, verse body — click one, or click it right on the canvas, to style it, hide it, or reorder it), and the Themes library folded underneath so it stays out of the way until you're switching themes. Library cards lead with the theme's name and compact icon actions on one row; the preview sits below.
  • Canvas zoom in the Theme Designer. Pinch, ⌘/Ctrl+scroll, or the ± buttons in the status bar zoom the canvas up to 4× (click the percentage to snap back to fit); scroll to pan while zoomed. And dragging a built-in theme's elements now explains itself — a prompt offers "Duplicate to edit" instead of silently ignoring the gesture.
  • Read aloud, one click away. A speaker toggle in the strip under the Program/Live monitors turns verse narration on or off mid-service — no trip to Settings (it's the same switch as Settings → Read aloud).
  • Exact font sizes. Size dropdowns with fixed steps are gone: every element takes a specific pixel size, all in the same unit — so the translation label can be larger than the reference if you want — plus a numeric "Scale all ×" that zooms the whole composition. Long verses still shrink to fit, but never below a 32px readability floor, and the floor only kicks in when the text genuinely can't fit.
Changed
  • Updates and downloads now come from our own CDN. In-app auto-updates and the download links on the website are served from Cloudflare instead of GitHub. Nothing changes for you — updates arrive the same way — but downloads are faster and no longer depend on GitHub's release pages. Linux now gets in-app auto-updates too (via the AppImage build).
  • Save is the only button in the Theme Designer. "Apply to Display" is gone. Themes are documents: outputs reference a theme, and saving it updates every output using it — the header pill shows "Used on N outputs" so you know Save is consequential before you press it. Edits never reach a screen until you save.
  • Settings slimmed to 7 tabs. Outputs moved to the Output Center; the Integrations tab (now just OSC + the REST API key) is renamed Remote control. Old links to the Outputs tab open the Output Center automatically.
  • Theme Designer inspector reorganised. With nothing selected, the theme-wide controls (style, text, background, placement, motion) read top-to-bottom as a narrative. Select an element — from the Layers panel or the canvas — and the inspector scopes to it with Typography / Position / Layout sections, the way a design tool does. When a per-element override is silently beating a theme-level slider, an amber chip says so — with a one-click reset.
  • Outputs survive restarts on the backend. Custom outputs are now stored by the app itself (output_channels.json in the app data dir) instead of a fragile browser-storage shadow list; existing saved outputs migrate over automatically on first launch.
  • Decluttered output cards. Each card is three tidy rows now — a live preview with the status shown as a labelled pill, the name, and the controls — with secondary actions (open in browser, copy the display URL / NDI source name, NDI help, remove) tucked into a compact "⋮" menu.
  • Tidier console. The Outputs button left the top toolbar (⇧O and the multiview's "Manage outputs" reach it); the verse-navigation strip now sits centred under the two monitors only, and Read-aloud + its mute toggle read as one segmented control instead of two loose buttons.
  • Theme Designer left bar tidied. Layers now folds away like the Themes library; the library's filter moved into a funnel dropdown left of search and Import / Export-all into a "⋮" menu, with the header pinned while the theme list scrolls.
  • Outputs and the Output Center now work from any screen, not just the Live console. They no longer wait for /control to register a session — open the Output Center from the Sermon Library and your outputs are already there.
Fixed
  • Stop Listening no longer clears the projected verse or drops your NDI feed. Previously, stopping transcription tore down the on-air program state — the verse on the audience display and NDI vanished, and starting again came back blank. Transcription is now a lightweight add-on you attach/detach; the projected verse, NDI feed, and staging queue stay exactly as they were across Stop → Start. Clearing what's on screen is now always an explicit operator action (the Clear button), never an automatic side effect of stopping the mic.
  • The theme picker no longer clips its last themes. The pop-over now fits the available height and scrolls, so every theme is reachable on small screens.
  • Uploaded image / font shows a clean chip. After uploading a background image or custom font, the filename sits in a bordered chip with a thumbnail (or type icon) instead of overflowing under the Replace button.
  • The blue default is gone — outputs show exactly what the designer shows. NDI feeds (and any output whose theme sets no explicit colours, including the built-in themes) used to fall back to a legacy sapphire-blue gradient with a blue reference — a different picture from the designer canvas and the audience display. Every renderer now shares the designer's neutral near-black stage with white text and a white reference; colour only ever comes from the theme you design. Pinned by pixel-level regression tests on the NDI renderer.
  • NDI now uses the same fonts as the designer. The scripture text on an NDI feed was rendering in a heavy, chunky serif that looked nothing like the refined serif in the Theme Designer. The bundled font file was a variable font whose hidden default was its heaviest, most compressed style, so the feed always drew that instead of the weight you see on screen. The verse now tracks the designer's weight and optical size exactly, and the reference/translation labels now use the same IBM Plex Sans as the app (bundled with the feed) instead of substituting Arial — so the NDI picture matches the designer pixel-for-pixel.
  • The verse "font weight" control now actually works. Choosing a weight in the Theme Designer previously did nothing to the scripture text. It now changes the verse weight everywhere — the designer canvas, the audience display, and the NDI feed — all in lock-step.
  • NDI sources carry each output's name. Renaming an output now renames its NDI network source too, so OBS/vMix shows the name you set (e.g. "Sapphire Stage Left" instead of the original "Sapphire NDI Feed") — and a feed that's already live is re-advertised under the new name immediately.
  • NDI vertical alignment matches the designer. The reference and verse sat too close to the top of the frame on an NDI feed compared with the Theme Designer. The feed measured line spacing differently from the browser; it now uses the same line-height model, so the text block sits exactly where you placed it. The small decorative underline that used to appear beneath the reference on the feed has also been removed.
  • Presenting a verse is instant again. Two regressions from this cycle compounded into visible lag between pushing a verse and it appearing on displays: the NDI renderer composited its 1080p frames on the server's event loop (delaying display delivery whenever an NDI feed was on — including feeds silently auto-resumed from the new persisted roster), and the console re-rendered far too much per verse. NDI rendering now runs on a worker thread and the console's per-verse state is isolated; both are pinned by regression tests.
  • Remote displays now restyle instantly. A projector window opened by IP on another device picks up theme edits mid-service over a new per-channel relay — no reload needed (previously it kept the old look until refreshed).
  • Reverting an output to "Follow Program theme" actually works. The backend silently ignored the change before.
  • NDI honours per-theme banner opt-out. A feed themed with "Banner alerts: Off" no longer composites alert banners into its frames (browser displays already respected this; the NDI renderer now does too).
  • Orphaned themes recovered. If an unsaved theme was ever "applied" and lost to the old Apply bug (on air but unselectable in the library), it is adopted into your theme library on next launch as "Recovered theme".

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 infoRun 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).
  • Operator control panel: streaming studio, manual override, staging queue, session history, theme designer.
  • Per-session NDI 1080p video output.
  • Global OSC server (UDP 8010) for TouchOSC / Stream Deck integration.
  • REST control API with a per-session API key.
  • Optional Sapphire voice (text-to-speech) with an on-demand installer (~337 MB).
  • Help dialog with seven setup guides.
  • System tray, sapphire:// deep links, splash screen.
Known limitations
  • Unsigned .dmg / .msi / .AppImage. See README for first-launch bypass instructions per platform.
  • Translation selector limited to KJV (other translations not yet bundled).
  • Setup tour silently fails inside the app window (fixed in 2.0.1).
  • Background process may be left running on quit, holding a port (fixed in 2.0.1).