Skip to content

Synchronize multiple teleprompters with per-screen previews and calibration - #2

Merged
FedyaLight merged 1 commit into
mainfrom
feat/multiple-prompters
Oct 11, 2026
Merged

FedyaLight merged 1 commit into
mainfrom
feat/multiple-prompters

Conversation

@FedyaLight

@FedyaLight FedyaLight commented Oct 11, 2026 •

Copy link
Copy Markdown
Owner

Different reading screens currently scroll in their own pixel layouts while the controller previews only the primary reader. A 16:10 monitor, a 16:9 monitor and a portrait reader can therefore drift to different passages; global mirroring also affects every reader.

This change makes one selected reader authoritative for the shared passage. Followers map a continuous word anchor into their own line wrapping, including different font sizes or margins on equal-size viewports. Controls and seeking on any reader affect the shared session, and a visible reader takes over when the leader disconnects or becomes hidden.

The controller can show all screens simultaneously. Each preview uses that reader's actual CSS viewport, effective settings and acknowledged position. Format comparison shades the excess around the intersecting aspect rectangles, aligned at the reading line: 1600×1000 versus 1600×900 at 40% produces 40 px above and 60 px below. It is a format guide; individual previews show the actual text when wrapping differs. Shading is confined to the operator preview.

Each screen has a persistent name and optional font-size, symmetric/asymmetric margin, top/bottom padding, marker-position and H/V mirror overrides. Unset values inherit session settings. Stable screen links survive reload; opening a saved link twice gives the newer window a separate identity while copying calibration. Secondary disconnected displays retain their last frame, and any preview with no fresh state for 3.5 seconds freezes with an explicit status. Inactive previews suspend their animation loops.

docs/research-prompters.md records the source research, including the operator request for three synchronized screens, mixed mirroring and narrower reading columns. docs/displays.md documents setup, inheritance, format geometry and limits. All six interface languages are covered.

Remote-control support from #1 has been merged into main. This PR now targets main and adds the multiple-screen workflow on top of it.

Validation against the production Swift relay and isolated Chromium profiles:

  • tests/displays.mjs: three readers, a 2600-word chunked script, long playback across different wraps, equal viewport/different font, exact previews, targeted calibration/mirroring, follower seeking, duplicate links, reload, rotation, leader selection/failover and both primary/secondary stale-preview freeze/recovery pass. The missing multiple-screen regression fails on the original main branch.
  • tests/remotes.mjs and tests/browser.mjs pass; maximum existing preview error is 0.34 CSS px, with zero external requests in local mode.
  • The full responsive matrix passed 2100 checks across six languages, two themes, seven sizes and five platform/hosting adapters. The final layout adjustment was rechecked for desktop and local-browser adapters.
  • tests/performance.mjs passes: paused and settled voice readers have zero animation frames and storage writes; scrolling draws normally. These are browser resource measurements, not battery estimates.
  • tests/hosting.mjs passes with real PeerJS/WebRTC, delayed negotiation, broker outage and configurable PeerServer.
  • JavaScript syntax and whitespace checks pass.

Physical remotes, display timing and native WebView rendering engines have not been certified by these browser tests. The server still relays one native shared session; one operator is recommended. Per-screen calibrations are device-local and are not included in portable backups.

@FedyaLight
FedyaLight changed the base branch from feat/remote-controls to main October 11, 2026 21:40
@FedyaLight
FedyaLight merged commit 2dead9b into main Oct 11, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant