Skip to content
~sami-ullah

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.

Screenshot of the JobPilot — AI-Assisted Remote Job Applications project

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.

◆ Architecture
  1. Scheduled jobthen
  2. fetch public job feedsthen
  3. normalise + dedupethen
  4. cheap keyword pre-filter
  1. Pre-filterthen
  2. AI scoring + location eligibilitythen
  3. AI tailoring (only for strong matches)
  1. Tailored CV + cover letterthen
  2. approval queuethen
  3. human approvesthen
  4. email send or apply kit
  1. Browser dashboardthen
  2. Next.js service layer <- MCP endpoint <- AI assistant
  1. Service layerthen
  2. 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#

JobPilots hero with the headline Auto-apply to remote jobs with a CV tailored for every role, next to a job card waiting for approval
The JobPilots landing page hero.
Full JobPilots landing page with job sources, how it works, features, comparison, pricing in PKR and FAQ
The full landing page.

Skills used

  • Screenshot of Salon Booking Marketplace — Multi-Salon Platform

    Own product

    Salon Booking Marketplace — Multi-Salon Platform

    A multi-salon booking marketplace I designed and built for Pakistan. Clients find nearby salons on a map, choose a barber, service and time, and book at the salon or as a home visit. Salons run staff, schedules and earnings from their own dashboard, and the platform collects a commission per completed booking through daily settlements.

    Next.jsReact.jsTypeScriptTailwind CSS
  • Own product

    ReviewLens — Review and Returns Analysis for Stores

    ReviewLens (working name) is a SaaS I built for online stores. It reads a store's customer reviews, returns and competitors and turns them into a short report: what customers complain about, which products cause the most problems and what to fix first. All numbers are computed in code, and AI only classifies text and explains the results.

    Next.jsReact.jsTypeScriptTailwind CSS
  • Screenshot of Clinic Booking Systemlive demo

    Concept project

    Clinic Booking System

    Book a slot in your time zone, race two bookings for one slot, then drag appointments in the admin calendar and watch overlaps fail.

    TypeScriptReact.jsNext.jszod
    ▶ Open demo

#nextjs6 min

JSON-LD Structured Data in Next.js 15

How to add JSON-LD structured data in Next.js 15: a safe script component, typed schema-dts graphs with stable @id values, FAQ rules and how to test it.

read →