The cue name is now shown wherever the countdown is, and the setup lives in Companion's and ProdDash's own settings, so record how it's done: - Companion: a button with $(resi-studio-cues:next_cue_name) in the top 46% (shrink to fit) over $(resi-studio-cues:next_cue_time_in_hms); connection settings (3000 ms poll, decoder once connected). Section 3 pointed at the 0.1.2 package; it's 0.1.5. - ProdDash: use Resi Cues' card (solo:resi-cues:next-cue), which is titled with the cue name, not ProPresenter's NextCue timer; each screen reloads its named layout to pick up a change. - What's set where at North Attleboro (5 Booth 1/4; BOH TV, Studio A Ingest and Studio B layouts). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resi → ProPresenter countdown
Shows a countdown to the next Resi cue on ProPresenter's stage display, and optionally the cue's name as a stage message. ProPresenter does the counting, so it's smooth; a small background service on a Mac keeps it pointed at the right cue.
Resi (cloud) ──► always-on Mac (this service) ──► ProPresenter (timer, optional stage message)
It talks to Resi directly. Companion isn't needed for the countdown; the Companion module in this kit is optional, for buttons and Stream Deck displays.
What you need
- An always-on Mac on the same network as ProPresenter, ideally one that logs in automatically (an ingest or utility Mac). It can be the ProPresenter Mac itself.
- A Resi login that can see the campus's decoder.
- ProPresenter 7.9 or newer.
1. Set up ProPresenter (once per site)
- Settings → Network: turn on Enable Network. Note the IP address and port.
- Timers: add a Countdown timer named
NextCue(any length; it gets overwritten). - Stage layout: in the layout your stage screen uses, add a Timer object set to NextCue. Add a Stage Message object only if you'll turn cue-name messages on.
2. Install the service (on the always-on Mac)
Copy this folder onto that Mac, open Terminal, and run:
zsh ~/Desktop/resi-propresenter-kit/install_bridge.sh
(adjust the path to wherever you put the folder). It asks for:
- Resi login email and password. The password goes in that Mac's Keychain, not a file.
- Which decoder feeds this campus, picked from a numbered list.
- ProPresenter's address, e.g.
192.168.1.50:1025. It checks it can reach it. - Which timer to drive (
NextCue). It checks the timer exists. - Whether to show cue names as a stage message. Default is no: just the countdown. If yes, the name is sent once per cue (never repeated), so it won't keep flashing.
Then it starts the service and shows the first lines of its log. You should see
NextCue -> <cue name> in 00:12:34. From then on it starts at login, restarts itself if
it stops, and follows whatever event the decoder is playing. Nobody has to do anything on
service day.
If the installer warns that the Mac doesn't log in automatically, turn on System Settings → Users & Groups → Automatically log in as … (FileVault must be off). Otherwise the countdown won't come back after a reboot until someone logs in.
Run only one copy per ProPresenter: two copies fight over the same timer.
3. Optional: Companion module
In Companion: Modules → Import module package → resi-studio-cues-0.1.5.tgz, then add a
Rey Kroona: Resi Studio Cues connection: the Resi login, Player position poll 3000 ms,
and (once it has connected) the Default decoder/player. It provides variables such as
next_cue_name, next_cue_time_in_hms and playback_state for buttons.
A button with the next cue's name and its countdown: give the button two text elements, split by a line if you like:
| Element | Text | Position |
|---|---|---|
| Cue name | $(resi-studio-cues:next_cue_name) |
top-aligned, height 46%, Shrink to fit on |
| Countdown | $(resi-studio-cues:next_cue_time_in_hms) |
bottom-aligned, full height |
Keeping the name to the top half lets a long cue name ("Message OUT (end of prayer; MC comes out)") shrink to fit instead of running over the countdown.
4. Optional: the cue name in ProdDash
ProdDash's Resi Cues module (in the ProdDash repo) feeds the Timers tile a countdown
titled with the next cue's name. Show that card, not ProPresenter's NextCue timer, which
only ever says "NextCue". In a single-timer Timers tile, choose Resi › Next cue when
adding it (stored as solo:resi-cues:next-cue). In an "all timers" tile it's already listed.
Each screen keeps its own copy of its layout. After a named layout changes, reload it on each screen: Layouts (the grid icon, left of the gear) → the layout's name.
Day to day
| To… | Run (on that Mac) |
|---|---|
| Watch what it's doing | tail -f ~/Library/Logs/resi-propresenter.log |
| Change decoder / ProPresenter / password / stage message on-off | zsh install_bridge.sh --setup |
| Update to a newer script | run zsh install_bridge.sh from the new kit (keeps settings) |
| Remove it | zsh install_bridge.sh --uninstall |
If something's wrong
Resi rejected the login: the password changed. Run--setupagain.Cannot reach ProPresenter: ProPresenter is closed, its IP changed, or Network is off. Run--setupto enter the new address.playback stopped — timer held: the decoder isn't moving, or Resi isn't reporting. It picks back up by itself when playback resumes.- Stage shows the cue name but no countdown: the stage layout's timer object isn't set
to
NextCue. - Over SSH: the installer asks for that Mac's login password first, to unlock its Keychain. Remote sessions keep it locked.
Resi's API is undocumented and unsupported, so don't open a Resi ticket about this tool.
Working on it
| Path | What it is |
|---|---|
resi_to_propresenter.py |
The bridge. Python 3, standard library only. |
install_bridge.sh |
Installs it as a login service on the Mac it runs on, and runs --setup when needed. |
make_kit.sh |
Builds resi-propresenter-kit.zip for another site (no site settings inside). |
source/ |
The Companion module resi-studio-cues (dist/ is what ships, plus manifest.json and HELP.md). |
resi-studio-cues-0.1.5.tgz |
The current Companion package: import it in Companion → Modules. |
Tests. All run offline against fakes, except the end-to-end one:
python3 test_playhead.py # the playhead estimator, nine Resi profiles plus slow-start cases
python3 test_stage_message.py # stage message sent once per cue, never when switched off
python3 test_rate_limit.py # backs off when Resi says "too many requests"
node source/backoff_test.js # Companion module: login hold-off, no crash loop on a locked account
node source/config_test.js # Companion module: settings always save, upgrade fills defaults, quieter cue refresh
source/tick_test.js is the Companion module's estimator test (run with JavaScriptCore's
jsc, with var TARGET='dist/main.js' loaded first). test_end_to_end.py drives a real
ProPresenter's NextCue timer and stage message, so it refuses to run without
<address> --touch-live-propresenter. Stop the installed bridge before using it.
The Companion package is source/dist, source/manifest.json and source/HELP.md (under
companion/), plus a vendored node_modules with @companion-module/base 1.14.1
(source/npm_vendor.py assembles one). Bump the version in manifest.json and the
package's package.json on every change.
Running at North Attleboro: the bridge, Companion and ProdDash all run on the NA Ingest
Mac, and all three use the media@waters.church Resi login. Keep them polling no faster than
every 3 seconds: Resi rate-limits the account when tools share it.
- ProPresenter (NA-ProP):
NextCuetimer on the stage screen's layout; stage messages off. - Companion: page 5 Booth, row 1, column 4 shows the next cue's name over its countdown.
- ProdDash: the NextCue tiles in the BOH TV, Studio A Ingest and Studio B layouts show Resi's countdown titled with the cue's name; FOH Booth and Mobile list all timers.