AI-powered military-to-civilian resume generator.
- Open
000-docs/032-QA-TEST-ope-veteran-flow-test-script.md - Follow each step, mark Pass/Fail
- If something fails β Create GitHub Issue
- Go to GitHub β Issues β New Issue
- Pick a template:
- QA Bug - something broke
- QA UX - works but confusing
- QA Missing - feature not there
- Fill in the blanks, attach screenshot if helpful
- Check assigned issues
- Create branch:
fix/issue-NUMBER - Fix the bug
- Create PR β tag Jeremy for review
generator/
βββ 000-docs/ # Project documentation (6767 + NNN standards)
βββ src/ # Source code
β βββ generators/ # Format-specific generators
β βββ parsers/ # Data parsers
β βββ templates/ # Template engine
β βββ utils/ # Utility functions
βββ templates/ # Resume templates
β βββ modern/ # Modern template
β βββ classic/ # Classic template
β βββ minimal/ # Minimal template
βββ data/ # Resume data files
β βββ examples/ # Example resumes
β βββ schemas/ # JSON schemas
βββ output/ # Generated resumes
βββ tests/ # Test suite
βββ config/ # Configuration files
βββ scripts/ # Automation scripts
pip install -r requirements.txt# Generate resume from data file
python src/main.py --data data/my-resume.json --template modern --format pdf
# Generate all formats
python src/main.py --data data/my-resume.json --all
# Interactive mode
python src/main.py --interactiveEdit config/config.yaml to customize:
- Default templates
- Output settings
- AI integration
- Styling preferences
# Run tests
pytest tests/
# Lint code
flake8 src/
# Format code
black src/The AI pipeline processes military documents and generates civilian resumes:
- Document Upload: Candidates upload military documents (DD-214, ERB/ORB, evaluations)
- Text Extraction: Worker extracts text from PDF, TXT, DOCX files
- Vertex AI Processing: Gemini 1.5 Flash generates:
CandidateProfile: Structured military career dataGeneratedResume: Civilian-friendly resume content
- Firestore Storage: Results stored in
candidateProfiles/andresumes/collections
After AI generation, resumes are exported to downloadable formats:
Storage Path Convention:
candidates/{candidateId}/exports/{timestamp}-resume.pdf
candidates/{candidateId}/exports/{timestamp}-resume.docx
Libraries Used:
| Format | Library | Notes |
|---|---|---|
puppeteer |
Full HTML/CSS rendering, Cloud Run compatible | |
| DOCX | docx |
Native DOCX generation, no Word required |
API Endpoints:
| Endpoint | Method | Description |
|---|---|---|
/internal/processCandidate |
POST | Process docs + generate resume + export |
/internal/candidateStatus/:id |
GET | Check processing status |
/internal/resumeDownload/:id/:format |
GET | Get signed download URL |
Team notifications to #operation-hired Slack channel when:
- New candidate intake: When a candidate submits documents and starts processing
- Resume ready: When AI generation and PDF/DOCX exports are complete
De-duplication: Each notification type uses a Firestore timestamp field to prevent duplicates:
candidates/{id}.firstSlackNotifiedAt- New candidate notificationresumes/{id}.resumeSlackNotifiedAt- Resume ready notification
Slack Message Format (Block Kit):
π New Candidate Intake
Name: John Smith
Email: john.smith@email.com
Branch/Rank/MOS: Army / E-6 / 11B
[View Candidate] button
π Resume Ready
Name: John Smith
Branch/Rank/MOS: Army / E-6 / 11B
Downloads: PDF, DOCX
[View Resume] button
Deploys all services and verifies the complete pipeline works in production.
Deployed Services (Dev):
| Service | URL |
|---|---|
| Frontend | https://resume-gen-intent-dev.web.app |
| Worker | https://resume-worker-dev-96171099570.us-central1.run.app |
| Firestore | resume-gen-intent-dev project |
| Storage | resume-gen-intent-dev.firebasestorage.app |
Applies Operation Hired branding to the frontend for a professional, veteran-forward experience.
Theme & Branding:
- Primary color: Gold
#C59141(matches operationhired.com) - Dark header/footer:
#1a1a1a - Typography: Roboto + Roboto Slab fonts
- Layout: Branded nav header and footer with Operation Hired identity
Frontend Routes:
| Route | Component | Description |
|---|---|---|
/intake |
IntakePage | Candidate info form (step 1) |
/intake/:id/documents |
IntakeDocumentsPage | Document upload (step 2) |
/intake/:id/complete |
IntakeCompletePage | Status and resume download (step 3) |
/candidate/:id |
CandidatePage | Canonical shareable resume URL |
Candidate Resume URL Pattern: /candidate/{candidateId}
- Shareable link for operations team
- Redirects to
/intake/{id}/complete - Can be bookmarked by candidates
UI Components:
- Step indicator across all pages (3 steps)
- Drag-and-drop file upload
- Real-time status updates
- Download buttons for PDF/DOCX
Layout Component: frontend/src/components/Layout.tsx
- Navigation: Home, Resume Generator, Admin, Hire Talent, Government Services, Contact
- Footer: Company info, quick links, address
- Mobile-responsive hamburger menu
Theme Variables: frontend/src/index.css
--primary-gold: #C59141;
--primary-dark: #1a1a1a;
--success-green: #38a169;
--error-red: #e53e3e;
--info-blue: #3182ce;Internal dashboard for Operation Hired team to view candidates and monitor pipeline.
Admin Routes:
| Route | Component | Description |
|---|---|---|
/admin |
AdminCandidatesPage | Redirect to candidates list |
/admin/candidates |
AdminCandidatesPage | List all candidates with filtering |
/admin/candidates/:id |
AdminCandidateDetailPage | Candidate detail view |
Admin Data Sources (Read-Only):
| Collection | Data |
|---|---|
candidates |
Basic candidate info, status |
candidateDocuments |
Uploaded document metadata |
candidateProfiles |
AI-generated profile data |
resumes |
Generated resume content and export paths |
Admin Features:
- Real-time candidate list with status filtering
- Status summary cards (total, ready, processing, errors)
- Candidate detail view with:
- Candidate info (name, email, branch, rank, MOS)
- System info (ID, timestamps)
- Uploaded documents list
- Resume preview (summary, skills, experience)
- PDF/DOCX download buttons
- Link to candidate-facing page
Security Note: Admin pages are publicly accessible in dev. Production deployment should add Firebase Auth.
# GCP
GCP_PROJECT_ID=resume-gen-intent-dev
VERTEX_LOCATION=us-central1
GEMINI_MODEL_NAME=gemini-1.5-flash
# Firebase Storage
FIREBASE_STORAGE_BUCKET=resume-gen-intent-dev.firebasestorage.app
# Frontend
VITE_WORKER_URL=https://resume-worker-dev-96171099570.us-central1.run.app
# Slack Notifications (Phase 2.1)
SLACK_OPERATION_HIRED_WEBHOOK_URL=https://hooks.slack.com/services/xxx/yyy/zzz
# Worker App URL (for Slack links)
APP_BASE_URL=https://resume-gen-intent-dev.web.appDeploy Worker to Cloud Run:
cd services/worker
# Build and push image
gcloud builds submit \
--tag us-central1-docker.pkg.dev/resume-gen-intent-dev/resume-generator/worker:latest \
--project resume-gen-intent-dev \
../..
# Deploy to Cloud Run
gcloud run deploy resume-worker-dev \
--image us-central1-docker.pkg.dev/resume-gen-intent-dev/resume-generator/worker:latest \
--platform managed \
--region us-central1 \
--project resume-gen-intent-dev \
--allow-unauthenticated \
--ingress all \
--memory 2Gi \
--cpu 2 \
--timeout 300 \
--set-env-vars "GCP_PROJECT_ID=resume-gen-intent-dev,VERTEX_LOCATION=us-central1,GEMINI_MODEL_NAME=gemini-1.5-flash,FIREBASE_STORAGE_BUCKET=resume-gen-intent-dev.firebasestorage.app,APP_BASE_URL=https://resume-gen-intent-dev.web.app"Deploy Frontend to Firebase Hosting:
cd frontend
# Build production bundle
npm run build
# Deploy to Firebase Hosting
firebase deploy --only hosting --project resume-gen-intent-devDeploy Firestore/Storage Rules:
firebase deploy --only firestore:rules,storage --project resume-gen-intent-devThe worker service uses Puppeteer for PDF generation with system Chromium:
# services/worker/Dockerfile uses node:20-slim with Chromium
FROM node:20-slim AS production
RUN apt-get update && apt-get install -y \
chromium \
fonts-liberation \
... # (additional dependencies)
--no-install-recommends
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromiumResource Requirements:
- Memory: 2Gi (for Chromium headless)
- CPU: 2 (for PDF rendering)
- Timeout: 300s (AI + PDF generation)
# Worker health
curl https://resume-worker-dev-96171099570.us-central1.run.app/health
# Expected response:
# {"status":"healthy","service":"worker","timestamp":"...","version":"0.1.0"}See 000-docs/ for complete documentation following the 6767 standard.
MIT