
Otorecrutor
A recruitment-intelligence platform I am the only engineer on. An LLM agent sits on top of a Python and Playwright acquisition layer that keeps 40,000+ agent records current across six national franchise networks, twice a day, with nobody watching.
I built the whole of it: the acquisition layer, the backend architecture, the PostgreSQL schema (movement history, scan logs, audit trail) and the agent that reads it. Eight scrapers run concurrently behind a shared Playwright base class that carries retry, pacing and per-site rate control, across RE/MAX, Century 21, Coldwell Banker, ERA, Keller Williams and Turyap.
What the system is actually for is change. It detects joins, departures and inter-office transfers inside the same run they happen in, then pushes structured events out through a custom Telegram bot, SMS and scheduled Excel reporting. Runs ship twice daily through a versioned Docker Compose deployment, gated by an automated compatibility check against the production runtime.
The work I am proudest of is a bug I had to find rather than a feature I got to build. Partial page loads were making the pipeline report agents as departed when they had not gone anywhere. I added whole-office carry-forward and partial-fetch detection; the release took the affected pipelines from dozens of false positives to none, and preserved 87 records in a single run.
Above all of that sits a data-integrity guard. If a run reports an implausible departure rate, it rolls the transaction back and raises an alert instead of writing. One upstream site going strange can no longer quietly corrupt the dataset.
- Roll the transaction back and alert when a run reports an implausible departure rate.
- Trusting the scrape, and letting one upstream failure quietly corrupt 40,000 records.
- 40,000+ agent records kept current
- Six national networks, eight concurrent scrapers
- Twice-daily unattended runs on a containerised VPS
- Sole engineer: architecture, schema, agent, deployment