Inspiration

Every evening in many households, friends and families sit on the couch and often spend a long time deciding, aimlessly scrolling streaming carousels because no single person can agree on what to watch. Traditional recommendation algorithms often fall short for living rooms: they personalize strictly for a single user profile, leading to compromises where someone is always unhappy. We built OnePick to turn decision fatigue into a shared household consensus quickly.

What It Does

OnePick is a 10-foot Fire TV application that:

  1. Activates Household Profiles: Quickly toggles who is sitting on the couch via D-pad remote navigation, gathering individual likes, runtime limits, and hard dealbreakers (e.g. no horror).
  2. Computes Rawlsian Max-Min Consensus: Rather than a simple majority vote (which leaves minority tastes steamrolled), our deterministic fairness engine maximizes the satisfaction of the least-satisfied viewer.
  3. Conversational Constraint Patching: Interprets typed "voice-style refine" requests such as "We already watched Timberline Cadence together last week" or "Shruti has to wake up early tomorrow, keep it under 100 minutes" into structured constraints without losing state. It uses a built-in deterministic parser; the Amazon Bedrock Converse API integration is included for when it is available.
  4. Plain-English Explanation: Explains why the title was picked in plain English, highlighting the compromise and naming who gave something up before hitting play.

How We Built It

  • Architecture & Runtimes: The system uses a clean client-server architecture:
    • Fire OS Client (fireos/): A native Android Leanback WebView wrapper configured for Fire TV, mapping remote D-pad controls (KEYCODE_DPAD_*, KEYCODE_ENTER, KEYCODE_BACK) and bridging Back button events to web modal states. Tested on an Android TV emulator (API 34) at 1080p, not on a physical Fire TV device, as permitted by the hackathon FAQ.
    • Node.js Application Server (app/server.ts): Serves the 10-foot TV web client, executes the deterministic scoring engine, and communicates with AWS Bedrock via standard AWS SDK credential chains.
  • 10-Foot TV UI (app/index.html): Built with overscan-safe margins, large typography (28px+ body), spatial keyboard navigation, and high-contrast focus outlines.
  • Deterministic Core (core/): Written in pure TypeScript with zero external dependencies, providing unit-tested Rawlsian max-min fairness ranking, group scoring, and constraint satisfaction.
  • AWS Bedrock Integration (api/bedrock.ts): Employs the Amazon Bedrock Converse API (@aws-sdk/client-bedrock-runtime, standardized on amazon.nova-lite-v1:0) for natural language constraint parsing and natural explanation generation, bounded by configurable timeouts, response caching, strict JSON schema validation, and deterministic fallbacks. Bedrock (Nova Lite via the Converse API) is integrated with a deterministic fallback, and a live call was not verified because of a Free-plan quota.
  • Curated Living Room Library: Exactly 20 original titles with detailed metadata, genre weights, mood tags, and runtime constraints.

Challenges We Ran Into

  • Key Events Swallowed During Text Refinement: To support hardware D-pad navigation, our native Fire OS wrapper intercepted key events at the Activity level via dispatchKeyEvent. However, when opening the voice-style text refinement dialog (onJsPrompt), this handler swallowed KEYCODE_ENTER before the AlertDialog could process it, forwarding the click into the background WebView. We fixed this by tracking dialog visibility with a flag and delegating to super.dispatchKeyEvent, plus attaching an OnEditorActionListener to handle Enter and Done actions.
  • 320dpi WebView Scaling on Android TV: On a 1080p display at 320dpi (2.0x density), the Android WebView reported window.innerWidth of 960 instead of 1920 CSS pixels. An auto-scaler designed for browser viewports compounded this by applying a 0.5x transform inside an already density-scaled canvas. We resolved this by applying explicit wrapper-level CSS positioning to keep the 1080p canvas aligned.
  • Live Bedrock Blocked on a New Free-Plan AWS Account: When testing Amazon Nova Lite via the Bedrock Converse API, our Free-plan account encountered a region lock in us-east-1 (redirecting to Sydney ap-southeast-2), followed by an SCP permission deny on model use cases, and finally an immediate ThrottlingException ("Too many tokens per day") on the very first message. Because the daily token quota appeared to be zero, no live Bedrock calls succeeded. Our deterministic fallback allowed the application and demo flow to continue uninterrupted.
  • Predictable Television Response Times: Living room users expect immediate feedback without waiting on cloud round-trips. We kept candidate ranking strictly deterministic in TypeScript with a dependency-free core engine, reserving Bedrock solely for semantic constraint extraction and explanations.

Accomplishments That We're Proud Of

  • Designing a fair group aggregation formula that prioritizes lifting the satisfaction floor of the lowest-scoring viewer.
  • The app runs end to end on an Android TV emulator (API 34, 1080p) via a native Leanback WebView wrapper.
  • Building a full 10-foot TV interface with keyboard navigation, overscan-safe layout, and high-contrast focus outlines.
  • A curated catalogue of 20 original fictional titles with custom generated SVG posters and rich metadata.
  • 35 automated tests passing across constraint filtering, watched history exclusions, Bedrock JSON sanitization, HTTP routes, and fairness ranking.
  • Diagnostic tooling (npm run bedrock:check) that checks AWS connectivity and reports whether Bedrock or the fallback answered, without exposing credentials.

What We Learned

  • Designing for a 10-foot television interface demands completely different UX paradigms than desktop or mobile apps: focus clarity, contrast, and remote navigation speed are paramount.
  • Why we kept ranking deterministic and planned an LLM only for parsing and explanations: scoring and fairness must be fast, verifiable, and mathematically grounded, whereas language models are best suited for flexible conversational inputs and explanations.
  • What we learned from a blocked cloud integration: always design offline-first with robust deterministic fallbacks so that service quotas, region restrictions, or network failures never break core functionality.

What's Next for OnePick

  • Direct integration with Fire TV Live TV channels and Prime Video deep-linking.
  • Voice integration via Alexa Voice Service (AVS) on Fire TV Remotes.
  • Long-term household viewing memory to automatically balance fairness across consecutive movie nights.

Built With

Share this project:

Updates

Submission history