Adds modules/propresenter-looks/, a new module, so it shows up in the admin page's Available modules catalog.
Why
When something looks wrong on the outputs and nobody is at the ProPresenter machine, the first question is "what look are we on?". This tile answers it from any dashboard.
What the tile does
Shows the name of the audience look that is live in ProPresenter right now, sized as large as the tile allows.
Flashes once when the look changes.
Shows a Modified tag when someone changed the look by hand and it no longer matches a saved look.
Shows "since 10:42 AM" for when the look last changed.
If ProPresenter stops answering, the status dot goes red and the tile keeps the last known look on screen, dimmed. It recovers by itself.
How it works
The server entry polls GET /v1/look/current once a second, and GET /v1/looks every ten seconds to find the name of the saved look the live one matches. It streams the result to tiles over SSE (only when something changed, with a 15 s heartbeat).
Browsers never talk to ProPresenter. No dependencies.
ProPresenter gives the current look a UUID of its own. Its index points at the matching saved look, or equals the number of saved looks when it matches none; that case is what shows as Modified.
On an older ProPresenter without /v1/looks, it falls back to the live look's own name.
Module guide rules
One self-contained folder; nothing in the shell (server.js, public/) is touched.
proddash: ">=1.5.0", version 1.0.0. Declares the local-network permission.
Admin config: one endpoint field (ProPresenter) plus password, both with help.
Tile gear: three ungrouped switches (Heading, Live status, Since), no help, labels of two words or fewer.
No title-bar controls. Styles are scoped under [data-module="propresenter-looks"] and use only the shell's colour variables.
Testing
modules/propresenter-looks/tools/pp-looks-mock.js is a mock of ProPresenter's looks API. It changes the live look every few seconds and makes every fourth change a hand-modified look; --password and --no-list exercise the other paths.
Run in a checkout against the mock, through the guide's resilience checklist:
Mock killed: red dot, "Unreachable · last known", last look dimmed
Mock restarted: recovers with no reload
ProdDash restarted with the tile open: recovers
Two tiles with different gear settings work independently
Tile removed: no errors from the module, no streams left open
Admin config saved: module remounts and follows the new host
Page reload: tile comes back with its settings
Not yet run against a real ProPresenter.
The same module is also at christian/propresenter-looks as a standalone repo.
Adds `modules/propresenter-looks/`, a new module, so it shows up in the admin page's **Available modules** catalog.
## Why
When something looks wrong on the outputs and nobody is at the ProPresenter machine, the first question is "what look are we on?". This tile answers it from any dashboard.
## What the tile does
- Shows the name of the audience look that is live in ProPresenter right now, sized as large as the tile allows.
- Flashes once when the look changes.
- Shows a **Modified** tag when someone changed the look by hand and it no longer matches a saved look.
- Shows "since 10:42 AM" for when the look last changed.
- If ProPresenter stops answering, the status dot goes red and the tile keeps the **last known** look on screen, dimmed. It recovers by itself.
## How it works
- The server entry polls `GET /v1/look/current` once a second, and `GET /v1/looks` every ten seconds to find the name of the saved look the live one matches. It streams the result to tiles over SSE (only when something changed, with a 15 s heartbeat).
- Browsers never talk to ProPresenter. No dependencies.
- ProPresenter gives the current look a UUID of its own. Its `index` points at the matching saved look, or equals the number of saved looks when it matches none; that case is what shows as **Modified**.
- On an older ProPresenter without `/v1/looks`, it falls back to the live look's own name.
## Module guide rules
- One self-contained folder; nothing in the shell (`server.js`, `public/`) is touched.
- `proddash: ">=1.5.0"`, version `1.0.0`. Declares the `local-network` permission.
- Admin config: one `endpoint` field (ProPresenter) plus `password`, both with `help`.
- Tile gear: three ungrouped switches (Heading, Live status, Since), no `help`, labels of two words or fewer.
- No title-bar controls. Styles are scoped under `[data-module="propresenter-looks"]` and use only the shell's colour variables.
## Testing
`modules/propresenter-looks/tools/pp-looks-mock.js` is a mock of ProPresenter's looks API. It changes the live look every few seconds and makes every fourth change a hand-modified look; `--password` and `--no-list` exercise the other paths.
Run in a checkout against the mock, through the guide's resilience checklist:
- [x] Mock killed: red dot, "Unreachable · last known", last look dimmed
- [x] Mock restarted: recovers with no reload
- [x] ProdDash restarted with the tile open: recovers
- [x] Two tiles with different gear settings work independently
- [x] Tile removed: no errors from the module, no streams left open
- [x] Admin config saved: module remounts and follows the new host
- [x] Page reload: tile comes back with its settings
Not yet run against a real ProPresenter.
The same module is also at `christian/propresenter-looks` as a standalone repo.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
christian
added 6 commits 2026-10-26 12:59:40 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Adds
modules/propresenter-looks/, a new module, so it shows up in the admin page's Available modules catalog.Why
When something looks wrong on the outputs and nobody is at the ProPresenter machine, the first question is "what look are we on?". This tile answers it from any dashboard.
What the tile does
How it works
GET /v1/look/currentonce a second, andGET /v1/looksevery ten seconds to find the name of the saved look the live one matches. It streams the result to tiles over SSE (only when something changed, with a 15 s heartbeat).indexpoints at the matching saved look, or equals the number of saved looks when it matches none; that case is what shows as Modified./v1/looks, it falls back to the live look's own name.Module guide rules
server.js,public/) is touched.proddash: ">=1.5.0", version1.0.0. Declares thelocal-networkpermission.endpointfield (ProPresenter) pluspassword, both withhelp.help, labels of two words or fewer.[data-module="propresenter-looks"]and use only the shell's colour variables.Testing
modules/propresenter-looks/tools/pp-looks-mock.jsis a mock of ProPresenter's looks API. It changes the live look every few seconds and makes every fourth change a hand-modified look;--passwordand--no-listexercise the other paths.Run in a checkout against the mock, through the guide's resilience checklist:
Not yet run against a real ProPresenter.
The same module is also at
christian/propresenter-looksas a standalone repo.🤖 Generated with Claude Code