// case study · product
A large ATS registry is useful only if the pipeline stays quiet.
Nori turns direct company and ATS feeds into fresh, ranked job notes through bounded ingestion, source-specific adapters, duplicate filtering, and scheduled delivery.

Job aggregators make freshness hard to reason about. One opening can appear through several mirrors, lose its original posting context, and remain visible after the source closes. Nori starts from company career pages and ATS endpoints instead, then normalizes each result before it reaches the user.
A registry, not an inflated monitoring claim
Nori has a registry covering 31,000+ companies. That registry is the address book for the ingestion system; it does not mean every record is actively polled in every run. Validation jobs classify healthy, stale, and failing targets so bounded workers can spend time on due sources without overwhelming upstream systems.
Source-specific adapters handle the differences between Greenhouse, Lever, Ashby, Workday, SmartRecruiters, BambooHR, and direct company APIs. Backoff, circuit breaking, and target quarantine isolate a bad endpoint instead of allowing one provider to stall the full run.
The pipeline
- Ingest. Bounded asynchronous workers fetch only eligible targets and place normalized records into the processing path.
- Normalize. ATS-specific payloads become one job schema with canonical company, title, location, timestamp, and direct-apply fields.
- Deduplicate. Stable hashes and database uniqueness constraints reject repeated listings without a race-prone read before write.
- Rank. Sentence-transformer similarity and product filters prioritize relevant roles before delivery.
- Serve. FastAPI exposes the data layer while the Next.js product supports discovery, saving, and application tracking.
31K+
Company registry
ATS and career-page coverage
120+
Matches per day
surfaced by the discovery pipeline
95%
Duplicate filtering
before ranked delivery
Why the architecture matters
Crawling is the visible part, but reliability lives in scheduling, normalization, and state. PostgreSQL provides the production source of truth, Redis supports queued work, and a local SQLite mode keeps development reproducible. The adapters remain independent, so a provider change can be fixed without rewriting the rest of the ingestion system.
The result is intentionally less dramatic than a feed of raw scrape logs: a small set of fresh roles with direct source links and enough context to make a decision quickly. Quiet output is the product.