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.
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.