Listens to a live sermon and displays the verse on a projector screen automatically — two ways:
- Spoken reference — someone says "John 3:16" or "First Corinthians chapter 13 verse 4" out loud.
- Spoken quote — someone quotes a verse's actual words ("For God so loved the world...") without saying the reference. The tool matches what was said against the full King James Bible and figures out the reference itself.
Built on Supabase Realtime as the live bridge between the two screens, with no custom backend server required.
Two pages, two laptops:
detector.html— runs on a laptop near the sound booth. Transcribes the sermon live, checks each chunk for a spoken reference, and — if none is found — checks whether the words just spoken closely match an actual Bible verse. Either way, it looks up the verse and broadcasts it.display.html— runs full-screen on the projector laptop. Just listens for broadcasts and shows whatever verse comes in.bible-kjv.json— the full King James Bible (66 books, 31,102 verses, public domain), bundled so quote-matching works without needing a paid search API. Loaded once when the detector page opens.verse-search.js— the quote-matching engine. Weighs distinctive words (like "shepherd" or "begotten") much more heavily than common ones (like "lord" or "heart") so it doesn't false-positive on generic sermon chatter — tested against plain conversational sentences ("we just had a great time of worship this morning") to confirm they don't accidentally trigger a match.
They talk to each other entirely through a Supabase Realtime channel — no server, no polling, near-instant.
- Google Chrome on both laptops. Browser speech recognition is Chrome-only right now — Safari and Firefox don't support it reliably.
- A free Supabase project (you don't need any tables for the live flow to work — Realtime broadcast doesn't require a database).
- Internet connection on both laptops (for speech recognition and the
reference-lookup API; quote-matching itself runs fully offline once
bible-kjv.jsonhas loaded). - A working microphone with a reasonably clear feed of the preacher's voice.
Just create a free project at supabase.com — you only need the Project URL and Publishable/anon key, both found under Project Settings → API.
- Open
detector.htmlin Chrome on the sound-booth laptop. Wait for the status bar at the top to say "Bible search index ready" before relying on quote detection — this takes a couple of seconds on first load. - Open
display.htmlin Chrome on the projector laptop, and make it full-screen (F11).
On both pages, paste in the same Supabase URL, key, and channel name
(default scripture-live — just needs to match on both pages), then
save/connect.
On the detector page, click Start Listening and allow microphone access when Chrome asks. Try both ways of testing it:
- Say "John 3:16" out loud (reference detection).
- Say "For God so loved the world that he gave his only begotten son" out loud (quote detection).
Both should appear on the display page within a second or two.
Leave both pages open. There's a manual input box on the detector page for typing a reference or pasting a quote directly, for whenever auto-detect misses something.
All verse text — both the reference-lookup API and the bundled quote-matching dataset — comes from public domain sources: the King James Version (bundled directly, from aruljohn/Bible-kjv, MIT-licensed JSON of public domain text) and, for reference lookups, optionally the World English Bible via bible-api.com. Modern translations like the NIV or ESV are copyrighted and would require a paid, licensed API instead; don't swap either source without checking the license terms of whatever you point it at.
- Quote-matching only works well against literal KJV wording, and tolerates small speech-to-text slips (one-letter differences like "loved" heard as "love," or "world" heard as "word") — this was tested and fixed. If someone quotes a genuine paraphrase ("Anyone who finds a wife finds a good thing" — that's NIV-style, not KJV's "Whoso findeth..."), the match can still fail, since the words differ too much.
- Heavily degraded transcripts intentionally return no match rather than guess. Tested case: "For God so love the word" (a badly mis-heard version of John 3:16) has only 3 recognizable words left, and those 3 words also appear together in a different verse (1 John 2:5) — with that little signal, the tool can't safely tell which one you meant, so it stays silent instead of risking showing the wrong verse to the congregation. This is deliberate: a wrong verse on screen is worse than no verse. The real fix is a clearer mic feed for that moment, or the manual override box.
- Very short verses (like "Jesus wept," the shortest verse in the Bible) may not have enough distinctive words to clear the matching threshold by default. Also a tested, known gap.
- Speech-to-text accuracy depends heavily on mic quality and clarity — expect some misses early on.
- Chrome's speech recognition periodically restarts itself; the detector page auto-restarts it, but there can be a brief gap.
- Genuinely ambiguous phrasing can be misread even by the best version of this: "Psalm one nineteen" (commonly meaning Psalm 119) will currently be parsed as chapter 1, verse 19, since spoken numbers don't distinguish "one-nineteen-the-single-number" from "one, then nineteen" without more context.
- No authentication on the Realtime channel as built — fine for a single church's internal use, but don't publish your Supabase key anywhere public if you'd rather strangers not be able to broadcast to your screen.
schema.sqladds an optional table if you want a logged history of every verse shown, e.g. to publish "today's references" after the service.- To improve quote-matching against modern paraphrasing, the most direct next step would be bundling a second public-domain translation (e.g. the World English Bible) into the search index alongside the KJV, so a quote can match against either wording.
- Styling in
display.htmlis a simple placeholder — restyle it to match whatever design system you're already using for the church's slides.