I turned my job hunt into a pipeline, then got rejected by my own tech stack

Two rejection emails landed the same week this spring. One from Deepgram, one from ElevenLabs. Both polite, both no.

Here's the funny part. My side project runs on both of them. Voluble does real-time speech-to-speech translation: Deepgram turns speech into text, ElevenLabs turns it back, and I've been paying both at 2am for a year. Then both passed. If you want a quick lesson in humility, get rejected by the APIs you build on.

That was the mood in April. I needed a senior engineering role, I had EU work rights and a comp floor I wasn't pretending didn't exist, and my browser looked like a hostage situation. 40-something tabs of postings I'd half-read, and a spreadsheet whose "status" column stopped being true by week 1. I'd apply on a Tuesday, forget by Thursday, and rediscover the rejection three weeks later like a small archaeological find.

So I did the thing engineers do when they're avoiding their feelings. I built a pipeline.

The engine is career-ops, an open-source job-search system by santifer. I use it, and over 3 months I've bent it pretty hard around how I actually work. The apply button stayed mine. Everything before it, I handed to the machine.

What I was hunting

Wide, on purpose. Backend, AI and ML product engineering, plain senior software engineer, app and product roles, and senior or staff mobile. I've shipped iOS and Android, Go backends, and a Rust core behind a translation app. People keep filing me under "mobile dev," and that throws away half my range.

It all runs off two files.

config/profile.yml is the me half: target roles, which archetypes are a real fit versus a stretch, where I can legally work, my comp floor, and a narrative block with the stories I want to tell (Voluble's Rust core, dragging an OTT app's ANR rate to 0.09%, the open-source work).

portals.yml is the market half: a location filter, a title filter, a stack of Google dorks aimed at specific ATS platforms (one is literally site:jobs.ashbyhq.com "Backend Engineer" Netherlands OR remote), and a list of tracked companies, each with a note on why it's worth an evening.

How it hunts

Scanning is the cheap part, so I keep it cheap. It hits the Greenhouse, Ashby, and Lever APIs directly, no language model near it, and dedups every URL.

The job boards are the annoying part. LinkedIn, Glassdoor, and Indeed have no friendly APIs, and they hate scrapers. So I drive my own logged-in Chrome with Playwright, WebWright, and Claude for Chrome, reading the accessibility tree the way a screen reader would instead of brittle CSS. Because it's my own session, I'm not fighting bot checks, and keeping it local saved me more grief than anything else.

How it scores

Every posting that survives gets scored into a report under reports/: fit, seniority, red flags, and a legitimacy check. That last one earns its keep. A depressing number of "senior remote" listings are ghost jobs, and I'd rather learn that before I burn an evening on a cover letter.

Tailoring each application

Each score comes with a report, and that report is where tailoring starts. It pulls out what this specific role wants: the archetype, the must-have skills, the words an ATS will grep for. That drives the CV.

Everything builds from one cv.md plus the proof points in profile.yml, and the generator assembles a per-company version from them. It reads the role's archetype and must-haves off the report, then decides which of my stories to lead with, which to keep, and which to cut. A backend role at Qonto pulls my Go and axum work and Voluble's Rust core to the front. A mobile role at Zalando leads with SwiftUI, Compose, and that 0.09% ANR number. It also makes sure the words the ATS is grepping for actually show up, when they're true. It never invents anything. It just decides which true thing goes first.

It renders two ways: a LaTeX path through xelatex (tectonic when the fonts sulk) and an HTML path through headless Chromium with the Unicode normalized, because half the ATS parsers choke on a smart quote.

The cover letter takes its angle from the company note I wrote in portals.yml. For the AI companies that angle was obvious: I build Voluble on Deepgram and ElevenLabs, so I said so. (They passed anyway. We'll get to that.) The prose runs through voice-dna.md, my anti-slop style guide. If a draft sounds like a language model in a tie, it fails.

Where I take over

One step is never automated: applying. The machine gets me to a ranked, tailored shortlist and stops there. I sent every application by hand.

Three months of receipts

Early April to mid-July, the plain version. I scored 440 postings. I passed on 110 of them (66 skipped on sight, 44 binned after a closer look) and left 234 sitting in the maybe pile. And I applied to 91 companies by hand, 96 applications once you count the few I went back for.

Where those landed so far: 34 no's, 4 interviews, 1 warm maybe (Beatgrid), no offers yet, and a healthy pile still pending or gone quiet. That's a job hunt.

The applications went wide, which was the point. Mistral AI and Speechify on the AI side. Sentry, Supabase, and Reddit for dev tools. Qonto, Airwallex, Rabobank, and ING in fintech. Figma, TomTom, Coolblue, Fairphone, Tibber, Wikimedia, Lely, and NOWATCH across product. For once my applications said out loud what I am: a senior engineer who ships across mobile, backend, and AI.

The rejections went wide too, and most were fine. Booking.com, ABN AMRO, Mollie, Picnic, bol, eBay, Mozilla, PostHog, Philips, Just Eat Takeaway, Xebia, Speakap. That's the job. And then Deepgram and ElevenLabs, which I keep framed in my head.

The 4 that turned into conversations are the ones I'm quietly proud of: bunq, Zalando (their Lounge team), Ditto (for Ditto Care), and Wypoon Technologies. A couple are still live as I write this.

What it's good and bad at

It's good at volume without panic: it reads more postings in a morning than I'd manage in a week, and it catches ghost jobs I'd have fallen for. It's useless at the part that actually gets you hired, being a person a hiring manager remembers, or telling whether "senior" at a 12-person startup means staff-level scope or founder-does-everything chaos. That's still me, at my desk, with coffee.

3 months in, the search is still open, but I can see all of it now. I know my conversion at every stage, I know which archetypes waste my night, and when a good role lands the boring work is already done.

And if bunq or Zalando works out, I owe Deepgram and ElevenLabs a thank-you note for the motivation.

Tools