Personal resume generator with a Vite + React frontend and a Fastify backend, bundled through Docker Compose. Export finished profiles to PDF, TXT, or JSON, and run everything offline once dependencies and fonts are installed.
- Requirements
- Local Installation
- Development
- Testing
- Docker Compose
- Editing Workflow
- Import / Export Details
- Contributing
- Offline Behaviour
- Node.js 20+
- npm 9+
- Docker & Docker Compose (optional for deployment)
npm install
npm run setup:fonts -w backendsetup:fonts syncs the required font files (currently Roboto Mono for the UI and exports) into frontend/src/assets/fonts and backend/assets/fonts, ensuring offline typography.
Use two terminals:
npm run dev -w backend
npm run dev -w frontend -- --hostThe frontend expects the backend at http://localhost:4000/api and you can override it with VITE_API_URL.
npm testThis runs the backend Vitest suite with coverage (kept above 30% around Zod validation and PDF/TXT exports).
docker compose up --build- Frontend:
http://localhost:5173 - Backend:
http://localhost:4000 - Profiles persist in the shared
profiles_datavolume
- Create one or more profiles ("New profile" button).
- Edit meta, contact, and every section from the central panel.
- Preview the PDF styling live in the right-hand panel.
- Tweak Profile Settings (target role + ATS tags) directly under the contact card.
- Organise skills into labeled groups (up to 13 items per group) and keep certifications within the 13-entry limit.
- Export PDF/TXT/JSON or import profiles from JSON files.
- Importing profiles lets users omit every
id; the backend generates UUIDs for profile sections, normalises legacy skill arrays, and validates everything through Zod. Validation problems return explicit error messages. - JSON exports strip all
idfields so the file can be re-imported without conflicts, while the persisted storage keeps its identifiers intact. - PDF/TXT exports share the formatting defaults: Calibri-first font stack, 2 cm page margins, 16–18 pt name, 13–14 pt section headers, 11 pt body copy, and 10–11 pt metadata.
- Fork the repository and create a branch with a conventional commit-style name (e.g.
feat/frontend-skills-groups). - Run
npm installfollowed bynpm run setup:fonts -w backendif you have not already synced fonts. - Implement changes while keeping ESLint/Prettier defaults and the shared schema expectations.
- Validate with
npm test(or package-scoped scripts) and, where relevant,npm run build -w frontend/npm run build -w backend. - Open a PR summarising the impact, screenshots for UI updates, and any manual verification steps.
- No external network calls at runtime: Roboto Mono fonts are shipped locally by the backend.
- Puppeteer renders the PDF inside the backend service; ensure Chromium downloads during the initial
npm install. - Imported profiles are stored in
backend/data/profiles.json(or in the Docker volume) so they remain available offline.
