A job search platform I built from scratch to run my own search like a sales pipeline — find recruiters, get an AI-drafted email, track every follow-up, discover jobs before they saturate. Twenty days, zero prior Next.js or Supabase experience.
Job searching was disorganized across three broken pieces — finding roles, tracking outreach, and surfacing unposted jobs.
I built JSP solo in 20 days — three layers for outreach, tracking, and discovery — coding with AI assistance.
It's live at jsp-mvp.vercel.app, with real GPT-4o email drafts, a Kanban follow-up engine, and Google auth.
The problem
The idea came from personal frustration — I was targeting AI PM roles and found the entire process exhausting and disorganised. Most tools help you find a job. None of them help you run a systematic outreach campaign and track it like a pipeline — which is exactly what a serious search requires, especially for roles that never get posted.
Finding relevant opportunities
Naukri, LinkedIn, Indeed show you everything or nothing. No system learns what you actually want.
Managing outreach and follow-up
Once you've found something, tracking who you contacted and when to follow up becomes unstructured fast. Opportunities die from poor tracking, not lack of ability.
Roles that never get posted
A large share of roles fill through referrals and direct outreach. Most job seekers only ever play in the visible market.
Architecture
Mapped out from day one as three independent layers. A rule I held throughout: work on one branch at a time, and don't design the next one while building the current one.
Outreach
Find recruiters → generate a personalised email → send
Traction
Track every outreach → follow up on time → never lose a lead
Opportunity
Discover postings → feed into Layers 1 and 2
Hidden roles go straight into Layer 1 as cold outreach. Posted roles run the full loop: discover → reach out → track. A single lead_type field on one table handles both.
Build log
Not a full commit history — the five points where the product actually changed shape.
$git commit -m "initial commit"
One page, a hardcoded list of fake recruiters, a static email template. Nothing real yet — just enough to prove the idea worked visually.
$git commit -m "migrate to TypeScript, App Router, Tailwind + Hunter.io"
Rebuilt the codebase properly — commit to the right stack rather than patch the wrong one. This is also where #0f0f0f / #4ade80 — the palette this whole page is built in — got locked in and never changed again.
$git commit -m "Branch 1 complete: gpt-4o wired, editable email, followup fields"
The most important single commit in the project. Real GPT-4o replaced the template. The email became an editable <textarea> — nobody should send an AI draft without reading it first. And sent_at / followup_due_at got written on save — the foundation the entire follow-up engine in Branch 2 would depend on. [NEEDS INPUT: one sentence on why GPT-4o specifically — cost, latency, quality vs. alternatives considered]. The first drafts [NEEDS INPUT: concrete example — generic-sounding, hallucinated recruiter details, wrong tone] — refining the prompt against real recruiter examples got it to a draft worth sending, not just one that existed.
$git commit -m "Branch 2: Kanban pipeline, drag-and-drop, follow-up engine"
The most complex build in the project, done in one session — six components, three API routes, drag-and-drop, a slide-in drawer, and a follow-up state machine: sent → reminded (day 3) → escalated (day 5) → cold (day 7), clearing instantly on any reply.
$git commit -m "Branch 3: opportunity discovery, scoring, preferences" + "google auth"
The job feed — three sources merged, scored, and ranked — landed first. Auth came last, on purpose: with zero real users yet, adding it after the product worked meant zero migration risk and a clean implementation.
What it does
Tell it who you are. It finds the recruiter and writes the email.
A 14-field form — background, target role, achievements, tone — feeds both the recruiter search and the email personalisation. When Hunter.io has no data for a company (common for Indian startups), a labelled fallback pool keeps the flow from dead-ending.
Every lead lives on a board, not in your memory.
Six columns — Draft, Sent, Follow-up Due, Followed Up, Replied, Cold/Closed. Job search is a pipeline that moves over days and weeks; a Kanban makes the state of it readable in five seconds instead of a spreadsheet you have to actually read.
A scored feed, not another job board to babysit.
Preferences set once, three sources merged into one ranked list — source is metadata nobody needs to see. Every card can go straight into the pipeline or straight into a recruiter search, closing the loop back into Layer 1.
[NEEDS INPUT: describe how the ranked feed's scoring actually works today — the real weighting/criteria behind the ranking — and any validation step, even something as simple as "manually checked top-20 vs. bottom-20 scored jobs against my own judgment of fit."]
Problems faced
What I deliberately left out
Every item below was considered, discussed with myself, and cut on purpose — the discipline that kept a solo 20-day build from turning into a project that builds forever and ships never.
Bulk outreach
No sending to 50 recruiters at once. Mass outreach is impersonal and risks the relationships this tool exists to build.
Autonomous AI agents
No auto-sending, no follow-ups fired without a click. The user generates, reviews, edits, sends. JSP assists — it doesn't replace judgment.
LinkedIn scraping
Evaluated seriously — best recruiter data lives there. Rejected: LinkedIn actively bans scrapers and sues over it. A product built on a foundation that can vanish overnight is the wrong call.
Analytics, team accounts, pricing
No charts, no shared pipelines, no monetisation in v1. Prove the loop works for one person before building for many.
Honest reflection
Twenty days. No prior Next.js or Supabase experience. Three product layers, authentication, and a live deployment.
The technical implementation was AI-assisted — Claude Code, with instruction files I wrote and refined for every branch. That's transparent and intentional: I'm a PM, not an engineer, and using AI for implementation while owning every product and architecture decision was the right division of labour for building this alone.
It isn't perfect. Recruiter data is weak for Indian companies. The job feed is limited by its free sources. I named those limits instead of hiding them — in the product, and here.