Skip to content

Building from Source

JoshuaPavan edited this page Oct 30, 2026 · 1 revision

Building from Source

Requirements

  • 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

Run it

npm install
npm start

npm 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.

Build an installer

npm run tauri:build

Installers 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.

Tests

npm test

Runs the Node tests (lower-third designs, social overlay, displays view, spoken references, song import) and the Rust tests (relay, file serving rules, Bible search).

Project layout

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.

How the pieces talk

  • 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 (port 5511) 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.

Contributing

Fork, make changes, and open a pull request. Keep changes focused and include short tests or manual verification steps.

Clone this wiki locally