Inspiration

In Argentina and across Latin America, Generala is the dice game every family plays after dinner: five dice, a cup, a pencil and a scoresheet. We wanted to bring that table night to the living room TV, keeping the best part, shaking the cup, without making anyone buy controllers or install an app.

Fire TV priority categories: Generala Shake targets Family Entertainment (a classic table game for every age, played together in the living room) and Multi-modal UX (the TV is the shared table, each phone is a personal controller joined via QR code with a real shake gesture, the Fire TV remote drives the TV menus, and a voice commentator narrates the best plays out loud through the TV speakers).

What it does

Generala Shake turns the Fire TV into the game table and every player's phone into their dice cup.

  • The TV shows the table, the dice and the shared scoresheet for everyone.
  • Players join by scanning a QR code on the TV. The controller opens in the phone's browser, so there is nothing to install.
  • Shake your phone to roll (or tap the button if you prefer), choose which dice to keep, and pick where to score.
  • A voice commentator calls the game like a sports broadcaster: big plays (Generala, Poker, Full, Escalera), a Generala on the first roll, scratching a zero, a new leader, each new round and the end of the game. Everyone hears what happens without looking at the screen. The host can turn it off in the room settings, and the TV has a Mute button.
  • Classic Generala rules (Escalera, Full, Poker, Generala), also known as Yahtzee.
  • Fully playable in Spanish and English.

How we built it

  • TV app: a native Fire TV app for Vega OS, built with React Native (react-native 0.83) and the @amazon-devices/* packages. The manifest (tv/manifest.toml) targets Vega 1.2 with the React Native Kepler runtime, plus WebView and w3cmedia. It acts as the room host and renders the table, with D-pad focus navigation for the remote. We build .vpkg packages for aarch64, armv7 and x86_64 (Fire TV devices and the Vega Virtual Device).
  • Phone controller: a web app built with React and Vite, using the device motion sensors to detect the shake.
  • Backend: serverless API on Vercel that creates rooms and validates every move, with Supabase storing the room state and syncing it in real time between the TV and the phones.
  • Shared engine: the rules live in one pure JavaScript module (engine.js) plus an i18n module, shared by the backend, the TV app and the phone controller so all three always agree on the rules.
  • Voice commentator: game events map to short phrases, with 8 variants per event and language (Rioplatense Spanish and American English) picked by a hash so they don't repeat. Audio is generated with OpenAI text-to-speech (gpt-4o-mini-tts) using a style prompt: a Rioplatense football commentator or an American sports announcer. The TV never sends free text, only a template key and variables, so the server builds and validates every phrase. Phrases are pre-generated in the background on Vercel (waitUntil) in both languages, cached as MP3 in a private Supabase Storage bucket and behind the CDN, so each distinct phrase is generated only once. On the TV they play through the native AudioPlayer from @amazon-devices/react-native-w3cmedia.
  • Performance & quality on Vega: we reviewed the TV app against the official Vega guides (manifest, best practices, focus management, performance, WebView) through the Amazon Devices Builder Tools MCP server, plus vega project doctor and the KPI Visualizer. Resulting fixes: an ErrorBoundary that shows a focusable Restart button instead of a blank screen; the first screen no longer waits on the network (resuming a saved room runs in the background with a 2.5 s cap); the fully_drawn marker via useReportFullyDrawn from @amazon-devices/kepler-performance-api so the TTFD launch KPI is measurable; accessibility labels for VoiceView on icon buttons; and less overdraw by replacing four stacked translucent layers with two opaque pre-blended discs.

Challenges we ran into

  • Keeping the TV and several phones in sync with low latency and a single source of truth for the game state.
  • Detecting a natural shake gesture reliably across different phones and browsers, and handling motion sensor permissions.
  • Designing a 10-foot UI that is readable from the couch, while the detailed actions happen on the phone.
  • Getting audio out of Vega: from the WebView, speechSynthesis had no voices, <audio> got stuck and Web Audio never reached the speakers, so we moved to the native w3cmedia player. Reusing a single player hung Vega's audio thread and the system killed the app, so now each phrase gets a fresh player that is destroyed before the next one, only the newest pending phrase is queued, and a 20-second watchdog discards any player that never finishes.

Accomplishments that we're proud of

  • Anyone in the room can join in seconds with just the phone they already have.
  • One rules engine shared across three platforms.
  • Shaking the phone really feels like shaking the cup.
  • A commentator that makes the living room react to every Generala.
  • Fast cold start on Vega: TTFF ~630 ms and TTFD ~650 ms on the Vega Virtual Device, well under the 1,500 ms and 8,000 ms thresholds.

What we learned

  • Building for Vega OS and the Fire TV 10-foot experience, including native audio playback and launch KPIs.
  • Treating phones as second-screen controllers through the browser, with no app install.
  • Designing a clean API and room-state contract between a TV host and many clients.

What's next for Generala Shake

  • More languages and regional rule variants.
  • Online rooms to play with family in other cities.
  • Other classic table games using the same TV plus phones setup.

Built With

Share this project:

Updates

Submission history