Starter monorepo for an ATS-friendly CV builder:
- Web: React + TypeScript + Vite
- API: FastAPI + SQLite
- Output: PDF generation (v1)
- Features: dedicated profile and education tab, split editor/preview layout, CV version manager (multiple versions, duplicate, default), dark mode, dummy-data generation, programmer-focused form fields, certifications, and auto-sorted experience (newest to oldest)
- AI: import text-based PDF/DOCX/TXT CVs into editable fields and create evidence-bound job-tailored versions with Groq
apps/
web/ # componentized editor, preview, version manager, AI studio, and export flow
api/ # FastAPI + SQLite + PDF generation
packages/
shared-schema/ # CV JSON schema
ats-rules/ # ATS rule placeholders
template-engine/ # template metadata
- Install API dependencies:
npm run setup:api
- Start API:
npm run dev:api
- Start web app in another terminal:
npm run dev:web
Web runs at http://localhost:5173 and API at http://localhost:8000.
- Copy
.env.exampleto.envand set your Groq key. - Build and start both images:
docker compose up --build -d
- Open
http://localhost:5173. API documentation remains available athttp://localhost:8000/docs.
Compose creates my-cv-maker-web:latest and my-cv-maker-api:latest. Saved CVs persist in the cv_data Docker volume when containers are recreated.
Useful commands:
docker compose ps
docker compose logs -f
docker compose downUse docker compose down -v only when you intentionally want to delete all CV data stored in Docker.
- Copy
.env.exampleto.env. - Create a new Groq API key and set
GROQ_API_KEYin.env. - Keep
.envlocal. It is ignored by Git and the API key must never be exposed to the browser. - Restart the API after changing
.env.
The default model is openai/gpt-oss-20b, which supports strict structured outputs. Override it with GROQ_MODEL only when the replacement supports Groq JSON-schema structured output.
AI endpoints:
GET /ai/statusreports configuration without exposing the key.POST /ai/import-cvaccepts a PDF, DOCX, or TXT file up to 8 MB.POST /ai/tailorrewrites the summary and every experience for a job, then returns reviewable, confirmation-gated suggestions for missing experience.POST /ai/enhance-sectionrewrites a summary or experience block using only the facts supplied, then returns a reviewable suggestion.DELETE /cvs/{cv_id}permanently deletes a saved CV and assigns a new default when needed.
PDF export includes a live first-page preview for Classic, Minimal, and Modern templates plus A4/Letter page sizes, compact/standard/wide margins, and compact/standard/comfortable density. Generated files embed Unicode fonts, include clickable profile links, and are rejected if an automated extraction check cannot recover important CV text.
Run the API persistence and PDF service tests from a Python environment with the API requirements installed:
python -m unittest discover -s apps/api/tests -vThe importer currently supports text-based documents. Image-only or scanned PDFs return a clear OCR-required message instead of guessing. Tailoring preserves factual identity, employment, date, skills, link, and certification fields in server code; AI is limited to summary and bullet wording.