Case study

AutoApplier

An AI job-search platform that finds real openings, scores fit and writes truthful, tailored resumes.

Solo project: design, backend, frontend and deployment2026
AutoApplier screenshot

The problem

Job boards are full of stale and reposted listings, and tailoring a resume for every application takes hours. Generic AI tools make it faster, but they invent experience the candidate does not have.

How it works

From input to result

1

Collect

Reads company career sites (Greenhouse, Lever, Ashby) and six job boards, then applies the user's location, seniority and age filters.

2

Verify

Cross-checks board postings against the employer's own careers page and labels each job verified, likely real, stale or suspicious.

3

Pre-filter

A free rule-based score picks the most promising jobs, at most 25 per search, for AI scoring.

4

Score

An LLM reads the job description and scores fit against the candidate's full profile.

5

Tailor

On approval, writes a one-page LaTeX resume and a cover letter, checked line by line against the candidate's own words.

6

Apply and track

Apply on the company site, follow up by email, and let inbox replies update the tracker.

Key decisions

Why it is built this way

Long work runs as small, resumable steps

Vercel stops any request after 300 seconds. Searches run as database-backed jobs in steps of at most four minutes, with leases so two workers never run the same job and a stopped step never loses progress. The browser, a cron call or a server loop can advance them.

Rate limits pause work instead of failing it

Each user brings their own keys for Groq, Gemini, OpenAI or Claude. Keys rotate, and a 429 puts a key into a cooldown taken from the provider's Retry-After header and stored in the database. When every key is limited, the job is rescheduled for the moment one frees up, and only falls back to rules after the user's chosen maximum wait.

A truthfulness check on every generated line

A rephrased line must share most of its content words with one of the candidate's own lines, and every number must appear in the source. Anything unsupported is removed before the PDF is built.

AI calls only where they help

A free pre-filter, a cap of 25 AI-scored jobs per search, no AI for postings without a description, and the cheapest capable model of each provider by default.

Built for unreliable job sources

LinkedIn blocks data-centre addresses, so it is skipped for 15 minutes after a 429. Every source has a time budget, and slow ones are cut off instead of stalling the whole search.

Results

  • Live on Vercel with a Neon Postgres database, and I use it every day for my own job search.
  • Supports 4 LLM providers, 3 applicant-tracking systems and 6 job boards.
  • Resumes fill exactly one page from real content, and every line traces back to the candidate.

What I would build next

  • A browser extension that reads LinkedIn job descriptions while browsing.
  • Interview preparation generated from each job description.

Built with

PythonFastAPISQLAlchemy (async)PostgreSQLNext.jsReactLaTeX (Tectonic)Vercel