Real-time Bible scripture display for church services. Listens to a preacher’s microphone, detects scripture references from speech, and sends the verse text to your presentation software.
Download the latest installer from Releases.
No Python installation required — everything is bundled.
BibleCue is not signed with an Apple Developer ID, so the first time you open it macOS will say it “could not verify BibleCue is free of malware”:
xattr -dr com.apple.quarantine /Applications/BibleCue.app
For Google Speech mode, set Chrome or Edge as your default browser — Safari’s speech recognition won’t drive it.
| Software | Output plugin |
|---|---|
| ProPresenter 7+ | ProPresenter |
| OBS Studio | OBS WebSocket |
| EasyWorship, MediaShout, Proclaim | HTTP Webhook |
| Any software that watches a file | Text File |
| Any | Clipboard |
| Legacy broadcast hardware | TCP Raw |
Turn on exactly one output in BibleCue’s Outputs card — enabling several at once sends every detected verse to all of them.
BibleCue doesn’t drive ProPresenter’s Bible/Scripture module — it triggers a Message, and ProPresenter never displays a message’s UUID anywhere in its own interface, so you pull it from the API itself:
1025,
which is also BibleCue’s default). Find the Mac/PC’s local IP address
(e.g. in System Settings → Network) — that’s what goes in BibleCue’s IP field.**
into one layer and ** into the other — these are
placeholder tokens; ProPresenter fills them in live when BibleCue triggers
the message. Save it and give it a name you’ll recognize, e.g. “BibleCue”.http://<propresenter-ip>:<port>/v1/messages
This returns every message as JSON. Find the one you just made by its
"name" and copy the value under "id": { "uuid": "..." }.
Both machines must be on the same network. ProPresenter’s exact menu wording varies a little by version — look for “Network” under Preferences/Settings if the path above doesn’t match exactly.
Requires a text source already added to your OBS scene (its name goes in BibleCue’s Text Source field — must match exactly).
4455) and the password (click “Show Connect Info”).127.0.0.1 if BibleCue runs on the
same machine as OBS (otherwise OBS’s local IP), the port, the password, and
the exact name of the text source to update.Enter any URL that accepts a POST with JSON body
{"verse": "...", "reference": "...", "translation": "..."} — e.g. an
EasyWorship/Proclaim integration, a Zapier/Make webhook, or your own script.
Enter a file path (e.g. C:\verse.txt or /Users/you/verse.txt). BibleCue
overwrites it with the verse text and reference on every detection — point
whatever software you use (a lower-third tool, OBS’s “Read from file” text
source, vMix, etc.) at that same path.
Enter the IP and port of a device listening on a plain TCP socket (legacy
broadcast character generators, custom scripts). BibleCue sends
"<verse text> — <reference>\n" as UTF-8 on each detection — no protocol
beyond that.
No setup — copies "<verse text> — <reference>" to the system clipboard on
every detection. Paste it into anything.
Requirements: Node.js 18+, Python 3.10+
# Install Python dependencies
pip install sounddevice numpy scipy requests python-scriptures websockets Pillow obs-websocket-py ndi-python
# Install Node dependencies
cd biblecue-desktop
npm install
# Run in development
npm start
Requires Python 3.11 and PyInstaller (pip install pyinstaller).
# 1. Bundle the Python backend into a standalone executable
pyinstaller backend.spec # -> dist/backend.exe
# 2. Copy it into the Electron app
copy dist\backend.exe biblecue-desktop\python\backend.exe # Windows
# cp dist/backend biblecue-desktop/python/backend # macOS
# 3. Build the platform installer
cd biblecue-desktop
npm run build # Windows NSIS installer -> dist/
npm run build:mac # macOS DMG -> dist/
The local Bible (KJV, WEB) downloads automatically from getbible.net on first run and is cached on disk — there is no Bible build step.
_output_yourplugin() function in output_plugins.py"yourplugin" in fire_outputs()DEFAULT_SETTINGS["outputs"] in biblecue.pybiblecue-desktop/renderer/index.htmlcollectOutputs(), and populateOutputs() in app.jsMIT