# ali-adel21/resume-checker architecture

> Architecture diagram of the GitHub repository ali-adel21/resume-checker, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-10-17). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ali-adel21/resume-checker
- Repository: https://github.com/ali-adel21/resume-checker
- Video tour (about a minute): https://gitdiagram.com/ali-adel21/resume-checker/video

## Overview

Resume Checker AI is a web app for uploading a PDF resume, optionally supplying job details, and receiving AI-generated ATS and broader resume feedback. The upload route owns the analysis workflow: it uploads the PDF and a converted image, stores resume metadata, requests feedback, saves the result, and navigates to the result page. The README describes sign-in and a visual feedback dashboard; those capabilities are included, though the sampled sources do not establish all route-to-view relationships. Edges cite the upload flow or Puter integration; undocumented display wiring is marked unverified.

Main entry points: [`app/routes/upload.tsx`](https://github.com/ali-adel21/resume-checker/blob/main/app/routes/upload.tsx) (Resume upload), [`app/lib/puter.ts`](https://github.com/ali-adel21/resume-checker/blob/main/app/lib/puter.ts) (Puter client store), [`app/routes/resume.tsx`](https://github.com/ali-adel21/resume-checker/blob/main/app/routes/resume.tsx) (Resume results route), [`app/components/FileUploader.tsx`](https://github.com/ali-adel21/resume-checker/blob/main/app/components/FileUploader.tsx) (PDF picker)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["Resume workflow"]
  node_upload["Resume upload<br/>[upload.tsx]"]
  node_pdfpicker["PDF picker<br/>[FileUploader.tsx]"]
  node_pdfimage["PDF conversion<br/>[pdf2img.ts]"]
  node_instructions["Analysis prompt<br/>[index.tsx]"]
  node_format["Formatting helpers<br/>[formatBytes.ts]"]
end

subgraph group_integration["Puter services"]
  node_puterstore["Puter client store<br/>[puter.ts]"]
  node_puter{{"Puter platform"}}
  node_filestore[("Resume file storage")]
  node_feedbackai{{"AI feedback"}}
  node_resumeindex[("Resume metadata")]
end

subgraph group_results["Feedback interface"]
  node_resume["Resume results route<br/>[resume.tsx]"]
  node_summary["Score summary<br/>[Summary.tsx]"]
  node_gauge["Score gauge<br/>[ScoreGauge.tsx]"]
  node_ats["ATS feedback<br/>[ATS.tsx]"]
  node_details["Category details<br/>[Details.tsx]"]
  node_accordion["Expandable sections<br/>[Accordion.tsx]"]
end

subgraph group_navigation["App navigation"]
  node_auth["Sign-in route<br/>[auth.tsx]"]
  node_home["Home route<br/>[home.tsx]"]
  node_wipe["Data wipe route<br/>[wipe.tsx]"]
end

node_jobseeker(("Job seeker"))

node_jobseeker -->|"submits resume"| node_upload
node_upload -->|"selects PDF"| node_pdfpicker
node_pdfpicker -->|"formats size"| node_format
node_upload -->|"uploads PDF"| node_puterstore
node_upload -->|"converts PDF"| node_pdfimage
node_upload -->|"uploads image"| node_puterstore
node_upload -->|"builds prompt"| node_instructions
node_upload -->|"requests feedback"| node_puterstore
node_upload -->|"saves metadata"| node_puterstore
node_puterstore -->|"calls platform APIs"| node_puter
node_puter -.->|"stores files"| node_filestore
node_puter -.->|"runs AI analysis"| node_feedbackai
node_puter -.->|"stores records"| node_resumeindex
node_upload -->|"navigates to result"| node_resume
node_resume -.->|"renders score"| node_summary
node_summary -->|"renders gauge"| node_gauge
node_resume -.->|"shows ATS feedback"| node_ats
node_resume -.->|"shows category tips"| node_details
node_details -->|"uses sections"| node_accordion
node_jobseeker -->|"signs in"| node_auth
node_jobseeker -.->|"visits app"| node_home
node_jobseeker -.->|"requests cleanup"| node_wipe

click node_upload "https://github.com/ali-adel21/resume-checker/blob/main/app/routes/upload.tsx"
click node_pdfpicker "https://github.com/ali-adel21/resume-checker/blob/main/app/components/FileUploader.tsx"
click node_pdfimage "https://github.com/ali-adel21/resume-checker/blob/main/app/lib/pdf2img.ts"
click node_instructions "https://github.com/ali-adel21/resume-checker/blob/main/constants/index.tsx"
click node_format "https://github.com/ali-adel21/resume-checker/blob/main/app/lib/formatBytes.ts"
click node_puterstore "https://github.com/ali-adel21/resume-checker/blob/main/app/lib/puter.ts"
click node_auth "https://github.com/ali-adel21/resume-checker/blob/main/app/routes/auth.tsx"
click node_home "https://github.com/ali-adel21/resume-checker/blob/main/app/routes/home.tsx"
click node_resume "https://github.com/ali-adel21/resume-checker/blob/main/app/routes/resume.tsx"
click node_wipe "https://github.com/ali-adel21/resume-checker/blob/main/app/routes/wipe.tsx"
click node_summary "https://github.com/ali-adel21/resume-checker/blob/main/app/components/Summary.tsx"
click node_gauge "https://github.com/ali-adel21/resume-checker/blob/main/app/components/ScoreGauge.tsx"
click node_ats "https://github.com/ali-adel21/resume-checker/blob/main/app/components/ATS.tsx"
click node_details "https://github.com/ali-adel21/resume-checker/blob/main/app/components/Details.tsx"
click node_accordion "https://github.com/ali-adel21/resume-checker/blob/main/app/components/Accordion.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_upload,node_pdfpicker,node_pdfimage,node_instructions,node_format toneBlue
class node_puterstore,node_puter,node_filestore,node_feedbackai,node_resumeindex toneAmber
class node_resume,node_summary,node_gauge,node_ats,node_details,node_accordion toneMint
class node_auth,node_home,node_wipe toneRose
class node_jobseeker toneIndigo
```

## Components

### Resume workflow

- [Resume upload](https://github.com/ali-adel21/resume-checker/blob/main/app/routes/upload.tsx): `app/routes/upload.tsx`
- [PDF picker](https://github.com/ali-adel21/resume-checker/blob/main/app/components/FileUploader.tsx): `app/components/FileUploader.tsx`
- [PDF conversion](https://github.com/ali-adel21/resume-checker/blob/main/app/lib/pdf2img.ts): `app/lib/pdf2img.ts`
- [Analysis prompt](https://github.com/ali-adel21/resume-checker/blob/main/constants/index.tsx): `constants/index.tsx`
- [Formatting helpers](https://github.com/ali-adel21/resume-checker/blob/main/app/lib/formatBytes.ts): `app/lib/formatBytes.ts`

### Puter services

- [Puter client store](https://github.com/ali-adel21/resume-checker/blob/main/app/lib/puter.ts): `app/lib/puter.ts`
- **Puter platform**
- **Resume file storage**
- **AI feedback**
- **Resume metadata**

### Feedback interface

- [Resume results route](https://github.com/ali-adel21/resume-checker/blob/main/app/routes/resume.tsx): `app/routes/resume.tsx`
- [Score summary](https://github.com/ali-adel21/resume-checker/blob/main/app/components/Summary.tsx): `app/components/Summary.tsx`
- [Score gauge](https://github.com/ali-adel21/resume-checker/blob/main/app/components/ScoreGauge.tsx): `app/components/ScoreGauge.tsx`
- [ATS feedback](https://github.com/ali-adel21/resume-checker/blob/main/app/components/ATS.tsx): `app/components/ATS.tsx`
- [Category details](https://github.com/ali-adel21/resume-checker/blob/main/app/components/Details.tsx): `app/components/Details.tsx`
- [Expandable sections](https://github.com/ali-adel21/resume-checker/blob/main/app/components/Accordion.tsx): `app/components/Accordion.tsx`

### App navigation

- [Sign-in route](https://github.com/ali-adel21/resume-checker/blob/main/app/routes/auth.tsx): `app/routes/auth.tsx`
- [Home route](https://github.com/ali-adel21/resume-checker/blob/main/app/routes/home.tsx): `app/routes/home.tsx`
- [Data wipe route](https://github.com/ali-adel21/resume-checker/blob/main/app/routes/wipe.tsx): `app/routes/wipe.tsx`

### Other components

- **Job seeker**

## Connections

- Job seeker → Resume upload: submits resume (evidence: `README.md`)
- Resume upload → PDF picker: selects PDF (evidence: `app/routes/upload.tsx`)
- PDF picker → Formatting helpers: formats size (evidence: `app/components/FileUploader.tsx`)
- Resume upload → Puter client store: uploads PDF (evidence: `app/routes/upload.tsx`)
- Resume upload → PDF conversion: converts PDF (evidence: `app/routes/upload.tsx`)
- Resume upload → Puter client store: uploads image (evidence: `app/routes/upload.tsx`)
- Resume upload → Analysis prompt: builds prompt (evidence: `app/routes/upload.tsx`)
- Resume upload → Puter client store: requests feedback (evidence: `app/routes/upload.tsx`)
- Resume upload → Puter client store: saves metadata (evidence: `app/routes/upload.tsx`)
- Puter client store → Puter platform: calls platform APIs (evidence: `app/lib/puter.ts`)
- Puter platform → Resume file storage: stores files
- Puter platform → AI feedback: runs AI analysis
- Puter platform → Resume metadata: stores records
- Resume upload → Resume results route: navigates to result (evidence: `app/routes/upload.tsx`)
- Resume results route → Score summary: renders score
- Score summary → Score gauge: renders gauge (evidence: `app/components/Summary.tsx`)
- Resume results route → ATS feedback: shows ATS feedback
- Resume results route → Category details: shows category tips
- Category details → Expandable sections: uses sections (evidence: `app/components/Details.tsx`)
- Job seeker → Sign-in route: signs in (evidence: `README.md`)
- Job seeker → Home route: visits app
- Job seeker → Data wipe route: requests cleanup
