Changelog
Every notable change since Lectrn's (then Versify's) very first build. This full history resets at 1.0 — a clean start for the real release. Back to downloads →
0.8.1-beta2026-08-21
Changed
- Versify now checks for a new version every hour instead of once a day, so an update shows up mid-session instead of only on next launch.
Fixed
- The "Update available" badge opened the download page as a second in-app window instead of your actual default browser. It now opens properly in Safari/Chrome/whichever browser you normally use.
- Background Library drag-to-reorder felt sticky and unclear about what was actually happening. The thumbnail you're dragging now sticks to your cursor directly, and the others slide out of the way live to show where it'll land — the same feel as reordering apps on an iPad, instead of the previous silent snap-to-place.
0.8.0-beta2026-08-20
Added
- Hovering a Background Library thumbnail now shows its original filename (falls back to the previous generic hint for older library entries saved before this shipped).
- Background Library thumbnails can now be reordered by dragging — works with both mouse and touch, so it's usable on iPad too, not just desktop.
0.7.1-beta2026-08-20
Changed
- The update checker is now actually connected to a real, live version manifest — the "Update available" badge will genuinely appear (linking to the download page) when a newer version ships, instead of silently never checking.
Fixed
- The upload area's info bubble (ⓘ) showed a "?" cursor and used the browser's slow native tooltip, which some testers read as the app being unresponsive. It's now a regular cursor with an instant custom tooltip, matching the same fast tooltip already used for locked-feature explanations elsewhere in Settings.
0.7.0-beta2026-08-20
Added
- Another secret feature.
- Settings > Developer Override gained a button linking directly to the local analytics dashboard, for internal use during testing.
0.6.0-beta2026-08-18
Changed
- "Replay Tutorial" moved out of the developer-only tools and into Settings > Appearance, where it's available on every tier, including the free trial.
0.5.0-beta2026-08-18
Added
- The Display window now shows a small brand mark in the bottom-right corner, so a screenshot of the output still identifies which app it came from. Not shown on the NDI alpha/key output, since that's composited directly into someone else's broadcast.
0.4.0-beta2026-08-18
Added
- A free, no-signup 14-day trial for anyone without a license key — verse lookup and full background/font/text-style customization all work, previewed right on screen. Sending it to an actual Display window (or another device) needs a license.
- The header now always shows which tier you're currently on.
Changed
- The free/unlicensed state is now a time-limited trial rather than an indefinitely open tier — what used to be the default is now "Basic," the cheapest tier that actually requires a license key.
0.3.0-beta2026-08-18
Added
- Background uploads now show a loading spinner on each thumbnail until it's fully copied into the library, and multiple files can upload at once without blocking the rest of the app.
- A "Darken background" option in Text Style, for readability when a lighter background image or video is used.
- Settings is now organized into sidebar categories (Appearance, Bible Translations, Licensing, NDI Output, Controller Settings, Privacy, Feedback) instead of one long scrolling page, and remembers which section you last had open.
- The upload area now shows the file size and library limits directly.
Changed
- Hovering a locked (tier-gated) button now shows a cleaner tooltip that isn't covered by the cursor's "not allowed" icon. Font favorites get the same treatment.
- Controller Settings (name, notify-on-change, view-only mode) now requires the Production tier, matching NDI Output.
- Settings no longer scrolls the page behind it once you reach the bottom of a section.
Fixed
- NDI Output's toggle switches no longer show as "on" while the app isn't licensed for Production — they now correctly reflect that NDI isn't actually running.
- Video backgrounds could sometimes show solid black instead of the video, especially larger files — the display was swapping the background in before the video had actually loaded a frame to show.
0.2.0-beta2026-08-18
Added
- Export the current slide as a PNG or JPEG still image, right from the Preview panel (Professional tier). Captures the exact background, text, and styling currently shown — including the current frame of a video background — at 1920×1080.
0.1.2-beta2026-08-18
Added
- Preview panel now has a "Copy Remote Control Link" button next to Copy Display Link, for sharing the Control Panel itself with another device on the network. Greyed out on the Basic tier with a short hover tooltip explaining it needs Professional — controlling Versify remotely still requires that tier either way, this just makes the link easy to share once you have it.
Fixed
- Settings > Controller Settings' "View-only mode" checkbox now correctly shows as checked and locked when this device is genuinely being forced into view-only (connecting remotely on the Basic tier) — previously it sat there unchecked and fully clickable, implying it was your own optional choice when it wasn't. The actual security boundary (the server rejecting remote changes on Basic tier) was already solid; this was a display-only gap.
0.1.1-beta2026-08-18
Changed
- The packaged app's name (Dock, Applications folder, window title) now includes the version while in alpha/beta — e.g. "Versify 0.1.1-beta" — so it's obvious which build is installed when testing more than one. Drops back to a plain "Versify" automatically once a stable release ships.
0.1.0-beta2026-08-18
Officially in beta — thanks for helping test Versify. Versioning restarts here rather than continuing the alpha counter.
Added
- Versify can now be packaged as a real Mac installer (Apple Silicon for now) — a native app window instead of running from a terminal and opening a browser tab. Unsigned for this round, so first launch needs a right-click → Open past the "unidentified developer" warning.
- Settings > NDI Output now shows a "Download the NDI Bridge" link when NDI isn't detected as running (hidden until that installer is hosted somewhere).
Changed
- Beta keys now unlock the Professional tier, not Production — reaching Production requires a separate key that isn't handed out yet. A distinct kind of beta key can additionally reveal Settings' Developer Override section (a local tier-testing tool not meant for ordinary testers); holding one still doesn't grant Production on its own.
- Where Versify keeps its settings/state/uploads changed under the hood to support real installs — no effect on the existing terminal-based setup.
Fixed
- Deactivating a license didn't actually reset the unlocked tier back down — found while testing the change above.
0.17.0-alpha2026-08-17
Added
- Bug reports can now optionally include your email address, so a reply can reach you directly if you'd like one. Completely optional, and left blank by default.
- A full privacy notice (Settings > Privacy) explaining exactly what usage data Versify can keep, that it's opt-in and never leaves your computer, and how the separate Feedback/bug-report system works.
0.16.3-alpha2026-08-17
Changed
- "N controllers connected" in the header now shows more detail on hover — which connections make up that count, useful for telling a real second device apart from one device with two tabs open (or a stale connection not yet cleaned up).
- The secret feature now resets every time the app reloads, not just when it's fully closed.
0.16.2-alpha2026-08-17
Changed
- The verse reference field now sits on its own full-width row with the Go button right beside it, instead of squeezing down to fit alongside Prev/Next/Clear/Random — those now wrap onto a second row below.
0.16.1-alpha2026-08-17
Changed
- The splash screen stays up twice as long, and can now be skipped early by clicking it or pressing any key.
Fixed
- Selecting only one Bible translation in Settings didn't actually hide the translation dropdown on the Control Panel, even though it was supposed to. The dropdown's CSS wasn't respecting the hide — same root cause as an earlier fix to a couple of other elements this release cycle, now checked across the whole app so it shouldn't recur.
0.16.0-alpha2026-08-17
Added
- Settings > Bible Translations — choose which translations show up in the Bible translation dropdown. At least one must stay selected; with exactly one selected, the dropdown disappears entirely.
- Network control now requires the Professional tier or higher. On the Basic tier, Versify can only be controlled from the computer it's running on; the Display window itself is unaffected and stays viewable from any device regardless of tier.
- A notify-only update checker — a small badge next to the version number links to a newer release when one's available. Nothing is downloaded or run automatically.
Fixed
- A rejected state-sync request used to fail silently instead of being surfaced to the operator.
0.15.0-alpha2026-08-17
Added
- A splash screen on load — the Versify logo alongside a random popular, inspirational verse from the Bible or Book of Mormon, a different one each time.
- A secret feature. You'll know it when you find it.
0.14.0-alpha2026-08-17
Added
- Hardcoded beta license keys —
VERSIFY-BETA-2026unlocks the Production tier without needing the real licensing backend yet, and expires December 31, 2026, so anyone still on this build after the beta wave is prompted to update. Real licensing is still fully built underneath and remains the plan for later in the beta phase. - Opt-in analytics consent, GDPR-style — nothing is collected until a first-run prompt is explicitly answered "Allow" (denying, or not answering, blocks every event). Changeable anytime via a new Settings > Privacy toggle.
- A "What's New" popover shown once per version update to returning users (never on a brand-new install's first run, since the tutorial already covers that) — this first entry thanks beta testers and highlights the new Privacy setting and Send Report.
Changed
- The tier default flipped from
productiontobasic— a fresh install now starts locked down like a real user's would, instead of everything being unlocked out of the box.
0.13.0-alpha2026-08-17
Added
- A standalone
analytics.htmldashboard (not linked from the Control Panel) for checking in on collected usage stats — stat cards for total events/unique installs/install age, and a plain-CSS bar chart per event field, matching whichever theme is already set. - Every analytics event is now tagged with the app version automatically (server-side, always authoritative).
- Install identity now includes a first-seen timestamp (
.versify-install-meta.json, migrating automatically from the older bare-ID file), letting the dashboard show roughly how long an install has been around. - Session-length tracking: a
session_endevent fires vianavigator.sendBeaconon page teardown, recording how long the Control Panel was open. - Manual log rotation — an "Archive & Reset Log" button (and
POST /api/analytics/rotate) archives the current log to a timestamped file and starts a fresh one, keeping the archived data rather than deleting it. Deliberately not automatic or scheduled — it only runs when someone explicitly triggers it.
0.12.0-alpha2026-08-17
Added
- Local usage-statistics infrastructure (
analytics.py) — events append to a gitignored local JSONL file, tagged with an anonymous per-install ID (a random UUID, never tied to a name/email). Nothing is sent anywhere external, and nothing surfaces in the UI yet; aGET /api/analytics/summaryendpoint aggregates counts for manual inspection until there's a reason to build a real view. About 20 real actions are instrumented — verse lookups (translation, volume, reference, and how it was triggered), background/text-style/NDI changes, licensing attempts, controller settings, feedback submissions, the Display window, and tutorial completion/drop-off — all counts and categories, never a controller's name, a feedback description, an uploaded file, or anything else someone typed. Client-side error messages are sanitized to redact local file-path usernames (e.g./Users/alex/...→/Users/<user>/...) before being logged, since the alternative — collecting them raw — could otherwise leak an OS username.
0.11.0-alpha2026-08-17
Added
- A first-run tutorial: an 8-step guided tour of the Control Panel (verse lookup, recent verses, live preview, backgrounds, text style, and a pointer at the Settings gear), shown once per browser via a
localStorageflag. Each step dims the rest of the screen and opens a small window next to the feature it's explaining; narrated only, so Next/Back/Skip always advances regardless of whether the highlighted feature is actually touched. Dismissible via Skip or Escape. There's no end-user "replay" option by design — only a "Replay Tutorial" button in Settings > Developer Override, for testing.
Fixed
.btn[hidden]wasn't actually hiding —.btn's owndisplaystyle tied the browser's default[hidden]rule on CSS specificity and won on source order, so a hidden button (the tutorial's Back button on its first step) stayed fully visible and clickable. Fixed with an explicit.btn[hidden] { display: none; }rule, which protects any other hidden.btnin the app going forward, not just this one.
0.10.0-alpha2026-08-17
Added
- A tier-specific upgrade prompt in Settings > Licensing, shown on the Basic and Professional tiers to point out what the next tier up unlocks (hidden entirely on Production, since there's nothing left to upsell).
Changed
- Professional/Production-gated features (System Fonts & Favorites, NDI Output) now grey out instead of disappearing entirely when the current tier doesn't unlock them, so it's obvious what's available at a higher tier rather than hiding it. The underlying controls are also actually disabled, not just dimmed.
- Removed every remaining user-facing mention of the third-party licensing/payment processor from Settings — end users have no reason to know or care who processes licensing behind the scenes, and any customer-facing text should read as coming from Versify, not a third party. Two license-activation error messages that could have leaked that name into the UI on a network failure now say "the license server" instead.
0.9.1-alpha2026-08-17
Changed
- The "Include technical details" checkbox on a Feedback report is gone — that information (app version, current settings, recent errors) is now always included, with a small note next to the report controls explaining that some non-identifying system information is gathered automatically.
- "Copy Instead" (and the Send Report failure fallback) now opens the report text in its own popup instead of expanding it inline inside the Settings modal, keeping Settings compact regardless of how long the report gets. The popup layers on top of Settings and closes independently — via its own × button, a backdrop click, or Escape (which closes the popup first, then Settings on a second press).
0.9.0-alpha2026-08-17
Added
- Feedback reports can now be sent directly instead of only copied — a new "Send Report" button emails the report via a new
emailer.pymodule (stdlibsmtplib, no new dependency). Recipient defaults to a personal inbox for now, planned to move to asupport@address before beta; email credentials are read from environment variables rather than hardcoded, since a real password baked into tracked source would sit in git history forever. Until credentials are configured, Send Report shows a clear "not set up" message and falls back to the existing copyable report text, so there's never a dead end. "Copy Instead" remains as a manual fallback alongside it. - The Feedback report's license status now gets its own "### Licensing" section instead of being buried as one bullet among network/disk/connection details in "### Server".
- The Settings modal's "Developer override" tier dropdown moved out of the Licensing section into its own section at the very top of the modal, visually flagged with a dashed border so it reads clearly as a testing-only control.
- NDI Output's two checkboxes are now toggle switches, to read more clearly as on/off controls than plain checkboxes.
Changed
- Settings section headers (Appearance, Licensing, NDI Output, Controller Settings, Feedback) are noticeably larger and bolder, with a dividing line, so the modal's sections are easier to tell apart at a glance.
0.8.0-alpha2026-08-17
Added
- Bug reports now capture much more automatically: on the device side, OS/platform, screen resolution and window size, touch support, connection type, theme, tier, controller name/id, and Background Library usage — none of which the server can see on its own. On the server side, uptime, network config (port, detected LAN IP, and the IP address the report was actually submitted from — useful for figuring out which device on the network hit a problem), who else was connected at the time (Displays/controllers/NDI), and disk headroom (uploads folder size plus free space on the volume, since video backgrounds can run up to 500MB each and running out mid-event would be a bad time to find out).
0.7.1-alpha2026-08-17
Fixed
- The Feedback section's copy assumed the reader already knew a specific internal workflow. Reworded to describe what the feature actually does for whoever's using the app — copy a report and send it along to whoever's supporting it — without assuming any particular process on the other end. Also softened "diagnostic info" to "technical details."
0.7.0-alpha2026-08-17
Added
- Select or drag multiple background files at once. Uploaded one at a time in sequence (not in parallel, to keep progress clear and avoid hammering local disk I/O with several large video writes together), with a "N of M" status; only the last file in the batch becomes the active Display background, so a multi-file drop doesn't flash through every file as each one finishes.
- The existing 10-item Background Library cap now applies to the whole batch up front: if the selection wouldn't fit, or any file in it is the wrong type or an oversized video, the *entire* batch is rejected with a clear message before anything uploads — same "make the operator choose deliberately" reasoning as the single-file cap check, rather than silently uploading some files and skipping others.
Fixed
- A real bug caught while building the above:
e.target.filesis a liveFileListtied to the input element, not a snapshot. The single-file version happened to be safe because it immediately indexed out the oneFileobject; naively carrying that same pattern to multiple files (const files = e.target.files) meant the very next line — resetting the input's value so re-picking the same file(s) still fires "change" — emptied the list out before it was ever used. Fixed by copying into a real array first.
0.6.2-alpha2026-08-17
Fixed
- "Choose file" silently stopped working after the first video upload of a session — no error, nothing happened on subsequent picks. Root cause: the "Uploading…" status was shown by replacing the drop zone's
innerHTML, which destroys and recreates the file<input>inside it; thechangelistener stayed bound to the original (now-orphaned) element, so the freshly recreated input had nothing listening to it. Fixed by toggling visibility of a separate status element instead of ever touching the input's DOM subtree. Also reset the file input's value after each pick so selecting the exact same file twice in a row fireschangeagain too (a separate, related gotcha).
0.6.1-alpha2026-08-17
Added
- Remove a background from the "Background Library" (renamed from "Recent uploads") with the small "×" on each thumbnail. Uploaded video files are also deleted from the server (
DELETE /api/upload-video, with path-traversal protection) souploads/doesn't grow unbounded — image entries are embedded data URLs with nothing server-side to clean up. Removing the background currently on screen asks for confirmation and resets the Display to the default background first, rather than deleting a video file out from under whatever's still on screen.
Fixed
- Uploading an 11th background used to silently evict the oldest library entry (and, for a video, without ever deleting its now-orphaned server file). It now blocks the upload with a clear error telling you to remove one first, instead of guessing which one you didn't want.
.btns built from non-<button>elements (like the "Choose file" label) had no flex centering, somin-heightstretching the box taller than the text needed left the text sitting high with the extra space collecting below it instead of being centered. Fixed at the base.btnrule so it's robust for any element type, not just this one button.
0.6.0-alpha2026-08-17
Added
- Real licensing is now live: enter a license key in Settings to activate it against the license server (no separate account needed for this — the license key itself is the credential) and unlock its tier. Caches the result locally with a 7-day offline grace period so a bad-Wi-Fi show day doesn't suddenly lock out Production features, while an explicit revocation/expiry takes effect on the next check. The existing manual tier dropdown becomes a "developer override" that only applies until a real license is activated.
- A "Copy Report" bug-report feature (Settings > Feedback): pick Bug or Improvement/Feature Request, describe what happened, and copy a self-contained Markdown report (app version, current state/settings, license status, recent client- and server-side errors) sized to paste straight into a support conversation. Falls back to a selectable text box if the clipboard API is unavailable.
- Persistent server-side error log (
.versify-debug.log, gitignored) and a safety net around every POST handler so an unexpected failure always gets logged and returns a real error message instead of the connection just dropping. - A recommended-size (1920×1080px) tooltip on the background upload drop zone.
Fixed
- Video background uploads now report *why* they failed (file too large, connection interrupted, disk error) instead of a bare status code — and a connection interrupted mid-upload is now caught and reported instead of silently saving a truncated, broken file.
- The "Choose file" button (and other
.btn.smallbuttons) had ballooned to a disproportionate 44px tall from the earlier touch-target pass; given its own smaller minimum height. .checkbox-rownever had its owndisplay: flex— it happened to render correctly only inside the Text Style panel, which supplied that from a parent-scoped rule. Every checkbox added to the Settings modal this session (NDI, Controller Settings) was actually rendering broken/overlapping until this was caught and fixed directly on.checkbox-rowitself.
0.5.2-alpha2026-08-17
Added
- Controller Settings section is now functional: give this controller a display name (shown to other controllers in place of a bare count), get a toast notification when another controller makes a change (shows who, when named), and a view-only mode that dims and disables editing on this controller while keeping the live preview visible — for a monitoring-only screen.
js/sync.js'ssubscribeToServerStatenow takes a{clientTag, clientId, name}options object (still accepts a bare tag string for backward compatibility);server.pytracks id/name per controller connection so/api/statuscan list who's connected and state broadcasts can say who made a change.
0.5.1-alpha2026-08-17
Added
- NDI output is now actually controllable from the Settings menu: independent toggles for the full and alpha/key outputs, taking effect within a few seconds without restarting the NDI bridge (a separate process, polling
server.py's new/api/settingsendpoint every 3s). - Licensing is now a real 3-tier system (Basic < Professional < Production) instead of a single unlock toggle, chosen via a tier selector in Settings. Basic covers the whole core app; Professional gates system font search + favorites; Production gates NDI output. Tier now lives server-side (
/api/settings) rather than per-browser, since NDI is a shared, installation-wide capability, not something that should vary controller to controller. This test environment defaults to Production so nothing needs unlocking — that default must change before shipping. - Appearance section in Settings: Light / Dark / "Use system setting" theme control for the Control Panel itself (not the Display window).
css/control.cssnow uses CSS custom properties for theming; applied via an inline<head>script so there's no flash of the wrong theme on load.
Fixed
- Removed the NDI bridge's
window-all-closedlistener — with live-toggleable outputs, disabling both from Settings would otherwise have quit the whole bridge process instead of just idling until one is re-enabled.
0.5.0-alpha2026-08-17
Added
- Settings menu: a ⚙ button in the header opens a modal with Licensing, NDI Output, and Controller Settings sections. Licensing is fully functional (the Pro "unlock for testing" toggle moved here from the font panel, centralizing it); NDI Output and Controller Settings are placeholder "coming soon" sections — scaffolding for controls we'll build out later, per plan.
- Modal closes via the × button, clicking outside it, or Escape.
Changed
- The font panel's Pro section no longer has its own inline unlock button — it now shows the PRO badge plus a "Manage licensing in Settings" link, since licensing lives centrally in Settings now.
0.4.1-alpha2026-08-17
Fixed
server.pywas blindly trustingVERSIFY_LAN_IP(the machine-specific override for pinning to a production network's NIC — see.versify-local.env) even when that address no longer belongs to any interface on the machine, e.g. after moving to a different network. It now validates the override actually binds locally before using it, falling back to auto-detection (with a printed note) otherwise — previously this silently handed out a dead address for "Copy Display Link" and other devices.start.shdidn't check whether the server process actually stayed running after launching it — if the port was already taken (e.g. a leftoverserver.pyfrom a previous run that was never stopped), it printed the crash traceback but then carried on anyway, started the NDI bridge, and falsely reported "Versify is running." It now checks the server process is still alive before proceeding, and exits with a clear error if not.
0.4.0-alpha2026-08-15
Added
- System font search: on Chrome/Edge, browse and search every font installed on the computer running the Control Panel (via the Local Font Access API), with graceful fallback to typing a font name manually on browsers that don't support it (or if permission is declined) — same pattern already used for Zoram/McKay, where the font just needs to be installed on the Display machine.
- Font favorites: star any font (standard, system-searched, or manually typed) for one-click reuse from a favorites row, instead of re-searching every time.
- First Pro-gated feature: system font search and favorites are marked as a Versify Pro feature. There's no license backend yet, so unlocking is a local "Unlock for testing" toggle for now — a placeholder for a real entitlement check before this ships.
Fixed
- A CSS rule for the new Pro section's body was accidentally overriding the
hiddenattribute'sdisplay: none, which would have shown "Pro" controls to everyone regardless of lock state — caught and fixed before it left this machine.
0.3.0-alpha2026-08-15
Added
- Multiple simultaneous Control Panels now stay live-synced with each other, not just with the Display — each Control Panel subscribes to the same Server-Sent Events stream the Display uses, so a verse, background, or style change made in one window shows up in every other open Control Panel (and its preview) immediately.
- "N controllers connected" indicator in the header, so operators know when more than one Control Panel is live.
- Touch/iPad pass over the Control Panel: bigger tap targets (preset swatches, background library thumbnails, checkboxes, buttons all sized closer to Apple's 44pt minimum),
touch-action: manipulationon interactive controls to kill the tap delay and accidental double-tap zoom, and 16px form field text to stop iOS Safari's auto-zoom-on-focus.
Fixed
- Two Control Panels open at once previously had no way to see each other's changes — each held its own stale local copy of the state, so whichever one posted last silently overwrote the other (a real risk once more than one operator has the page open). Each Control Panel now tags its own edits with a per-session client ID so it can recognize (and skip re-rendering from) its own echoed update while still applying everyone else's.
0.2.0-alpha2026-08-16
Added
- Video backgrounds — upload a video file as the Display background, alongside gradient/color/image. Videos are stored as real files on the server (
uploads/, via a new/api/upload-videoendpoint) rather than embedded as data URLs, since video files are much larger than images and would otherwise blow past localStorage limits and bloat every state broadcast. - Background library ("recent uploads") now holds 10 items (up from 5) and supports both images and videos, with live video thumbnails.
- Version number shown in the Control Panel header, read from
VERSIONat runtime. - Git version control initialized for the project.
Fixed
- The server now sends
Cache-Control: no-cacheon every response, andClear-Site-Dataon the Control Panel / Display page loads — a stale cached copy of the JS after an edit caused real, hard-to-diagnose bugs more than once during development (including while building this release). Every page load now starts from a clean slate. - Video
<video>elements now wait for thecanplayevent before calling.play(), instead of calling it immediately after settingsrc— the immediate-call pattern is a known-unreliable autoplay pattern.
0.1.0-alpha2026-08-16
First versioned snapshot, capturing everything built so far.
Added
- Core architecture: Control Panel + Display window, kept in sync live by a local server (
server.py) over HTTP + Server-Sent Events — works across browser tabs, other devices on the network, and separate applications like the NDI bridge. - Scripture data: Old/New Testament in three public-domain translations (KJV, ASV, WEB), plus Book of Mormon, Doctrine and Covenants, and Pearl of Great Price.
- Verse lookup with book-name autocomplete; Next/Previous verse navigation (Enter to advance,
'to go back). - Backgrounds: gradient/color presets (including Chroma Green), custom color picker, image upload with a 5-image recent-uploads library.
- Text styling: font selection (including Zoram/McKay, referenced by name for locally-installed Church typefaces), auto-fit or manual sizing, text color.
- Layout modes: Full Screen, Lower Third, Upper Third — with an optional gradient scrim, toggleable off for clean chroma keying.
- Bible translation switcher (KJV / ASV / WEB), live-updating the verse on screen when switched.
- NDI output via a companion Electron app (
ndi-bridge/) — broadcasts two simultaneous NDI sources: the full styled output, and a real alpha-channel "key" output for compositing over camera video. - Multi-NIC support for production machines with more than one active network interface (
VERSIFY_LAN_IP,ndi-bridge/set-ndi-network.sh). - Copy Display Link, for opening the Display page directly from another device on the same network.
start.sh/stop.shfor one-command startup of the server and NDI bridge together.
Known gaps (tracked for later, not yet built)
- Quote mode (historical figures + public-domain portraits)
- Premium translations (NIV etc.) — needs direct publisher licensing
- Multiple simultaneous controllers for one Display
- Video backgrounds