# sanimanqezu/job-application-tracker architecture

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

- Interactive diagram: https://gitdiagram.com/sanimanqezu/job-application-tracker
- Repository: https://github.com/sanimanqezu/job-application-tracker

## Overview

Job Application Tracker supports authenticated job-search tracking, interview scheduling, status progression, dashboards, and live South African job discovery. The primary workflow is: a user browses new openings, records an application, then tracks its status and interviews through the dashboard and board. The graph follows documented API responsibilities and sampled service/repository calls; some discovery and frontend wiring is documented but not sampled, so uncertain internal call links are omitted.

Main entry points: [`frontend/src/lib/api.ts`](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/lib/api.ts) (HTTP API client), [`backend/src/main/java/com/sanele/jobtracker/controller/DiscoveryController.java`](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/DiscoveryController.java) (Discovery endpoints), [`backend/src/main/java/com/sanele/jobtracker/repository/UserRepository.java`](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/UserRepository.java) (User repository), [`frontend/src/app/layout.tsx`](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/layout.tsx) (Next.js experience)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_webui["Next.js experience<br/>[layout.tsx]"]
  node_applicationsui["Applications views<br/>[page.tsx]"]
  node_boardui["Kanban board<br/>[page.tsx]"]
  node_dashboardui["Dashboard<br/>[page.tsx]"]
  node_discoverui["Discover jobs<br/>[page.tsx]"]
  node_client["HTTP API client<br/>[api.ts]"]
  node_authui["Login and register<br/>[page.tsx]"]
  node_store["Application state"]
end

subgraph group_identity["Identity and API"]
  node_authcontroller["Auth endpoints"]
  node_authservice["Authentication service<br/>[AuthService.java]"]
  node_security["JWT security"]
end

subgraph group_tracking["Application tracking"]
  node_appcontroller["Application endpoints"]
  node_appservice["Application service"]
  node_interviewcontroller["Interview endpoints"]
  node_interviewservice["Interview service"]
  node_dashboardcontroller["Dashboard endpoint"]
  node_dashboardservice["Dashboard statistics"]
end

subgraph group_discovery["Job discovery"]
  node_discovercontroller["Discovery endpoints"]
  node_scanservice["Job scan and matching"]
  node_atsclient["ATS board client<br/>[AtsClient.java]"]
  node_harvester["Company harvesting"]
  node_ingestor["Company ingestion"]
  node_queue["Company candidate queue<br/>[CompanyQueue.java]"]
  node_companycatalog["Company catalog"]
  node_scanner["Standalone scanner<br/>[scan.mjs]"]
end

subgraph group_storage["Persistence and integrations"]
  node_apprepo["Application repository"]
  node_interviewrepo["Interview repository"]
  node_scannedrepo["Scanned jobs repository"]
  node_companyrepo["Company repository"]
  node_userrepo["User repository"]
  node_postgres[("PostgreSQL")]
end

node_jobseeker(("Job seeker"))
node_atsproviders["ATS providers"]
node_adzuna["Adzuna feed"]

node_jobseeker -->|"uses"| node_webui
node_webui -->|"navigates"| node_applicationsui
node_webui -->|"navigates"| node_boardui
node_webui -->|"navigates"| node_dashboardui
node_webui -->|"navigates"| node_discoverui
node_authui -->|"submits credentials"| node_client
node_applicationsui -->|"requests applications"| node_client
node_boardui -->|"updates status"| node_client
node_dashboardui -->|"requests statistics"| node_client
node_discoverui -->|"requests openings"| node_client
node_applicationsui -->|"updates state"| node_store
node_client -->|"sends auth requests"| node_authcontroller
node_client -->|"sends application requests"| node_appcontroller
node_client -->|"sends interview requests"| node_interviewcontroller
node_client -->|"requests dashboard"| node_dashboardcontroller
node_client -->|"requests discovery"| node_discovercontroller
node_authcontroller -->|"delegates auth"| node_authservice
node_authservice -->|"reads and saves users"| node_userrepo
node_authservice -->|"issues JWT"| node_security
node_security -->|"loads users"| node_userrepo
node_appcontroller -->|"delegates CRUD"| node_appservice
node_appservice -->|"resolves account"| node_userrepo
node_appservice -->|"reads and writes"| node_apprepo
node_interviewcontroller -->|"delegates interviews"| node_interviewservice
node_interviewservice -->|"resolves account"| node_userrepo
node_interviewservice -->|"checks application"| node_apprepo
node_interviewservice -->|"reads and writes"| node_interviewrepo
node_dashboardcontroller -->|"requests statistics"| node_dashboardservice
node_dashboardservice -->|"resolves account"| node_userrepo
node_dashboardservice -->|"counts applications"| node_apprepo
node_discovercontroller -->|"starts scans"| node_scanservice
node_discovercontroller -->|"filters openings"| node_scannedrepo
node_discovercontroller -->|"reads company counts"| node_companyrepo
node_discovercontroller -->|"records application"| node_appservice
node_discovercontroller -->|"checks harvest status"| node_harvester
node_scanservice -->|"fetches boards"| node_atsclient
node_scanservice -->|"loads and updates companies"| node_companyrepo
node_scanservice -->|"upserts scanned jobs"| node_scannedrepo
node_atsclient -.->|"fetches listings"| node_atsproviders
node_harvester -->|"discovers companies"| node_companycatalog
node_companycatalog -->|"queues candidates"| node_queue
node_ingestor -->|"dequeues candidates"| node_queue
node_ingestor -->|"persists companies"| node_companyrepo
node_scanner -.->|"scans ATS boards"| node_atsproviders
node_scanner -.->|"imports optional feed"| node_adzuna
node_userrepo -->|"reads and writes"| node_postgres
node_apprepo -->|"reads and writes"| node_postgres
node_interviewrepo -->|"reads and writes"| node_postgres

click node_webui "https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/layout.tsx"
click node_applicationsui "https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/applications/page.tsx"
click node_boardui "https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/board/page.tsx"
click node_dashboardui "https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/dashboard/page.tsx"
click node_discoverui "https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/discover/page.tsx"
click node_client "https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/lib/api.ts"
click node_authui "https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/login/page.tsx"
click node_store "https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/store/applicationStore.ts"
click node_authcontroller "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/AuthController.java"
click node_authservice "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/service/AuthService.java"
click node_security "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/security/SecurityConfig.java"
click node_appcontroller "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/JobApplicationController.java"
click node_appservice "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/service/JobApplicationService.java"
click node_interviewcontroller "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/InterviewController.java"
click node_interviewservice "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/service/InterviewService.java"
click node_dashboardcontroller "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/DashboardController.java"
click node_dashboardservice "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/service/DashboardService.java"
click node_discovercontroller "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/DiscoveryController.java"
click node_scanservice "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/scan/JobScanService.java"
click node_atsclient "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/ats/AtsClient.java"
click node_harvester "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/scan/CompanyHarvester.java"
click node_ingestor "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/scan/CompanyIngestor.java"
click node_queue "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/scan/CompanyQueue.java"
click node_companycatalog "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/catalog/CompanyCatalog.java"
click node_apprepo "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/JobApplicationRepository.java"
click node_interviewrepo "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/InterviewRepository.java"
click node_scannedrepo "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/ScannedJobRepository.java"
click node_companyrepo "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/CompanyRepository.java"
click node_userrepo "https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/UserRepository.java"
click node_scanner "https://github.com/sanimanqezu/job-application-tracker/blob/master/scanner/scan.mjs"

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_webui,node_applicationsui,node_boardui,node_dashboardui,node_discoverui,node_client,node_authui,node_store toneBlue
class node_authcontroller,node_authservice,node_security toneAmber
class node_appcontroller,node_appservice,node_interviewcontroller,node_interviewservice,node_dashboardcontroller,node_dashboardservice toneMint
class node_discovercontroller,node_scanservice,node_atsclient,node_harvester,node_ingestor,node_queue,node_companycatalog,node_scanner toneRose
class node_apprepo,node_interviewrepo,node_scannedrepo,node_companyrepo,node_userrepo,node_postgres,node_jobseeker,node_atsproviders,node_adzuna toneIndigo
```

## Components

### Web experience

- [Next.js experience](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/layout.tsx): `frontend/src/app/layout.tsx`
- [Applications views](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/applications/page.tsx): `frontend/src/app/applications/page.tsx`
- [Kanban board](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/board/page.tsx): `frontend/src/app/board/page.tsx`
- [Dashboard](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/dashboard/page.tsx): `frontend/src/app/dashboard/page.tsx`
- [Discover jobs](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/discover/page.tsx): `frontend/src/app/discover/page.tsx`
- [HTTP API client](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/lib/api.ts): `frontend/src/lib/api.ts`
- [Login and register](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/app/login/page.tsx): `frontend/src/app/login/page.tsx`
- [Application state](https://github.com/sanimanqezu/job-application-tracker/blob/master/frontend/src/store/applicationStore.ts): `frontend/src/store/applicationStore.ts`

### Identity and API

- [Auth endpoints](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/AuthController.java): `backend/src/main/java/com/sanele/jobtracker/controller/AuthController.java`
- [Authentication service](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/service/AuthService.java): `backend/src/main/java/com/sanele/jobtracker/service/AuthService.java`
- [JWT security](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/security/SecurityConfig.java): `backend/src/main/java/com/sanele/jobtracker/security/SecurityConfig.java`

### Application tracking

- [Application endpoints](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/JobApplicationController.java): `backend/src/main/java/com/sanele/jobtracker/controller/JobApplicationController.java`
- [Application service](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/service/JobApplicationService.java): `backend/src/main/java/com/sanele/jobtracker/service/JobApplicationService.java`
- [Interview endpoints](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/InterviewController.java): `backend/src/main/java/com/sanele/jobtracker/controller/InterviewController.java`
- [Interview service](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/service/InterviewService.java): `backend/src/main/java/com/sanele/jobtracker/service/InterviewService.java`
- [Dashboard endpoint](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/DashboardController.java): `backend/src/main/java/com/sanele/jobtracker/controller/DashboardController.java`
- [Dashboard statistics](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/service/DashboardService.java): `backend/src/main/java/com/sanele/jobtracker/service/DashboardService.java`

### Job discovery

- [Discovery endpoints](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/controller/DiscoveryController.java): `backend/src/main/java/com/sanele/jobtracker/controller/DiscoveryController.java`
- [Job scan and matching](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/scan/JobScanService.java): `backend/src/main/java/com/sanele/jobtracker/scan/JobScanService.java`
- [ATS board client](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/ats/AtsClient.java): `backend/src/main/java/com/sanele/jobtracker/ats/AtsClient.java`
- [Company harvesting](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/scan/CompanyHarvester.java): `backend/src/main/java/com/sanele/jobtracker/scan/CompanyHarvester.java`
- [Company ingestion](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/scan/CompanyIngestor.java): `backend/src/main/java/com/sanele/jobtracker/scan/CompanyIngestor.java`
- [Company candidate queue](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/scan/CompanyQueue.java): `backend/src/main/java/com/sanele/jobtracker/scan/CompanyQueue.java`
- [Company catalog](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/catalog/CompanyCatalog.java): `backend/src/main/java/com/sanele/jobtracker/catalog/CompanyCatalog.java`
- [Standalone scanner](https://github.com/sanimanqezu/job-application-tracker/blob/master/scanner/scan.mjs): `scanner/scan.mjs`

### Persistence and integrations

- [Application repository](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/JobApplicationRepository.java): `backend/src/main/java/com/sanele/jobtracker/repository/JobApplicationRepository.java`
- [Interview repository](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/InterviewRepository.java): `backend/src/main/java/com/sanele/jobtracker/repository/InterviewRepository.java`
- [Scanned jobs repository](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/ScannedJobRepository.java): `backend/src/main/java/com/sanele/jobtracker/repository/ScannedJobRepository.java`
- [Company repository](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/CompanyRepository.java): `backend/src/main/java/com/sanele/jobtracker/repository/CompanyRepository.java`
- [User repository](https://github.com/sanimanqezu/job-application-tracker/blob/master/backend/src/main/java/com/sanele/jobtracker/repository/UserRepository.java): `backend/src/main/java/com/sanele/jobtracker/repository/UserRepository.java`
- **PostgreSQL**

### Other components

- **Job seeker**
- **ATS providers**
- **Adzuna feed**

## Connections

- Job seeker → Next.js experience: uses
- Next.js experience → Applications views: navigates
- Next.js experience → Kanban board: navigates
- Next.js experience → Dashboard: navigates
- Next.js experience → Discover jobs: navigates
- Login and register → HTTP API client: submits credentials
- Applications views → HTTP API client: requests applications
- Kanban board → HTTP API client: updates status
- Dashboard → HTTP API client: requests statistics
- Discover jobs → HTTP API client: requests openings
- Applications views → Application state: updates state
- HTTP API client → Auth endpoints: sends auth requests
- HTTP API client → Application endpoints: sends application requests
- HTTP API client → Interview endpoints: sends interview requests
- HTTP API client → Dashboard endpoint: requests dashboard
- HTTP API client → Discovery endpoints: requests discovery
- Auth endpoints → Authentication service: delegates auth
- Authentication service → User repository: reads and saves users
- Authentication service → JWT security: issues JWT
- JWT security → User repository: loads users
- Application endpoints → Application service: delegates CRUD
- Application service → User repository: resolves account
- Application service → Application repository: reads and writes
- Interview endpoints → Interview service: delegates interviews
- Interview service → User repository: resolves account
- Interview service → Application repository: checks application
- Interview service → Interview repository: reads and writes
- Dashboard endpoint → Dashboard statistics: requests statistics
- Dashboard statistics → User repository: resolves account
- Dashboard statistics → Application repository: counts applications
- Discovery endpoints → Job scan and matching: starts scans
- Discovery endpoints → Scanned jobs repository: filters openings
- Discovery endpoints → Company repository: reads company counts
- Discovery endpoints → Application service: records application
- Discovery endpoints → Company harvesting: checks harvest status
- Job scan and matching → ATS board client: fetches boards
- Job scan and matching → Company repository: loads and updates companies
- Job scan and matching → Scanned jobs repository: upserts scanned jobs
- ATS board client → ATS providers: fetches listings
- Company harvesting → Company catalog: discovers companies
- Company catalog → Company candidate queue: queues candidates
- Company ingestion → Company candidate queue: dequeues candidates
- Company ingestion → Company repository: persists companies
- Standalone scanner → ATS providers: scans ATS boards
- Standalone scanner → Adzuna feed: imports optional feed
- User repository → PostgreSQL: reads and writes
- Application repository → PostgreSQL: reads and writes
- Interview repository → PostgreSQL: reads and writes
