Rendering scripture without a spinner
Rendering scripture without a spinner
The single nastiest UI failure mode in church presentation software is the loading spinner. Not a crash, not a wrong verse — a spinner. The presenter clicks Next, the projector shows a loading state, and several thousand people watch the worship team improvise for four seconds.
Verse is built so that doesn’t happen. This post is a quick tour of how.
The premise
Every verse the desktop app might project is one of three things at any moment:
- Pre-rendered. The card is on disk, rasterised at the projector’s output resolution, ready to draw.
- Composable. The translation + reference are on disk; the card has to be laid out, but no network call is needed.
- Missing. Not on disk at all. Won’t be shown until it’s been fetched and either pre-rendered or composed.
The trick is to push as much as possible into (1), make sure (2) is fast enough to be invisible, and make (3) impossible during a service.
Pre-render at plan time
When you drop a scripture reference into a service plan, Verse doesn’t just store the reference. It walks the renderer over every card the plan will need — every verse range, every translation switch, every theme variant — and writes pre-rendered frames into a per-plan cache.
That work happens at plan-build time, not at presentation time. The plan you saved on Friday already contains rasterised slides for every verse you queued. By Sunday morning the spinner has nowhere to live.
Local-first translation storage
For composition (case 2), every translation Verse supports is stored locally:
- Public-domain translations (KJV, ASV, BBE, WEB) ship inside the desktop installer.
- Licensed translations download on first use, with a verifiable checksum, and stay on disk forever.
- The verse picker queries the local store directly. There is no network round-trip in the search path.
A consequence: search latency is bounded by the SSD, not the WAN. The reference selector responds in single-digit milliseconds even on the slow corporate laptops a lot of volunteer techs end up running Verse on.
The “missing” case
We worked hard to make (3) impossible during a service, but it’s not impossible at planning time. If a presenter picks a translation that isn’t yet on disk, Verse fetches it — but it does so during the picker dialog, with progress, not silently behind the next slide. By the time the presenter has confirmed the reference, the translation is local.
If the desktop app can’t reach the network at all (a real possibility on Sunday) it just refuses to add a translation it doesn’t have. That’s an honest failure mode: you see it ten minutes before service, not during.
What we cheat on
A few smaller things we punt on, in the interest of full disclosure:
- Font loading. Custom theme fonts are bundled per-plan; we don’t hot-load fonts mid-service.
- Image backgrounds. Theme background images are rasterised into the card; we don’t redraw them per-slide.
- Audio cues. We don’t pre-render audio. If you’re mixing audio cues with Verse-driven visuals, the audio layer is on you (for now).
Why this matters
It matters because the people running church AV are usually volunteers, often new every six months, often working on the laptop that someone donated three years ago. They cannot debug a spinner mid-sermon. Our job is to make sure they never have to.