Current public product architecture.
controller.htmlis the operator renderer.Sis the editable Preview state;programStateis the state currently sent to Program.send()sends controller state through the preload bridge. The main process storeslastState, forwards Program state to Electron output windows and publishes the same state over SSE.output.htmlis the canonical Program renderer for Electron windows and browser/OBS clients.main.jsowns Electron windows, HTTP/SSE, OSC, IPC, media storage, output routing and the full source/packaged smoke harness.
Preview selection must never change the LIVE cue, running timer or Program output until an explicit TAKE/GO/direct action.
- Cues have stable IDs, selected/LIVE separation, planned fields, actual timestamps, status, lower-third automation and optional linked screen content.
src/show-storage/repository.jswrites the current show atomically underuserData, keeps bounded backups and detects an unclean session.src/show-storage/package.jsexports/imports portable.protimer-showpackages with checksums, schema validation and referenced assets only.src/show-storage/preflight.jsreturns blocking/warning/ready checks without changing Program.- localStorage remains a compatibility/preferences layer; it is not the only show-recovery mechanism.
src/screen-content/model.jsvalidates standard image, video, PDF, text, logo, timer and blank items.- Scenes and layers remain in
S.scenes; a timer layer controls#stageinside the Program renderer. src/report/model.jsbuilds the post-show report from canonical cue actual fields, with legacy log fallback and spreadsheet-safe CSV output.
Window capture is intentionally absent. ProTimer Studio is a rundown, timing, graphics and display-distribution product, not an OBS/Resolume replacement.
src/lower-third/model.js,validate.js,migrate.jsandresolve.jsdefine the versioned template/runtime contract.src/lower-third/package.jsimports/exports.protimer-ltpackages and their referenced media.- Lower Third Studio edits templates locally. PREVIEW resolves selected-cue data without touching Program; TAKE resolves the active template with LIVE cue data.
output.htmlrenders resolved runtime layers and retains the legacy lower-third renderer as a compatibility fallback.- MP4/H.264, WebM VP8 and WebM VP9 fixture decode/compositing are covered by smoke. Claims remain limited to the exact tested environment and fixtures.
src/output-routing/model.jscontains pure normalization, display identity, fail-safe resolution and pixel/grid bounds rules.main.jsownsoutputConfigsand theauxOutputsBrowserWindow map.- Each enabled route receives the same Program state and can use fullscreen, normal window, pixel-accurate custom or grid-cell placement.
- Display IDs are paired with a stable label/size fingerprint. A missing or ambiguous display is reported as unavailable and never silently replaced by another monitor.
- Display add/remove/metrics events reconcile routes. Custom routes are frameless so macOS cannot cascade or clamp requested pixel coordinates.
- HTTP/SSE server: output page, remote, backstage, signal, authenticated command/status endpoints and ranged media delivery.
- OSC UDP uses the same canonical command normalization as HTTP.
src/control-api/commands.jssanitizes commands and bounded status payloads.- Security limitations, including unauthenticated local OSC, are documented in
SECURITY.md.
- English is the default.
- English and Serbian are
FULLproduct dictionaries. - 35 additional
COREpacks localize primary workflows and use English fallback for advanced strings. - Arabic, Urdu and Persian set RTL document direction.
- Exact scope is documented in
docs/LOCALIZATION.md.
npm test: deterministic headless module suite.npm run test:renderers:philips: five real renderer workflows pinned to PHL 243V7.npm run test:beta-ui: responsive product matrix.npm run smoke:philips: full source smoke.npm run smoke:packaged:philips: full packaged smoke.npm run smoke:lt-soak: condition-driven lower-third soak.
Local visual regression is pinned to the configured PHL 243V7 test display and aborts when that monitor is unavailable. Stable Mac distribution still requires Developer ID signing and notarization; stable Windows distribution still requires real Windows x64 QA and signing.
- Do not use
window.prompt(); use the application modal. - Do not reintroduce window capture without a new approved product scope.
- Do not change timer, GO, Program state or output protocols as part of unrelated work.
- Do not remove the legacy lower-third renderer while legacy shows remain supported.
- Any new preload method also needs a browser fallback in
controller.html.