Repository navigation
Building from Source
- Rust (stable)
- Node.js 18 or newer and npm
- To package installers: the Tauri CLI,
cargo install tauri-cli --version "^2" --locked - Linux only:
libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev
npm install
npm startnpm start runs the app from the project folder, so edits under src/ show after a reload. You can also open src/renderer/panel/panel.html in a browser for quick UI work; native features (output windows, file dialogs, the display server) are unavailable there.
npm run tauri:buildInstallers are written to src-tauri/target/release/bundle/: .app and .dmg on macOS, .exe on Windows, .deb and .AppImage on Linux. Build each system on that system. The same builds run in GitHub Actions (.github/workflows/push-release.yml), which publishes a pre-release on every push to main, and a normal release for a v* tag.
npm testRuns the Node tests (lower-third designs, social overlay, displays view, spoken references, song import) and the Rust tests (relay, file serving rules, Bible search).
src/
renderer/
panel/ The control panel
panel.html
styles/ base.css, modern.css, console.css (loaded in that order)
scripts/ Classic scripts loaded in order by panel.html:
core/ state and storage, app core, settings, i18n and theme, startup
library/ Bible and lyrics library, chapter grid, Bible search
ui/ workspace, sidebar, shortcuts, command palette, app chrome
output/ live output, sync, embedded Program/Preview displays
sources/ media and backgrounds
integrations/ host mode, displays, wall, media, phone remote, updates
display/ The output page, used by every output and link
wall/ The Wall/LED page
displays/ The Displays pop-out window
fonts/ Bundled fonts (Geist, Geist Mono, Source Serif 4)
shared/ Code used by several pages
src-tauri/ The desktop app (Rust): servers, relay, Bible search, windows
assets/ bibles/ (bundled Bible XML), logo/, bg/
build/ App icon source and logo
test/ Node tests
.github/ CI: tests, installers, releases
The display page is served at /src/renderer/display/display.html. The old /UI/scripture-pod-display.html address redirects there, so saved OBS browser sources keep working.
- The panel (the control window) sends messages. Native things, such as windows, files and the network, go through a small bridge to the Rust side.
- The Rust side runs a small web server (port
5510) that serves the pages, and a WebSocket relay (port5511) that passes the panel's messages to every connected display. The relay needs the per-launch token. - The display page is one page used by every output. Which view it shows depends on its address: the live display, a monitor (
role=monitor), the stage display (role=stage) or media only (role=media). - Output windows inside the app receive their messages directly, not over the network.
See src-tauri/README.md in the repository for how the Rust side maps to the pages and what has been verified.
Fork, make changes, and open a pull request. Keep changes focused and include short tests or manual verification steps.
Scripture Pod is open source (MIT). Found a problem? Open an issue.
Scripture Pod
Workspaces
Screens and streaming
Using the app
Help