Inspiration

When Ela was small, Sunday night meant one thing. Ma, Ela, the sofa, one blanket, one TV. Nobody remembers what they watched. Everybody remembers watching it together.

Then they grew up and moved apart. Ma is in Hyderabad. Ela is in Sydney. Same shows, nine thousand kilometres apart, texting "did you see that?" into the dark.

We have more screens than ever: a TV in every room, a phone in every hand. And we don't share moments anymore. We share links. "Have you seen it yet?" "No spoilers." "I'll watch it later."

The living room is dead.

FireJam is Ela's idea for bringing it back.

What it does

Ela turns on her Fire TV. Before she has picked anything, it tells her: Ma is watching Sintel. It's 8:42 pm in Hyderabad. Pull up a chair.

One click and she's on the sofa. Same film, same second. Ma pauses, and Ela's TV pauses too and says who did it. Ma types "Have you eaten yet?" on her phone, and it pops up on Ela's TV, over the film.

That's FireJam: Spotify Jam for the biggest screen in the house.

  • See your people. Home opens on who's watching right now, where they are, and what time it is there.
  • The Jam Map. Everyone you love, lit up by what they're watching. A world map of friends and public jams, with arcs between people watching together. Move pin to pin with the D-pad, then join, add a friend or invite. Ghost mode hides you.
  • One click, same frame. Every screen in a jam plays from one shared clock, typically within a few tens of milliseconds. Anyone can play, pause, skip or switch film, and everyone sees who did it.
  • "Alexa, pause." Pauses the jam for everyone. Play, rewind 30 seconds and restart work too.
  • Your phone is the keyboard. Scan a QR code; there's no app to install. Chat and reactions from an iPhone or Android phone pop up on every TV in the jam, even over Prime Video.
  • Prime Video, together. If everyone in the jam has Prime, every TV opens the title in its own Prime Video app and FireJam keeps them in step. The Watch screen leads with 19 Prime titles: Fallout, Reacher, The Family Man, Mirzapur, Panchayat. No Prime, no entry; the server enforces it.
  • Share first. A new jam opens on its invite: a QR code anyone can scan and a four-letter code. It waits until the host presses Start.
  • A tap on the shoulder. When a friend presses play, your Fire TV says so over whatever is on: "🔥 Ma is watching Sintel." One press takes you into their jam, even with FireJam closed.
  • It knows who's on the sofa. No forms. FireJam follows Fire TV profiles: switch profile and FireJam switches with you. An id alone signs nobody in; a profile needs its secret token or a TV it trusts.
  • "Pick for us." Amazon Bedrock picks what the group watches next, and it knows everyone's bedtime: when it's late for Ma, it picks something short and says why.
  • Everyone's invited. Fire TV first. The same app runs on Android TV and Google TV, a Windows bridge brings a laptop's Prime Video into the jam, and any other smart TV joins in its browser.

How we built it

  • TV app: React + TypeScript (Vite) built for the 10-foot UI. A custom spatial-navigation layer moves focus by on-screen geometry, so every screen works with a D-pad without hand-wired focus maps. Layout scales from the Fire TV WebView's 960×540 CSS pixels up to 4K.
  • Fire OS app: a small Kotlin app with a full-screen WebView and a launcher banner. It forwards the remote's Back and media keys (WebViews don't pass them to JavaScript), answers Alexa through a MediaSession, follows Prime Video's media session, follows the active Fire TV profile, and draws chat and pop-ups over other apps.
  • Realtime server: Node + Socket.IO. Presence, friend graph, jams, join requests and invites, rate-limited reactions and chat.
  • Sync engine: the server stores each jam as (playing, position, updatedAt) on its own clock. Each screen estimates its clock offset NTP-style, computes the expected playhead, and corrects drift by nudging the playback rate (±10%, inaudible) or, for big jumps, seeking ahead by the device's measured seek latency.
  • On AWS: the server runs on an EC2 Graviton (t4g.micro) instance in Sydney behind CloudFront, which carries HTTPS and WebSockets worldwide. Releases go through S3 and deploys through Systems Manager, with no SSH. Amazon Bedrock (Nova Lite, Converse API) powers "Pick for us".
  • Map: d3-geo Natural Earth projection over world-atlas data, rendered as SVG with focusable HTML pins on top.
  • Content: Blender Foundation open movies (CC-BY) streamed by FireJam itself, plus Prime Video titles that play in each viewer's own Prime Video app.

Challenges we ran into

  • Remote input in a WebView. Back and media keys never reach JavaScript, so the native app forwards them and asks the web app whether it handled Back before exiting.
  • Spatial navigation that feels right. Early versions jumped from a card row into the side rail, or skipped rows. The fix was preferring the current group, requiring a candidate's centre to lie past the current element's edge, and scoring same-row neighbours far above diagonal ones.
  • Performance on a streaming stick. Profiling the real device showed the TV burning 58% of a CPU core on an idle Home screen: progress bars animated their width (a page layout every frame) and decorative loops kept it redrawing at 60 fps. Fixing those took idle CPU to 8% on Home and 19% on the Jam Map (from 128%).
  • Fire TV profiles without an API. The profile-switch broadcast is reserved for Amazon's apps, so FireJam follows the active profile id in secure settings instead, hashed before it leaves the TV.
  • Sync on slow hardware. "Seek when off by more than X" loops forever on a Fire TV Stick, because each seek lands late. Measuring seek latency and aiming ahead, plus rate nudging for small drift, fixed it.

Accomplishments that we're proud of

  • A pause on one screen pauses every TV in the jam, with a banner saying who did it, and the corner reads In sync · 18 ms.
  • The whole app works with nothing but a Fire TV remote, or your voice.
  • It runs on a real Fire TV Stick 4K Max, not just a simulator, and idles at 8% CPU on Home.

What we learned

  • A TV is not a big phone. Endless CSS animations that look free on a laptop cost half a CPU core on a stick, and text that looked fine on a monitor was below Amazon's 28 px minimum from the sofa.
  • Sync is about time, not video. The hard parts were a TV clock 162 s off, seeks that land late, Prime Video reporting position 0 during ads, and timers that freeze in the background.
  • Fire TV gives apps a lot: media sessions, Alexa transport controls, overlays. But the two things a social app needs most, Prime Video deep links and Fire TV profiles, are reserved for Amazon's own apps. Finding the edges of what's allowed was half the work.

What's next for FireJam

  • "Alexa, start a jam with Ma." Start, join and invite by voice through Alexa+.
  • Push-to-talk from the phone, ducking the film while someone speaks.
  • Deep links into the apps people already watch in, instead of a catalogue.
  • Login with Amazon, contact-based friend discovery, and moderation before public jams go beyond a demo.

They told us the living room was dead. We never stopped loving the same things. We just stopped feeling them together.

FireJam is the living room, back. Pull up a chair, Ma.

Try it

Built With

Share this project:

Updates

Submission history