Curriculate is a React-based resume editor and preview tool. It provides a polished A4-style resume canvas, editable resume sections, profile image controls, skill and language management, timeline entries, print/export helpers, and a generic Max Mustermann sample resume for safe previews.
The public repository intentionally contains only placeholder resume content. Personal resume variants, profile photos, company logos, and generated local artifacts are ignored and should stay outside version control.
- Live resume preview with an editor sidebar.
- Generic placeholder resume data for
Max Mustermann. - Editable profile, contact, skills, languages, experience, education, and engagement sections.
- Skill icons from Devicon and Lucide.
- Timeline entry logos when a local resume variant provides them.
- Drag-and-drop skill ordering in the preview.
- Profile image upload through the editor, stored locally in the browser.
- A4 and fit-to-content export modes.
- Page overflow measurement and optional page-break guide.
- Print-friendly layout and production build output.
- React 18
- TypeScript
- Create React App /
react-scripts - Tailwind CSS
- Lucide React icons
- Devicon skill icons
- Testing Library
Install dependencies:
npm installStart the development server:
npm startThe app runs at http://localhost:3000.
Run tests:
npm test -- --watchAll=falseCreate a production build:
npm run buildThe compiled app is written to build/.
public/
index.html
manifest.json
robots.txt
src/
App.tsx
App.test.tsx
components/
ResumeMaxMustermann.tsx
resume/
BrandContext.tsx
ResumeEditor.tsx
ResumePreview.tsx
ResumeShell.tsx
constants.ts
hooks.ts
icons.ts
index.ts
primitives.tsx
types.ts
Important files:
src/App.tsxselects the resume component rendered by the application.src/components/ResumeMaxMustermann.tsxcontains the safe placeholder resume used by default.src/resume/ResumeShell.tsxowns editor/preview layout, local storage, print controls, and page metrics.src/resume/ResumeEditor.tsxcontains the editable form controls.src/resume/ResumePreview.tsxrenders the generic resume preview.src/resume/types.tsdefines the resume data model.src/resume/icons.tsdefines available skill icon options.
Resume content is represented by ResumeState:
type ResumeState = {
name: string;
profileImage: string;
profileSummary: string;
contact: {
email: string;
phone: string;
address: string;
};
skills: Skill[];
languages: Language[];
experience: TimelineEntry[];
education: TimelineEntry[];
engagement?: TimelineEntry[];
repositories?: GitHubRepository[];
};Timeline sections use this shape:
type TimelineEntry = {
id: string;
date: string;
title: string;
org: string;
location?: string;
body: string;
logo?: string;
};The repository ignores personal resume components by default:
src/components/Resume*.tsx
!src/components/ResumeMaxMustermann.tsxThat means you can create a private local file such as:
src/components/ResumeYourName.tsx
Then temporarily point src/App.tsx at that component for local editing. Because personal variants are ignored, they will not be committed unless the ignore rules are changed deliberately.
Recommended workflow:
- Copy
src/components/ResumeMaxMustermann.tsx. - Rename the copy to a personal local component.
- Replace placeholder data with private resume data.
- Keep personal photos and logos under ignored paths such as
public/logo/. - Do not commit private resume files or media assets.
The public repository should not contain:
- Personal resume components.
- Profile photos.
- Company or institution logo assets used only for private resumes.
- Generated builds.
- IDE state or local machine metadata.
- Environment files.
The current .gitignore covers these categories:
.idea/build/node_modules/.DS_Store.env*local variantspublic/logo/public/bild*.pngpublic/*Bewerbungsfoto*- private
src/components/Resume*.tsxvariants, exceptResumeMaxMustermann.tsx
Before publishing changes, check what will be committed:
git status --short --ignored
git diff --cached --name-statusCurriculate saves edits in localStorage under a key based on the initial resume name:
resume-v1-<resume name>
This keeps edits available across reloads in the same browser. It also means old local data can override changed defaults. Clear the browser storage for the site if you want to see the component's fresh initial state again.
Use the controls in the app to switch between A4 and fit-to-content export modes. The preview includes page measurement and an optional page-break guide to make print output easier to tune.
For PDF export, use the browser print dialog and choose "Save as PDF". The print stylesheet removes editor controls and preserves the resume sheet layout.
The default test renders the app and checks that the public placeholder resume is present:
npm test -- --watchAll=falseRun this before committing changes to the public resume component or shared resume infrastructure.
Create an optimized production build:
npm run buildThe generated build/ directory is intentionally ignored. Deploy from the build output with your preferred static hosting provider.
- Keep
ResumeMaxMustermann.tsxgeneric and safe for public use. - Add reusable behavior to
src/resume/instead of duplicating it inside individual resume components. - Keep private data in ignored local files.
- Review staged files before pushing history changes.
- If history ever contains private data, rewrite the public branch and remove stale remote branches that still reference old commits.