‹ ALL PROJECTS

Startup Job Finder & Matcher.

An always-on discovery pipeline that crawls newsletters, startup boards, and LinkedIn every two hours, has Claude score every posting against a versioned fit profile, and runs an enrichment agent that hunts down the real job behind thin mentions — 1,000+ postings triaged for ~$15/month.

LOG ENTRY003 / 2026-06
STATUSShipped
PROOF POINT1,000+ postings triaged autonomously for ~$15/month
TERRAINagentsllmscrapingpipeline
MAPTHE SYSTEM AT A GLANCE
SOURCES · 2HSubstack newslettersstartups.galleryLinkedIn profilesChrome extensionPIPELINEHaiku: extract the JDdedupSonnet: fit score 0–100vs fit_profile.mdROUTE≥ 50 → discovery< 50 → rejectedthin → TBDDASHBOARDtriage by scorepipeline tabsinterview trackerENRICHMENT AGENThunts the real posting · Apify + ClaudeTBD DRAINSRE-SCORED

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.

Triage view: every posting scored 0–100 with the reasons — comp floor cleared, stage fit, domain match — spelled out as evidence chips

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.

Live pipeline counts: 164 to triage, 25 in pipeline, 283 queued for enrichment, 546 auto-rejected

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:

Usage dashboard: 1,864 API calls, 1.7M input tokens, $15.15 total — tracked per model with cache economics visible

  • ~$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.