AI Job-Search Pipeline (Self-Hosted Web App)
A self-hosted AI job-search platform: point it at the portals you care about, and it scans them on a schedule, auto-discovers how to fetch each portal's jobs, pulls new listings, and scores every one against your CV with an LLM — surfacing the handful worth your attention out of hundreds. A filter, not a spray-and-pray applier; the human always decides.
What it does. Career-Ops turns a noisy, manual job hunt into a scored, automated feed. You open a browser, configure your targets (roles/keywords) and a portal catalog (the company/job sites you want watched), and the system does the rest: on a configurable schedule it visits each portal, fetches new listings, and evaluates each one against your CV with an LLM, producing a relevance score and reasoning. You review a sortable dashboard of pre-scored listings and decide what to pursue — the system never submits an application. The headline trick: an AI discovery agent inspects each portal's careers page and figures out how to fetch its jobs (JSON API vs RSS vs HTML scrape), so adding a new portal doesn't require hand-writing a scraper.
// Background
Job hunting across many portals — no tracker, no filter,
no way to curate listings against personal criteria.
Too many portals to check manually
Dozens of company career pages, job boards, and niche
sites — each with different layouts, cadences, and formats.
A full sweep takes hours; done daily, it's a second job
No way to curate against personal criteria
Without a scoring rubric tied to skills, seniority, location,
and work style, every listing looks equally worth reading.
200 listings/week · 5 worth pursuing · impossible to tell apart
No tracker — history disappears
Seen it, skipped it, applied — none of that is recorded.
Next session starts from zero; duplicates go unnoticed.
Applied twice to the same role; missed follow-ups entirely
Good listings expire unnoticed
Many postings close in 3–5 days. Without automated
scanning, you only see them when you happen to look.
Timing matters — missed windows don't reopen
Evaluation is inconsistent session to session
Spray-and-pray tools apply to everything. High volume,
low quality, reputation damage with recruiters.
Volume applications filter you out, not in
Net effect
The few high-fit listings sit buried in the pile —
invisible until read by hand, every day.
// Solution
Data sources
Portal Catalog
user-curated company list
URL + name per target
CV Profile YAML
skills · experience · targets
scoring rubric source
Pipeline
Discover
CrewAI agent
detects fetch method
Discover
Fetch
json_api · rss
html_scrape
Fetch
Evaluate
LiteLLM score
vs CV rubric
Evaluate
Review
Vite SPA
sortable · paginated
Review
Track
PostgreSQL
runs + scores
Persist
Node/Express API · FastAPI agents (CrewAI + LiteLLM) · Vite SPA · PostgreSQL · node-cron · Docker Compose
// Impact
From tabs to tracker
Before · manual browser tabs
20+ tabs · read · close · forgottenAfter · automated scan + queue
scored queue arrives · DB persists0
tabs to see ranked listings
Scan pipeline funnel
Portals checked per scan
Listings fetched
LLM-scored
Review queue
Results
Portals supported
42+
AI agent
CrewAI
LLM backend
LiteLLM
Scan cadence
cron
Scores persisted · sortable review queue
node-cron scans · Docker Compose (4 svc)
| Layer | Technologies |
|---|---|
| Frontend | Vite SPA (dashboard: sortable columns, pagination), served on its own port |
| API server | Bun / Express (Node), REST API, JWT auth |
| Scheduler | node-cron scan scheduler (scan-scheduler.mjs), staged ScanWorkflow |
| AI agents | Python FastAPI microservice — CrewAI + LiteLLM: discovery_agent, fetch_jobs_agent, scan_agent (/discover, /fetch-jobs, /evaluate) |
| Fetch methods | JSON API · RSS feed · HTML scrape (per-portal, auto-selected) |
| Database | PostgreSQL — portals, scan runs, listings, evaluations, targets |
| Infra | Docker Compose (4 services), served under /career-ops behind the platform nginx |
Disclaimer: sample visuals may contain anonymized, simulated, or non-production values for presentation purposes.