Inspiration

A television app that only recommends more television leaves the rest of a retail catalog unused. The interesting moment is the one after the credits, when a naval film makes someone want a sextant, a model frigate, or an afternoon on a real boat. Fire TV is the screen in the room where that impulse starts, and a phone is where the search should finish. The app is that bridge, built so a judge can see it with the D-pad and without an AWS account.

What it does

  • Home screen with a featured bridge title, a shelf of films that play in the app, and a shelf of titles that exist for recommendations.
  • Category groups for each title. Focus a suggestion to read why it belongs and to show a QR code for https://www.amazon.com/s?k=....
  • Playback of a bundled Creative Commons trailer, plus three streamed Creative Commons shorts, with credit on screen. Beyond the screen opens the recommendations without leaving the film.
  • A provider boundary: Bedrock when credentials exist and the reply parses, curated data otherwise.

The app does not scrape product pages, does not call the Product Advertising API, and does not append an affiliate tag.

How it is built

  • Fire OS client in Kotlin and Jetpack Compose, minSdk 24, Leanback launcher, landscape, D-pad focus.
  • ExoPlayer (Media3) for a bundled Sintel trailer and for HTTPS streams of Big Buck Bunny, Tears of Steel, and Elephants Dream.
  • ZXing to draw QR codes on the television.
  • A JVM module that owns the catalog, the curated fallback, search-link construction, a small SigV4 signer, and the Bedrock Converse call. The Android app depends on that module. Unit tests run on the host, and GitHub Actions runs them plus assembleDebug.
  • Original geometric title art and SIL Open Font License fonts (Fraunces, Outfit). No studio key art and no studio logos.

Bedrock usage

The AWS integration is a real Converse request, not a mention in the README.

  • Endpoint: bedrock-runtime.{region}.amazonaws.com, path /model/{modelId}/converse.
  • Signing: AWS Signature Version 4, service name bedrock, optional session token.
  • Default model id: us.anthropic.claude-haiku-4-5-20251001-v1:0, overridable. The same client works with other Converse models, including Amazon Nova Lite.
  • The prompt asks for 4–6 retail categories and three suggestions each, forbids more movies and affiliate tags, and demands one-sentence reasons. The parser drops streaming categories and tag= parameters. Fewer than two usable categories, an HTTP error, or a timeout returns the curated set and says so on screen.
  • Keys come from the environment or bedrock.properties at build time, or from a file on the device. None are committed. CI and a fresh clone run entirely on curated data.

Challenges

  • A television should not be the place a long-lived cloud key lives. The hackathon demo still has to call Bedrock from the device the judge is holding, so credentials are optional, overridable on the device, and kept out of git. A shipped version would put the model behind a small backend.
  • There is no pleasant supported way to recommend specific products without the Product Advertising API, and that API was out of scope. Search links plus a QR code are the honest integration: the shopper lands on Amazon’s own results.
  • Public sample-video hosts are not stable. The Google sample bucket used by many ExoPlayer demos returned 403, so playback uses a Blender-hosted trailer bundled in the APK and Archive.org copies of three CC films.
  • Ten-foot focus is a layout problem. The title screen is a category rail, one row of suggestions, and a persistent phone panel, instead of a dense grid.

What is next

  • A tiny backend that holds the Bedrock call, so the television never stores a key, with the same curated fallback when the network fails.
  • Remote voice as a third input beside the D-pad and the phone: “more like the sextant” refines the row that is already on screen.
  • A household profile that remembers which bridges were scanned, still without an affiliate tag.
  • If a sanctioned retail API becomes available to the developer, replace the search link with a real product card. Until then, the search page is the handoff.

Built With

  • amazon-bedrock
  • fire-os
  • jetpack-compose
  • kotlin
  • media3-exoplayer
  • zxing
Share this project:

Updates

Submission history