# aientech/dossier architecture

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

- Interactive diagram: https://gitdiagram.com/aientech/dossier
- Repository: https://github.com/aientech/dossier

## Overview

Dossier is a self-hosted job-search and application-tracking product for one person. Its central workflow builds a career profile, turns a job posting into a match assessment and tailored documents, then supports refinement, PDF download, and application tracking. Separate capabilities cover job discovery, daily agent drafts, startup listings, Gmail and Calendar, and an MCP connector. The map reflects README-documented workflows and sampled route, auth, job-runner, and persistence code; unsampled subsystems are represented at their listed paths, with relationships omitted where evidence is insufficient.

Main entry points: [`src/app/(app)/new/new-application.tsx`](https://github.com/aientech/dossier/blob/main/src/app/(app)/new/new-application.tsx) (New application), [`src/lib/settings-data.ts`](https://github.com/aientech/dossier/blob/main/src/lib/settings-data.ts) (Settings access), [`src/app/(app)/profile/profile-editor.tsx`](https://github.com/aientech/dossier/blob/main/src/app/(app)/profile/profile-editor.tsx) (Career profile), [`src/app/(app)/applications/[id]/application-view.tsx`](https://github.com/aientech/dossier/blob/main/src/app/(app)/applications/%5Bid%5D/application-view.tsx) (Application details)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_profile_docs["Profile and documents"]
  node_profile["Career profile<br/>[profile-editor.tsx]"]
  node_profile_import["Profile import<br/>[profile-import.ts]"]
  node_base_resume["Base resume"]
  node_document_themes["Resume themes<br/>[themes.ts]"]
  node_pdf["PDF generation<br/>[render.ts]"]
end

subgraph group_job_search["Job search and tracking"]
  node_application_create["New application"]
  node_application_record["Application details"]
  node_application_tracking["Application tracking<br/>[board.tsx]"]
  node_dashboard["Dashboard<br/>[dashboard.tsx]"]
  node_job_search_ui["Job search<br/>[jobs-screen.tsx]"]
  node_job_search_engine["Search sources<br/>[search.ts]"]
  node_startups["Startup listings<br/>[refresh.ts]"]
end

subgraph group_ai_work["AI and automation"]
  node_ai_tasks["AI writing and matching<br/>[index.ts]"]
  node_ai_providers["AI providers<br/>[provider.ts]"]
  node_job_runner["Background jobs<br/>[runner.ts]"]
  node_job_agent["Daily job agent<br/>[run.ts]"]
end

subgraph group_integrations["External integrations"]
  node_mcp["MCP connector<br/>[tools.ts]"]
  node_google["Google services<br/>[account.ts]"]
  node_google_oauth["Google OAuth<br/>[oauth.ts]"]
end

subgraph group_platform["Platform and data"]
  node_settings_data["Settings access<br/>[settings-data.ts]"]
  node_settings["Settings rules<br/>[settings.ts]"]
  node_session["Session auth<br/>[session.ts]"]
  node_route_guard["Private route guard<br/>[route.ts]"]
  node_connector_oauth["Connector OAuth<br/>[oauth.ts]"]
  node_export["Data export and import<br/>[data-export.ts]"]
  node_database_client["Database client<br/>[prisma.ts]"]
  node_database[("PostgreSQL")]
  node_env["Runtime configuration<br/>[env.ts]"]
  node_keys["Key derivation<br/>[keys.ts]"]
end

node_user(("Job seeker"))

node_user -->|"maintains"| node_profile
node_user -->|"imports resume"| node_profile_import
node_user -->|"builds"| node_base_resume
node_profile -->|"supplies profile facts"| node_application_create
node_user -->|"pastes posting"| node_application_create
node_application_create -->|"requests matching and drafts"| node_ai_tasks
node_ai_tasks -.->|"uses model"| node_ai_providers
node_user -->|"searches jobs"| node_job_search_ui
node_job_search_ui -.->|"searches sources"| node_job_search_engine
node_user -->|"explores startups"| node_startups
node_user -->|"reviews drafts"| node_job_agent
node_job_agent -.->|"queues work"| node_job_runner
node_user -->|"refines documents"| node_application_record
node_application_record -->|"downloads PDFs"| node_pdf
node_user -->|"tracks progress"| node_application_tracking
node_user -->|"reviews activity"| node_dashboard
node_user -->|"customizes resume"| node_document_themes
node_user -->|"connects account"| node_google
node_google_oauth -->|"authorizes account"| node_google
node_user -->|"uses connector"| node_mcp
node_mcp -->|"verifies access token"| node_connector_oauth
node_route_guard -->|"checks session"| node_session
node_settings_data -->|"loads and saves settings"| node_settings
node_settings_data -->|"queries settings"| node_database_client
node_database_client -->|"connects"| node_database
node_session -->|"derives session keys"| node_keys
node_keys -->|"reads configuration"| node_env
node_user -->|"exports or restores data"| node_export
node_application_create -.->|"runs background tasks"| node_job_runner

click node_profile "https://github.com/aientech/dossier/blob/main/src/app/(app)/profile/profile-editor.tsx"
click node_profile_import "https://github.com/aientech/dossier/blob/main/src/lib/profile-import.ts"
click node_base_resume "https://github.com/aientech/dossier/blob/main/src/app/(app)/resume/resume-workspace.tsx"
click node_document_themes "https://github.com/aientech/dossier/blob/main/src/lib/themes.ts"
click node_application_create "https://github.com/aientech/dossier/blob/main/src/app/(app)/new/new-application.tsx"
click node_application_record "https://github.com/aientech/dossier/blob/main/src/app/(app)/applications/%5Bid%5D/application-view.tsx"
click node_application_tracking "https://github.com/aientech/dossier/blob/main/src/app/(app)/applications/board.tsx"
click node_dashboard "https://github.com/aientech/dossier/blob/main/src/app/(app)/dashboard.tsx"
click node_job_search_ui "https://github.com/aientech/dossier/blob/main/src/app/(app)/jobs/jobs-screen.tsx"
click node_job_search_engine "https://github.com/aientech/dossier/blob/main/src/lib/job-search/search.ts"
click node_startups "https://github.com/aientech/dossier/blob/main/src/lib/startups/refresh.ts"
click node_ai_tasks "https://github.com/aientech/dossier/blob/main/src/lib/ai/tasks/index.ts"
click node_ai_providers "https://github.com/aientech/dossier/blob/main/src/lib/ai/provider.ts"
click node_job_runner "https://github.com/aientech/dossier/blob/main/src/lib/jobs/runner.ts"
click node_job_agent "https://github.com/aientech/dossier/blob/main/src/lib/agent/run.ts"
click node_mcp "https://github.com/aientech/dossier/blob/main/src/lib/connector/tools.ts"
click node_google "https://github.com/aientech/dossier/blob/main/src/lib/google/account.ts"
click node_google_oauth "https://github.com/aientech/dossier/blob/main/src/lib/google/oauth.ts"
click node_pdf "https://github.com/aientech/dossier/blob/main/src/lib/pdf/render.ts"
click node_settings_data "https://github.com/aientech/dossier/blob/main/src/lib/settings-data.ts"
click node_settings "https://github.com/aientech/dossier/blob/main/src/lib/settings.ts"
click node_session "https://github.com/aientech/dossier/blob/main/src/lib/auth/session.ts"
click node_route_guard "https://github.com/aientech/dossier/blob/main/src/lib/route.ts"
click node_connector_oauth "https://github.com/aientech/dossier/blob/main/src/lib/connector/oauth.ts"
click node_export "https://github.com/aientech/dossier/blob/main/src/lib/data-export.ts"
click node_database_client "https://github.com/aientech/dossier/blob/main/src/lib/prisma.ts"
click node_env "https://github.com/aientech/dossier/blob/main/src/lib/env.ts"
click node_keys "https://github.com/aientech/dossier/blob/main/src/lib/keys.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_profile,node_profile_import,node_base_resume,node_document_themes,node_pdf toneBlue
class node_application_create,node_application_record,node_application_tracking,node_dashboard,node_job_search_ui,node_job_search_engine,node_startups toneAmber
class node_ai_tasks,node_ai_providers,node_job_runner,node_job_agent toneMint
class node_mcp,node_google,node_google_oauth toneRose
class node_settings_data,node_settings,node_session,node_route_guard,node_connector_oauth,node_export,node_database_client,node_database,node_env,node_keys,node_user toneIndigo
```

## Components

### Profile and documents

- [Career profile](https://github.com/aientech/dossier/blob/main/src/app/(app)/profile/profile-editor.tsx): `src/app/(app)/profile/profile-editor.tsx`
- [Profile import](https://github.com/aientech/dossier/blob/main/src/lib/profile-import.ts): `src/lib/profile-import.ts`
- [Base resume](https://github.com/aientech/dossier/blob/main/src/app/(app)/resume/resume-workspace.tsx): `src/app/(app)/resume/resume-workspace.tsx`
- [Resume themes](https://github.com/aientech/dossier/blob/main/src/lib/themes.ts): `src/lib/themes.ts`
- [PDF generation](https://github.com/aientech/dossier/blob/main/src/lib/pdf/render.ts): `src/lib/pdf/render.ts`

### Job search and tracking

- [New application](https://github.com/aientech/dossier/blob/main/src/app/(app)/new/new-application.tsx): `src/app/(app)/new/new-application.tsx`
- [Application details](https://github.com/aientech/dossier/blob/main/src/app/(app)/applications/%5Bid%5D/application-view.tsx): `src/app/(app)/applications/[id]/application-view.tsx`
- [Application tracking](https://github.com/aientech/dossier/blob/main/src/app/(app)/applications/board.tsx): `src/app/(app)/applications/board.tsx`
- [Dashboard](https://github.com/aientech/dossier/blob/main/src/app/(app)/dashboard.tsx): `src/app/(app)/dashboard.tsx`
- [Job search](https://github.com/aientech/dossier/blob/main/src/app/(app)/jobs/jobs-screen.tsx): `src/app/(app)/jobs/jobs-screen.tsx`
- [Search sources](https://github.com/aientech/dossier/blob/main/src/lib/job-search/search.ts): `src/lib/job-search/search.ts`
- [Startup listings](https://github.com/aientech/dossier/blob/main/src/lib/startups/refresh.ts): `src/lib/startups/refresh.ts`

### AI and automation

- [AI writing and matching](https://github.com/aientech/dossier/blob/main/src/lib/ai/tasks/index.ts): `src/lib/ai/tasks/index.ts`
- [AI providers](https://github.com/aientech/dossier/blob/main/src/lib/ai/provider.ts): `src/lib/ai/provider.ts`
- [Background jobs](https://github.com/aientech/dossier/blob/main/src/lib/jobs/runner.ts): `src/lib/jobs/runner.ts`
- [Daily job agent](https://github.com/aientech/dossier/blob/main/src/lib/agent/run.ts): `src/lib/agent/run.ts`

### External integrations

- [MCP connector](https://github.com/aientech/dossier/blob/main/src/lib/connector/tools.ts): `src/lib/connector/tools.ts`
- [Google services](https://github.com/aientech/dossier/blob/main/src/lib/google/account.ts): `src/lib/google/account.ts`
- [Google OAuth](https://github.com/aientech/dossier/blob/main/src/lib/google/oauth.ts): `src/lib/google/oauth.ts`

### Platform and data

- [Settings access](https://github.com/aientech/dossier/blob/main/src/lib/settings-data.ts): `src/lib/settings-data.ts`
- [Settings rules](https://github.com/aientech/dossier/blob/main/src/lib/settings.ts): `src/lib/settings.ts`
- [Session auth](https://github.com/aientech/dossier/blob/main/src/lib/auth/session.ts): `src/lib/auth/session.ts`
- [Private route guard](https://github.com/aientech/dossier/blob/main/src/lib/route.ts): `src/lib/route.ts`
- [Connector OAuth](https://github.com/aientech/dossier/blob/main/src/lib/connector/oauth.ts): `src/lib/connector/oauth.ts`
- [Data export and import](https://github.com/aientech/dossier/blob/main/src/lib/data-export.ts): `src/lib/data-export.ts`
- [Database client](https://github.com/aientech/dossier/blob/main/src/lib/prisma.ts): `src/lib/prisma.ts`
- **PostgreSQL**
- [Runtime configuration](https://github.com/aientech/dossier/blob/main/src/lib/env.ts): `src/lib/env.ts`
- [Key derivation](https://github.com/aientech/dossier/blob/main/src/lib/keys.ts): `src/lib/keys.ts`

### Other components

- **Job seeker**

## Connections

- Job seeker → Career profile: maintains (evidence: `README.md`)
- Job seeker → Profile import: imports resume (evidence: `README.md`)
- Job seeker → Base resume: builds (evidence: `README.md`)
- Career profile → New application: supplies profile facts (evidence: `README.md`)
- Job seeker → New application: pastes posting (evidence: `README.md`)
- New application → AI writing and matching: requests matching and drafts (evidence: `README.md`)
- AI writing and matching → AI providers: uses model
- Job seeker → Job search: searches jobs (evidence: `README.md`)
- Job search → Search sources: searches sources
- Job seeker → Startup listings: explores startups (evidence: `README.md`)
- Job seeker → Daily job agent: reviews drafts (evidence: `README.md`)
- Daily job agent → Background jobs: queues work
- Job seeker → Application details: refines documents (evidence: `README.md`)
- Application details → PDF generation: downloads PDFs
- Job seeker → Application tracking: tracks progress (evidence: `README.md`)
- Job seeker → Dashboard: reviews activity (evidence: `README.md`)
- Job seeker → Resume themes: customizes resume (evidence: `README.md`)
- Job seeker → Google services: connects account (evidence: `README.md`)
- Google OAuth → Google services: authorizes account (evidence: `src/app/api/google/callback/route.ts`)
- Job seeker → MCP connector: uses connector (evidence: `README.md`)
- MCP connector → Connector OAuth: verifies access token (evidence: `src/app/api/mcp/route.ts`)
- Private route guard → Session auth: checks session (evidence: `src/lib/route.ts`)
- Settings access → Settings rules: loads and saves settings (evidence: `src/lib/settings-data.ts`)
- Settings access → Database client: queries settings (evidence: `src/lib/settings-data.ts`)
- Database client → PostgreSQL: connects (evidence: `src/lib/prisma.ts`)
- Session auth → Key derivation: derives session keys (evidence: `src/lib/auth/session.ts`)
- Key derivation → Runtime configuration: reads configuration (evidence: `src/lib/keys.ts`)
- Job seeker → Data export and import: exports or restores data (evidence: `README.md`)
- New application → Background jobs: runs background tasks
