Guide

The self-documenting dashboard. Navigate by module tab below, or read the Overview for system-wide reference.

What ZJP is

Zapply Job Pipeline — collects tech (and Canada) jobs from 18 ATS sources, tags & enriches them, and publishes to zapply.jobs, softwarejobs.dev, Discord, and 8 GitHub repos (6 US + 2 Canada). Runs every ~15 min via GitHub Actions.

Pipeline Journey end-to-end: what happens where

A job is fetched, classified, enriched, health-checked, published, and monitored. Below: the six stages with their actions & outputs, the data flow between stores, and the ~15-min “wave” that propagates each cycle to this dashboard.

① The six stageseach card = what that module does · arrows = job flow (left → right, wraps on narrow screens)
AGG
Aggregator
cron · every 15 min
does
  • Fetch ~18 ATS boards
  • Dedupe vs R2 store
  • Normalize to canonical schema
outputs
  • all_jobs.json (R2)
TAG
Tagger
chained on AGG
does
  • Classify domain (SW/DS/HW/AI…)
  • Set seniority level
  • Flag G1 = unclassified
outputs
  • domain + level tags
  • G1 rate
ENR
Enricher
scheduled · daily
does
  • Add description + skills
  • Degree / visa / experience
  • Assign depth tier t0–t4
outputs
  • enriched_jobs.json
  • tier distribution
SUP
Supply health
derived from AGG meta
does
  • Track active vs dead sources
  • Flag zero-yield feeds
  • Aggregate by company
outputs
  • by_source / by_company
  • zero-yield list
OUT
Publisher
chained, post-enrich
does
  • Publish to sjd + 8 repos
  • Post new jobs to Discord
  • Refresh consumer boards
outputs
  • consumer repos
  • Discord posts
↳ AGG → TAG → ENR → SUP → OUT
INF — infrastructure & monitoring (always-on)
Alerts · R2 health · dedupe store · schema version · submodule alignment · secret rotation. Sits across every stage, not in the job flow.
② Data flowwhere the bytes live and move · R2 is canonical; Supabase is the dashboard read copy
~18 ATS sources
external job boards (Greenhouse, Lever, Ashby, …)
R2 canonical
all_jobs.json · source of truth · dedupe store guards it
Supabase
enriched_jobs.json + metrics · dashboard reads here (60s cache)
Consumers
sjd (zapply.jobs)8 reposDiscord
③ The wavehow one ~15-min cycle reaches this dashboard · every step dispatches the next — no poll gap
starts waveproducer (fetch-jobs)~9 min · schedule, every 15 min
chainedcollect-metrics~40s · dispatched on producer finish
chainedpublish-to-supabase~20s · chained on collect-metrics
storeSupabasedashboard reads here (60s cache)
consumerDashboardoperator sees fresh data
Nominal ≈ 15 min, observed ≈ 15–25 min. Every step is wave-chained — each dispatches the next on completion (producer → collect-metrics → publish → Supabase → this dashboard). No poll gap. See INF → Pipeline Timing for the live step-flow.
process (AGG/TAG/ENR) metrics (SUP) output (OUT) canonical store infra (INF)

Reading the Dashboard — UI Conventions

How to interpret what you see. Read once — these hold across every tab.

Timestamps + Local/UTC toggle
Every timestamp renders in your local timezone by default. Use the Local/UTC button in the StatusBar to switch.
Color system
Coral = alerts/danger + interactive. Sky-blue = data (chart bars/lines). Blue→indigo gradient on distribution bars = magnitude. Green/amber/red = semantic (verdict, success/warn/danger).
Caveats (blockquote)
Dimmed, left-bordered notes under widgets explain the non-obvious — baselines, gotchas, what isn't measured.
Section dividers
Coral outline only — structural edges, not alerts. Each has an icon identifying the section's module.
Delta header (Overview)
“Since last visit” banner showing what changed (pool, G1, enriched, alerts) since your previous page load. Client-side localStorage — no server history needed.
Data-freshness, not user-serving
The dashboard measures pipeline + consumer-backend freshness, not when a real user views a job.

Metric Definitions

The non-obvious metrics explained.

G1 / G1 Rate
Share of jobs the tagger could not classify. Lower is better. “Classification Rate” = 100 − G1.
Desc% / Description Coverage
Share of jobs with a real, retrievable description (not a stub). Higher = more searchable.
Enrichment tiers (t0–t4)
Depth per job: t0 = none → t4 = deepest (description + skills + degree + visa + more).
Freshness / LIVE · DELAYED · DOWN
Age since last pipeline run. LIVE < 30 min, DELAYED < 6 h, DOWN beyond.
Tech-US
Subset in SW/DS/HW/AI domains, US-located — the primary product audience.
False-Positive Rate (TAG)
Per-domain FP rate — how often the tagger assigns the wrong domain. Lower is better. Overall: ~2.9%.
Drift Rate (TAG)
Share of jobs whose classification changed since last run. Low drift = stable tagging.
Source Health (SUP)
Per-source fetch status: Active (fetched), Cached (skipped unchanged), Zero-Yield (0 jobs), Skipped (major ATS sidecar).
Consumer E2E
End-to-end freshness of each downstream consumer — how stale its published jobs are.