# faginr/job-tracker architecture

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

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

## Overview

Job Tracker is a web app for organizing job and internship searches: users manage applications, contacts, and skills, including links between them and skill proficiency. The main flow is sign-in, browse or edit personal records in the React UI, send authenticated requests to the API, and persist changes in the datastore. The README also documents adding and searching records and linking contacts and skills to applications. Backend route wiring and application CRUD are sampled; other route behavior is inferred only at the capability level from the README and tree.

Main entry points: [`datastore-backend/index.js`](https://github.com/faginr/job-tracker/blob/main/datastore-backend/index.js) (Route mounting), [`datastore-backend/model.js`](https://github.com/faginr/job-tracker/blob/main/datastore-backend/model.js) (Datastore model), [`datastore-backend/routes/applications.js`](https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/applications.js) (Application routes), [`react-frontend/src/App.js`](https://github.com/faginr/job-tracker/blob/main/react-frontend/src/App.js) (React app)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Web interface"]
  node_app["React app<br/>[App.js]"]
  node_application_ui["Applications UI<br/>[ApplicationPage.js]"]
  node_edit_application["Edit application"]
  node_contact_ui["Contacts UI<br/>[ContactPage.js]"]
  node_skill_ui["Skills UI<br/>[SkillPage.js]"]
  node_fetch["API requests<br/>[fetchRequests.js]"]
end

subgraph group_identity["Identity"]
  node_auth_ui["Auth provider"]
  node_token["Token helper<br/>[Auth0Functions.js]"]
end

subgraph group_api["Backend API"]
  node_server["HTTP server<br/>[server.js]"]
  node_router["Route mounting<br/>[index.js]"]
  node_applications["Application routes<br/>[applications.js]"]
  node_contacts["Contact routes<br/>[contacts.js]"]
  node_skills["Skill routes<br/>[skills.js]"]
  node_user_skills["User skill routes<br/>[userSkills.js]"]
  node_app_skills["App skill routes<br/>[userAppSkills.js]"]
  node_users["User routes<br/>[users.js]"]
  node_verify["JWT verification<br/>[verifyUser.js]"]
end

subgraph group_data["Persistence"]
  node_model["Datastore model<br/>[model.js]"]
  node_datastore["Datastore client<br/>[datastore.js]"]
  node_store[("Persistent records")]
end

node_user(("Job seeker"))
node_auth0(("Auth0"))

node_user -->|"uses"| node_app
node_app -->|"routes to"| node_application_ui
node_app -->|"routes to"| node_contact_ui
node_app -->|"routes to"| node_skill_ui
node_user -->|"signs in"| node_auth_ui
node_auth_ui -->|"authenticates"| node_auth0
node_token -->|"gets token"| node_auth0
node_edit_application -->|"requests token"| node_token
node_edit_application -->|"PATCH request"| node_applications
node_fetch -->|"API requests"| node_applications
node_server -->|"mounts routes"| node_router
node_router -->|"mounts"| node_applications
node_router -->|"mounts"| node_contacts
node_router -->|"mounts"| node_users
node_router -->|"mounts"| node_user_skills
node_router -->|"mounts"| node_app_skills
node_router -->|"mounts"| node_skills
node_applications -->|"checks user"| node_verify
node_applications -->|"reads and writes"| node_model
node_contacts -->|"reads and writes"| node_model
node_skills -->|"reads and writes"| node_model
node_user_skills -->|"reads and writes"| node_model
node_app_skills -->|"reads and writes"| node_model
node_users -->|"reads and writes"| node_model
node_model -->|"uses client"| node_datastore
node_datastore -->|"persists data"| node_store

click node_app "https://github.com/faginr/job-tracker/blob/main/react-frontend/src/App.js"
click node_application_ui "https://github.com/faginr/job-tracker/blob/main/react-frontend/src/pages/ApplicationPage.js"
click node_edit_application "https://github.com/faginr/job-tracker/blob/main/react-frontend/src/pages/EditApplicationPage.js"
click node_contact_ui "https://github.com/faginr/job-tracker/blob/main/react-frontend/src/pages/ContactPage.js"
click node_skill_ui "https://github.com/faginr/job-tracker/blob/main/react-frontend/src/pages/SkillPage.js"
click node_fetch "https://github.com/faginr/job-tracker/blob/main/react-frontend/src/data_model/fetchRequests.js"
click node_auth_ui "https://github.com/faginr/job-tracker/blob/main/react-frontend/src/components/Auth0WithNavigate.js"
click node_token "https://github.com/faginr/job-tracker/blob/main/react-frontend/src/utils/Auth0Functions.js"
click node_server "https://github.com/faginr/job-tracker/blob/main/datastore-backend/server.js"
click node_router "https://github.com/faginr/job-tracker/blob/main/datastore-backend/index.js"
click node_applications "https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/applications.js"
click node_contacts "https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/contacts.js"
click node_skills "https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/skills.js"
click node_user_skills "https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/userSkills.js"
click node_app_skills "https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/userAppSkills.js"
click node_users "https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/users.js"
click node_verify "https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/middleware/verifyUser.js"
click node_model "https://github.com/faginr/job-tracker/blob/main/datastore-backend/model.js"
click node_datastore "https://github.com/faginr/job-tracker/blob/main/datastore-backend/datastore.js"

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_app,node_application_ui,node_edit_application,node_contact_ui,node_skill_ui,node_fetch toneBlue
class node_auth_ui,node_token toneAmber
class node_server,node_router,node_applications,node_contacts,node_skills,node_user_skills,node_app_skills,node_users,node_verify toneMint
class node_model,node_datastore,node_store toneRose
class node_user,node_auth0 toneIndigo
```

## Components

### Web interface

- [React app](https://github.com/faginr/job-tracker/blob/main/react-frontend/src/App.js): `react-frontend/src/App.js`
- [Applications UI](https://github.com/faginr/job-tracker/blob/main/react-frontend/src/pages/ApplicationPage.js): `react-frontend/src/pages/ApplicationPage.js`
- [Edit application](https://github.com/faginr/job-tracker/blob/main/react-frontend/src/pages/EditApplicationPage.js): `react-frontend/src/pages/EditApplicationPage.js`
- [Contacts UI](https://github.com/faginr/job-tracker/blob/main/react-frontend/src/pages/ContactPage.js): `react-frontend/src/pages/ContactPage.js`
- [Skills UI](https://github.com/faginr/job-tracker/blob/main/react-frontend/src/pages/SkillPage.js): `react-frontend/src/pages/SkillPage.js`
- [API requests](https://github.com/faginr/job-tracker/blob/main/react-frontend/src/data_model/fetchRequests.js): `react-frontend/src/data_model/fetchRequests.js`

### Identity

- [Auth provider](https://github.com/faginr/job-tracker/blob/main/react-frontend/src/components/Auth0WithNavigate.js): `react-frontend/src/components/Auth0WithNavigate.js`
- [Token helper](https://github.com/faginr/job-tracker/blob/main/react-frontend/src/utils/Auth0Functions.js): `react-frontend/src/utils/Auth0Functions.js`

### Backend API

- [HTTP server](https://github.com/faginr/job-tracker/blob/main/datastore-backend/server.js): `datastore-backend/server.js`
- [Route mounting](https://github.com/faginr/job-tracker/blob/main/datastore-backend/index.js): `datastore-backend/index.js`
- [Application routes](https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/applications.js): `datastore-backend/routes/applications.js`
- [Contact routes](https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/contacts.js): `datastore-backend/routes/contacts.js`
- [Skill routes](https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/skills.js): `datastore-backend/routes/skills.js`
- [User skill routes](https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/userSkills.js): `datastore-backend/routes/userSkills.js`
- [App skill routes](https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/userAppSkills.js): `datastore-backend/routes/userAppSkills.js`
- [User routes](https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/users.js): `datastore-backend/routes/users.js`
- [JWT verification](https://github.com/faginr/job-tracker/blob/main/datastore-backend/routes/middleware/verifyUser.js): `datastore-backend/routes/middleware/verifyUser.js`

### Persistence

- [Datastore model](https://github.com/faginr/job-tracker/blob/main/datastore-backend/model.js): `datastore-backend/model.js`
- [Datastore client](https://github.com/faginr/job-tracker/blob/main/datastore-backend/datastore.js): `datastore-backend/datastore.js`
- **Persistent records**

### Other components

- **Job seeker**
- **Auth0**

## Connections

- Job seeker → React app: uses
- React app → Applications UI: routes to
- React app → Contacts UI: routes to
- React app → Skills UI: routes to
- Job seeker → Auth provider: signs in
- Auth provider → Auth0: authenticates
- Token helper → Auth0: gets token
- Edit application → Token helper: requests token
- Edit application → Application routes: PATCH request
- API requests → Application routes: API requests
- HTTP server → Route mounting: mounts routes
- Route mounting → Application routes: mounts
- Route mounting → Contact routes: mounts
- Route mounting → User routes: mounts
- Route mounting → User skill routes: mounts
- Route mounting → App skill routes: mounts
- Route mounting → Skill routes: mounts
- Application routes → JWT verification: checks user
- Application routes → Datastore model: reads and writes
- Contact routes → Datastore model: reads and writes
- Skill routes → Datastore model: reads and writes
- User skill routes → Datastore model: reads and writes
- App skill routes → Datastore model: reads and writes
- User routes → Datastore model: reads and writes
- Datastore model → Datastore client: uses client
- Datastore client → Persistent records: persists data
