The problem

A useful job-sourcing system needs more than a list of career pages. It must discover openings across sources, extract inconsistent pages, recognize duplicates, and preserve when a posting was actually observed.

The approach

  1. Combine ATS API discovery, targeted search, funding events, company watchlists, and public LinkedIn posts in a node-based workflow.
  2. Extract through an ATS parser, JSON-LD, DOM parsing, and optional LLM fallback. Normalize timestamps and keep source metadata alongside each job.
  3. Check exact idempotency and semantic similarity before persistence. Surface results in a FastAPI/Jinja2 dashboard with freshness buckets and filters.

How it fits together

Discover URLs
Extract & normalize
Exact dedupe
Semantic checks
Freshness-first review

The result

An end-to-end discovery, extraction, storage, and review workflow across six ATS connectors, with configurable Langfuse tracing.

The engineering decision

Freshness is explicit data, not a guess based on sort order. Source timestamps and first-observed timestamps remain separate, including an unknown bucket when neither supports a confident claim.

Explore the implementation