All projects
CupidFaces Live

JobHunt

AI-powered job application platform aggregating 8 job sources with Gmail OAuth sending

800+
Applications sent (beta)
11
Active users
8
Job sources aggregated
6
AI features
AI/LLMSaaSNext.jsFull-stackWebAuthn
JobHunt homepage
Homepage

The Problem

Job searching is genuinely fragmented. Applications live in spreadsheets, job boards are siloed, cover letters get written from scratch for every role, and sending applications means juggling tabs. The overhead is highest during periods of unemployment, exactly when people have the least time and money to spare.

Overview

JobHunt is a job application platform designed to consolidate the entire job search workflow into one place. It pulls listings from 8 job boards simultaneously, deduplicates them, and lets you filter by job type, recency, and keywords. Applications are managed through 6 stages: Draft, Applied, Interview, Offer, Rejected, Withdrawn.

The AI layer is powered by Gemini 2.5 Flash Lite. From a job listing, you can tailor your CV to the role, generate a cover letter in three styles (formal, casual, or creative), and generate 10 interview questions across technical, behavioural, company, and situational categories. You can also analyse your CV, analyse your LinkedIn profile, and rebuild CV text that came out garbled from a badly structured PDF.

Every piece of AI output is editable before it goes anywhere. When you are ready to apply, you connect your Gmail via OAuth2 and send the email directly from your own address.

My Role

  • Conceived the product and defined the full feature set: multi-source job aggregation, 6-stage application tracking, AI writing assistance, and Gmail OAuth sending
  • Designed the AI feature set: 6 distinct features with tailored prompts, editable outputs, and per-user rate limiting per feature
  • Made the core product decision that all AI outputs are editable before going anywhere
  • Specified the job source normalisation approach: one internal Job schema that every source maps to
  • Defined the Gmail OAuth flow: connect once, applications send from the user's own address
  • Designed the 4-step onboarding flow: profile, job preferences, LinkedIn capture, CV upload
  • As a solo-stage project with no separate engineering team, I contributed directly to development alongside product ownership.

Stakeholders

  • Job seekers (primary users)
  • Hiring managers (indirect, as email recipients)
  • Google (Gmail OAuth partner)
  • Job board APIs (Remotive, Adzuna, Jobicy, Himalayas, and others)

Technical Context

Next.js App Router with React 19 and TypeScript. Supabase handles the PostgreSQL database with Row Level Security enforcing user data isolation at the database level.

The job aggregation runs via API route on demand and via Vercel cron in the background. Each source is fetched in parallel and results are upserted by a unique constraint on (user_id, source, external_id). The AI features use Gemini 2.5 Flash Lite with rate limiting via Vercel KV.

Gmail OAuth stores the access token and refresh token in the database. Before sending an email, the route checks token expiry and refreshes automatically if needed.

Key Decisions

AI outputs are first drafts, always editable
Every piece of AI-generated content on the platform can be edited before it goes anywhere. AI writing needs a human pass to sound right for the specific person applying.
Storing WebAuthn challenges in the database for serverless compatibility
On Vercel serverless, a new function instance handles each request, so there is no shared in-memory state. Storing challenges in a database table with expiry timestamps solved this.
Sending applications from the user's own Gmail account
Sending from a platform address means the hiring manager's first impression is a platform they may not recognise. Sending from the user's own Gmail address means the email looks like a normal job application.
Zero monthly infrastructure cost by design
The platform runs entirely on free tiers: Supabase, Gemini API, Vercel, and job sources without paid API keys. A job hunting tool is used most intensively during unemployment, which is precisely when paying a monthly subscription is hardest.

Challenges

Eight job sources, eight different data shapes
Every job source returns data differently. The normalisation layer maps every source response to a single internal Job type. Adding a new source means writing a new mapper, not changing the application code.
PDF text extraction is unreliable across different PDF generators
PDFs generated by word processors, design tools, and CV builders all encode text differently. The CV rebuilding feature exists precisely for this case: when the extracted text comes out garbled, the AI reconstructs a clean, properly formatted CV.
Rate limiting AI features without killing the experience
Per-user per-feature rate limits handle this without requiring users to manage tokens or credits. The limits are generous enough that normal use never hits them.

Discovery

The brief came from a client who builds tools for people around him. The job search problem was one he had watched friends struggle with: applications spread across spreadsheets, cover letters rewritten from scratch for every role, and no clean way to track where everything stood.

Stakeholder Friction

The main scope cut was a direct employer posting feature that would have let companies list jobs on the platform. Doing both the job seeker side and the employer side in the same release was not realistic, and a half-finished employer experience would have undermined the job seeker product.

Outcomes

800+ applications sent averaging 70+ per user
800+ job applications sent from users' own Gmail accounts across 11 beta users, averaging over 70 applications per user.
Full job search workflow in one place
8 job sources aggregated and deduplicated, 6-stage application tracking, and AI-assisted writing all in one interface.
Zero infrastructure cost through beta
Platform has run entirely on free tiers (Supabase, Gemini API, and Vercel) through the full beta period without hitting usage limits.

Technology Decisions

Next.jsReact 19 + TypeScriptSupabase + RLSGemini 2.5 Flash LiteGmail OAuth2WebAuthn / PasskeysTailwind CSS 4ZustandMammoth (.docx)Custom PDF Parser (zlib)Vercel + Cron

What I'd Change

Weekly job digest emails. The usage pattern across beta users is intense in the first week, then quiet. A weekly email surfacing five matched roles based on each user's saved preferences would create that loop without requiring any action from the user.

From the blog

All posts
The Real Skills You Need as a Technical Product Manager
There’s a lot of confusion about what a Technical Product Manager actually does.
22 May 2026
JobHunt: What I Was Actually Trying to Fix
Most of the products I build start with a small, persistent frustration. Something I've experienced myself or watched someone close to me struggle with and couldn't stop thinking about.
17 May 2026
ProductManagement
Building JobHunt: A TPM's Notes on Shipping an AI Job Application Assistant
I'm a Technical Product Manager. I think in user journeys, prioritisation frameworks, and edge cases. What I don't usually do is write the code. JobHunt changed that, not because I suddenly became a software engineer, but because AI-assisted development has made the distance between an idea and a working product smaller than I've ever seen it. This is a record of what I built, why I built it that way, and what the decisions looked like in practice.
17 May 2026
← PrevPM NotifierVisibility Logic