Observation Deck Receiver
A custom Cast (CAF v3) receiver that plays Observation Deck video on a Chromecast Ultra and keeps going if the phone leaves.
What it does
- Plays the server's streams and reports watch progress back every 10 seconds, so resume works whoever started playback.
- Shows and reports position as an absolute time, even though piped streams restart their clock at zero after a seek. Seeks reload the stream at the new offset.
- Draws subtitles itself from WebVTT cues, because the cues are in absolute time and the stream clock is not.
- If a stream errors or ends early it retries up to three times, resuming from the last position and showing a message on screen.
- At the end of an episode it shows an up-next card and starts the next one. It remembers audio and subtitle language per show.
- Disconnecting the phone does nothing: playback and progress reporting carry on.




Captured in desktop Chrome at 1920 by 1080 with a stand-in for the Cast framework and a generated clip, not on a Chromecast. The layout and text are the receiver's own page.
Screenshots use a made-up library of generated test clips and artwork. Conan the Barbarian (1982) stands in as the film being played; the artwork and frames are drawn for the page, not taken from the film.
Under the hood
- Plain JavaScript on the Cast Application Framework.
core.jsholds the pure logic (URL building, seek and offset maths, WebVTT, LOAD building) and is unit-tested with Node's test runner;receiver.jswires it to LOAD, SEEK and track-edit interceptors. - Static site only: a Cloudflare Worker serves the
public/folder through an assets binding, with no Worker script. - A desktop Chrome test sender and a mock server stand in for the Android app and the real server, for testing without a Chromecast.
- State is broadcast to senders on a custom message channel so a remote can show the same position, audio track and subtitles as the TV.