Simple "CV as code" Next.js CV creator app. It aims to provide a single source of truth for your profetional life.
The template is designed for you to fork, clone, and make your own.
- Data-Driven: All your content (jobs, skills, awards) lives in one file:
src/data/cv-data.js. - Themeable: All your styling (colors, fonts) lives in one file:
src/styles/theme.css. - Privacy First: Your personal
cv-data.jsandtheme.cssfiles are already in.gitignore. You can update your private CV data without ever committing it to your public repository. - Preset System: Define tags (e.g., "frontend", "product-manager") for your skills and jobs. The CV can be filtered with a URL (
/?preset=frontend), allowing you to generate tailored CVs for different roles. - Easy PDF Export: Uses CSS print styles. The "Download as PDF" button simply triggers the browser's print dialog, which is styled to look like a perfect A4 document.
- Framework: Next.js 16 (App Router)
- Styling: Tailwind CSS v4
This project is a template. Here's how you set it up for yourself.
git clone https://github.com/Moeren588/cv-creator
cd cv-creator
npm installThis template uses .template files for your personal content and theme. You need to copy them to create the "real" files that the app will use.
These new files (cv-data.js, theme.css) are already gitignored.
# 1. Create your data file
cp src/data/cv-data.js.template src/data/cv-data.js
# 2. Create your theme file
cp src/styles/theme.css.template src/styles/theme.cssOpen src/data/cv-data.js and fill it out with your personal information. This is your new "single source of truth."
- Define your
presets(the filters for your CV). - Add your
experience,skills,contactinfo, etc. - Use the
tagsarray on each item to control which preset it appears in. An item tagged"all"will appear in every preset.
Open src/app/layout.js. This is the only source-controlled file you need to edit. Import your desired fonts from next/font/google and assign them to the --font-body and --font-heading variables.
Open src/styles/theme.css. This file is gitignored, so your changes are your own.
- Update the
font-familynames in:rootto match the fonts you chose inlayout.js. - Change all the CSS color variables to match your personal brand. The template is already set up for light and dark modes.
npm run devOpen the localhost adress (most likely http://localhost:3000) to see your new CV. Click the preset buttons to see it filter in real-time.
Click the "Download as PDF" button. This will open your browser's print dialog.
- Set the Destination to "Save as PDF".
- In More settings, ensure "Background graphics" is checked. This is essential for your theme's colors to show up. (if you have colored backgrounds that is)
- Set Scale to 100% and Margins to None for the best result.
The application is styled with Tailwind, but all color and font values are controlled by CSS variables defined in src/styles/theme.css.
When you want to change the accent color, you don't hunt through components. You just change the --text-accent variable, and the change is applied everywhere.
If you want to fully utilize the built in features of TailwindCSS, check out their predefined colors here.
The src/app/page.js file is a "dumb" layout component. It simply imports the cvData object and maps over its arrays.
To add, remove, or edit a job, you only touch cv-data.js.
The filtering logic is handled on the server. The src/app/page.js component reads the searchParams.preset from the URL.
It then filters every list using this logic: "Show this item if the preset is 'all', OR if the item is tagged 'all', OR if the item's tags include the current preset."
This makes for an extremely fast and powerful way to generate tailored CVs on the fly.