Benjamin J. Sunter
← Selected work Pipeline tooling

Career Ops

Built 2026 · Open source

Hiring broke: the average open role gets more than 300 applications now, up from about 100 in 2021. AI made applying almost free. It did nothing for the people who have to read them.

Applying faster is what caused the pile-up, so Career Ops goes the other way. It never writes or submits anything. It narrows down which roles deserve your time.

What it does

  • Reads about twelve thousand postings a morning and throws away almost all of them.
  • Works out what happened to every application by reading my mail, so I record nothing by hand.
  • Keeps the record straight: what I sent, what came back, and when.

What it doesn't do

  • It never writes or submits an application. Applying still happens in a browser.
  • It doesn't guess. Roughly half of what it reads, it won't judge. It hands those to me.
  • It won't get you a job. The bottleneck is how many people can read applications, and nothing here changes that.

The demo below shows what it produces. Filter it, sort it, open any row.

Demo Synthetic data. Every company, role and application below is invented.

Filter, sort, open any row.

How a role reaches the list 103 job boards four ATS APIs Ranked, then read cheap filters first Banded by age freshest first Do next what to open Greenhouse, Ashby, Lever and Workday. Each row arrives with pay band, employee sentiment and your history with that company attached. Status comes from your mail. A req with 300 applicants is read in arrival order, so week one beats a better score in week six.
How I keep it accurate

Every morning it reads about twelve thousand postings across 103 boards, cheaply throws away almost all of them, and leaves a handful to read properly. That part is easy to build, and easy to trust for about a week.

Then it starts getting things wrong without telling you. A rule written in March stops matching the mail that arrives in September, nothing errors, and the dashboard still looks fine. Mine filed a live interview invitation as a routine acknowledgement.

So most of my time went into checking it. There are 886 real emails I labeled by hand that every change has to pass, and a command called drift that goes back through everything already stored and reports where the data and the rules that produced it no longer agree. I can tell you what it still gets wrong. Most tools like this can't, because they were demoed once and never measured again.

Fixes apply backwards too. When I repair a rule, it repairs the next email and a year of old records, so the history gets more accurate the longer it runs. It's also why I wouldn't trust a dashboard nobody has reconciled against the source in six months.

$ careerops corpus
checked 886: 886 agree, 0 drift, 0 regressions

$ careerops drift
OK   event type                 OK   title without a role
--   event role: 1              OK   outreach-only application
OK   unread pay band            OK   flat scoring signal
OK   unapplied alias

     468  stored   "Operational Excellence Program Manager"
          derived  "Program Manager"

Both of those are real output. The one open finding is staying open, because the stored title is the better of the two.

What the 886 means, and what it doesn't. It's a regression gate. It doesn't measure accuracy. I labeled those messages myself after seeing what the classifier made of them, and fixed the code until the two agreed, so it reports 100% by design. It shows that a change didn't break something that used to work. It can't tell me how often it's right about mail it has never seen. I don't have that number yet. Getting it means labeling a held-out sample blind, before looking at the verdict. That's an afternoon's work and the next thing I'll do. Until then, the gate is all I'm claiming.

It doesn't fix the real problem, and nothing on the candidate's side can. The hard bugs all had the same cause: software saying something untrue with total confidence, and being believed. Most of the work was teaching it to say when it doesn't know.

Application volume: Ashby, 100M+ submissions. Interview-rate decline: ZipRecruiter 2026 talent acquisition survey.

PythonSQLiteGmail API Anthropic APIEvent sourcingOpen source

Take it if it's useful. There's a two-minute path with no credentials, and a full setup that reads your Gmail locally. Your mail never leaves your machine. Steps are in the README.

Technical summary (PDF) View on GitHub