# fabiendaniel/job-search-assistant architecture

> Architecture diagram of the GitHub repository fabiendaniel/job-search-assistant, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-10). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/fabiendaniel/job-search-assistant
- Repository: https://github.com/fabiendaniel/job-search-assistant

## Overview

JobNavigator is a self-hosted, multi-account job-hunt automation product. A user configures job searches, which the backend runs across career sites and aggregators; discovered postings are processed and stored for the feed, then users can score jobs against résumés, tailor résumés and letters, and track applications. Separate capabilities include persona-based autofill, Gmail response monitoring, and Telegram alerts. The graph preserves these documented branches; some are represented at directory level because their individual route or source implementations were not excerpted.

Main entry points: [`backend/models/db.py`](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/models/db.py) (Application database), [`backend/scraper/orchestrator.py`](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/scraper/orchestrator.py) (Scrape orchestrator), [`backend/analyzer/cv_scorer.py`](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/analyzer/cv_scorer.py) (Resume scoring), [`backend/api/routes_resumes.py`](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_resumes.py) (Resume builder)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["User experience"]
  node_webapp["Web application<br/>[App.jsx]"]
  node_jobfeed["Job feed<br/>[JobFeed.jsx]"]
  node_applicationui["Applications UI<br/>[Applications.jsx]"]
  node_api["HTTP API<br/>[main.py]"]
end

subgraph group_discovery["Job discovery"]
  node_searchapi["Search endpoints<br/>[routes_searches.py]"]
  node_scraper["Scrape orchestrator<br/>[orchestrator.py]"]
  node_sources["Job sources"]
  node_ats["ATS handlers"]
  node_jobapi["Job endpoints<br/>[routes_jobs.py]"]
end

subgraph group_intelligence["Analysis and tailoring"]
  node_scoring["Resume scoring<br/>[cv_scorer.py]"]
  node_llm["LLM providers<br/>[llm_client.py]"]
  node_resumeapi["Resume builder<br/>[routes_resumes.py]"]
  node_coverletters["Cover letters"]
end

subgraph group_tracking["Application tracking"]
  node_persona["Persona autofill<br/>[routes_autofill.py]"]
  node_extension["Browser extension"]
  node_applicationapi["Application tracking"]
  node_gmail["Gmail monitor<br/>[gmail_client.py]"]
  node_telegram["Telegram alerts<br/>[telegram.py]"]
end

subgraph group_platform["Accounts and persistence"]
  node_accounts["Account context<br/>[context.py]"]
  node_settings["Account settings<br/>[settings.py]"]
  node_database[("Application database<br/>[db.py]")]
end

node_user(("Job hunter"))

node_user -->|"uses"| node_webapp
node_webapp -->|"routes to"| node_jobfeed
node_webapp -->|"routes to"| node_applicationui
node_searchapi -->|"starts searches"| node_scraper
node_scraper -->|"dispatches to"| node_sources
node_scraper -.->|"uses handlers"| node_ats
node_scraper -->|"records jobs"| node_database
node_jobapi -->|"scores jobs"| node_scoring
node_scoring -->|"requests analysis"| node_llm
node_resumeapi -->|"uses scoring"| node_scoring
node_resumeapi -.->|"generates content"| node_llm
node_jobapi -->|"reads and writes"| node_database
node_resumeapi -->|"stores resumes"| node_database
node_applicationapi -->|"stores applications"| node_database
node_gmail -->|"updates status"| node_database
node_gmail -->|"resolves account"| node_accounts
node_persona -.->|"serves autofill"| node_extension
node_scoring -->|"sends alerts"| node_telegram
node_accounts -->|"scopes queries"| node_database
node_settings -->|"reads and writes"| node_database
node_scraper -->|"scores discovered jobs"| node_scoring

click node_webapp "https://github.com/fabiendaniel/job-search-assistant/blob/main/frontend/src/App.jsx"
click node_jobfeed "https://github.com/fabiendaniel/job-search-assistant/blob/main/frontend/src/screens/JobFeed.jsx"
click node_applicationui "https://github.com/fabiendaniel/job-search-assistant/blob/main/frontend/src/screens/Applications.jsx"
click node_api "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/main.py"
click node_searchapi "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_searches.py"
click node_scraper "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/scraper/orchestrator.py"
click node_sources "https://github.com/fabiendaniel/job-search-assistant/tree/main/backend/scraper/sources"
click node_ats "https://github.com/fabiendaniel/job-search-assistant/tree/main/backend/scraper/ats"
click node_jobapi "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_jobs.py"
click node_scoring "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/analyzer/cv_scorer.py"
click node_llm "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/analyzer/llm_client.py"
click node_resumeapi "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_resumes.py"
click node_coverletters "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_cover_letters.py"
click node_persona "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_autofill.py"
click node_extension "https://github.com/fabiendaniel/job-search-assistant/blob/main/extension/content_autofill.js"
click node_applicationapi "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_applications.py"
click node_gmail "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/email_monitor/gmail_client.py"
click node_telegram "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/notifier/telegram.py"
click node_accounts "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/accounts/context.py"
click node_settings "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/accounts/settings.py"
click node_database "https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/models/db.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_webapp,node_jobfeed,node_applicationui,node_api toneBlue
class node_searchapi,node_scraper,node_sources,node_ats,node_jobapi toneAmber
class node_scoring,node_llm,node_resumeapi,node_coverletters toneMint
class node_persona,node_extension,node_applicationapi,node_gmail,node_telegram toneRose
class node_accounts,node_settings,node_database,node_user toneIndigo
```

## Components

### User experience

- [Web application](https://github.com/fabiendaniel/job-search-assistant/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Job feed](https://github.com/fabiendaniel/job-search-assistant/blob/main/frontend/src/screens/JobFeed.jsx): `frontend/src/screens/JobFeed.jsx`
- [Applications UI](https://github.com/fabiendaniel/job-search-assistant/blob/main/frontend/src/screens/Applications.jsx): `frontend/src/screens/Applications.jsx`
- [HTTP API](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/main.py): `backend/main.py`

### Job discovery

- [Search endpoints](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_searches.py): `backend/api/routes_searches.py`
- [Scrape orchestrator](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/scraper/orchestrator.py): `backend/scraper/orchestrator.py`
- [Job sources](https://github.com/fabiendaniel/job-search-assistant/tree/main/backend/scraper/sources): `backend/scraper/sources`
- [ATS handlers](https://github.com/fabiendaniel/job-search-assistant/tree/main/backend/scraper/ats): `backend/scraper/ats`
- [Job endpoints](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_jobs.py): `backend/api/routes_jobs.py`

### Analysis and tailoring

- [Resume scoring](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/analyzer/cv_scorer.py): `backend/analyzer/cv_scorer.py`
- [LLM providers](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/analyzer/llm_client.py): `backend/analyzer/llm_client.py`
- [Resume builder](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_resumes.py): `backend/api/routes_resumes.py`
- [Cover letters](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_cover_letters.py): `backend/api/routes_cover_letters.py`

### Application tracking

- [Persona autofill](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_autofill.py): `backend/api/routes_autofill.py`
- [Browser extension](https://github.com/fabiendaniel/job-search-assistant/blob/main/extension/content_autofill.js): `extension/content_autofill.js`
- [Application tracking](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/api/routes_applications.py): `backend/api/routes_applications.py`
- [Gmail monitor](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/email_monitor/gmail_client.py): `backend/email_monitor/gmail_client.py`
- [Telegram alerts](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/notifier/telegram.py): `backend/notifier/telegram.py`

### Accounts and persistence

- [Account context](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/accounts/context.py): `backend/accounts/context.py`
- [Account settings](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/accounts/settings.py): `backend/accounts/settings.py`
- [Application database](https://github.com/fabiendaniel/job-search-assistant/blob/main/backend/models/db.py): `backend/models/db.py`

### Other components

- **Job hunter**

## Connections

- Job hunter → Web application: uses (evidence: `README.md`)
- Web application → Job feed: routes to (evidence: `frontend/src/App.jsx`)
- Web application → Applications UI: routes to (evidence: `frontend/src/App.jsx`)
- Search endpoints → Scrape orchestrator: starts searches (evidence: `backend/api/routes_searches.py`)
- Scrape orchestrator → Job sources: dispatches to (evidence: `backend/scraper/orchestrator.py`)
- Scrape orchestrator → ATS handlers: uses handlers
- Scrape orchestrator → Application database: records jobs (evidence: `backend/scraper/orchestrator.py`)
- Job endpoints → Resume scoring: scores jobs (evidence: `backend/api/routes_jobs.py`)
- Resume scoring → LLM providers: requests analysis (evidence: `backend/analyzer/cv_scorer.py`)
- Resume builder → Resume scoring: uses scoring (evidence: `backend/api/routes_resumes.py`)
- Resume builder → LLM providers: generates content (evidence: `backend/api/routes_resumes.py`)
- Job endpoints → Application database: reads and writes (evidence: `backend/api/routes_jobs.py`)
- Resume builder → Application database: stores resumes (evidence: `backend/api/routes_resumes.py`)
- Application tracking → Application database: stores applications (evidence: `backend/api/routes_applications.py`)
- Gmail monitor → Application database: updates status (evidence: `backend/email_monitor/gmail_client.py`)
- Gmail monitor → Account context: resolves account (evidence: `backend/email_monitor/gmail_client.py`)
- Persona autofill → Browser extension: serves autofill
- Resume scoring → Telegram alerts: sends alerts (evidence: `backend/analyzer/cv_scorer.py`)
- Account context → Application database: scopes queries (evidence: `backend/accounts/context.py`)
- Account settings → Application database: reads and writes (evidence: `backend/accounts/settings.py`)
- Scrape orchestrator → Resume scoring: scores discovered jobs (evidence: `backend/scraper/orchestrator.py`)
