# ernestkac/job_search architecture

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

- Interactive diagram: https://gitdiagram.com/ernestkac/job_search
- Repository: https://github.com/ernestkac/job_search

## Overview

This is an AI-assisted job-search and application-management product focused on ICT vacancies. Candidates authenticate, build or parse a profile, browse or ingest jobs, assess match quality, prepare application materials, and track application progress; optional Gmail support is also exposed. The graph follows documented and excerpted calls, with some frontend/backend HTTP links supported by the API client’s SOURCE INDEX references. Several modules are indexed but unsampled, so uncertain internal links are omitted rather than inferred.

Main entry points: [`src/App.tsx`](https://github.com/ernestkac/job_search/blob/main/src/App.tsx) (Search workspace), [`server/app.ts`](https://github.com/ernestkac/job_search/blob/main/server/app.ts) (HTTP API), [`server/controller/jobs.controller.ts`](https://github.com/ernestkac/job_search/blob/main/server/controller/jobs.controller.ts) (Job workflows), [`src/components/ApplicationModal.tsx`](https://github.com/ernestkac/job_search/blob/main/src/components/ApplicationModal.tsx) (Application composer)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Candidate workspace"]
  node_workspace["Search workspace<br/>[App.tsx]"]
  node_profile_ui["Profile editor<br/>[ProfileView.tsx]"]
  node_dashboard["Dashboard<br/>[DashboardView.tsx]"]
  node_job_explorer["Job explorer"]
  node_job_detail["Job details<br/>[JobDetailModal.tsx]"]
  node_application_modal["Application composer"]
  node_tracker["Application tracker"]
  node_api_client["API client<br/>[api.ts]"]
  node_pdf["PDF generation<br/>[pdfService.ts]"]
end

subgraph group_server["Application backend"]
  node_http_api["HTTP API<br/>[app.ts]"]
  node_auth_controller["Authentication<br/>[auth.controller.ts]"]
  node_candidate_controller["Profile and CV"]
  node_jobs_controller["Job workflows<br/>[jobs.controller.ts]"]
  node_application_controller["Application records"]
end

subgraph group_data["Persistent data"]
  node_profile_store[("Candidate store")]
  node_job_store[("Job store<br/>[jobs.ts]")]
  node_application_store[("Application store<br/>[applications.ts]")]
end

subgraph group_ai_jobs["Job intelligence"]
  node_job_sources["Job scraping<br/>[scraper.ts]"]
  node_gemini["AI assistance<br/>[gemini.ts]"]
end

subgraph group_integrations["Application integrations"]
  node_gmail_client["Gmail client<br/>[gmailService.ts]"]
  node_auth_ui["Google auth<br/>[googleauth.ts]"]
  node_gmail_controller["Gmail operations"]
end

node_candidate(("Candidate"))

node_candidate -->|"uses"| node_workspace
node_workspace -->|"renders"| node_profile_ui
node_workspace -->|"renders"| node_dashboard
node_workspace -->|"renders"| node_job_explorer
node_workspace -->|"renders"| node_job_detail
node_workspace -->|"renders"| node_application_modal
node_workspace -->|"renders"| node_tracker
node_workspace -->|"requests"| node_api_client
node_application_modal -->|"requests"| node_api_client
node_application_modal -->|"generates PDFs"| node_pdf
node_application_modal -->|"sends mail"| node_gmail_client
node_application_modal -->|"uses auth"| node_auth_ui
node_workspace -->|"authenticates"| node_auth_ui
node_api_client -.->|"calls"| node_http_api
node_http_api -->|"routes auth"| node_auth_controller
node_http_api -.->|"routes API"| node_candidate_controller
node_http_api -.->|"routes API"| node_jobs_controller
node_http_api -.->|"routes API"| node_application_controller
node_http_api -.->|"routes API"| node_gmail_controller
node_candidate_controller -->|"reads and writes"| node_profile_store
node_candidate_controller -->|"parses CV"| node_gemini
node_jobs_controller -->|"fetches jobs"| node_job_sources
node_jobs_controller -->|"reads and writes"| node_job_store
node_jobs_controller -->|"loads profile"| node_profile_store
node_jobs_controller -->|"analyzes and drafts"| node_gemini
node_jobs_controller -->|"updates tracking"| node_application_store
node_application_controller -->|"manages records"| node_application_store
node_gmail_controller -.->|"loads credentials"| node_profile_store

click node_workspace "https://github.com/ernestkac/job_search/blob/main/src/App.tsx"
click node_profile_ui "https://github.com/ernestkac/job_search/blob/main/src/components/ProfileView.tsx"
click node_dashboard "https://github.com/ernestkac/job_search/blob/main/src/components/DashboardView.tsx"
click node_job_explorer "https://github.com/ernestkac/job_search/blob/main/src/components/JobExplorerView.tsx"
click node_job_detail "https://github.com/ernestkac/job_search/blob/main/src/components/JobDetailModal.tsx"
click node_application_modal "https://github.com/ernestkac/job_search/blob/main/src/components/ApplicationModal.tsx"
click node_tracker "https://github.com/ernestkac/job_search/blob/main/src/components/ApplicationTrackerView.tsx"
click node_api_client "https://github.com/ernestkac/job_search/blob/main/src/lib/api.ts"
click node_pdf "https://github.com/ernestkac/job_search/blob/main/src/lib/pdfService.ts"
click node_gmail_client "https://github.com/ernestkac/job_search/blob/main/src/lib/gmailService.ts"
click node_auth_ui "https://github.com/ernestkac/job_search/blob/main/src/lib/googleauth.ts"
click node_http_api "https://github.com/ernestkac/job_search/blob/main/server/app.ts"
click node_auth_controller "https://github.com/ernestkac/job_search/blob/main/server/controller/auth.controller.ts"
click node_candidate_controller "https://github.com/ernestkac/job_search/blob/main/server/controller/candidate.controller.ts"
click node_jobs_controller "https://github.com/ernestkac/job_search/blob/main/server/controller/jobs.controller.ts"
click node_application_controller "https://github.com/ernestkac/job_search/blob/main/server/controller/application.controller.ts"
click node_gmail_controller "https://github.com/ernestkac/job_search/blob/main/server/controller/gmail.controller.ts"
click node_job_sources "https://github.com/ernestkac/job_search/blob/main/server/utils/scraper.ts"
click node_gemini "https://github.com/ernestkac/job_search/blob/main/server/services/gemini.ts"
click node_profile_store "https://github.com/ernestkac/job_search/blob/main/server/models/candidateProfile.ts"
click node_job_store "https://github.com/ernestkac/job_search/blob/main/server/models/jobs.ts"
click node_application_store "https://github.com/ernestkac/job_search/blob/main/server/models/applications.ts"

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_workspace,node_profile_ui,node_dashboard,node_job_explorer,node_job_detail,node_application_modal,node_tracker,node_api_client,node_pdf toneBlue
class node_http_api,node_auth_controller,node_candidate_controller,node_jobs_controller,node_application_controller toneAmber
class node_profile_store,node_job_store,node_application_store toneMint
class node_job_sources,node_gemini toneRose
class node_gmail_client,node_auth_ui,node_gmail_controller,node_candidate toneIndigo
```

## Components

### Candidate workspace

- [Search workspace](https://github.com/ernestkac/job_search/blob/main/src/App.tsx): `src/App.tsx`
- [Profile editor](https://github.com/ernestkac/job_search/blob/main/src/components/ProfileView.tsx): `src/components/ProfileView.tsx`
- [Dashboard](https://github.com/ernestkac/job_search/blob/main/src/components/DashboardView.tsx): `src/components/DashboardView.tsx`
- [Job explorer](https://github.com/ernestkac/job_search/blob/main/src/components/JobExplorerView.tsx): `src/components/JobExplorerView.tsx`
- [Job details](https://github.com/ernestkac/job_search/blob/main/src/components/JobDetailModal.tsx): `src/components/JobDetailModal.tsx`
- [Application composer](https://github.com/ernestkac/job_search/blob/main/src/components/ApplicationModal.tsx): `src/components/ApplicationModal.tsx`
- [Application tracker](https://github.com/ernestkac/job_search/blob/main/src/components/ApplicationTrackerView.tsx): `src/components/ApplicationTrackerView.tsx`
- [API client](https://github.com/ernestkac/job_search/blob/main/src/lib/api.ts): `src/lib/api.ts`
- [PDF generation](https://github.com/ernestkac/job_search/blob/main/src/lib/pdfService.ts): `src/lib/pdfService.ts`

### Application backend

- [HTTP API](https://github.com/ernestkac/job_search/blob/main/server/app.ts): `server/app.ts`
- [Authentication](https://github.com/ernestkac/job_search/blob/main/server/controller/auth.controller.ts): `server/controller/auth.controller.ts`
- [Profile and CV](https://github.com/ernestkac/job_search/blob/main/server/controller/candidate.controller.ts): `server/controller/candidate.controller.ts`
- [Job workflows](https://github.com/ernestkac/job_search/blob/main/server/controller/jobs.controller.ts): `server/controller/jobs.controller.ts`
- [Application records](https://github.com/ernestkac/job_search/blob/main/server/controller/application.controller.ts): `server/controller/application.controller.ts`

### Persistent data

- [Candidate store](https://github.com/ernestkac/job_search/blob/main/server/models/candidateProfile.ts): `server/models/candidateProfile.ts`
- [Job store](https://github.com/ernestkac/job_search/blob/main/server/models/jobs.ts): `server/models/jobs.ts`
- [Application store](https://github.com/ernestkac/job_search/blob/main/server/models/applications.ts): `server/models/applications.ts`

### Job intelligence

- [Job scraping](https://github.com/ernestkac/job_search/blob/main/server/utils/scraper.ts): `server/utils/scraper.ts`
- [AI assistance](https://github.com/ernestkac/job_search/blob/main/server/services/gemini.ts): `server/services/gemini.ts`

### Application integrations

- [Gmail client](https://github.com/ernestkac/job_search/blob/main/src/lib/gmailService.ts): `src/lib/gmailService.ts`
- [Google auth](https://github.com/ernestkac/job_search/blob/main/src/lib/googleauth.ts): `src/lib/googleauth.ts`
- [Gmail operations](https://github.com/ernestkac/job_search/blob/main/server/controller/gmail.controller.ts): `server/controller/gmail.controller.ts`

### Other components

- **Candidate**

## Connections

- Candidate → Search workspace: uses (evidence: `src/App.tsx`)
- Search workspace → Profile editor: renders (evidence: `src/App.tsx`)
- Search workspace → Dashboard: renders (evidence: `src/App.tsx`)
- Search workspace → Job explorer: renders (evidence: `src/App.tsx`)
- Search workspace → Job details: renders (evidence: `src/App.tsx`)
- Search workspace → Application composer: renders (evidence: `src/App.tsx`)
- Search workspace → Application tracker: renders (evidence: `src/App.tsx`)
- Search workspace → API client: requests (evidence: `src/App.tsx`)
- Application composer → API client: requests (evidence: `src/components/ApplicationModal.tsx`)
- Application composer → PDF generation: generates PDFs (evidence: `src/components/ApplicationModal.tsx`)
- Application composer → Gmail client: sends mail (evidence: `src/components/ApplicationModal.tsx`)
- Application composer → Google auth: uses auth (evidence: `src/components/ApplicationModal.tsx`)
- Search workspace → Google auth: authenticates (evidence: `src/App.tsx`)
- API client → HTTP API: calls
- HTTP API → Authentication: routes auth (evidence: `server/app.ts`)
- HTTP API → Profile and CV: routes API
- HTTP API → Job workflows: routes API
- HTTP API → Application records: routes API
- HTTP API → Gmail operations: routes API
- Profile and CV → Candidate store: reads and writes (evidence: `server/controller/candidate.controller.ts`)
- Profile and CV → AI assistance: parses CV (evidence: `server/controller/candidate.controller.ts`)
- Job workflows → Job scraping: fetches jobs (evidence: `server/controller/jobs.controller.ts`)
- Job workflows → Job store: reads and writes (evidence: `server/controller/jobs.controller.ts`)
- Job workflows → Candidate store: loads profile (evidence: `server/controller/jobs.controller.ts`)
- Job workflows → AI assistance: analyzes and drafts (evidence: `server/controller/jobs.controller.ts`)
- Job workflows → Application store: updates tracking (evidence: `server/controller/jobs.controller.ts`)
- Application records → Application store: manages records (evidence: `server/controller/application.controller.ts`)
- Gmail operations → Candidate store: loads credentials (evidence: `server/controller/gmail.controller.ts`)
