Career OPS

I built a job-market data platform for my own job search. Every night it collects open software jobs from employers' own hiring systems, ranks them against my resume, and drafts a tailored one-page resume for the best matches.

Kaihuan HuangLoading the latest numbers…Public job data only · the tailoring example uses a sample resume

Live numbers from last night's run

The employer's publish date matters: a third-party job feed I checked labelled postings "recent" when it first saw them, and only 16% of those were really posted in the last 3 days. So I rank by the date the employer's own system gives.

Where the postings come from

Open software roles by hiring system. I read the employers' own systems first; LinkedIn and job boards only fill gaps.

AI engineering roles posted in the last 3 days (US)

PostedRoleCompanyLocationSource

What AI engineering job descriptions ask for

RequirementFinance companiesAll AI roles

How the nightly run works

  1. Collect. Read every company's job board (Greenhouse, Lever, Ashby, Workday, iCIMS, Oracle and more). Fast sources first, slow ones after.
  2. Store. One SQLite table that never deletes: a posting is marked closed only after it is missing twice in a row, and every status change is kept.
  3. Fetch job descriptions for new roles, one request per second per site.
  4. Score. Compare each job description with the resume using local open models (embeddings, then a reranker), plus rules for level and location.
  5. Tailor a one-page resume for the 10 best new matches (next section).
  6. Brief. A morning summary: new roles, best matches, drafts, and questions for me to answer.

Each step starts when the step it needs is done. Model work runs only in a fixed night window. Every step writes its result to a status file, and a failure sends an alert.

How the resume tailoring stays honest

For each job, the model rewrites one bullet at a time to use the job's own words for the same work. Then a set of plain checks decides what happens to each change:

ReadySame facts, the job's vocabulary. Goes into the PDF.
ConfirmAdds something my records don't show yet (a skill, a stronger claim). Kept, but marked for me to confirm. My answer is saved as a fact for every later resume.
RejectedA number the model made up, a changed company or date, filler words, more than three new keywords in one bullet, broken LaTeX, or a bullet that doubled in length.

Example (sample resume)

Ready
Built a booking service with FastAPI and PostgreSQL, with SMS confirmation and self-service cancellation.
Built and deployed a FastAPI / PostgreSQL booking API with SMS confirmation and self-service cancellation.
Same facts; uses the job's words "API" and "deployed".
Confirm
Wrote rule-based checks that stop a booking until the guest replies "yes".
Added a human-in-the-loop confirmation step: the agent cannot book until the guest replies "yes".
"Human in the loop" is the job's term for this. The candidate confirms it fits.
Rejected
Measured 1.2 s p95 latency over 40 test conversations.
Spearheaded latency work that cut p95 by 60% across 12 services.
New numbers (60%, 12) that are not in the records, and filler ("spearheaded").

The page fit is checked on the real PDF: if a version runs over one page, the longest rewrite goes back to its original wording before any bullet is dropped.

Engineering choices

First-hand data first

Chose
The employer's own hiring system and its publish date.
Why
A third-party feed's "recent" label was right only 16% of the time.

Rules check the model

Chose
The model drafts; plain code decides what is kept.
Why
A small local model rewriting ten bullets in one call gave one usable rewrite. One bullet per call, plus checks, gave ten of ten.

Local models first

Chose
Open models on my own GPU server; a cloud model is optional.
Why
No cost per run, and my resume and applications never leave my machines.

Safe releases

Chose
One release command: run every test, build, back up the database, switch, check the pages, roll back automatically if a check fails.
Why
The server also runs other production services, so nothing may break them.

Private by default

Chose
The full dashboard is private. This page is a static copy with public job data only, refreshed every night.
Why
The dashboard holds my resume and applications; visitors to this page never reach my server.