Smart Resume is a local-first resume editor built with React, Vite, and TypeScript. It provides an A4 canvas-style editing experience for structured resume data, with export support for images and PDF.
- Structured resume data rendered into a polished A4 layout
- Direct canvas text editing with automatic reflow for multiline content
- Drag, duplicate, delete, undo, and redo support for canvas elements
- Per-section page break controls for Education, Skills, Work, Side Project, Evaluation, and Portfolio
- Built-in Simplified Chinese and English UI localization
- Local persistence and history tracking
- Image and PDF export
- Optional AI-assisted resume parsing through Gemini
- Upload-safe sample data separated from private local resume data
- Node.js
- npm
npm installCopy .env.example to .env.local and set your Gemini API key if you want to use AI parsing.
GEMINI_API_KEY=your_api_key_hereThe editor can still run without AI parsing as a local resume editor.
npm run devThe Vite dev server starts on port 3000 by default and automatically tries the next available port if needed.
npm run buildVercel builds from the repository root with npm run build (or npm run build:vercel) and serves the dist directory. vercel.json rewrites all requests to index.html so the static app is served from /.
GitHub Pages is deployed by .github/workflows/deploy.yml. The workflow uses GitHub Pages Actions, reads the Pages base path with actions/configure-pages, and passes that path to Vite so assets resolve under the repository URL, such as /smart-resume/.
Before the first GitHub Pages deployment, open the repository settings and set Settings > Pages > Build and deployment > Source to GitHub Actions. If the deploy step fails with HttpError: Not Found while creating the Pages deployment, that setting is usually not enabled yet.
npm run lintResume content is stored separately from application code:
src/data/resume.public.jsoncontains sanitized sample data and is safe to upload.src/data/resume.local.jsoncontains private local resume data and is ignored by.gitignore.src/constants.tsimports the public JSON by default, so production builds do not bundle private resume content.
To work with your private data locally, copy values from resume.local.json into the editor or temporarily switch the import in src/constants.ts during local-only work. Switch it back to resume.public.json before building or uploading.
This project is designed to keep private resume content out of uploadable source files. Before publishing or sharing the project, check that:
src/data/resume.local.jsonis not included.src/constants.tsimportsresume.public.json.- Generated files in
dist/are rebuilt from sanitized data if you plan to publish them.