# lingyichen-ai/jadeai architecture

> Architecture diagram of the GitHub repository lingyichen-ai/jadeai, 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/lingyichen-ai/jadeai
- Repository: https://github.com/lingyichen-ai/jadeai

## Overview

JadeAI is an AI-assisted resume builder, with adjacent mock-interview, recruiting, and professional-photo features. The main workflow is to create or import a resume, edit and optimize it, then export or share it. The graph captures documented capabilities and links confirmed by the sampled API handlers; UI-to-API wiring and unsampled subsystem internals are represented only where the product structure supports them, not as detailed call chains.

Main entry points: [`src/lib/db/repositories/resume.repository.ts`](https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/db/repositories/resume.repository.ts) (Resume repository), [`src/app/api/ai/generate-resume/route.ts`](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/ai/generate-resume/route.ts) (AI resume tools), [`src/app/api/resume/parse/route.ts`](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/parse/route.ts) (Resume parsing), [`src/lib/auth/helpers.ts`](https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/auth/helpers.ts) (Authentication)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_resume["Resume Workflow"]
  node_dashboard["Resume dashboard<br/>[page.tsx]"]
  node_editor["Resume editor<br/>[page.tsx]"]
  node_resume_api["Resume API<br/>[route.ts]"]
  node_resume_detail_api["Resume detail API<br/>[route.ts]"]
  node_preview["Resume preview<br/>[resume-preview.tsx]"]
end

subgraph group_ai["AI Services"]
  node_ai_api["AI resume tools<br/>[route.ts]"]
  node_parse_api["Resume parsing<br/>[route.ts]"]
  node_ai_provider["AI provider config<br/>[provider.ts]"]
  node_ai_service["AI capabilities"]
  node_photo_api["Photo generation<br/>[route.ts]"]
end

subgraph group_interview["Interview &amp; Recruiting"]
  node_interview_ui["Mock interview<br/>[page.tsx]"]
  node_interview_api["Interview API<br/>[route.ts]"]
  node_recruit_ui["Recruiting workspace<br/>[page.tsx]"]
  node_recruit_api["Recruiting API<br/>[route.ts]"]
end

subgraph group_platform["Data &amp; Identity"]
  node_auth["Authentication<br/>[helpers.ts]"]
  node_resume_repo["Resume repository"]
  node_interview_repo["Interview repository"]
  node_recruit_repo["Recruit repository"]
  node_database[("SQLite / PostgreSQL")]
end

subgraph group_delivery["Export &amp; Sharing"]
  node_export_api["Resume export<br/>[route.ts]"]
  node_share_api["Resume sharing<br/>[route.ts]"]
  node_share_page["Shared resume page<br/>[page.tsx]"]
end

node_user(("Resume user"))
node_ai_models{{"External AI models"}}

node_user -->|"manages resumes"| node_dashboard
node_dashboard -->|"creates or lists"| node_resume_api
node_user -->|"edits resume"| node_editor
node_editor -->|"saves changes"| node_resume_detail_api
node_user -->|"uploads resume"| node_parse_api
node_user -->|"requests generation"| node_ai_api
node_ai_api -->|"resolves user"| node_auth
node_parse_api -->|"resolves user"| node_auth
node_resume_api -->|"resolves user"| node_auth
node_resume_detail_api -->|"resolves user"| node_auth
node_ai_api -->|"configures model"| node_ai_provider
node_parse_api -->|"reads AI config"| node_ai_provider
node_ai_api -->|"generates content"| node_ai_models
node_parse_api -->|"parses file"| node_ai_service
node_ai_service -->|"uses model"| node_ai_models
node_ai_api -->|"creates resume"| node_resume_repo
node_parse_api -->|"creates parsed resume"| node_resume_repo
node_resume_api -->|"reads and writes"| node_resume_repo
node_resume_detail_api -->|"reads and updates"| node_resume_repo
node_resume_repo -->|"persists data"| node_database
node_editor -->|"previews layout"| node_preview
node_user -->|"exports resume"| node_export_api
node_export_api -->|"loads resume"| node_resume_repo
node_user -->|"creates share link"| node_share_api
node_share_api -->|"loads resume"| node_resume_repo
node_share_page -->|"loads shared resume"| node_share_api
node_user -->|"practices interview"| node_interview_ui
node_interview_ui -->|"starts session"| node_interview_api
node_interview_api -->|"resolves user"| node_auth
node_interview_api -->|"creates session"| node_interview_repo
node_interview_repo -->|"persists sessions"| node_database
node_user -->|"manages candidates"| node_recruit_ui
node_recruit_ui -->|"manages jobs"| node_recruit_api
node_recruit_api -->|"stores recruiting data"| node_recruit_repo
node_recruit_repo -->|"persists data"| node_database
node_user -->|"requests photo"| node_photo_api
node_photo_api -.->|"generates image"| node_ai_models

click node_dashboard "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/dashboard/page.tsx"
click node_editor "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/editor/%5Bid%5D/page.tsx"
click node_resume_api "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/route.ts"
click node_resume_detail_api "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/%5Bid%5D/route.ts"
click node_preview "https://github.com/lingyichen-ai/jadeai/blob/main/src/components/preview/resume-preview.tsx"
click node_ai_api "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/ai/generate-resume/route.ts"
click node_parse_api "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/parse/route.ts"
click node_ai_provider "https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/ai/provider.ts"
click node_ai_service "https://github.com/lingyichen-ai/jadeai/tree/main/src/lib/ai"
click node_interview_ui "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/interview/%5Bid%5D/page.tsx"
click node_interview_api "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/interview/route.ts"
click node_recruit_ui "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/recruit/%5BjobId%5D/page.tsx"
click node_recruit_api "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/recruit/jobs/route.ts"
click node_photo_api "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/linkedin-photo/route.ts"
click node_auth "https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/auth/helpers.ts"
click node_resume_repo "https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/db/repositories/resume.repository.ts"
click node_interview_repo "https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/db/repositories/interview.repository.ts"
click node_recruit_repo "https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/db/repositories/recruit.repository.ts"
click node_database "https://github.com/lingyichen-ai/jadeai/tree/main/src/lib/db"
click node_export_api "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/%5Bid%5D/export/route.ts"
click node_share_api "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/%5Bid%5D/shares/route.ts"
click node_share_page "https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/share/%5Btoken%5D/page.tsx"

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_dashboard,node_editor,node_resume_api,node_resume_detail_api,node_preview,node_user toneBlue
class node_ai_api,node_parse_api,node_ai_provider,node_ai_service,node_photo_api toneAmber
class node_interview_ui,node_interview_api,node_recruit_ui,node_recruit_api toneMint
class node_auth,node_resume_repo,node_interview_repo,node_recruit_repo,node_database toneRose
class node_export_api,node_share_api,node_share_page,node_ai_models toneIndigo
```

## Components

### Resume Workflow

- [Resume dashboard](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/dashboard/page.tsx): `src/app/[locale]/dashboard/page.tsx`
- [Resume editor](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/editor/%5Bid%5D/page.tsx): `src/app/[locale]/editor/[id]/page.tsx`
- [Resume API](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/route.ts): `src/app/api/resume/route.ts`
- [Resume detail API](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/%5Bid%5D/route.ts): `src/app/api/resume/[id]/route.ts`
- [Resume preview](https://github.com/lingyichen-ai/jadeai/blob/main/src/components/preview/resume-preview.tsx): `src/components/preview/resume-preview.tsx`

### AI Services

- [AI resume tools](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/ai/generate-resume/route.ts): `src/app/api/ai/generate-resume/route.ts`
- [Resume parsing](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/parse/route.ts): `src/app/api/resume/parse/route.ts`
- [AI provider config](https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/ai/provider.ts): `src/lib/ai/provider.ts`
- [AI capabilities](https://github.com/lingyichen-ai/jadeai/tree/main/src/lib/ai): `src/lib/ai`
- [Photo generation](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/linkedin-photo/route.ts): `src/app/api/linkedin-photo/route.ts`

### Interview & Recruiting

- [Mock interview](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/interview/%5Bid%5D/page.tsx): `src/app/[locale]/interview/[id]/page.tsx`
- [Interview API](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/interview/route.ts): `src/app/api/interview/route.ts`
- [Recruiting workspace](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/recruit/%5BjobId%5D/page.tsx): `src/app/[locale]/recruit/[jobId]/page.tsx`
- [Recruiting API](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/recruit/jobs/route.ts): `src/app/api/recruit/jobs/route.ts`

### Data & Identity

- [Authentication](https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/auth/helpers.ts): `src/lib/auth/helpers.ts`
- [Resume repository](https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/db/repositories/resume.repository.ts): `src/lib/db/repositories/resume.repository.ts`
- [Interview repository](https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/db/repositories/interview.repository.ts): `src/lib/db/repositories/interview.repository.ts`
- [Recruit repository](https://github.com/lingyichen-ai/jadeai/blob/main/src/lib/db/repositories/recruit.repository.ts): `src/lib/db/repositories/recruit.repository.ts`
- [SQLite / PostgreSQL](https://github.com/lingyichen-ai/jadeai/tree/main/src/lib/db): `src/lib/db`

### Export & Sharing

- [Resume export](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/%5Bid%5D/export/route.ts): `src/app/api/resume/[id]/export/route.ts`
- [Resume sharing](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/api/resume/%5Bid%5D/shares/route.ts): `src/app/api/resume/[id]/shares/route.ts`
- [Shared resume page](https://github.com/lingyichen-ai/jadeai/blob/main/src/app/%5Blocale%5D/share/%5Btoken%5D/page.tsx): `src/app/[locale]/share/[token]/page.tsx`

### Other components

- **Resume user**
- **External AI models**

## Connections

- Resume user → Resume dashboard: manages resumes
- Resume dashboard → Resume API: creates or lists
- Resume user → Resume editor: edits resume
- Resume editor → Resume detail API: saves changes
- Resume user → Resume parsing: uploads resume
- Resume user → AI resume tools: requests generation
- AI resume tools → Authentication: resolves user
- Resume parsing → Authentication: resolves user
- Resume API → Authentication: resolves user
- Resume detail API → Authentication: resolves user
- AI resume tools → AI provider config: configures model
- Resume parsing → AI provider config: reads AI config
- AI resume tools → External AI models: generates content
- Resume parsing → AI capabilities: parses file
- AI capabilities → External AI models: uses model
- AI resume tools → Resume repository: creates resume
- Resume parsing → Resume repository: creates parsed resume
- Resume API → Resume repository: reads and writes
- Resume detail API → Resume repository: reads and updates
- Resume repository → SQLite / PostgreSQL: persists data
- Resume editor → Resume preview: previews layout
- Resume user → Resume export: exports resume
- Resume export → Resume repository: loads resume
- Resume user → Resume sharing: creates share link
- Resume sharing → Resume repository: loads resume
- Shared resume page → Resume sharing: loads shared resume
- Resume user → Mock interview: practices interview
- Mock interview → Interview API: starts session
- Interview API → Authentication: resolves user
- Interview API → Interview repository: creates session
- Interview repository → SQLite / PostgreSQL: persists sessions
- Resume user → Recruiting workspace: manages candidates
- Recruiting workspace → Recruiting API: manages jobs
- Recruiting API → Recruit repository: stores recruiting data
- Recruit repository → SQLite / PostgreSQL: persists data
- Resume user → Photo generation: requests photo
- Photo generation → External AI models: generates image
