Inspiration
Streaming didn’t kill choice — it multiplied it. In India, a normal night starts with four apps, three searches, and one disappointing discovery: the movie you want is on the service you don’t pay for.
Every recommendation feed assumes you have everything. We wanted the opposite: a TV app that starts with the constraint. What can I actually watch tonight, on the services I already have, in India? And instead of making people translate a mood into genres and filters, we wanted them to type the sentence they’d say to a friend — “cosy sci-fi,” “funny heist,” “sad but hopeful space movie” — and get a real answer.
That became Your Next Binge.
What it does
Your Next Binge is a remote-first discovery app for Fire TV that only shows titles with a real India availability option — stream, rent, or buy.
- Live Home rows: Trending in India and On my services, scoped to the providers you select. No “available in the US” noise.
- My List: save titles from any row or detail screen; the list survives app restarts and shows offline.
- Semantic search: describe the vibe in plain language. A local embedding server encodes the query, and an on-device vector index ranks 1,198 India-scoped titles by meaning.
- Detail you can act on: Stream / Rent / Buy chips with provider names, rating, runtime, genres, synopsis, and More Like This.
- India service picker: choose the services you actually pay for; the On my services row updates immediately.
- Offline fallback: the original mood-based “Browse by vibe” flow remains available when TMDB or the network is unavailable.
The result is fewer menus, less scrolling, and one clear answer: what to watch, where, and whether it’s already included.
How we built it
We built the app in React Native for Vega (Vega OS 0.83) with TypeScript, targeting the Fire TV remote and the 960×540 dp TV canvas.
Data layer. We use TMDB for metadata and India watch-provider data. The “Trending in India” row comes from /discover/movie with watch_region=IN, because TMDB’s trending endpoint ignores region. We include all five monetization types — flatrate, free, ads, rent, and buy — so ad-supported and free titles aren’t silently dropped. Responses are normalized before caching, with memory and AsyncStorage layers plus per-resource TTLs.
Semantic search. A FastAPI server running sentence-transformers/all-MiniLM-L6-v2 encodes the free-form query. The document vectors ship inside the app as a 2.43 MB base64 float32 index (1,198 titles, 384 dimensions, L2-normalized). Cosine ranking runs on the TV; no document text leaves the device. If the server is unavailable, search falls back to TMDB keyword search, then local title matching, and the UI says which mode produced the results.
TV interaction. Every row is wired with explicit setNextFocus directions because geometric focus drifts at row edges on Vega. State updates can drop the focused node, so focus is restored after actions. Search auto-submits after a short pause because the virtual keyboard captures the D-pad and onSubmitEditing is not reliable from the remote.
Storage and quality. We migrated from the deprecated kepler AsyncStorage export to Amazon’s supported async-storage package after discovering the legacy backend silently failed on the VVD. The project has 76 Jest tests, clean TypeScript, zero ESLint errors, and verified Debug and Release builds with zero manifest validation errors.
Challenges we ran into
Availability data is messier than it looks. TMDB’s trending endpoint supports watch_region in the docs but ignores it in practice. We rebuilt the row on /discover/movie, added all five monetization types, and verified detail-level availability before showing fallback recommendations.
The TV is not a phone with a bigger screen. The virtual keyboard captures D-pad input, and onSubmitEditing didn’t reliably fire from the remote. We added debounced auto-search, explicit focus wiring, and a focus fallback that waits for posters instead of landing on the Search tile during network load.
The platform modules decide the product. AsyncStorage writes looked successful but never persisted across relaunch; switching to the supported package fixed My List and provider settings. Then the trailer feature hit a harder wall: the Vega Virtual Device image does not ship the WebView module, so installing any package that depends on it failed. We cut the trailer, kept the backdrop, and shipped the availability and watchlist features that matter more.
Keeping search fast and honest. We measured the five gate queries on the VVD: all returned 12 semantic results in 31–33 ms. The fallback paths are explicit, so a dead embedding server produces keyword results rather than a spinner or a lie.
Accomplishments that we’re proud of
- A complete live-data loop verified on the Vega Virtual Device: 14 trending titles, 14 on-services titles, a detail screen with 3 real India offers, and a watchlist that survived a force-stop and relaunch.
- Semantic search working end to end on device: local MiniLM encoder, bundled 1,198-title index, on-device cosine ranking, 31–33 ms for all five test queries.
- 76 passing tests across TMDB mapping, caching, availability grouping, watchlist, settings, search fallbacks, routing, and the full UI flow.
- A useful offline mode instead of a blank error screen: the v1 mood picker remains as Browse by vibe.
- A product that respects the constraint. Every row, result, and detail page is scoped to India availability, and the UI never pretends a title is watchable when it isn’t.
What we learned
Availability should be a product primitive, not a filter. The most valuable thing we built wasn’t another recommendation algorithm; it was the guarantee that every result is actionable in the user’s region and on their services.
Splitting embeddings between server and device is a pragmatic compromise. Query encoding benefits from a real sentence-transformer, while a small bundled document index keeps ranking private, instant, and offline-friendly. The 2.43 MB index is a reasonable price for search that feels native.
On TV, focus and input are the product. Layout gets you a screenshot; focus management gets you an app. Most of our polish went into D-pad paths, restoring focus after state changes, and making text entry survivable with a remote.
Verify platform modules before committing to a feature. The WebView cut was disappointing, but discovering it during the build saved us from shipping an uninstallable app.
Measure on the target. Numbers from a laptop don’t tell you how a TV app feels. The VVD measurements changed our decisions about caching, index size, and search fallback behavior.
What’s next for Your Next Binge
- Physical Fire TV validation, including image rendering and trailer playback on hardware that ships the WebView module.
- More regions and languages, with the same availability-first model and localized semantic search.
- A refreshable index pipeline so the corpus tracks new releases and provider changes, plus int8 quantization if the bundle budget tightens.
- Better personalization: “why this fits” explanations, mood collections, and recommendations that learn from My List without requiring an account.
- Availability-change awareness: tell users when a saved title arrives on one of their services, or is about to leave.
- Submission hardening: managed credentials, CI for the index builder, and a proper privacy review for the optional embedding server.
Built With
- all-minilm-l6-v2
- amazon-vega-sdk
- asyncstorage
- eslint
- fastapi
- fire-tv
- jest
- node.js
- numpy
- python
- pytorch
- react-native-for-vega
- react-native-testing-library
- sentence-transformers
- tmdb-api
- typescript
- vega-os
Log in or sign up for Devpost to join the conversation.