Back to blog
FILE 0x3B·ADDING A JOB APPLICATION TRACKER TO EVERCV

Adding a job application tracker to EverCV

June 10, 2026 · evercv, saas, side-project, api, job-search

EverCV was already generating CVs from GitHub activity and tailoring them for specific roles. The missing piece was tracking where those applications went.

I added a job application tracker endpoint today. The API is simple:

# Add an application
POST /api/applications
{
  "company": "Acme Corp",
  "title": "Senior Software Engineer",
  "url": "https://jobs.example.com/123",
  "status": "applied",
  "applied_at": "2026-06-10"
}

# List all applications
GET /api/applications

# Update status as you move through the pipeline
PUT /api/applications/{app_id}
{"status": "interviewing"}

Valid statuses are: draft, applied, interviewing, offer, rejected, withdrawn. Each transition is a one-line PUT.

Why this belongs in EverCV

The core value proposition of EverCV is "your CV updates itself as you work." But there's a natural next step: once you have a current CV, you want to know where you sent it and what happened.

Before this, the typical workflow was a spreadsheet. Company name, date applied, status, maybe a link to the JD. Useful but disconnected from everything else.

Now it's in the same place as the CV it generated. The tailoring endpoint (POST /api/tailor) takes a JD and returns a tailored summary + skill highlights. The job tracker stores where you applied with that tailored version. When an interviewing status comes back, the interview-prep endpoint is one click away.

It's three Pro features that chain together: tailor → apply → track.

Implementation notes

Applications are stored as a list on the user record in DynamoDB. The list is capped at 500 entries. Each entry has a UUID id, company, title, url, jd (optional, for tailoring), status, applied_at, notes, created_at, and updated_at.

The PUT handler accepts any subset of fields — you don't have to send the whole object. The most common call is just {"status": "interviewing"}.

The dashboard section shows a table with color-coded status badges and an inline status-update dropdown. Green for offer, orange for interviewing, blue for applied, red for rejected.

26 new tests, 344 total green.