Own product
JobPilot — AI-Assisted Remote Job Applications
JobPilot is my own web app for remote job hunting. Every day it collects new remote jobs, scores each one against a master CV, writes a tailored CV and cover letter for good matches, and waits for a human to approve before anything is sent. It supports several job seekers in separate workspaces and can also be driven from an AI assistant through MCP.

Overview#
JobPilot is a web app I designed and built to make remote job applications less slow without making them careless. It finds new remote jobs every day, decides which ones fit a candidate, prepares a tailored CV and cover letter for each good match, and then stops. A person reviews the result and clicks approve. Only then does the app send an email application or produce an "apply kit" for jobs that use a website form.
It started as a tool for my own search and grew into a multi-account product: each job seeker gets a separate workspace with their own CV, preferences, sending email account and application history.
My role#
I did the full build on my own: product definition, data model, the daily pipeline, the AI integration, the dashboard, the marketing pages, authentication and deployment. I also wrote the user manual that ships with the app.
The problem#
A good remote application takes time. You read the posting, check whether the company even hires from your country, adjust your CV to what they ask for, write a short cover letter and keep a record of where it went. Doing that for every role eats evenings.
The tools that promise to fix this usually go too far the other way. They spray generic applications everywhere, sometimes with skills the candidate does not have. That wastes employers' time and damages the candidate's reputation.
I wanted the reading, filtering and drafting automated, and the decision and the truth of the CV kept firmly with the person.
Approach & architecture#
Everything lives in one Next.js project on Vercel: pages, server logic, scheduled jobs and the MCP endpoint. All business rules sit in one service layer, and the dashboard, the scheduled jobs and the MCP tools are thin entry points that call the same services, so behaviour never drifts between them.
- Scheduled jobthen
- fetch public job feedsthen
- normalise + dedupethen
- cheap keyword pre-filter
- Pre-filterthen
- AI scoring + location eligibilitythen
- AI tailoring (only for strong matches)
- Tailored CV + cover letterthen
- approval queuethen
- human approvesthen
- email send or apply kit
- Browser dashboardthen
- Next.js service layer <- MCP endpoint <- AI assistant
- Service layerthen
- PostgreSQL + file storage
Jobs come only from sources that offer public feeds or job board APIs, and the app keeps the link back to each original listing. Each job moves through a clear status path from discovered to sent, and every step is a guarded state change, so a job cannot be processed or sent twice even if two runs overlap.
The AI does two separate jobs. A small, cheap call scores the match and checks whether a candidate in the user's location can apply. A larger call, made only for strong matches, writes the tailored CV and cover letter. Costs are tracked per workspace with daily budgets.
Key challenges#
Keeping the CV honest. The tailored CV may only select, reorder and rephrase what is already in the confirmed master CV. I did not trust a prompt alone for this. Every tailored result goes through a separate validator that compares it with the master CV and rejects anything that adds experience or skills.
Human approval as a hard rule. There is no setting that turns approval off. The AI assistant connected over MCP can browse jobs and prepare drafts, but sending is a separate, deliberate action. Sends are queued, spaced out and capped per day, and an interrupted send is marked as failed instead of being retried, so nothing goes out twice.
Serverless time limits. Vercel functions have a maximum run time, so the pipeline works in small, idempotent batches. A daily scheduled run handles one batch, and the dashboard can keep processing batches on demand.
Many users, one database. Every query is scoped to a workspace, and access is checked at the start of every workspace function. Tests cover isolation for data, files and MCP access.
Tech stack#
- Next.js and TypeScript for the dashboard, server logic and marketing pages in one deployable app.
- PostgreSQL with Drizzle ORM for jobs, CV versions and applications.
- Auth.js for invite-only sign-in across multiple workspaces.
- Anthropic API for scoring and tailoring, with all AI output validated by schemas.
- MCP so an AI assistant can query and control the pipeline.
- PDF rendering, email sending and Vercel Cron for apply kits, applications and the daily run.
- Vitest for tests on the pipeline, validators, status transitions and isolation.
Results#
JobPilot is built and deployed. The daily pipeline, AI tailoring with the truthfulness check, the approval queue, email sending, apply kits, the application tracker, the MCP connection, plans with usage limits and an admin area are all in place. Payments are not integrated yet; an admin assigns plans manually. It is in active development.
Screenshots#



