Lose the remote on a couch in a thirty-foot box and you can lose an evening. The Overlook PWA on your phone is always within reach, always charged, and now drives Playbill end to end. Wake it, navigate it, play and pause it, type into it, and adjust the volume. All over the rig's own MQTT bus, no cloud round-trip in the loop.
What you get
Open the Playbill page in Overlook on your phone and the Remote tab gives you the controls that map to how people actually use a media box:
- Power. Tap once and Playbill launches its app fullscreen. If the box is already awake, the first nav-press wakes it anyway, the same way an Apple TV or Roku remote behaves. No "wake up" dance required.
- D-pad with OK. Up, down, left, right, and select. Generic by design, so it works inside YouTube, Plex, Netflix, the local library, or any future source without a custom remote per app.
- Back, Home, Menu. Esc, H, and M in shortcut form. The Playbill controller maps each one to the keystrokes the current source understands.
- Transport. Previous, play/pause, next. Wired to the same DBC message a hardware steering-wheel button would send, so a future physical remote and the PWA stay perfectly in sync.
- Streaming text input. Focus a field on the TV, then type on your phone keyboard. Characters stream to the Playbill as you type. Backspace, Tab, and Enter are first-class buttons so you can navigate forms without overloading your soft keyboard.
- Master volume. A slider, mute, and plus and minus, pinned to the top of the page so it stays reachable while you are on any tab.
Keyboard shortcuts work too. With Overlook open on a laptop, arrows drive the D-pad, Enter selects, Esc is Back, H is Home, M is Menu. The remote is just a thin client over a message bus, which makes any input device on your network a potential controller.
How it actually works
The remote does not poke at Playbill directly. Every button press is one MQTT publish to a topic of the form local/playbill/<deviceId>/<feature>/command. Headwaters, the edge gateway already living in the rig, is the broker. Playbill subscribes and translates the payload into the keystrokes its Electron shell expects. Status flows back the same way: each device retains its own volume/status, radio/status, and system/status, so a phone that joins the network ten minutes after the movie started catches up the moment it subscribes.
That shape has three useful consequences:
- Multi-Playbill out of the box. A rig can host up to three Playbills: living room, bedroom, bunkhouse. Each claims its own
<deviceId>in the topic path. The Overlook device picker switches between them in one tap. There is also anallbroadcast address for "pause everywhere right now." - Hardware remotes get the same protocol for free. The same actions sit on the CAN bus as
PlaybillNavCmd,PlaybillTransportCmd,PlaybillVolumeCmd, andPlaybillSystemCmd. A future steering-wheel button board, an IR receiver, or a hard-button wall panel can drive Playbill on the same wire-level contract the PWA does, no extra software on Playbill to support it. - The slider tells the truth. The volume widget is broker-authoritative: it never caches a value locally and never lies. If you nudge the volume from a wall panel while a phone is open, the phone slider snaps to the new position the next time status fires. Two devices controlling the same Playbill stay in agreement.
Two details worth keeping
The text field is not a one-shot submit. As you type, it diffs the new value against what it last sent and publishes the delta, coalesced into one message every 40 ms. A burst of three or four input events from a soft keyboard inserting a word becomes one MQTT publish. Type a search query, watch it appear on the TV roughly as fast as you type. Hit Backspace, the TV deletes a character. Hit the explicit Clear button and only the local field clears, because the cursor on the TV may have moved to a different field by then and spraying backspaces at it is rude.
The other detail is the auto-wake. If the GUI is not running when the first navigation press arrives, the controller launches it and swallows that first press, the same way pressing any button on an Apple TV remote wakes the box. The Power button is still there for anyone who wants an explicit on-switch, but the common case is "I tapped a direction, the TV came on."
Why this fits the platform
TrailCurrent has been quietly building toward this from both ends. Headwaters already runs the MQTT broker the rest of the rig is built on. Overlook is already the phone client that talks to it. Playbill is just the latest participant on the bus. Adding the remote did not require a new protocol, a new server, or a new cloud service. It is one more namespace under local/ on the broker that already carries tank levels, battery state, and proximity events.
That is what makes "cross-device control" cheap rather than a heroic feature. The same fabric that lets a propane alarm dim a movie also lets a phone pick the next track. The same fabric that publishes a tank level to the dashboard also publishes "volume just changed to 42" to every device that cares. Milepost on the wall and Fireside on the cabin display are the next participants. When they pick up the remote feature, none of the wire-level work changes.
Where to find it
The Headwaters and Overlook code is live in TrailCurrentHeadwaters. The new Playbill page lives under containers/frontend/public/js/pages/playbill/, with the broker bridge in containers/backend/src/routes/playbill.js and the CAN wire-level contract documented in DOCS/CAN-REMOTE.md. The Playbill side of the conversation is in TrailCurrentPlaybill.
The next step is the actual content sources behind the Remote tab. Radio is already wired in for in-rig audio sources. Live TV slides in next, then the local library, then the streaming clients. The remote you see in the screenshot above is the input layer those features ride on. When the rest of the entertainment story lands, the controls are already in your pocket.