Inspiration

Choosing a film often means switching between channels, browsing carousels and checking reviews, only to return to something familiar. The information is scattered, and a high rating tells you little about whether a film suits what you want right now.

Traditional viewing guides answered “What's on?” TONI asks “What fits?”

TONI, Tonight's Options, Narrowed Intelligently, is built for viewers who want help choosing from the channels they can actually access. Its promise is personal fit with less effort: bring taste, current mood, availability and critical evidence into one decision.

We wanted the experience to have the judgement of a film editor and the ease of talking to someone who understands your taste. A thoughtful shortlist should help you choose, while leaving room to discover something you would not have picked yourself.

What it does

TONI is a conversational viewing guide that presents a ranked shortlist of available films, then adds critical analysis and sources as review research completes. Try it at whatfitstonight.com.

Start with as much conversation as you want

Viewers choose their preferred level of detail:

  • Just give me something for a quick choice.
  • A couple of questions is fine for a little more guidance.
  • Get to know what I want for a deeper conversation.

You can type or speak through Gemini Live, and move between the two within the same session. Both interfaces use the same conversation context and preference signals. TONI gathers missing information without forcing everyone through the same questionnaire, then waits for confirmation before starting the recommendation search.

Check what you can watch

TONI checks UK or US availability against your selected channels and rental or purchase preferences using Watchmode and TMDB. Availability filtering happens before deeper review research, focusing that work on eligible films. Available, unavailable and unverified results remain distinct, so missing data is not treated as certainty.

Research the films

After the shortlist appears, TONI checks for usable cached review evidence. Where fresh retrieval is needed, it calls Parallel's Search API at runtime to find professional reviews, then uses its Extract API to retrieve evidence for analysis. Source filtering favours critic reviews over fan forums, ticket listings and encyclopaedic summaries. If coverage is insufficient, TONI broadens the search.

Review updates appear on the existing cards without replacing films or changing their order. Viewers can begin considering their options while the research completes.

Gemini turns that evidence into a structured film profile covering six dimensions: story and writing, pacing and structure, performances, craft and execution, demandingness and tone adjectives.

The assessment records whether critics broadly agree, disagree or provide limited coverage. Viewers see plain-language labels such as “Critics are divided on this film” alongside the supporting sources.

Make the choice manageable

The web experience highlights three recommendations:

  • Best fit: the strongest match for your current preferences.
  • Strong alternative: a distinct option that still fits.
  • Another option: an additional eligible film to consider.

Each recommendation explains its fit with the preferences provided. The review panel adds critical assessment and source links, with trailer links where available. Viewers who want more choice can reveal up to seven eligible recommendations or refine their choices.

The backend also supports a separate synchronous ranking path that assesses review evidence before returning results and can assign a Worth a stretch role. The default web flow prioritises getting available films onto the screen first.

How the agent reaches a recommendation

TONI gathers context, discovers candidate films and checks availability and viewing constraints. In the web experience, it ranks eligible films using preferences and metadata, then researches the displayed shortlist and adds evidence-led profiles. Availability determines which films reach the research stage, and insufficient review coverage triggers a broader retrieval attempt.

The workflow separates personal matching from critical assessment. Review analysis helps viewers evaluate the shortlist; it does not retrospectively change the displayed ranking.

This brings several separate viewing decisions into one workflow, with the viewer retaining control over when to search and what to change.

How we built it

We built TONI as a two-person team. Tina led the product experience, visual design and frontend, while Nate led the backend and integrations.

The application runs on Google Cloud Run, with Google's google-genai Python SDK connecting to the Gemini Developer API. Gemini supports preference extraction, candidate discovery and structured review synthesis, while Gemini Live handles spoken conversation.

The main components are:

  • Frontend: HTML5, vanilla JavaScript and Tailwind CSS, with shared interface components and session state for text and voice.
  • Backend: Python and FastAPI, with Pydantic contracts defining session context, availability states and film profiles.
  • Live voice: WebSocket audio transport, transcription and the Charon voice, with voice activity detection supporting conversational turns.
  • Review research: Parallel Search and Extract calls, cached evidence reuse and progressive review updates, with usage and latency recorded in trace logs.
  • Availability and film data: Watchmode and TMDB for country-specific availability, channel mapping, canonical metadata, posters and trailer links.
  • Deployment: Docker containers on Google Cloud Run, supported by deployment tooling and pre-flight checks.

We first validated live search, extraction and structured scoring, then connected that workflow to availability checks and the web interface. Shared data contracts helped us develop the frontend and backend against the same expectations.

The visual design takes its cues from film publishing: warm backgrounds, editorial typography and a restrained lime accent. Three prominent recommendations, optional deeper evidence and a choice of voice or text keep the experience focused on making a decision.

Challenges we ran into

Finding enough films within real availability constraints

A narrow combination, such as Netflix only in the UK, could eliminate much of an initial candidate list. We expanded candidate discovery to 15 to 20 titles and checked availability before invoking deeper Parallel research. This gives the ranking stage more eligible options and avoids researching films already ruled out by access constraints.

Coordinating live research and conversation

Concurrent extraction, voice playback and dialogue updates needed to remain tied to the correct session. We hardened extraction concurrency and voice lifecycle handling to reduce conflicting updates.

Early voice tests also exposed audio feedback and premature turn endings during natural pauses. Browser audio processing, pausing microphone transmission during voice playback and tuning voice activity detection helped address those problems.

Showing useful results while research continues

Waiting for every review search and synthesis call delayed the whole experience. We split the web flow into two stages: available films first, then review updates on those cards. Shared workers, bounded waits and reused model connections help control the research workload. Session and film checks prevent late updates from an earlier search appearing in new results.

Making incomplete evidence visible

An API failure must not leave a recommendation looking as though full review synthesis succeeded. We added explicit exception logging and clearer fallback explanations when live synthesis is unavailable. We also kept limited coverage and critical disagreement visible rather than presenting every assessment with the same confidence.

Accomplishments that we're proud of

  • A complete viewing decision workflow: conversation, live availability checks, review research and a ranked shortlist in one web experience.
  • Meaningful use of Parallel and Gemini: runtime retrieval supplies critical evidence for structured film assessment, alongside preference-based matching.
  • Connected voice and text: viewers can use either interface within the same conversation context.
  • A considered product experience: adjustable intake depth, a focused top three and optional evidence detail give viewers control over their effort.
  • Engineering beyond the happy path: automated tests cover contracts, ranking, availability gating, voice endpoints and error handling, alongside work on concurrency and transparent fallbacks.

What we learned

Availability shapes the whole recommendation process. A strong taste match is of little use if the viewer cannot access it. Checking access early also avoids unnecessary research calls.

Film quality and personal fit need separate treatment. A carefully made, demanding film may be exactly right for one viewing session and wrong for another. Keeping the film profile separate from session preferences lets TONI account for that difference.

Useful results and deeper analysis can arrive separately. Showing available films first lets viewers start considering their options while research continues. Keeping the order stable prevents the shortlist moving underneath them.

Disagreement can be useful evidence. Divided reviews can reveal qualities that matter to a particular viewer. Preserving that disagreement gives the recommendation more context than a single aggregate rating.

Conversation quality depends on coordination. Audio timing, session state, concurrent requests and recovery from failed calls all affect whether the experience feels coherent.

Impact needs testing with viewers. We have built the workflow; our next task is to measure whether it reduces time spent choosing and leads to satisfying viewing decisions.

What's next for TONI - Tonight's Options, Narrowed Intelligently

Our next step is to test TONI with viewers and improve it through real viewing decisions. We want to measure how long people take to choose, whether they watch a recommendation and whether it matches their expectations afterwards.

Learn your taste, with your control

We plan to introduce an optional, editable "My taste" profile. Viewers will be able to see what TONI has inferred, correct mistakes and remove preferences. A passing request such as "nothing heavy today" should remain separate from a lasting preference.

Optional post-watch feedback and a history of past recommendations will help TONI learn from what people actually enjoyed. We also want viewers to save and share recommendations, with watch-history imports through services such as Letterboxd and Trakt explored where supported.

Help with the final decision

We want viewers to compare recommendations and refine individual qualities: "same tone, faster pace", "something between these two films" or "why this over the film I found?"

The current interface already exposes sources and critical disagreement. Deeper source views would connect particular reviews to individual assessment dimensions, making the supporting evidence easier to inspect. We also want to bring clearer stretch recommendations into the web experience and explain why an unfamiliar choice might be worth trying.

Extend from films to TV series

TV series are a priority for the next phase. They introduce different decisions, including episode length, number of seasons and how much time someone wants to commit. TONI should account for those differences when recommending what to start.

Group viewing will explore how to balance two people's preferences. Broader availability coverage will extend beyond the UK and US, with Canada, Australia, Ireland and New Zealand as candidate markets.

Make it easier to start watching

We plan to improve links from recommendations to the relevant viewing provider and complete trailer support where available, reducing the steps between choosing a title and watching it.

We will prioritise these developments through viewer testing, with success measured by easier choices and satisfying recommendations.

Built With

Share this project:

Updates

Submission history