← Work

Case study · Live — Web, App Store & Google Play

Currently

A 'Watching Now' status for your shows, plus a news feed for everything you track.

Currently screenshot

Currently is a free movie and TV tracker built around honest watch statuses — including Watching Now — and a news feed for everything on your lists. It's live on the web, the App Store, and Google Play.

The problem

Most trackers record what you've finished and what you plan to watch, not where you actually are. And when a show you follow is renewed, canceled, or gets a new season, the news usually reaches you somewhere else, if it reaches you at all.

How it works

Titles and metadata come from TMDB. Every title sits in one status — Watching Next, Watching Now, Caught Up, Waiting until Completion, or Watched — on lists you can share with friends by invite.

Once a day, a scheduled job checks every title on your lists, or that you've rated, for changes: status, new seasons, cast, trailers, where it's streaming, new sequels, and trade-press headlines. Changes land in a News feed and as push notifications, and the poster grid shows Canceled, Finished, and New Episode ribbons.

Recommendations come two ways: a For You grid built from TMDB's recommendation graph and weighted by your own ratings, and a plain-language ask powered by an LLM.

Engineering decisions

  1. Checked against real data before building on it

    Before any polling code existed, TMDB's status field was queried against a real tracked list. That confirmed Canceled comes back distinct from Ended, which is what makes a cancellation alert possible at all.

  2. Vercel Cron instead of Cloud Functions

    The daily check is a Vercel Cron job hitting an authenticated Next.js route that uses the Firebase Admin SDK. It reuses the existing deploy pipeline and avoids moving to a paid Firebase plan just to run one scheduled task.

  3. No false alarms

    A title's first check is recorded silently as a baseline, so adding a show never triggers a burst of stale news. Events are deduplicated across lists — a show on three lists is still one news item.

  4. Push that opens something you can read

    Each recipient gets their own copy of an event, so a notification deep-links to an item they actually have access to. Pushes are capped per person per day.

  5. Native apps that load the live site

    The iOS and Android apps are Capacitor shells pointed at the production deployment, because the app's API routes have to run on the server. One HTTPS origin keeps sign-in working, and a bundled page covers offline.

  6. Never auto-pick a search result

    Title-only search returns wrong matches ("Paradise" finds "Paradise Hotel"), so adding a title always shows candidates with poster, year, and type to choose from.

  7. Private by default

    Lists are visible only to their members, ratings stay private to the person who gave them, and every AI-backed feature has a per-user daily quota.

Stack

Framework
Next.js (App Router), React 19, TypeScript
Native
Capacitor (iOS + Android)
Data
TMDB, MDBList, trade-press RSS
Auth & data
Firebase Auth, Firestore, Cloud Messaging
Scheduled jobs
Vercel Cron
AI
Anthropic Claude
Testing
Vitest, Firestore rules emulator