The problem
Startup jobs don't live on one board. They surface in Substack newsletters, founder LinkedIn posts, and niche galleries — often as a one-line mention with no job description attached. Reading it all is a full-time job; missing it means missing the role.
Generalize the shape of that problem and it's one every operating team has: high-volume, low-structure signal scattered across sources, where the cost of a miss is high and the cost of human review doesn't scale. Sourcing candidates, monitoring competitors, qualifying inbound — same physics.
Who it's for
Built for one demanding user — me, running a targeted job search — which made it an honest testbed: if the scores were wrong, I felt it the same day.
The buyer-side read: this is the reference architecture for any signal-triage workflow a leader might be asked to fund — talent sourcing, market monitoring, lead qualification. The stakeholders map directly: the operator (here, the candidate) needs a ranked queue with reasons; the approver needs unit costs and an audit trail; governance needs a guarantee the system observes but never acts outward on its own. All three got designed in from day one.
The approach
Every posting, from any source, lands in one dashboard — parsed, scored 0–100 against a versioned fit profile, and ranked. Triage becomes a two-minute decision pass: Apply, Later, Pass.

Every score comes with receipts. The chips under each card are the model's actual scoring rationale — what cleared the bar ($200K–$255K base — clears comp floor), what dragged it down (vertical is niche — unfamiliar domain), and what needs a human check before applying. That's the adoption unlock: a score you can interrogate is a score you'll trust, and a score you trust is the difference between a tool that gets used daily and a dashboard that gets ignored.
Architecture decisions
Three independent processes, one shared store, running locally on Windows:
- Collectors (every 2 hours): a Substack RSS crawler, a startups.gallery scraper, a LinkedIn profile crawler, and a Chrome extension that captures any posting in one click.
- Pipeline: Claude Haiku extracts the structured job description, dedup runs, then Claude Sonnet scores fit. ≥ 50 lands in discovery; below goes to rejected (kept for audit); thin mentions route to TBD.
- Enrichment agent (always-on): watches TBD and hunts down the real posting behind each one-line mention — direct fetch if there's a URL hint, web search via Apify if not — verifies the match with Claude, re-extracts, re-scores, and graduates the job. This is the genuinely agentic part: it decides, per candidate page, whether it found the real thing.

The decisions that mattered: structured output via tool use, not regex — every LLM step returns typed JSON, so downstream code never parses prose. Tiered model routing — the cheap model where the job is extraction, the smart model only where the job is judgment. 69 tests, all mocked — the pipeline is testable without a network.
Business impact
The whole thing is instrumented — every API call logged with exact token counts:

- ~$15 for the first month, all-in — 1,000+ postings triaged for less than the cost of one hour of anyone's time. Prompt caching did the heavy lifting: 7.4M cached tokens read at a tenth of the price.
- Hours per week of reading collapsed into a two-minute daily decision pass, with a lower miss rate than manual scanning — the system reads every issue of every newsletter, every time.
- Unit economics are visible per model and per pipeline stage, which is exactly the instrumentation an approver should demand before scaling any AI workload: cost per processed item, not a monthly bill you explain after the fact.
Risks & guardrails
- Nothing outbound. The system never applies, messages, or emails anyone; a human reviews everything it finds. Autonomy in triage, human control at the point of action.
- Rejected items are kept, not deleted — every auto-reject is auditable, so scoring drift is detectable rather than silent.
- The fit profile is versioned. When scores change, you can tell whether the market moved or the rubric did.
- Spend is capped by design: batch cadence, dedup before any LLM call, and caching mean cost grows with new signal, not raw volume.
Where it goes next
Auto-drafted application notes (still human-sent), a second profile to prove multi-tenant scoring, and re-capturing the dashboard numbers as they grow. The enterprise version of this pattern — same pipeline, different signal — is the pitch I'd make to any team drowning in unstructured inbound.