Product Manager — AI/ML & Consumer

I build products that get smarter the more people use them.

Shipping AI-powered consumer features to 28M+ monthly job seekers at Workday. Independently designed and built a consumer AI film recommendation engine on GCP from 0 to 1.

28M Monthly job seekers using the Workday candidate features I own
356M Job applications processed through my product surfaces in 2024
50K Films and TV shows scored and indexed in Kini's recommendation catalog
500+ Waitlist sign-ups for Kini before its first public launch

Coming soon to
App Store Google Play

Case Study 01 — Founder

Teaching an AI to know what movie you're in the mood to watch

Consumer app  ·  0-to-1  ·  Vertex AI + BigQuery  ·  Reinforcement Learning

You have access to 36,000 titles. You still can't decide what to watch.

It's 8pm. You open Netflix, then Hulu, then Prime. You check a review tracker - built for logging, not discovering. You try a streaming aggregator - it tells you where to watch, but assumes you already know what you want. 28 minutes later, you're rewatching something you've already seen.

The average American streaming subscriber wastes 110 hours per year just deciding what to watch. Not watching. Deciding.

Letterboxd / Trakt.tv / Queued
Great for logging what you've seen. Built for film nerds, not discovery.
Looks backward, not forward
JustWatch / Reelgood
Tells you where to stream a title. Assumes you already know what you want.
Solves the last step, not the first
Platform algorithms
Netflix, Prime, Hulu each recommend within their own catalog. Optimise for engagement, not fit.
Siloed, and don't ask how you feel right now

Cold start is a UX problem, not an ML problem.

Instead of waiting for history to accumulate, design interactions that extract high-signal preference data in the first 30 seconds. Tinder didn't solve match quality with compatibility surveys - it made expressing preference so frictionless that users generate thousands of data points without realizing it. Mood selection, history import, a swipe interface: data collection strategies in disguise.

The Solution

Pick a mood. Optionally describe a vibe: "something quietly devastating, like a Hirokazu Koreeda film." The app surfaces one recommendation at a time - swipe yes, no, or "already seen." Each interaction sharpens the model. The more you use it, the less time it takes.

Layer 1 - Cinephile DNA

Every film scored on how it feels, not what it's about. 12 dimensions, generated at temperature 0.0 with frozen model versioning - deterministic and drift-free. A mood selection becomes a vector query; Vertex AI Search for Media returns the nearest matches in under 500ms.

PacingSlow burn → Relentless
Narrative ComplexityLinear → Puzzle-box
Thematic DepthSurface → Philosophical
Tone IntensityLight → Exhausting
Arousal LevelCalming → High-tension
PredictabilityFamiliar → Mind-bending
Character FocusPlot-driven → Character study
Dialogue DensityVisual → Wordy
Conflict TypePhysical → Psychological
Visual StyleCategorical tags
Industry VibeCategorical tags
Ending VibeCategorical tags

Every interaction is a signal. The model learns in real time.

Six weighted behavioral signals feed back into the user's preference vector via Vertex AI reinforcement learning. A "watched it and hated it" carries a clickbait penalty (-1.5) - a film that overpromised is more damaging to trust than one you simply skipped. The model is penalized for misleading matches, not just wrong ones.

Recommendation flow — interactive prototype

Data Infrastructure

TMDB API
The Movie Database APISource of all film metadata: posters, cast, synopsis, streaming availability, and daily trending data for 50K+ titles in the catalog.TMDB docs →
Google Cloud FunctionsServerless compute that runs the daily ingestion job: pulls new and trending titles from TMDB, detects catalog gaps, and triggers the scoring pipeline. No servers to manage.Learn more →
Google BigQueryServerless data warehouse storing the full title catalog, user preference profiles, and behavioral event history. Single source of truth for the recommendation system.Learn more →
BigQuery ML — ML.GENERATE_TEXTCalls Gemini directly inside a SQL query - no data export or separate ML pipeline needed. Auto-scores every unscored film against all 12 Cinephile DNA dimensions. Runs at temperature 0.0 for deterministic, repeatable scoring.Learn more →
Vertex AI Search for MediaGoogle's purpose-built recommendation engine for media products. Handles vector similarity search across the DNA-scored catalog and real-time personalization re-ranking. The same infrastructure that powers recommendations at YouTube scale.Learn more →
App
Kini iOS AppBuilt on Flutter/FlutterFlow. Sends mood inputs, receives ranked recommendation results, and collects behavioral signals that flow back into BigQuery to continuously refine the model.

Hover any teal node for a summary. Click to open GCP documentation.

500+
Waitlist sign-ups, zero paid acquisition
12
Behavioral film dimensions in the DNA scoring system
50K
Titles auto-scored and maintained in the catalog
<500ms
Target latency from mood input to recommendation output

What I'd do differently

I'd build a Wizard of Oz version first - manually picking films based on mood inputs - before touching infrastructure. The build was right; the sequencing wasn't. I'd also add a post-recommendation survey earlier. The algorithm catches what people click. It doesn't catch whether the recommendation felt right before they swiped.


Case Study 02 - Workday

Owning the consumer layer inside a platform used by millions

AI/ML  ·  Candidate-facing product  ·  28M monthly users  ·  356M annual applications

My product surface

Workday is enterprise HR software - except for the product I own. The candidate experience is the public-facing layer job seekers hit when applying to companies like Apple, Google, and Visa. 28 million people a month. 356 million applications in 2024. The candidate has no contract with Workday. Building well for them is an act of pure product conviction.

The problem

Job seekers apply in the dark - no idea how competitive the role is or how they stack up. They waste time on applications they won't get. Recruiters waste time filtering the mismatch. Both sides lose. The solution I built addresses both sides simultaneously, without exposing any individual candidate's data.

Candidate Insights: giving job seekers competitive intelligence before they apply

I led Candidate Insights - surfaces real-time intelligence to job seekers before they apply. Skills match, experience percentile, applicant pool composition, similar role redirects. If the role isn't right, the feature says so before they waste the application.

Value to the candidate

  • Transparency - real data on the applicant pool before committing
  • Confidence - know you're competitive before you apply
  • Redirected effort - find a better-fit role if this one isn't right
  • Less frustration - data-based context if not selected

Candidate Insights

Serves both sides of the marketplace with one feature - zero compromise

Value to the recruiter

  • Self-filtered pool - candidates arrive already informed
  • Higher signal - fewer mismatched applications to screen
  • Faster fill time - better qualified-to-underqualified ratio
  • Competitive edge - Workday's version is free; LinkedIn charges for it

Resume-to-Jobs matching: flip the discovery model for candidates

A companion feature flips the model: upload your resume once, get proactively surfaced to matching open roles. Driven by the same deep learning matching model that produced a 15% improvement in quality-of-hire and 37% lift in candidate sentiment. Candidate Insights tells you how you fit a role; Resume-to-Jobs finds the roles that fit you.

+15%
Projected quality-of-hire improvement from deep learning candidate matching
+37%
Candidate sentiment lift across millions of active job seekers
-44%
Reduction in critical defect impact rank across the apply flow
3 hrs
Per-week manual admin time saved per recruiter after CRM improvements

What I'd do differently

I'd push harder for regular candidate interviews from the start. Users who can't leave your product give you some of the most honest feedback you'll ever get - we weren't capturing enough of it.


How I Think

Lessons from the work that have actually stuck

Cold start is a UX problem, not an ML problem

The standard fix is a popular-content fallback while data accumulates. I think that misses the point. The real question is how you make expressing preference so effortless that users generate signal constantly, without thinking about it.

Tinder didn't solve match quality with surveys. Every swipe in Kini is a training signal collected passively in half a second. Cold start isn't a waiting problem. It's a design problem.

The best consumer work I've done was inside a B2B company

At Workday, candidates can't vote with their feet. They can't switch to a competitor or leave a bad App Store review. They just deal with the experience we built. That constraint turned out to be a sharper test of product empathy than market pressure.

When users can't leave, you build for people - not retention metrics. That's the most important thing this work taught me.