How red8-tech/jobscope works
jobscope tracks job listings and matches resumes against them. Its main workflow ingests jobs from CSV or Remotive, normalizes CSV data, stores listings and skills in SQLite, then exposes typed REST endpoints for browsing and analytics. For matching, the API reads a saved resume and jobs, extracts resume skills through an LLM, retrieves text-similar jobs with TF-IDF, scores skill overlap and gaps, and persists results. The graph also shows skill backfill and startup seeding. Source excerpts establish most calls; some API-to-matcher wiring is visible only as configuration and documented behavior.
Main entry points: app.py FastAPI app · routes.py REST routes · repository.py Job repository · matching.py Resume matcher
Components 23
Job ingestion
- Ingest endpoint
src/jobscope/api/routes.py - CSV source
src/jobscope/ingestion/csv_source.py - CSV cleaning
src/jobscope/ingestion/cleaning.py - Remotive source
src/jobscope/ingestion/remotive.py - Job model
src/jobscope/models.py
API and storage
- FastAPI app
src/jobscope/api/app.py - REST routes
src/jobscope/api/routes.py - API schemas
src/jobscope/api/schemas.py - Job repository
src/jobscope/db/repository.py - SQL schema
src/jobscope/db/schema.py - SQLite store
- Saved resume
- Stored matches
Resume matching
- Skill extractor
src/jobscope/ai/extractor.py - Validated output
src/jobscope/ai/structured.py - LLM client
src/jobscope/ai/llm.py - Resume matcher
src/jobscope/ai/matching.py - TF-IDF retriever
src/jobscope/ai/retrieval.py
Skill enrichment
- Skill backfill
src/jobscope/services/backfill.py
Other components
- API client
- CSV file
- Remotive API
- Groq LLM
Connections 32
- API client → FastAPI app: sends requests
README.md - FastAPI app → REST routes: registers routes
src/jobscope/api/app.py - FastAPI app → CSV source: configures source
src/jobscope/api/app.py - FastAPI app → Remotive source: configures source
src/jobscope/api/app.py - FastAPI app → Resume matcher: configures factory
src/jobscope/api/app.py - FastAPI app → Skill extractor: configures factory
src/jobscope/api/app.py - FastAPI app → Job repository: seeds data
src/jobscope/api/app.py - REST routes → Job repository: reads and writes
src/jobscope/api/routes.py - REST routes → API schemas: returns typed responses
src/jobscope/api/routes.py - REST routes → Skill backfill: runs backfill
src/jobscope/api/routes.py - REST routes → Resume matcher: invokes matching
- Ingest endpoint → CSV source: dispatches source
src/jobscope/api/routes.py - Ingest endpoint → Remotive source: dispatches source
src/jobscope/api/routes.py - Ingest endpoint → Job repository: stores jobs
src/jobscope/api/routes.py - CSV file → CSV source: provides rows
README.md - CSV source → CSV cleaning: cleans rows
src/jobscope/ingestion/csv_source.py - CSV source → Job model: creates jobs
src/jobscope/ingestion/csv_source.py - Remotive API → Remotive source: provides listings
README.md - Remotive source → Job model: creates jobs
src/jobscope/ingestion/remotive.py - Job repository → SQLite store: queries and writes
src/jobscope/db/repository.py - Job repository → SQL schema: initializes tables
src/jobscope/db/repository.py - Job repository → Job model: maps records
src/jobscope/db/repository.py - REST routes → Saved resume: stores and reads
src/jobscope/api/routes.py - REST routes → Stored matches: saves and reads
src/jobscope/api/routes.py - Resume matcher → Skill extractor: extracts skills
src/jobscope/ai/matching.py - Resume matcher → TF-IDF retriever: retrieves candidates
src/jobscope/ai/matching.py - Resume matcher → Job model: scores job listings
src/jobscope/ai/matching.py - Groq LLM → LLM client: answers prompts
src/jobscope/ai/llm.py - Skill extractor → Validated output: validates extraction
src/jobscope/ai/extractor.py - Validated output → LLM client: requests JSON
src/jobscope/ai/structured.py - Skill backfill → Job repository: loads and updates skills
src/jobscope/services/backfill.py - Skill backfill → Skill extractor: extracts job skills
src/jobscope/services/backfill.py