Professional Bible Overlay System for Live Streaming
State-of-the-art Bible verse overlays for worship services, Bible studies, and live streaming
Features • Quick Start • Architecture • API Documentation • Contributing
AI usage disclosure: Much of this project's code was written with the assistance of an AI tool (Anthropic's Claude); originally it was written manually but it's been improved by AI. This includes the Node.js server, the client-side JavaScript for the overlay, control panel, mobile remote, and stage display, as well as much of the documentation. AI involvement is also reflected in the commit history, where several commits are co-authored by Claude. The maintainers have manually tested the application in OBS Studio prior to release, and automated smoke tests (
npm test) cover the pages, core API endpoints, and the WebSocket contract. The project is free, non-commercial, and open source under the MIT license.
- Overview
- Features
- Quick Start
- System Requirements
- Installation
- Configuration
- Usage
- Architecture
- API Documentation
- Development
- Deployment
- Troubleshooting
- Contributing
- License
- Support
PrimeBible Pro for OBS is a professional-grade Bible verse overlay system designed for churches, ministries, and content creators using OBS Studio. It combines stunning visual design, powerful features, and seamless integration to deliver Scripture beautifully during live streams, worship services, and Bible studies.
- 🎨 Professional Design: 6 customizable themes with glassmorphic effects and smooth animations
- ⚡ Lightning Fast: Real-time verse display with built-in caching
- 🎮 Intuitive Control: Web-based dashboard + mobile remote control
- 🔗 Deep OBS Integration: Automated setup, source management, and visibility control
- 📱 Multi-Device Support: Control from desktop, tablet, or phone
- 🖌️ Live Annotation: Draw, highlight, and annotate verses in real-time
- 📚 Multiple Bible Translations: Powered by PrimeBible API (default: KJV, AKJV, WEB, ASV - configurable)
- 🛠️ Zero Config: Works out-of-the-box with sensible defaults
- 🔒 100% Free: Open source, no subscriptions, no paywalls
| Theme | Description | Best For |
|---|---|---|
| Glass Lower Third | Modern glassmorphic design with blur effects | Contemporary worship services |
| Minimal Center | Clean, distraction-free centered display | Teaching & Bible studies |
| Full Screen | Maximum readability for large venues | Large auditoriums |
| Split Side | Professional side panel layout | Conference streams |
| Corner Card | Compact, unobtrusive display | Gaming/casual streams |
| Scrolling Ticker | News-style animated text | Announcements & extended passages |
- ✅ Multi-slide presentations with automatic text chunking
- ✅ Keyboard shortcuts for lightning-fast operation
- ✅ Service planning - Pre-load your entire service order, with CSV/JSON import & export
- ✅ History tracking - Never lose a verse you've displayed
- ✅ Favorites system - Quick access to commonly used verses
- ✅ Live preview - See exactly what will appear on stream
- ✅ OBS WebSocket integration - Full automation and control
- ✅ Live annotation tools - Draw, erase, highlight on-the-fly
- ✅ Stage display - Confidence monitor view for speakers
- ✅ Responsive design - Works on any screen size or device
- Fade - Classic smooth transition
- Slide Up / Down / Left / Right - Dynamic entrance from any direction
- Zoom In - Attention-grabbing scale effect
- None - Instant display, no animation
All animations respect the viewer's prefers-reduced-motion setting.
- Colors: Custom background, text, and accent colors
- Fonts: Curated Google Fonts (Lora, Merriweather, Roboto, Poppins, Montserrat, Open Sans)
- Sizes: Adjustable font scaling for any venue
- Safe Areas: Offset the overlay to avoid captions and other lower thirds
- Opacity: Transparent overlays or solid backgrounds
- High Contrast Mode: Enhanced readability for LED walls and projection
# Clone and start in one command
git clone https://github.com/primebible/primebible-for-obs.git && cd primebible-for-obs && npm install && npm start# 1. Clone the repository
git clone https://github.com/primebible/primebible-for-obs.git
cd primebible-for-obs
# 2. Install dependencies
npm install
# 3. Start the server
npm startOnce started, open your browser (default port is 4456, set in config.json):
- Control Panel: http://localhost:4456/control
- Overlay: http://localhost:4456/overlay
- Mobile Remote: http://localhost:4456/remote
- Stage Display: http://localhost:4456/stage
- In OBS, enable the WebSocket server: Tools → WebSocket Server Settings (default port
4455) - Open the Control Panel (http://localhost:4456/control)
- In the OBS Integration section, enter your OBS WebSocket URL and password
(defaults:
ws://127.0.0.1:4455, blank password) - Click Connect to OBS
- Click Setup Overlay in All Scenes - this automatically creates a browser source in every scene
- You're ready to go!
💡 Tip: Add the control panel as a Custom Browser Dock in OBS (View → Docks → Custom Browser Docks) so it lives inside OBS.
- OS: Windows 10/11, macOS 10.15+, Ubuntu 20.04+
- Node.js: v18.0.0 or higher
- RAM: 2GB available
- OBS Studio: v28.0+ (v29+ recommended)
- Browser: Chrome 90+, Firefox 88+, Safari 14+, Edge 90+
- OS: Windows 11, macOS 13+, Ubuntu 22.04+
- Node.js: v20.0.0+
- RAM: 4GB+ available
- OBS Studio: v29.0+
- Network: Gigabit Ethernet (for multi-device control)
- Install Node.js: Download from nodejs.org (LTS version recommended)
- Install OBS Studio: Download from obsproject.com
- Enable OBS WebSocket:
- Open OBS → Tools → WebSocket Server Settings
- Enable WebSocket server
- Note the port (default: 4455) and password (if set)
git clone https://github.com/primebible/primebible-for-obs.git
cd primebible-for-obs
npm install
npm start- Download the latest release
- Extract the ZIP file
- Open terminal in the extracted folder
- Run
npm install && npm start
docker build -t primebible-for-obs .
docker run -d -p 4456:4456 -v ./data:/app/data --name primebible-for-obs primebible-for-obsThe config.json file controls server behavior and default settings. The most important options:
| Option | Type | Default | Description |
|---|---|---|---|
port |
number | 4456 |
HTTP server port |
obsWebsocketUrl |
string | "ws://127.0.0.1:4455" |
OBS WebSocket URL |
obsPassword |
string | "" |
OBS WebSocket password |
overlaySourceName |
string | "PrimeBible Overlay" |
Name of the browser source created in OBS |
connectToObsOnStart |
boolean | false |
Auto-connect to OBS when the server starts |
autoCreateOverlayInAllScenes |
boolean | false |
Auto-create the overlay source in every scene on connect |
defaultTheme |
string | "glass-lower" |
Default overlay theme (glass-lower, minimal-center, full-screen, split-side, corner-card, ticker) |
defaultTranslation |
string | "kjv" |
Default Bible translation |
defaultAnimation |
string | "fade" |
Default animation (fade, slide-up, slide-down, slide-left, slide-right, zoom, none) |
maxCharsPerSlide |
number | 200 |
Character limit before splitting into slides |
maxLinesPerSlide |
number | 4 |
Line limit per slide |
autoAdvanceSlides |
boolean | false |
Automatically advance multi-slide passages |
autoAdvanceDelay |
number | 8000 |
Auto-advance delay in ms |
enableHistory |
boolean | true |
Track displayed verses in history |
maxHistoryItems |
number | 50 |
Maximum history entries to keep |
cacheVerses |
boolean | true |
Cache fetched verses in memory |
cacheDuration |
number | 3600000 |
Cache lifetime in ms (1 hour) |
remotePin |
string | "" |
PIN required for all WebSocket clients and mutating API calls (empty = no PIN) |
config.json also defines the theme and animation lists (overlayThemes, animations) and the translation dropdown (supportedTranslations — note the server's translation allowlist below takes precedence).
Fine-tune an individual overlay/browser source by appending parameters to its URL:
| Parameter | Example | Description |
|---|---|---|
theme |
?theme=glass-lower |
Theme for this overlay instance |
animation |
?animation=fade |
Animation for this overlay instance |
safeBottom / safeTop |
?safeBottom=80&safeTop=40 |
Pixel offsets to avoid captions/other overlays |
highContrast |
?highContrast=true |
Solid black background, pure white text (LED walls/projection) |
pin |
?pin=1234 |
Required when remotePin is set (the OBS setup button adds it automatically) |
Example: http://localhost:4456/overlay?theme=glass-lower&safeBottom=80&highContrast=true
| Variable | Default | Description |
|---|---|---|
PORT |
(uses config.json) |
Override the HTTP server port |
PRIMEBIBLE_API_URL |
https://primebible.com/api/verse-preview |
PrimeBible verse API endpoint |
PRIMEBIBLE_ALLOWED_TRANSLATIONS |
KJV,AKJV,WEB,ASV |
Comma-separated translation allowlist |
PRIMEBIBLE_ENABLE_BIBLEAPI_FALLBACK |
enabled | Set to 0 to disable the bible-api.com fallback |
Example:
PORT=8080 PRIMEBIBLE_ALLOWED_TRANSLATIONS=KJV,WEB npm start- Type a verse reference in the search box (e.g., "John 3:16")
- Select translation (KJV, AKJV, WEB, ASV by default)
- Choose theme and animation
- Click Fetch Verse to load it into the live preview
- Click Go Live to show it on stream
Long passages are automatically chunked into slides:
- Use Next/Previous buttons or arrow keys to navigate
- Progress indicator shows current slide
- Automatic text balancing for readability
- Add to Plan: Build your entire service order ahead of time
- Import/Export: Load plans from CSV or JSON, export for reuse
- One-Click Display: Click any plan item to load it instantly
- Plans persist in
data/service-plan.jsonacross restarts
To enable annotation tools:
- In OBS Studio, add the control panel as a Browser source with URL:
http://localhost:4456/control - Right-click the Browser source → Order → Move to Top (to set as overlay)
- Right-click the Browser source → Interact...
- IMPORTANT: Click the Enable button on the annotation tools in the control panel
- You can now annotate directly over your overlay!
Available annotation tools:
- Drawing Tool: Freehand draw on the overlay
- Highlighter: Emphasize specific words or phrases
- Eraser: Remove annotations
- Clear All: Reset the canvas
- Color Picker: Choose annotation colors
Active in the control panel (when not typing in a field):
| Shortcut | Action |
|---|---|
Enter |
Go live with the current verse |
Esc |
Hide overlay |
→ |
Next slide |
← |
Previous slide |
Scan the QR code in the control panel or navigate to http://[your-ip]:4456/remote on your mobile device.
Features:
- Touch-optimized interface
- Real-time sync with desktop
- Quick verse lookup and one-tap go-live
- Optional PIN protection: set
remotePinin config.json and every WebSocket client requires it — the control panel and remote prompt for it (or open with?pin=YOUR_PINonce; it's remembered on that device), and the "Setup Overlay in All Scenes" button bakes it into the OBS source URL. Manually added overlay/stage sources need?pin=appended. The PIN also guards all mutating API calls.
Open http://[your-ip]:4456/stage on a monitor facing the speaker — it mirrors the live verse as a confidence monitor.
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Control Panel │ │ Mobile Remote │ │ Stage Display │
│ (Web Browser) │ │ (Web Browser) │ │ (Web Browser) │
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │
└──────────┬──────────┴──────────┬──────────┘
│ │
┌─────────┴─────────────────────┐
│ WebSocket Server │
│ (Real-time Sync) │
└─────────┬─────────────────────┘
│
┌─────────┴─────────────────────┐
│ Node.js Express Server │
│ (API + Static Content) │
└────┬───────┬──────┬───────┬───┘
│ │ │ │
┌───────┴──┐ ┌──┴──┐ ┌─┴──┐ ┌──┴─────────┐
│PrimeBible│ │ OBS │ │data│ │ Overlay │
│ API │ │ WS │ │ / │ │(OBS Source)│
└──────────┘ └─────┘ └────┘ └────────────┘
Responsibilities:
- HTTP server (Express)
- WebSocket orchestration (ws library)
- REST API endpoints
- Static file serving
- OBS WebSocket client integration (with auto-reconnect)
- State management and persistence
Key APIs:
| Endpoint | Method | Description |
|---|---|---|
/api/health |
GET | Server status, uptime, connection counts |
/api/verse |
GET | Fetch Bible verses (?ref=John+3:16&translation=kjv) |
/api/history |
GET/DELETE | Read or clear verse display history |
/api/favorites |
GET/POST/DELETE | Manage favorite verses |
/api/service-plan |
GET/POST | Load/save service plans |
/api/service-plan/import/json |
POST | Import a plan from JSON |
/api/service-plan/import/csv |
POST | Import a plan from CSV (fetches each verse) |
/api/service-plan/export/json |
GET | Export the plan as JSON |
/api/service-plan/export/csv |
GET | Export the plan as CSV |
/api/search |
GET | Search history/favorites/plan (?q=God) |
/api/obs/connect |
POST | Connect to OBS WebSocket |
/api/obs/ensure-overlay |
POST | Create/update overlay source in OBS |
/api/obs/overlay-visible |
POST | Control overlay visibility |
/api/qr |
GET | Generate QR code for mobile access |
Responsibilities:
- Render Bible verses with themes and animations
- Listen for WebSocket commands from server
- Handle multi-slide presentations
- Apply live annotations and drawing
- Responsive design for all aspect ratios
WebSocket Events (Received):
displayVerse/hideVerse- Show or hide the versenextSlide/previousSlide- Navigate multi-slide contentsetTheme/setAnimation/setBackground/setFonts/setFontSizes- Live stylingticker- Switch to ticker modedrawing/clearDrawing/enableDrawing/setDrawColor- Live annotation
Responsibilities:
- Search and fetch verses
- Live preview before displaying
- Service plan management
- History and favorites management
- OBS connection and control
- Live customization interface
history.json- Recently displayed versesfavorites.json- User-favorited versesservice-plan.json- Saved service orderscustomizations.json- Saved styling customizations
1. User searches "John 3:16" in Control Panel
2. Control JS calls /api/verse?ref=John+3:16&translation=kjv
3. Server fetches from PrimeBible API (with cache)
4. Server returns JSON to Control Panel
5. User clicks "Go Live"
6. Control sends WebSocket message to Server
7. Server broadcasts displayVerse to all Overlay clients
8. Overlay animates verse on screen
9. OBS captures overlay as browser source
10. Verse added to history.json
Fetch a Bible verse or passage.
Query Parameters:
ref(string, required) - Bible reference (e.g., "John 3:16", "Psalm 23:1-6")translation(string, optional) - Translation code (default from config; must be in the allowlist)
Response:
{
"ok": true,
"cached": false,
"data": {
"provider": "primebible.com",
"reference": "John 3:16",
"translationId": "kjv",
"translationName": "King James Version",
"verses": [
{ "book": "John", "chapter": 3, "verse": 16, "text": "For God so loved the world..." }
],
"fullText": "16 For God so loved the world...",
"slides": ["16 For God so loved the world..."],
"fetchedAt": "2026-07-11T00:00:00.000Z"
}
}Note: fetching a verse automatically records it in history (when enableHistory is on). There is no POST /api/history; use DELETE /api/history to clear it.
Add a verse to favorites.
Body:
{
"ref": "John 3:16",
"translation": "kjv"
}Clients identify themselves via the ?role= query parameter on the WebSocket URL (overlay, stage, control, remote); the server responds with a hello message carrying config and current state, then both sides exchange typed JSON messages.
requestVerse, goLive, hideOverlay, setTheme, setAnimation, nextSlide, previousSlide, setBackground, setFonts, setFontSizes, ticker, drawing, clearDrawing, enableDrawing, disableDrawing, setDrawColor, forceRefresh, getState
goLive
{
"type": "goLive",
"payload": { "reference": "John 3:16", "slides": ["..."], "translationName": "KJV" },
"theme": "glass-lower",
"animation": "fade"
}displayVerse, hideVerse, setTheme, setAnimation, nextSlide, previousSlide, ticker, setBackground, setFonts, setFontSizes, drawing, clearDrawing, enableDrawing, disableDrawing, setDrawColor, forceRefresh
primebible-for-obs/
├── server.js # Main Node.js server
├── config.json # Configuration file
├── package.json # Dependencies
├── Dockerfile # Container build
├── scripts/
│ └── smoke-test.mjs # Automated smoke test (npm test)
├── public/ # Static web assets
│ ├── control.html # Control panel UI
│ ├── control.js # Control panel logic
│ ├── overlay.html # Overlay UI
│ ├── overlay.js # Overlay logic
│ ├── remote.html # Mobile remote UI
│ ├── remote.js # Mobile remote logic
│ ├── stage.html # Stage display (confidence monitor)
│ ├── stage.js # Stage display logic
│ ├── shared.css # Shared styles
│ ├── voice-control.js # Experimental voice verse detection
│ ├── voice-control-ui.js # Voice control UI component
│ └── voice-demo.html # Voice control demo page
└── data/ # Persistent storage (created automatically)
├── history.json # Verse history
├── favorites.json # Favorite verses
├── service-plan.json # Service plan data
└── customizations.json # Saved styling
# Start with auto-reload on file changes
npm run dev# Automated smoke test: boots the server, checks every page, the core API
# endpoints, and the WebSocket contract
npm test
# Full manual test checklist (OBS integration, themes, mobile, persistence)
# See SMOKE_TEST.mdWe welcome contributions! Please see CONTRIBUTING.md for guidelines.
Quick Contribution Guide:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- JavaScript: ES6+ syntax, async/await preferred
- Indentation: 2 spaces
- Naming: camelCase for variables/functions, PascalCase for classes
- Comments: JSDoc style for functions
See DIGITAL_OCEAN_DEPLOYMENT.md for the complete Digital Ocean deployment guide.
# Build Docker image
docker build -t primebible-for-obs .
# Run container (persist history/favorites/plans via the data volume)
docker run -d -p 4456:4456 -v ./data:/app/data --name primebible-for-obs primebible-for-obs- Set a
remotePinin config.json to protect the mobile remote - Configure OBS WebSocket password
- Set up reverse proxy (nginx/Apache)
- Enable HTTPS/SSL
- Configure firewall rules
- Set up automatic backups for the
data/folder - Use a process manager (PM2 or systemd)
- Set up monitoring (optional)
Solution:
- Verify OBS is running
- Check OBS WebSocket is enabled: Tools → WebSocket Server Settings
- Verify the URL (default:
ws://127.0.0.1:4455) and password match your config - Ensure firewall allows WebSocket connections
Solution:
- Verify overlay URL is correct:
http://localhost:4456/overlay - Check browser source dimensions match your canvas (1920x1080)
- Ensure overlay source is not hidden in OBS
- Try clicking "Refresh cache" in OBS browser source properties
Solution:
- Check internet connection (required for Bible API)
- Verify PrimeBible API is accessible
- Check server console for API errors
- The bible-api.com fallback is on by default; make sure
PRIMEBIBLE_ENABLE_BIBLEAPI_FALLBACKis not set to0
Solution:
- Ensure devices are on same network
- Use your computer's local IP (not localhost)
- Check firewall allows port 4456 connections
- If you set a
remotePin, the remote will prompt for it (or open/remote?pin=YOUR_PIN)
Visit http://localhost:4456/api/health to see server status, uptime, and live connection counts — useful for confirming the server is up and clients are connected.
We love contributions! Here's how you can help:
- 🐛 Report bugs: Open an issue
- 💡 Suggest features: Start a discussion
- 📝 Improve docs: Submit a PR for README updates
- 🎨 Add themes: Create new overlay themes (see CONTRIBUTING.md)
- 🌐 Translations: Help translate the interface
Thanks to all our contributors! 🙏
This project is licensed under the MIT License - see the LICENSE file for details.
- PrimeBible API: Free for non-commercial use
- OBS Studio: GPL-2.0
- Node.js dependencies: See individual package licenses
- 📚 Documentation: QUICKSTART.md
- 💬 Community: GitHub Discussions
- 🐛 Issues: Bug Tracker
- 📧 Email: support@primebible.com
- 🌐 Website: primebible.com
PrimeBible for OBS is 100% free and open source. If this project has blessed your ministry, consider supporting:
- ⭐ Star this repository
- 💬 Share with your church/community
- 💙 Sponsor PrimeBible (optional)
- Additional overlay themes (Neon, Classic, Minimal Modern)
- Typewriter animation
- Voice-activated verse detection (experimental build ships in
public/voice-*) - Enhanced mobile remote with gesture controls
- Multi-language interface (Spanish, Portuguese, Korean)
- Hotkey support for physical stream deck integration
- Enhanced stage display with speaker notes
- Cloud sync for service plans
- Collaborative remote control (multiple devices)
- Custom theme builder with visual editor
- Automated sermon note generation
- Integration with other Bible APIs (Crossway, YouVersion)
- Lines of Code: ~5,000
- Languages: JavaScript, HTML, CSS
- License: MIT
- Status: Active Development
- First Release: November 2025
- PrimeBible: For providing the exceptional Bible API
- OBS Studio: For the amazing streaming platform
- obs-websocket-js: For WebSocket integration library
- Our Contributors: Thank you for making this project better!
Made with ❤️ by PrimeBible
Bringing Scripture to Life in Your Streams
Website • GitHub • Documentation • Issues
© 2025 PrimeBible. Released under the MIT License.