# mohammadmasah/job-tracker-aggregator architecture

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

- Interactive diagram: https://gitdiagram.com/mohammadmasah/job-tracker-aggregator
- Repository: https://github.com/mohammadmasah/job-tracker-aggregator

## Overview

TrackIt accompagne une recherche d’emploi de la collecte d’offres au suivi des candidatures, des contacts et des documents, avec tableau de bord et assistant IA. Le flux principal passe par l’interface ou l’extension, l’API FastAPI, puis les données métier persistées en PostgreSQL. Les branches couvrent aussi le scraping, l’analyse de CV, l’authentification et les intégrations annoncées. Les extraits de code sont partiels : les liens vers des capacités documentées mais non échantillonnées reposent sur le README, sans détailler leur câblage interne.

Main entry points: [`backend/app/database.py`](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/database.py) (Accès données), [`backend/app/routes/applications.py`](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/applications.py) (Routes candidatures), [`backend/app/services/ai_agents.py`](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/ai_agents.py) (Agents IA), [`frontend/src/App.jsx`](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/frontend/src/App.jsx) (Application web)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Interface utilisateur"]
  node_webapp["Application web<br/>[App.jsx]"]
  node_applicationui["Gestion candidatures<br/>[Applications.jsx]"]
  node_applicationapi["API candidatures<br/>[application.js]"]
  node_extension["Extension Chrome<br/>[content.js]"]
  node_offerui["Consultation offres<br/>[Offers.jsx]"]
end

subgraph group_tracking["Suivi métier"]
  node_applicationroutes["Routes candidatures<br/>[applications.py]"]
  node_contactroutes["Routes contacts<br/>[contacts.py]"]
  node_applicationmodel["Modèle candidature<br/>[application.py]"]
  node_contactmodel["Modèles contacts<br/>[contact.py]"]
end

subgraph group_discovery["Offres et documents"]
  node_offerroutes["Routes offres<br/>[offers.py]"]
  node_scraperoutes["Routes scraping<br/>[scraper.py]"]
  node_adzunaservice["Connecteur Adzuna<br/>[adzuna.py]"]
  node_welovedevservice["Connecteur WeLoveDevs<br/>[weLoveDevs.py]"]
  node_documentsroutes["Routes documents<br/>[documents.py]"]
  node_pdfservice["Analyse PDF<br/>[pdf.service.py]"]
end

subgraph group_assistant["Assistant IA"]
  node_chatroute["Routes chatbot<br/>[chatbot.py]"]
  node_analysisroute["Analyse chatbot<br/>[chatbot_analyse.py]"]
  node_agents["Agents IA<br/>[ai_agents.py]"]
  node_llm["Service LLM<br/>[llm_service.py]"]
  node_history["Historique chat<br/>[chat_history.py]"]
end

subgraph group_platform["Services plateforme"]
  node_database["Accès données<br/>[database.py]"]
  node_postgres[("PostgreSQL")]
  node_redis[("Redis")]
  node_ollama{{"Ollama"}}
  node_auth["Authentification API<br/>[user.py]"]
end

node_user(("Candidat"))
node_jobboards{{"Jobboards"}}
node_smtp{{"Service SMTP"}}

node_user -->|"utilise"| node_webapp
node_webapp -->|"ouvre"| node_applicationui
node_applicationui -->|"crée candidature"| node_applicationapi
node_applicationapi -->|"requête HTTP"| node_applicationroutes
node_applicationroutes -->|"lit et écrit"| node_database
node_database -->|"persiste"| node_postgres
node_applicationroutes -->|"manipule"| node_applicationmodel
node_applicationui -->|"crée contacts"| node_contactroutes
node_contactroutes -->|"manipule"| node_contactmodel
node_user -->|"capture offre"| node_extension
node_extension -->|"transmet offre"| node_scraperoutes
node_webapp -->|"ouvre"| node_offerui
node_offerui -->|"consulte"| node_offerroutes
node_offerroutes -->|"interroge"| node_welovedevservice
node_offerroutes -->|"interroge"| node_adzunaservice
node_welovedevservice -.->|"récupère offres"| node_jobboards
node_adzunaservice -.->|"récupère offres"| node_jobboards
node_scraperoutes -->|"scrape"| node_welovedevservice
node_scraperoutes -->|"scrape"| node_adzunaservice
node_documentsroutes -->|"analyse CV"| node_pdfservice
node_pdfservice -->|"associe document"| node_database
node_chatroute -->|"délègue"| node_agents
node_analysisroute -->|"délègue"| node_agents
node_agents -->|"interroge contexte"| node_database
node_agents -->|"sollicite modèle"| node_llm
node_llm -->|"génère réponse"| node_ollama
node_chatroute -->|"gère historique"| node_history
node_auth -->|"vérifie compte"| node_database
node_auth -.->|"limite accès"| node_redis
node_applicationroutes -.->|"envoie relances"| node_smtp

click node_webapp "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/frontend/src/App.jsx"
click node_applicationui "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/frontend/src/pages/user/Applications.jsx"
click node_applicationapi "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/frontend/src/api/application.js"
click node_extension "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/job-tracker-extension/content.js"
click node_applicationroutes "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/applications.py"
click node_contactroutes "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/contacts.py"
click node_applicationmodel "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/models/application.py"
click node_contactmodel "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/models/contact.py"
click node_offerui "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/frontend/src/pages/user/Offers.jsx"
click node_offerroutes "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/offers.py"
click node_scraperoutes "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/scraper.py"
click node_adzunaservice "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/adzuna.py"
click node_welovedevservice "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/weLoveDevs.py"
click node_documentsroutes "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/documents.py"
click node_pdfservice "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/pdf.service.py"
click node_chatroute "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/chatbot.py"
click node_analysisroute "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/chatbot_analyse.py"
click node_agents "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/ai_agents.py"
click node_llm "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/llm_service.py"
click node_history "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/chat_history.py"
click node_database "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/database.py"
click node_auth "https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/api/user.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_applicationui,node_applicationapi,node_extension,node_offerui toneBlue
class node_applicationroutes,node_contactroutes,node_applicationmodel,node_contactmodel toneAmber
class node_offerroutes,node_scraperoutes,node_adzunaservice,node_welovedevservice,node_documentsroutes,node_pdfservice toneMint
class node_chatroute,node_analysisroute,node_agents,node_llm,node_history toneRose
class node_database,node_postgres,node_redis,node_ollama,node_auth,node_user,node_jobboards,node_smtp toneIndigo
```

## Components

### Interface utilisateur

- [Application web](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Gestion candidatures](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/frontend/src/pages/user/Applications.jsx): `frontend/src/pages/user/Applications.jsx`
- [API candidatures](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/frontend/src/api/application.js): `frontend/src/api/application.js`
- [Extension Chrome](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/job-tracker-extension/content.js): `job-tracker-extension/content.js`
- [Consultation offres](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/frontend/src/pages/user/Offers.jsx): `frontend/src/pages/user/Offers.jsx`

### Suivi métier

- [Routes candidatures](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/applications.py): `backend/app/routes/applications.py`
- [Routes contacts](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/contacts.py): `backend/app/routes/contacts.py`
- [Modèle candidature](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/models/application.py): `backend/app/models/application.py`
- [Modèles contacts](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/models/contact.py): `backend/app/models/contact.py`

### Offres et documents

- [Routes offres](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/offers.py): `backend/app/routes/offers.py`
- [Routes scraping](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/scraper.py): `backend/app/routes/scraper.py`
- [Connecteur Adzuna](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/adzuna.py): `backend/app/services/adzuna.py`
- [Connecteur WeLoveDevs](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/weLoveDevs.py): `backend/app/services/weLoveDevs.py`
- [Routes documents](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/documents.py): `backend/app/routes/documents.py`
- [Analyse PDF](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/pdf.service.py): `backend/app/services/pdf.service.py`

### Assistant IA

- [Routes chatbot](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/chatbot.py): `backend/app/routes/chatbot.py`
- [Analyse chatbot](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/routes/chatbot_analyse.py): `backend/app/routes/chatbot_analyse.py`
- [Agents IA](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/ai_agents.py): `backend/app/services/ai_agents.py`
- [Service LLM](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/llm_service.py): `backend/app/services/llm_service.py`
- [Historique chat](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/services/chat_history.py): `backend/app/services/chat_history.py`

### Services plateforme

- [Accès données](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/database.py): `backend/app/database.py`
- **PostgreSQL**
- **Redis**
- **Ollama**
- [Authentification API](https://github.com/mohammadmasah/job-tracker-aggregator/blob/main/backend/app/api/user.py): `backend/app/api/user.py`

### Other components

- **Candidat**
- **Jobboards**
- **Service SMTP**

## Connections

- Candidat → Application web: utilise
- Application web → Gestion candidatures: ouvre
- Gestion candidatures → API candidatures: crée candidature
- API candidatures → Routes candidatures: requête HTTP
- Routes candidatures → Accès données: lit et écrit
- Accès données → PostgreSQL: persiste
- Routes candidatures → Modèle candidature: manipule
- Gestion candidatures → Routes contacts: crée contacts
- Routes contacts → Modèles contacts: manipule
- Candidat → Extension Chrome: capture offre
- Extension Chrome → Routes scraping: transmet offre
- Application web → Consultation offres: ouvre
- Consultation offres → Routes offres: consulte
- Routes offres → Connecteur WeLoveDevs: interroge
- Routes offres → Connecteur Adzuna: interroge
- Connecteur WeLoveDevs → Jobboards: récupère offres
- Connecteur Adzuna → Jobboards: récupère offres
- Routes scraping → Connecteur WeLoveDevs: scrape
- Routes scraping → Connecteur Adzuna: scrape
- Routes documents → Analyse PDF: analyse CV
- Analyse PDF → Accès données: associe document
- Routes chatbot → Agents IA: délègue
- Analyse chatbot → Agents IA: délègue
- Agents IA → Accès données: interroge contexte
- Agents IA → Service LLM: sollicite modèle
- Service LLM → Ollama: génère réponse
- Routes chatbot → Historique chat: gère historique
- Authentification API → Accès données: vérifie compte
- Authentification API → Redis: limite accès
- Routes candidatures → Service SMTP: envoie relances
