SanctuaryPro is a Windows desktop application for church presentation management, built with Electron. It runs a local Express/Socket.io server as a child process and presents a browser-based admin panel for operators, while projecting a separate live view to connected screens.
The admin and live view communicate in real time over Socket.io, allowing instant, seamless projection of Bible verses, slides, images, video, audio, and custom text.
Platform
Windows · Electron
Architecture
Express + Socket.io
File Format
.sps (sessions)
ℹ️
SanctuaryPro enforces a single instance lock — if a second launch is attempted, the existing window is brought to focus. If a .sps file is passed as an argument, it is opened in the running instance.
A session captures the full state of a service — the media library, backgrounds, font settings, and all content — in a single .sps file. Sessions are stored in Documents\SanctuaryPro\Sessions\.
Welcome Screen
Shown on first launch and when no session is open. Presents three starting options, a list of recent sessions (with document icons), and a recovery prompt if an unsaved session was detected from a previous crash.
New Session from Default
Creates a new session pre-populated from a built-in default template. The operator names the session before any content is loaded, keeping the workflow consistent from the start.
Blank Session
Creates an empty session with no library items, backgrounds, or content. Ideal for one-off use or building from scratch.
Open from File (.sps)
Opens an existing .sps session file via the file picker or by double-clicking a .sps file in Windows Explorer. The file association is registered at install time.
Recent Sessions
The welcome screen shows recently opened sessions with their names and last-modified dates. Selecting one loads it immediately.
Save Session
Saves the current session in place if it has a name. If the session is unsaved or unnamed, a Save As dialog is shown to give it a name and location.
Rename / Save As
If saving a named session with a different name, a dialog offers three choices: Rename (moves the file), Save As (creates a copy with the new name), or Cancel. Pressing Escape cancels and restores the original name.
Unsaved Changes Guard
When quitting or opening another session while there are unsaved changes, a dialog prompts the operator to Save, Discard, or Cancel — preventing accidental data loss.
Session Dropdown
The header toolbar shows the current session name as an editable field. A dropdown menu offers New, Open, and Save options, sorted with the most-used actions at the top.
↑ Back to top
The library is the central content list for a session. Every item added to a session — slides, images, videos, audio, text slides, slideshows — lives here.
Adding Items
Items are added via toolbar buttons (PPTX, Image, Video, Text, Audio, Slideshow) or by drag-and-drop directly onto the library panel. Dragging a folder uploads all supported files within it.
Reordering Items
Library items can be dragged to reorder them. The order is preserved in the session file.
Deleting Items
Items are removed via a delete button on each library card. Deletion is confirmed and pushes an undo snapshot.
Item Labels
Every item has an editable label displayed on its library card. Labels are saved with the session.
Upload Status Feedback
When files are being uploaded or processed, a status bar at the top of the library shows progress messages and clears automatically on completion.
↑ Back to top
Images and PowerPoint files are the primary slide content type. PPTX files are processed server-side to extract individual slide images.
PPTX Import
PowerPoint files are uploaded and processed by the server, which extracts each slide as a high-resolution image. Progress is shown in the upload status bar. The result is a library item with one slide thumbnail per PPTX slide.
Image Import
Single images (JPG, PNG, GIF, WebP, etc.) can be uploaded as individual library items. Multiple images dragged in at once are each added as separate items.
Slide Grid
Each slide-type library item expands to show a thumbnail grid of all its slides. Clicking a thumbnail selects it and shows it in the preview panel.
Slide Preview
The selected slide is shown in a scaled preview panel on the right side of the admin panel. A badge indicates whether the slide is in Preview or Live state.
Project Slide
The ▶ Project slide button sends the currently selected slide to the live view. If a Bible verse is currently live, a silent blackout transition is applied automatically before the slide appears.
Prev / Next Navigation
Arrow buttons step through the slides of the active library item. A second pair of arrows (Live nav) steps through slides while they are actively projected, updating the live view instantly.
Present Mode (PPTX Live Capture)
For animated PPTX presentations, Present Mode opens the file in PowerPoint and captures its screen output in real time, piping each frame to the live view. This preserves PPTX animations and transitions that static slide extraction cannot replicate.
- Requires PowerPoint to be installed on the host PC
- A loading overlay is shown while capture initialises
- Slide change events sync the admin panel's counter
- Exiting PowerPoint or stopping capture returns to normal mode
↑ Back to top
Bible verse projection is a first-class feature. The operator can look up any verse, preview it in the staging panel, and send it live — all without leaving the admin panel.
Bible Library Import
A Bible data file is imported once and stored locally. The picker panel shows the total book count once loaded. The operator selects a book, chapter, and verse via a three-step drill-down panel.
Book / Chapter / Verse Picker
A collapsible picker panel lists all books. Selecting a book loads its chapters; selecting a chapter loads its verses. A search field filters the book list in real time. Keyboard navigation is supported.
Verse Stage (Preview)
When a verse is selected, it appears in the Verse Stage — a styled preview that shows exactly how the verse will look on the live screen, including the active background and font settings.
Send to Live
The Send Live button projects the staged verse to the live view. If a slide is currently projected, a silent blackout transition occurs first.
Verse Live Navigation
While a verse is live, arrow buttons step forward and backward through verses in the same chapter, updating the live view instantly — without having to return to the picker.
Stage Navigation
Separate stage prev/next arrows allow the operator to browse verses in the staging panel (before going live) without affecting the currently projected content.
Verse Background
Verse content uses its own independent background setting, separate from the slide background. This allows different visual styles for verses vs. slides within the same session.
↑ Back to top
Text Slide Creator (TSC) allows operators to create custom multi-slide text presentations directly in the app, without any external software.
Multi-Slide Editor
Each TSC item contains one or more slides, each with a Title and Body text field. Slides can be added, removed, and reordered within the editor. The focused panel is used for the live preview.
Live Preview
As the operator types, a real-time preview panel renders the slide using the active TSC background and current font settings — showing exactly what will appear on screen.
TSC Background
Text slides have their own background selector, independent of the main slide background and the verse background. Supports the same set of image backgrounds and solid colours as the main background system.
Background Opacity
A slider controls the opacity of the TSC background image, allowing the background to be dimmed so text is more legible.
Edit Existing TSC
TSC items in the library show an Edit button that re-opens the TSC editor pre-populated with all existing slides and settings for that item.
↑ Back to top
Audio items support single tracks or multi-track playlists, with full playback controls displayed inline in the library.
Audio Import
Audio files (MP3, WAV, AAC, etc.) are imported as library items. Multiple files can be dropped onto an existing audio item to add them as additional tracks.
Playlist Support
An audio item can contain multiple tracks. The track list is shown in the library card. Tracks advance automatically when one ends, and the track label updates in the admin panel in real time.
Playback Controls
Play, pause, stop, and seek controls are shown in the audio controls panel when an audio item is active. A scrubber shows current position and total duration. Current time updates in real time via socket sync.
Audio Drop Modal
When audio files are dropped onto the library panel (not onto an existing item), a modal prompts the operator to either add the files to an existing audio item or create a new one.
Audio in HDMI Output
Audio playback occurs in the live view HTML page. All output windows (including HDMI outputs) load the same live view and use the no-user-gesture-required autoplay policy, meaning audio is delivered to every connected screen's audio channel — including HDMI audio.
↑ Back to top
Video files are projected directly to the live view, with controls available in the admin panel during playback.
Video Import
Video files (MP4, WebM, MOV, etc.) are uploaded as library items. A thumbnail is generated from the first frame.
Video Preview
Selecting a video item shows a playable preview in the slide preview panel, allowing the operator to review content before projecting it.
Playback Controls
While a video is projected, an inline control panel shows play/pause toggle, a seek scrubber, current time, and total duration. The scrubber syncs position back to the live view in real time.
Video End Handling
When a video ends, the live view emits a video:ended event. The admin panel resets the video controls and clears the on-air state automatically.
↑ Back to top
Slideshows are automated image presentations that cycle through a collection of images at a defined interval — ideal for welcome loops or announcement rotations.
Slideshow Creation
A slideshow item is created from the library toolbar. Images can be added to it by dropping them onto the slideshow card or via its add button.
Interval Setting
Each slideshow has a configurable interval (in seconds) that controls how long each slide is displayed before automatically advancing.
Transition Style
The transition between slides can be configured — options include fade and instant cut. The setting is stored per slideshow item.
Loop
Slideshows can be set to loop continuously or stop after the final slide. The loop setting is configurable per item.
Play / Pause / Stop
Header buttons on the slideshow card control playback. Start begins from the first (or current) slide; pause freezes without resetting; stop ends the slideshow and clears the live view.
Slide Tick Sync
Each time the slideshow advances, a slideshow:tick socket event updates the active thumbnail highlight in the admin panel to show which slide is currently live.
↑ Back to top
The background system controls the visual canvas behind projected content. Three independent background contexts exist: one for slides, one for verses, and one for TSC text slides.
Background Library
Backgrounds are stored in Documents\SanctuaryPro\Backgrounds\. The app loads and displays them in a visual picker. Custom images can be added to this folder and will appear automatically.
Background Picker
A dropdown thumbnail picker in the toolbar shows all available backgrounds. Selecting one updates the current content context's background immediately — on both the admin preview and the live view.
Solid Colour Backgrounds
In addition to image backgrounds, any solid colour can be used. A colour picker allows a custom hex/RGB value to be entered and stored as the background.
Background Opacity
A slider controls the opacity of the background image independently of the text overlay. Reducing opacity dims the image so text is more legible against it.
Verse Background (Independent)
Bible verse content has its own background selector. Switching between verse and slide projection automatically applies the correct background to the live view.
TSC Background (Independent)
Text Slide items also have their own background selector and opacity slider, independent of the slide and verse backgrounds.
Background in Admin Preview
All background changes are immediately reflected in the admin panel's preview box and verse stage, so the operator can see the result before projecting.
↑ Back to top
Font settings control how Bible verses and text slides appear in the live view. Settings are global across the session and stored with it.
Font Family
A dropdown selects the typeface used for projected text. The selection is applied instantly to the live view and reflected in the admin panel's verse stage preview.
Font Size
A range slider controls the font size as a percentage of the screen height. The current value is shown numerically next to the slider and updates in real time.
Live Font Preview
Font changes are broadcast to the live view instantly via socket, so the operator and audience see the change at the same moment.
Font Persisted in Session
The selected font family and size are saved as part of the session file. Loading a session restores the operator's preferred typography settings automatically.
↑ Back to top
These controls govern what the audience sees at any moment, giving the operator precise real-time command of the live screen.
Live
Blackout
Instantly covers the live screen with a solid black overlay. The Blackout button in the toolbar toggles the state and shows ON when active. The button state is preserved independently of any content transitions.
Live
Clear All
Clears all content from the live screen — slides, verses, and audio — and blacks the screen. Distinct from Blackout: Clear All also stops any running audio or video.
Live
Verse ↔ Slide Transition (Silent Blackout)
When switching between a Bible verse and a projected slide (in either direction), SanctuaryPro automatically applies a silent blackout transition: the screen blacks out (450 ms), content switches instantly, then the blackout lifts with a smooth fade. This prevents the audience from seeing a jarring visual cut between content types.
- The Blackout button is not affected — it retains its current state
- The transition is invisible to the operator; the admin UI does not change
- Works in both directions: verse→slide and slide→verse
- Also applied when navigating live verse arrows while a slide is projected
On-Air Indicator
A badge in the admin panel shows whether a verse is currently on air. The indicator clears when content is cleared or the screen is blacked out.
Connection Status
A dot and label in the header show whether the admin panel is connected to the local server. The indicator updates in real time on connect and disconnect events.
↑ Back to top
SanctuaryPro supports projection to multiple external displays simultaneously. Each output window loads the same live view page and receives all socket events in real time.
Display Settings Panel
A Display Settings panel in the header toolbar lists all connected displays — Primary plus any external screens — with their resolution and system label. A checkbox next to each external display enables or disables output to that screen.
Multi-screen
Output Window
Enabling a display opens a fullscreen frameless BrowserWindow on that physical screen, loading /live. It receives all the same projection events (slides, verses, blackout, clear, audio, video) as any other live client.
Audio via HDMI
Output windows use the no-user-gesture-required autoplay policy, meaning audio and video play automatically — including audio routed through the HDMI connection's audio channel. If the connected screen has speakers, they will receive audio.
⚠️
If audio through the projector is not desired, the HDMI audio device should be disabled or set to a lower volume in Windows Sound settings. SanctuaryPro does not currently offer per-display audio routing.
Identify Displays
An Identify button flashes a large numbered overlay on each output window for 3 seconds, so the operator can see which display number corresponds to which physical screen.
Refresh Display List
A Refresh button re-queries the system for connected displays, updating the list without restarting the app.
Hot-plug Detection
Displays connected or disconnected while the app is running are detected automatically. The display list updates and windows are opened or closed accordingly.
Persisted Display Selection
The operator's display selection is saved to the settings file and restored on the next launch, so the same outputs are activated without manual reconfiguration.
↑ Back to top
The library has a full undo/redo history, allowing any accidental change to be reversed without reloading the session.
Automatic
Undo Snapshots
A snapshot of the library is pushed to the undo stack automatically before any destructive operation — adding an item, deleting an item, reordering, or editing content. No manual save step is required.
Undo (Ctrl+Z)
Pressing Ctrl+Z or clicking the Undo button reverts the library to the previous snapshot. The library is re-rendered instantly.
Redo (Ctrl+Y)
Pressing Ctrl+Y re-applies an undone change, moving forward through the undo history.
Button State
The Undo and Redo toolbar buttons are disabled when there is nothing to undo or redo respectively, providing clear visual feedback of the history state.
↑ Back to top
SanctuaryPro automatically protects unsaved work against unexpected shutdowns or crashes.
Automatic
Recovery File
Every time the library changes, a recovery snapshot is written to AppData\Roaming\SanctuaryPro\recovery.json after a 2-second debounce. The file includes a timestamp, the session name, and the full library state.
Recovery Prompt on Launch
If a recovery file exists when the app starts (indicating the previous session was not cleanly closed), the Welcome Screen displays a recovery prompt. The operator can choose to Restore the unsaved session or Discard it.
Recovery File Cleanup
The recovery file is deleted after a clean session save or when the operator explicitly discards it. This ensures the prompt only appears when genuinely needed.
↑ Back to top
The local Express server exposes a REST API and Socket.io interface that third-party clients — including the SanctuaryPro Remote Android companion app — can connect to over the local Wi-Fi network.
| Method |
Endpoint |
Description |
GET | /api/sessions | List all saved sessions |
GET | /api/sessions/recents | Get recently opened sessions |
POST | /api/sessions/:name/load | Load a session by name |
POST | /api/sessions | Save the current session |
GET | /api/sessions/recovery | Check for a recovery file |
POST | /api/sessions/recovery/restore | Restore from recovery file |
POST | /api/sessions/recovery/discard | Discard the recovery file |
GET | /api/library | Get the current library |
POST | /api/library/restore | Restore a library snapshot (undo/redo) |
POST | /api/library/:id/send-live | Project a specific slide to the live view |
GET | /api/state | Get current app state (background, font, etc.) |
Key Socket.io events available to remote clients:
| Event | Direction | Description |
verse:live | emit | Project a Bible verse to the live view |
clear:all | emit | Clear the live screen |
clear:text | emit | Clear only the verse/text overlay |
bg:update | emit | Change background image or opacity |
blackout:update | listen | Blackout state changed |
library:updated | listen | Library changed (full payload included) |
slideshow:stop | emit | Stop the active slideshow |
display:identify | emit | Identify connected output screens |
state:sync | listen | Full state sync on connection |
📱
The SanctuaryPro Remote Android app connects to these endpoints over local Wi-Fi. The PC's local IP address is entered once in the app's settings. No internet connection is required.
↑ Back to top