A fully static, GitHub-powered resume website builder. This project allows you to create, edit, and manage your resume content through a web interface, storing data in JSON files and leveraging GitHub Actions for updates and deployment.
- Static Site Generation: Built with Next.js for a fast, secure, and easily deployable static website.
- Data-Driven: Resume content (About, Experience, Education, Projects, Certifications, Organizations) is managed via JSON files in
src/data. - In-Browser Editor: A dedicated
/editorroute provides a user-friendly interface to modify resume content. Drafts are saved locally usinglocalStorage. - Live Preview: The main
/route displays the formatted resume based on the current data. - ATS-Friendly PDF Export: Includes a script (
scripts/generate-ats-resume.ts) to generate a simplified Markdown and PDF version suitable for Applicant Tracking Systems (ATS), outputting to thepublic/directory. - GitHub Workflow: Edits made in the editor can be downloaded as a
.ziparchive. Submitting this archive via a GitHub Pull Request triggers GitHub Actions to update the content, rebuild the site, and regenerate the PDF.
- Framework: Next.js (v15+) with React (v19+)
- Language: TypeScript
- Styling: Tailwind CSS (v4) & shadcn/ui
- State Management: React Context API (
ResumeContext.tsx) - UI Enhancements:
- React Joyride for the welcome tour.
- Data Storage: JSON files & Browser
localStorage - PDF Generation: markdown-it & Puppeteer
- Testing: Jest & React Testing Library
- Clone the repository:
git clone <your-repository-url> cd resume
- Install dependencies:
npm install
- Run the development server:
Open http://localhost:3000 to view the main resume page. Open http://localhost:3000/editor to access the editor.
npm run dev
npm run dev: Starts the Next.js development server with Turbopack for faster refresh times and improved development experience. Access the site at http://localhost:3000.npm run build: Builds the application for production, generating optimized static files ready for deployment.npm run start: Starts the production server using the built files. Requires runningnpm run buildfirst.npm run lint: Lints the codebase using ESLint to identify and fix code style issues and potential errors in JavaScript, JSX, TypeScript, and TSX files.npm run typecheck: Checks TypeScript types across the project without emitting compiled files, ensuring type safety.npm run test: Runs Jest tests to verify code functionality and prevent regressions.npm run test:watch: Runs Jest tests in watch mode, automatically re-running tests when files change.npm run test:coverage: Runs Jest tests and generates a coverage report to identify untested code.npm run pdf: Generates an ATS-friendly PDF resume using the scripts inscripts/generate-ats-md.tsandscripts/generate-ats-pdf.ts. The output is saved topublic/asts/cv-ats.pdf.npm run og: Generates an OpenGraph image for social media sharing using the script inscripts/generate-og-image.ts. The output is saved topublic/og/resume-og.png.
.github/workflows/: GitHub Actions workflows for CI/CDapply-updates.yml: Processes ZIP files in the updates directorybuild-static.yml: Builds and deploys the static site to GitHub Pagesgenerate-ats-cv.yml: Generates ATS-friendly resume versionsgenerate-og-image.yml: Creates OpenGraph image for social sharingyearly-update.yml: Automatically triggers rebuild on January 1st
public/: Static assets and generated filesscripts/: Utility scripts for PDF generationsrc/: Source codeapp/: Next.js app router componentscomponents/: Reusable UI componentscontexts/: React context providersdata/: JSON data files for resume contenthooks/: Custom React hookslib/: Utility functionsservices/: Business logic and data storage servicestypes/: TypeScript type definitions
updates/: Directory for ZIP files containing resume updates
- Navigate to the
/editorpage on your deployed site or local development server. - Make desired changes to the resume sections using the inline editing forms. Upload new images if needed.
- Click the "Download Changes" button to get a
.ziparchive containing the updated JSON data and any new images. - Commit and push this
.zipfile to the/updatesdirectory in your GitHub repository (typically via a Pull Request). - GitHub Actions will automatically:
- Detect the new
.zipfile - Extract its contents
- Update the corresponding JSON files and images
- Delete the processed
.zip - Rebuild the Next.js site
- Generate ATS-friendly versions (Markdown and PDF)
- Deploy to GitHub Pages
- Detect the new
This project uses several GitHub Actions workflows to automate the resume update and deployment process:
- Trigger: Push to master, pull requests, or manual dispatch
- Purpose: Processes ZIP files uploaded to the
/updatesdirectory - Actions:
- Extracts JSON data and images from ZIP files
- Updates the corresponding files in the repository
- Validates JSON files for correctness
- Removes processed ZIP files
- Commits and pushes changes
- Trigger: After Apply Resume Updates workflow completes, or manual dispatch
- Purpose: Builds and deploys the static Next.js site to GitHub Pages
- Actions:
- Runs linting, type checking, and tests
- Triggers ATS CV generation
- Configures base path for GitHub Pages deployment
- Builds the static site with Next.js
- Deploys to GitHub Pages
- Trigger: Called by other workflows or manual dispatch
- Purpose: Creates ATS-friendly versions of the resume
- Actions:
- Checks for changes in JSON data files
- Generates Markdown version of the resume
- Creates PDF version
- Commits and pushes the generated files
- Trigger: Called by other workflows or manual dispatch
- Purpose: Creates OpenGraph image for social media sharing
- Actions:
- Checks for changes in JSON data files
- Generates a PNG image using Puppeteer
- Commits and pushes the generated image
- Trigger: Scheduled to run at 00:05 on January 1st, or manual dispatch
- Purpose: Ensures the resume is rebuilt at the start of each year to update relative dates
- Actions:
- Triggers the Build Static workflow