# petermoschitto/resumeoptimizer architecture

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

- Interactive diagram: https://gitdiagram.com/petermoschitto/resumeoptimizer
- Repository: https://github.com/petermoschitto/resumeoptimizer

## Overview

This is a resume-analysis and AI-comparison web application. Users provide a PDF or text resume and target role, then receive provider analyses, scores, recommendations, and—when comparing providers—consensus and divergent findings. The UI also includes an improvement action plan and a resume editor with PDF rendering/export capabilities. The excerpts establish the main frontend-to-backend analysis route and PDF/editor helpers; some component wiring and prioritization implementation details are unsampled, so those links are omitted or marked unverified.

Main entry points: [`onboarding-project/src/App.tsx`](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/App.tsx) (Application flow), [`onboarding-project/src/components/ResumeEditor.tsx`](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/ResumeEditor.tsx) (Resume editor), [`backend/services/aiProviders.js`](https://github.com/petermoschitto/resumeoptimizer/blob/main/backend/services/aiProviders.js) (Provider analysis), [`backend/server.js`](https://github.com/petermoschitto/resumeoptimizer/blob/main/backend/server.js) (Express API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Resume workflow"]
  node_app["Application flow<br/>[App.tsx]"]
  node_resume_form["Resume intake<br/>[ResumeForm.tsx]"]
  node_suggestions["AI suggestions<br/>[AISuggestions.tsx]"]
  node_comparison["Comparison dashboard"]
  node_action_plan["Action plan"]
end

subgraph group_analysis["Analysis services"]
  node_api_client["Backend API client<br/>[api-client.ts]"]
  node_orchestrator["Multi-AI orchestration"]
  node_optimized_openai["Optimized analysis"]
  node_cache[("Analysis cache<br/>[cache.ts]")]
  node_provider_base["Provider contract"]
  node_openai_service["OpenAI service<br/>[openai-service.ts]"]
  node_anthropic_service["Anthropic service"]
  node_google_service["Google service<br/>[google-service.ts]"]
  node_error_handler["API error handling<br/>[errorHandler.ts]"]
end

subgraph group_backend["Backend analysis"]
  node_backend_api["Express API<br/>[server.js]"]
  node_provider_service["Provider analysis<br/>[aiProviders.js]"]
  node_prioritization["Improvement prioritization<br/>[prioritization.js]"]
end

subgraph group_editing["Editing and PDF"]
  node_editor["Resume editor<br/>[ResumeEditor.tsx]"]
  node_pdf_optimizer["PDF text extraction<br/>[pdfOptimizer.ts]"]
  node_resume_parser["Resume parser<br/>[resumeParser.ts]"]
  node_pdf_visual["Visual PDF renderer"]
  node_pdf_renderer["PDF renderer<br/>[pdfRenderer.ts]"]
  node_pdf_formatter["PDF formatter<br/>[pdfFormatter.ts]"]
end

node_user(("Resume user"))
node_openai{{"OpenAI API"}}
node_anthropic{{"Anthropic API"}}
node_google{{"Google AI API"}}

node_user -->|"uses"| node_app
node_app -->|"requests comparison"| node_orchestrator
node_app -->|"requests single analysis"| node_optimized_openai
node_app -->|"renders results"| node_suggestions
node_app -->|"renders comparison"| node_comparison
node_resume_form -->|"extracts text"| node_pdf_optimizer
node_orchestrator -->|"dispatches analysis"| node_api_client
node_api_client -->|"posts analysis"| node_backend_api
node_backend_api -->|"invokes providers"| node_provider_service
node_provider_service -->|"requests analysis"| node_openai
node_provider_service -->|"requests analysis"| node_anthropic
node_provider_service -->|"requests analysis"| node_google
node_comparison -->|"uses plan"| node_action_plan
node_optimized_openai -->|"reads and writes"| node_cache
node_openai_service -->|"reads and writes"| node_cache
node_editor -->|"parses resume"| node_resume_parser
node_editor -->|"renders source PDF"| node_pdf_visual
node_editor -.-> node_pdf_renderer
node_editor -.-> node_pdf_formatter
node_backend_api -.-> node_prioritization
node_app -.-> node_resume_form
node_app -.-> node_editor

click node_app "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/App.tsx"
click node_resume_form "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/ResumeForm.tsx"
click node_suggestions "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/AISuggestions.tsx"
click node_comparison "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/ComparisonDashboard.tsx"
click node_action_plan "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/ActionPlanGenerator.tsx"
click node_editor "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/ResumeEditor.tsx"
click node_pdf_optimizer "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/pdfOptimizer.ts"
click node_resume_parser "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/resumeParser.ts"
click node_pdf_visual "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/pdfVisualRenderer.ts"
click node_pdf_renderer "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/pdfRenderer.ts"
click node_pdf_formatter "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/pdfFormatter.ts"
click node_api_client "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/api-client.ts"
click node_orchestrator "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/multi-ai-orchestrator.ts"
click node_optimized_openai "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/openai-optimized.ts"
click node_cache "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/cache.ts"
click node_provider_base "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/ai-provider-base.ts"
click node_openai_service "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/openai-service.ts"
click node_anthropic_service "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/anthropic-service.ts"
click node_google_service "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/google-service.ts"
click node_error_handler "https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/errorHandler.ts"
click node_backend_api "https://github.com/petermoschitto/resumeoptimizer/blob/main/backend/server.js"
click node_provider_service "https://github.com/petermoschitto/resumeoptimizer/blob/main/backend/services/aiProviders.js"
click node_prioritization "https://github.com/petermoschitto/resumeoptimizer/blob/main/backend/services/prioritization.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_resume_form,node_suggestions,node_comparison,node_action_plan,node_user toneBlue
class node_api_client,node_orchestrator,node_optimized_openai,node_cache,node_provider_base,node_openai_service,node_anthropic_service,node_google_service,node_error_handler toneAmber
class node_backend_api,node_provider_service,node_prioritization,node_openai,node_anthropic,node_google toneMint
class node_editor,node_pdf_optimizer,node_resume_parser,node_pdf_visual,node_pdf_renderer,node_pdf_formatter toneRose
```

## Components

### Resume workflow

- [Application flow](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/App.tsx): `onboarding-project/src/App.tsx`
- [Resume intake](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/ResumeForm.tsx): `onboarding-project/src/components/ResumeForm.tsx`
- [AI suggestions](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/AISuggestions.tsx): `onboarding-project/src/components/AISuggestions.tsx`
- [Comparison dashboard](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/ComparisonDashboard.tsx): `onboarding-project/src/components/ComparisonDashboard.tsx`
- [Action plan](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/ActionPlanGenerator.tsx): `onboarding-project/src/components/ActionPlanGenerator.tsx`

### Analysis services

- [Backend API client](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/api-client.ts): `onboarding-project/src/services/api-client.ts`
- [Multi-AI orchestration](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/multi-ai-orchestrator.ts): `onboarding-project/src/services/multi-ai-orchestrator.ts`
- [Optimized analysis](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/openai-optimized.ts): `onboarding-project/src/services/openai-optimized.ts`
- [Analysis cache](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/cache.ts): `onboarding-project/src/services/cache.ts`
- [Provider contract](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/ai-provider-base.ts): `onboarding-project/src/services/ai-provider-base.ts`
- [OpenAI service](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/openai-service.ts): `onboarding-project/src/services/openai-service.ts`
- [Anthropic service](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/anthropic-service.ts): `onboarding-project/src/services/anthropic-service.ts`
- [Google service](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/services/google-service.ts): `onboarding-project/src/services/google-service.ts`
- [API error handling](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/errorHandler.ts): `onboarding-project/src/utils/errorHandler.ts`

### Backend analysis

- [Express API](https://github.com/petermoschitto/resumeoptimizer/blob/main/backend/server.js): `backend/server.js`
- [Provider analysis](https://github.com/petermoschitto/resumeoptimizer/blob/main/backend/services/aiProviders.js): `backend/services/aiProviders.js`
- [Improvement prioritization](https://github.com/petermoschitto/resumeoptimizer/blob/main/backend/services/prioritization.js): `backend/services/prioritization.js`

### Editing and PDF

- [Resume editor](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/components/ResumeEditor.tsx): `onboarding-project/src/components/ResumeEditor.tsx`
- [PDF text extraction](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/pdfOptimizer.ts): `onboarding-project/src/utils/pdfOptimizer.ts`
- [Resume parser](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/resumeParser.ts): `onboarding-project/src/utils/resumeParser.ts`
- [Visual PDF renderer](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/pdfVisualRenderer.ts): `onboarding-project/src/utils/pdfVisualRenderer.ts`
- [PDF renderer](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/pdfRenderer.ts): `onboarding-project/src/utils/pdfRenderer.ts`
- [PDF formatter](https://github.com/petermoschitto/resumeoptimizer/blob/main/onboarding-project/src/utils/pdfFormatter.ts): `onboarding-project/src/utils/pdfFormatter.ts`

### Other components

- **Resume user**
- **OpenAI API**
- **Anthropic API**
- **Google AI API**

## Connections

- Resume user → Application flow: uses (evidence: `README.md`)
- Application flow → Multi-AI orchestration: requests comparison (evidence: `onboarding-project/src/App.tsx`)
- Application flow → Optimized analysis: requests single analysis (evidence: `onboarding-project/src/App.tsx`)
- Application flow → AI suggestions: renders results (evidence: `onboarding-project/src/App.tsx`)
- Application flow → Comparison dashboard: renders comparison (evidence: `onboarding-project/src/App.tsx`)
- Resume intake → PDF text extraction: extracts text (evidence: `onboarding-project/src/components/ResumeForm.tsx`)
- Multi-AI orchestration → Backend API client: dispatches analysis (evidence: `onboarding-project/src/services/multi-ai-orchestrator.ts`)
- Backend API client → Express API: posts analysis (evidence: `onboarding-project/src/services/api-client.ts`)
- Express API → Provider analysis: invokes providers (evidence: `backend/server.js`)
- Provider analysis → OpenAI API: requests analysis (evidence: `backend/services/aiProviders.js`)
- Provider analysis → Anthropic API: requests analysis (evidence: `backend/services/aiProviders.js`)
- Provider analysis → Google AI API: requests analysis (evidence: `backend/services/aiProviders.js`)
- Comparison dashboard → Action plan: uses plan (evidence: `onboarding-project/src/components/ComparisonDashboard.tsx`)
- Optimized analysis → Analysis cache: reads and writes (evidence: `onboarding-project/src/services/openai-optimized.ts`)
- OpenAI service → Analysis cache: reads and writes (evidence: `onboarding-project/src/services/openai-service.ts`)
- Resume editor → Resume parser: parses resume (evidence: `onboarding-project/src/components/ResumeEditor.tsx`)
- Resume editor → Visual PDF renderer: renders source PDF (evidence: `onboarding-project/src/components/ResumeEditor.tsx`)
- Resume editor → PDF renderer (evidence: `onboarding-project/src/components/ResumeEditor.tsx`)
- Resume editor → PDF formatter (evidence: `onboarding-project/src/components/ResumeEditor.tsx`)
- Express API → Improvement prioritization (evidence: `backend/server.js`)
- Application flow → Resume intake (evidence: `onboarding-project/src/App.tsx`)
- Application flow → Resume editor (evidence: `onboarding-project/src/App.tsx`)
