The viewer module is a small Express app that reads the crawler SQLite catalog and exposes:
- a static browser UI for filtering, favorites, saved searches, and JD inspection
- JSON APIs for jobs, sources, and stats
- a local matcher-backed quick-fit and full-fit orchestration flow
- default catalog path:
/app/state/catalog.sqlite - local mounted path in this repo:
crawler/state/catalog.sqlite
docker compose up viewerOpen http://localhost:3000.
The viewer expects access to the matcher codebase because it can parse job URLs and trigger local fit-analysis runs from the UI.
CATALOG_DBSTATE_DIRMATCH_RUNS_DIRANALYSIS_CACHE_PATHMATCHER_DIRPYTHON_BINLOGO_DEV_PUBLISHABLE_KEYLOGO_DEV_SECRET_KEYDISCORD_WEBHOOK_URLSCORE_NOTIFY_MIN_SCORE(default4)CAREER_OPS_DIRNVIDIA_API_KEYNVIDIA_MODELSAVED_SEARCH_ANALYZER_ENABLED(0disables the idle saved-search full analyzer)SAVED_SEARCH_ANALYZER_INTERVAL_MS(default60000)SAVED_SEARCHES_PATHCRAWLER_ACTIVE_LOCK_PATHCRAWLER_ACTIVE_LOCK_STALE_MS
GET /api/jobsGET /api/jobGET /api/sourcesGET /api/statsGET /api/configPOST /api/match-runsGET /api/match-runs/:idGET /api/match-runs/:id/resultsGET /api/job-parsedGET /api/logo-dev/brand
Automatically sends Discord embeds when job matches score above the threshold. Each notification includes job title (linked), company logo thumbnail, score, location, mode, compensation, decision emoji, and company website link.
Setup: Create a Discord webhook, add DISCORD_WEBHOOK_URL to .env, set SCORE_NOTIFY_MIN_SCORE threshold (default 4).
Decision emojis: ✅ 4.0–4.2 | ⚡ 4.2–4.5 | 🎯 4.5–4.75 | 🌟 4.75+
- saved-search buttons loaded from
public/saved-searches.json - favorite-company filtering stored in local browser storage
- evaluated-only filtering using the local analysis cache
- quick-fit analysis with the Maverick pipeline
- full-fit analysis with the ensemble pipeline
- JD data modal backed by the parser API
- side-panel fit details and rerun controls
- idle full-fit analysis for saved-search matches, one job at a time, newest first, skipped while the crawler lock is active