How rdlucas2/jobregator works
Jobregator aggregates job listings from multiple sources, filters them, enriches them with AI, stores them, then surfaces them through Discord notifications and a searchable dashboard with live updates. The diagram follows the documented service workflow and source excerpts; some internal wiring is unsampled, so those relationships are omitted rather than inferred.
Main entry points: worker.py Worker Consumer · index.ts Dashboard Routes & SSE · main.go Scraper Orchestrator · server.py MCP Enrichment Server
Components 23
Collection & Filtering
- Scraper Orchestrator
services/scraper/cmd/scraper/main.go - Source Adapters
services/scraper/internal/source - Lookback & Hard Filters
services/scraper/internal/source
AI Enrichment
- Worker Consumer
services/worker/src/worker.py - MCP Enrichment Server
services/mcp-server/src/server.py - Analysis & Scoring Tools
services/mcp-server/src/tools.py - Provider Selection & Cache
services/mcp-server/src/providers/factory.py - Provider Contracts
services/mcp-server/src/providers/base.py - Claude Providers
services/mcp-server/src/providers/claude.py - Jev Decisions
services/mcp-server/src/providers/jev.py - Claude API Client
services/mcp-server/src/llm.py
Storage & Messaging
- NATS Streams
- Listing Persistence
services/worker/src/db.py - Postgres Listings
User Delivery
- Discord Notifier
services/notifier/src/notifier.py - Dashboard Routes & SSE
services/dashboard/src/index.ts - Dashboard Queries
services/dashboard/src/db.ts - Dashboard Views & Charts
services/dashboard/src/templates.ts
Other components
- Job Sources
- Anthropic Claude API
- TypeSafe API
- Discord
- Dashboard User
Connections 25
- Job Sources → Source Adapters: provide listings
services/scraper/internal/source/adzuna.go - Scraper Orchestrator → Source Adapters: fetches listings
services/scraper/cmd/scraper/main.go - Scraper Orchestrator → Lookback & Hard Filters: filters listings
services/scraper/cmd/scraper/main.go - Scraper Orchestrator → NATS Streams: publishes raw
services/scraper/cmd/scraper/main.go - NATS Streams → Worker Consumer: delivers raw
README.md - Worker Consumer → Listing Persistence: inserts & updates
services/worker/src/worker.py - Listing Persistence → Postgres Listings: writes listings
services/worker/src/db.py - Worker Consumer → MCP Enrichment Server: calls MCP tools
services/worker/src/worker.py - MCP Enrichment Server → Analysis & Scoring Tools: dispatches analysis
services/mcp-server/src/server.py - MCP Enrichment Server → Provider Selection & Cache: builds providers
services/mcp-server/src/server.py - Provider Selection & Cache → Claude Providers: selects provider
services/mcp-server/src/providers/factory.py - Provider Selection & Cache → Jev Decisions: selects provider
services/mcp-server/src/providers/factory.py - Claude Providers → Provider Contracts: implements contracts
services/mcp-server/src/providers/claude.py - Jev Decisions → Provider Contracts: implements decisions
services/mcp-server/src/providers/jev.py - Claude Providers → Claude API Client: requests completions
services/mcp-server/src/providers/claude.py - Claude API Client → Anthropic Claude API: calls API
services/mcp-server/src/llm.py - Jev Decisions → TypeSafe API: requests decisions
- Worker Consumer → NATS Streams: publishes enriched
services/worker/src/worker.py - NATS Streams → Discord Notifier: delivers enriched
README.md - Discord Notifier → Discord: sends webhook
README.md - NATS Streams → Dashboard Routes & SSE: streams updates
services/dashboard/src/index.ts - Dashboard Routes & SSE → Dashboard Queries: queries listings
services/dashboard/src/index.ts - Dashboard Queries → Postgres Listings: reads listings
services/dashboard/src/db.ts - Dashboard Routes & SSE → Dashboard Views & Charts: renders views
services/dashboard/src/index.ts - Dashboard User → Dashboard Routes & SSE: browses & filters
README.md