Case study · Product management, end to end · Live in production

MovieMatchThe MovieMatch app icon

Find what's worth watching. Then swipe with a friend, and the first title you both want becomes the plan.

I felt the problem, scoped the bet, made every product call, and shipped it with AI as the engineering team. This page is the decision log.

RoleProduct manager and builder
TimelineFeb to Apr 2026, maintained
Proof90+ real users, real payments
A product about ending debates, presented without one
Scroll
90+ real usersReal Stripe payments40 percent swipe in pairsTwo minutes to a decisionIndia-first streaming data 90+ real usersReal Stripe payments40 percent swipe in pairsTwo minutes to a decisionIndia-first streaming data
01 · The problem

Thirty minutes of scrolling. Zero decisions.

This started as my own problem. Deciding what to watch took 15 to 30 minutes across five streaming apps, and good recommendations from friends evaporated because they had nowhere to live. The two person version is worse: open Netflix, scroll, veto each other's picks, settle for a rewatch, give up.

The bar I set: one glance answers what is worth watching, two people find a mutual pick in one short swipe session, every keeper has a home, and every title says where it streams in India.

0minutes of scrolling, vetoing, and settling, before MovieMatch
0minutes from opening the app to a film you both actually agreed on
02 · The mechanic

Don't read about it. Swipe.

Right is want to watch, left is pass. Solo, every right swipe quietly builds your watchlist. With a friend connected, the moment you both want the same title, a match pops on both phones in real time.

This toy version has four cards. The real one is live, and the architecture that makes a match impossible to fake is decision 01 below.

Your friend has already swiped this stack
It's a match
🍿🎬
You both want to watch this. The debate is over.
The stack is done. Your watchlist built itself.

Drag the card, or use the buttons
03 · What shipped

Discovery is the daily core. Matching is the signature moment.

Discover feed with a cinematic hero and curated rows
The daily surface. A trailer led hero and six curated rows, filterable by Hollywood, Bollywood, or both. Every right swipe lands in a watchlist that builds itself, so saving requires zero effort.
Movie detail with trailer, genres, and where to watch in India
India first, structurally. Every title shows its plot, its trailer in app, and where it actually streams here: JioHotstar, Zee5 and SonyLIV beside Netflix, Prime Video and Apple TV+. The feed never recommends what you cannot stream.
The detail I'm proudest of

Hidden Gems corrects for TMDB's bias against Hindi cinema.

The six Discover rows are hand designed recipes, not six calls to a popular endpoint, and Hidden Gems is the one with a conscience. It surfaces loved but unseen titles: rating 7.0 or higher inside a deliberately low vote band. But Hindi films are structurally under voted on TMDB, so one global threshold would have silently erased Bollywood gems. The fix is per language thresholds, and when language is set to Both, results interleave one for one instead of sorting by raw popularity. Editorial fairness, implemented as query parameters.

Hindi qualifies at 10 to 150 votesEnglish needs 50 to 500Empty shelf? The band widens itself
04 · The calls

Five decisions, each with the road not taken.

This is the part of product management that does not screenshot well: what got chosen, what got rejected, and the tradeoff each call accepted.

01

The server owns the match.

Rejected: comparing swipe lists in the browser

A match must be true on both phones at once, exactly once, and impossible to fake. The client cannot even insert a match. One atomic database function records the swipe, enforces the daily limit, verifies the friendship, and creates the match. The database is the referee.

02

No subscription, on principle.

Rejected: the default SaaS monthly plan

A movie night is a per day event, and once people find what to watch, they leave. Charging monthly punishes the product for doing its job. So: ₹49 for a day pass, ₹499 lifetime. Charge for the moment it saves, not the habit it creates.

03

A free tier calibrated to a real session.

Rejected: a crippled teaser that nags upgrades

50 swipes a day is roughly what a natural session consumes, so a free user gets a full, genuinely valuable session daily. The counter lives in the database, not the browser, so clearing localStorage refills nothing. Premium removes the ceiling instead of unlocking the product.

04

Swipes are global, matches are per friendship.

Rejected: a separate swipe deck per friend

Your taste is yours. A film you right swiped last month still matches the moment a new friend likes it today, so switching partners reuses your whole history instead of starting from zero. Solo swiping silently pre-builds future matches.

05

Login is one email and one code.

Rejected: passwords, and social login too

No password storage, no reset flows, no OAuth consent screens. The trade: when login itself is an email, delivery becomes the front door, so a small app got a serious email system, a queue with retries, backoff, a dead letter queue, and a suppression list.

05 · Deliberately not built

The cuts matter as much as the features.

Chat between friends

The match is the message. Conversations belong in WhatsApp.

Your own reviews and ratings

The app is for deciding, not critiquing. TMDB ratings are shown, and that is enough.

Group swiping for three or more

Prototyped at the schema level, then killed by free tier physics: 50 card stacks barely overlap across four phones. Pairs are where the mechanic works, so pairs are what shipped.

Native apps

One PWA installs on iPhone, Android, and desktop. No store review, no 30 percent cut on premium, instant deploys.

Passwords

Nobody can leak, forget, or reuse a password that does not exist.

The roadmap holds the rest: group swiping, push notifications, personalized recommendations. Each waits for evidence, not enthusiasm.

06 · How it was built

AI wrote the code. The judgment was mine.

The method

Product managed like a job.

I felt the problem personally, scoped a two player mechanic, calibrated the free tier from observed user behavior, and priced against the subscription default on purpose. Every call above was mine.

The team

AI as the engineering team.

Built on Lovable with Supabase as the backend, TMDB behind a server side proxy, Stripe for payments. I directed the build, reviewed the architecture, and made every scoping call.

The discipline

Shipped like production.

31 database migrations in 7 weeks, server side payment verification, a real email pipeline, and a decision log where every choice keeps its rejected alternative.

07 · The numbers
0real registered users on the live product, who never met me
0use it in pairs, couples and friends swiping toward a match
0from opening the app to a title two people agreed on
0serverless edge functions doing the privileged work
0database migrations shipped in about 7 weeks
499lifetime, or ₹49 for a day pass. It will never charge monthly.

"A discovery product is measured by how fast people leave it. MovieMatch works when the debate ends in two minutes and the TV turns on."

The closing lesson · MovieMatch, 2026
Next case study

After

Two games about your senses, 275 hand written roast lines that mathematically cannot repeat, and a product with no accounts because nobody can type anything offensive if nobody can type at all.

Read it