Repository files navigation

Curriculate

Bildschirmfoto 2026-07-01 um 01 12 48

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.

Features

  • 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.

Tech Stack

  • React 18
  • TypeScript
  • Create React App / react-scripts
  • Tailwind CSS
  • Lucide React icons
  • Devicon skill icons
  • Testing Library

Getting Started

Install dependencies:

npm install

Start the development server:

npm start

The app runs at http://localhost:3000.

Run tests:

npm test -- --watchAll=false

Create a production build:

npm run build

The compiled app is written to build/.

Project Structure

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.tsx selects the resume component rendered by the application.
  • src/components/ResumeMaxMustermann.tsx contains the safe placeholder resume used by default.
  • src/resume/ResumeShell.tsx owns editor/preview layout, local storage, print controls, and page metrics.
  • src/resume/ResumeEditor.tsx contains the editable form controls.
  • src/resume/ResumePreview.tsx renders the generic resume preview.
  • src/resume/types.ts defines the resume data model.
  • src/resume/icons.ts defines available skill icon options.

Resume Data Model

Resume content is represented by ResumeState:

typeResumeState={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:

typeTimelineEntry={id: string;date: string;title: string;org: string;location?: string;body: string;logo?: string;};

Creating a Local Resume Variant

The repository ignores personal resume components by default:

src/components/Resume*.tsx!src/components/ResumeMaxMustermann.tsx

That 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:

  1. Copy src/components/ResumeMaxMustermann.tsx.
  2. Rename the copy to a personal local component.
  3. Replace placeholder data with private resume data.
  4. Keep personal photos and logos under ignored paths such as public/logo/.
  5. Do not commit private resume files or media assets.

Privacy Rules

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 variants
  • public/logo/
  • public/bild*.png
  • public/*Bewerbungsfoto*
  • private src/components/Resume*.tsx variants, except ResumeMaxMustermann.tsx

Before publishing changes, check what will be committed:

git status --short --ignored
git diff --cached --name-status

Browser Storage

Curriculate 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.

Exporting And Printing

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.

Testing

The default test renders the app and checks that the public placeholder resume is present:

npm test -- --watchAll=false

Run this before committing changes to the public resume component or shared resume infrastructure.

Build

Create an optimized production build:

npm run build

The generated build/ directory is intentionally ignored. Deploy from the build output with your preferred static hosting provider.

Maintenance Notes

  • Keep ResumeMaxMustermann.tsx generic 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.

About

React-based resume editor with live A4 preview, customizable sections, drag-and-drop skills, local storage, and PDF/print export.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Curriculate

Bildschirmfoto 2026-07-01 um 01 12 48

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.

Features

  • 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.

Tech Stack

  • React 18
  • TypeScript
  • Create React App / react-scripts
  • Tailwind CSS
  • Lucide React icons
  • Devicon skill icons
  • Testing Library

Getting Started

Install dependencies:

npm install

Start the development server:

npm start

The app runs at http://localhost:3000.

Run tests:

npm test -- --watchAll=false

Create a production build:

npm run build

The compiled app is written to build/.

Project Structure

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.tsx selects the resume component rendered by the application.
  • src/components/ResumeMaxMustermann.tsx contains the safe placeholder resume used by default.
  • src/resume/ResumeShell.tsx owns editor/preview layout, local storage, print controls, and page metrics.
  • src/resume/ResumeEditor.tsx contains the editable form controls.
  • src/resume/ResumePreview.tsx renders the generic resume preview.
  • src/resume/types.ts defines the resume data model.
  • src/resume/icons.ts defines available skill icon options.

Resume Data Model

Resume content is represented by ResumeState:

typeResumeState={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:

typeTimelineEntry={id: string;date: string;title: string;org: string;location?: string;body: string;logo?: string;};

Creating a Local Resume Variant

The repository ignores personal resume components by default:

src/components/Resume*.tsx!src/components/ResumeMaxMustermann.tsx

That 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:

  1. Copy src/components/ResumeMaxMustermann.tsx.
  2. Rename the copy to a personal local component.
  3. Replace placeholder data with private resume data.
  4. Keep personal photos and logos under ignored paths such as public/logo/.
  5. Do not commit private resume files or media assets.

Privacy Rules

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 variants
  • public/logo/
  • public/bild*.png
  • public/*Bewerbungsfoto*
  • private src/components/Resume*.tsx variants, except ResumeMaxMustermann.tsx

Before publishing changes, check what will be committed:

git status --short --ignored
git diff --cached --name-status

Browser Storage

Curriculate 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.

Exporting And Printing

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.

Testing

The default test renders the app and checks that the public placeholder resume is present:

npm test -- --watchAll=false

Run this before committing changes to the public resume component or shared resume infrastructure.

Build

Create an optimized production build:

npm run build

The generated build/ directory is intentionally ignored. Deploy from the build output with your preferred static hosting provider.

Maintenance Notes

  • Keep ResumeMaxMustermann.tsx generic 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.

About

React-based resume editor with live A4 preview, customizable sections, drag-and-drop skills, local storage, and PDF/print export.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Curriculate

Bildschirmfoto 2026-07-01 um 01 12 48

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.

Features

  • 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.

Tech Stack

  • React 18
  • TypeScript
  • Create React App / react-scripts
  • Tailwind CSS
  • Lucide React icons
  • Devicon skill icons
  • Testing Library

Getting Started

Install dependencies:

npm install

Start the development server:

npm start

The app runs at http://localhost:3000.

Run tests:

npm test -- --watchAll=false

Create a production build:

npm run build

The compiled app is written to build/.

Project Structure

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.tsx selects the resume component rendered by the application.
  • src/components/ResumeMaxMustermann.tsx contains the safe placeholder resume used by default.
  • src/resume/ResumeShell.tsx owns editor/preview layout, local storage, print controls, and page metrics.
  • src/resume/ResumeEditor.tsx contains the editable form controls.
  • src/resume/ResumePreview.tsx renders the generic resume preview.
  • src/resume/types.ts defines the resume data model.
  • src/resume/icons.ts defines available skill icon options.

Resume Data Model

Resume content is represented by ResumeState:

typeResumeState={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:

typeTimelineEntry={id: string;date: string;title: string;org: string;location?: string;body: string;logo?: string;};

Creating a Local Resume Variant

The repository ignores personal resume components by default:

src/components/Resume*.tsx!src/components/ResumeMaxMustermann.tsx

That 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:

  1. Copy src/components/ResumeMaxMustermann.tsx.
  2. Rename the copy to a personal local component.
  3. Replace placeholder data with private resume data.
  4. Keep personal photos and logos under ignored paths such as public/logo/.
  5. Do not commit private resume files or media assets.

Privacy Rules

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 variants
  • public/logo/
  • public/bild*.png
  • public/*Bewerbungsfoto*
  • private src/components/Resume*.tsx variants, except ResumeMaxMustermann.tsx

Before publishing changes, check what will be committed:

git status --short --ignored
git diff --cached --name-status

Browser Storage

Curriculate 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.

Exporting And Printing

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.

Testing

The default test renders the app and checks that the public placeholder resume is present:

npm test -- --watchAll=false

Run this before committing changes to the public resume component or shared resume infrastructure.

Build

Create an optimized production build:

npm run build

The generated build/ directory is intentionally ignored. Deploy from the build output with your preferred static hosting provider.

Maintenance Notes

  • Keep ResumeMaxMustermann.tsx generic 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.

About

React-based resume editor with live A4 preview, customizable sections, drag-and-drop skills, local storage, and PDF/print export.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Curriculate

Bildschirmfoto 2026-07-01 um 01 12 48

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.

Features

  • 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.

Tech Stack

  • React 18
  • TypeScript
  • Create React App / react-scripts
  • Tailwind CSS
  • Lucide React icons
  • Devicon skill icons
  • Testing Library

Getting Started

Install dependencies:

npm install

Start the development server:

npm start

The app runs at http://localhost:3000.

Run tests:

npm test -- --watchAll=false

Create a production build:

npm run build

The compiled app is written to build/.

Project Structure

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.tsx selects the resume component rendered by the application.
  • src/components/ResumeMaxMustermann.tsx contains the safe placeholder resume used by default.
  • src/resume/ResumeShell.tsx owns editor/preview layout, local storage, print controls, and page metrics.
  • src/resume/ResumeEditor.tsx contains the editable form controls.
  • src/resume/ResumePreview.tsx renders the generic resume preview.
  • src/resume/types.ts defines the resume data model.
  • src/resume/icons.ts defines available skill icon options.

Resume Data Model

Resume content is represented by ResumeState:

typeResumeState={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:

typeTimelineEntry={id: string;date: string;title: string;org: string;location?: string;body: string;logo?: string;};

Creating a Local Resume Variant

The repository ignores personal resume components by default:

src/components/Resume*.tsx!src/components/ResumeMaxMustermann.tsx

That 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:

  1. Copy src/components/ResumeMaxMustermann.tsx.
  2. Rename the copy to a personal local component.
  3. Replace placeholder data with private resume data.
  4. Keep personal photos and logos under ignored paths such as public/logo/.
  5. Do not commit private resume files or media assets.

Privacy Rules

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 variants
  • public/logo/
  • public/bild*.png
  • public/*Bewerbungsfoto*
  • private src/components/Resume*.tsx variants, except ResumeMaxMustermann.tsx

Before publishing changes, check what will be committed:

git status --short --ignored
git diff --cached --name-status

Browser Storage

Curriculate 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.

Exporting And Printing

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.

Testing

The default test renders the app and checks that the public placeholder resume is present:

npm test -- --watchAll=false

Run this before committing changes to the public resume component or shared resume infrastructure.

Build

Create an optimized production build:

npm run build

The generated build/ directory is intentionally ignored. Deploy from the build output with your preferred static hosting provider.

Maintenance Notes

  • Keep ResumeMaxMustermann.tsx generic 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.

About

React-based resume editor with live A4 preview, customizable sections, drag-and-drop skills, local storage, and PDF/print export.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Curriculate

Bildschirmfoto 2026-07-01 um 01 12 48

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.

Features

  • 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.

Tech Stack

  • React 18
  • TypeScript
  • Create React App / react-scripts
  • Tailwind CSS
  • Lucide React icons
  • Devicon skill icons
  • Testing Library

Getting Started

Install dependencies:

npm install

Start the development server:

npm start

The app runs at http://localhost:3000.

Run tests:

npm test -- --watchAll=false

Create a production build:

npm run build

The compiled app is written to build/.

Project Structure

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.tsx selects the resume component rendered by the application.
  • src/components/ResumeMaxMustermann.tsx contains the safe placeholder resume used by default.
  • src/resume/ResumeShell.tsx owns editor/preview layout, local storage, print controls, and page metrics.
  • src/resume/ResumeEditor.tsx contains the editable form controls.
  • src/resume/ResumePreview.tsx renders the generic resume preview.
  • src/resume/types.ts defines the resume data model.
  • src/resume/icons.ts defines available skill icon options.

Resume Data Model

Resume content is represented by ResumeState:

typeResumeState={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:

typeTimelineEntry={id: string;date: string;title: string;org: string;location?: string;body: string;logo?: string;};

Creating a Local Resume Variant

The repository ignores personal resume components by default:

src/components/Resume*.tsx!src/components/ResumeMaxMustermann.tsx

That 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:

  1. Copy src/components/ResumeMaxMustermann.tsx.
  2. Rename the copy to a personal local component.
  3. Replace placeholder data with private resume data.
  4. Keep personal photos and logos under ignored paths such as public/logo/.
  5. Do not commit private resume files or media assets.

Privacy Rules

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 variants
  • public/logo/
  • public/bild*.png
  • public/*Bewerbungsfoto*
  • private src/components/Resume*.tsx variants, except ResumeMaxMustermann.tsx

Before publishing changes, check what will be committed:

git status --short --ignored
git diff --cached --name-status

Browser Storage

Curriculate 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.

Exporting And Printing

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.

Testing

The default test renders the app and checks that the public placeholder resume is present:

npm test -- --watchAll=false

Run this before committing changes to the public resume component or shared resume infrastructure.

Build

Create an optimized production build:

npm run build

The generated build/ directory is intentionally ignored. Deploy from the build output with your preferred static hosting provider.

Maintenance Notes

  • Keep ResumeMaxMustermann.tsx generic 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.

About

React-based resume editor with live A4 preview, customizable sections, drag-and-drop skills, local storage, and PDF/print export.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Curriculate

Bildschirmfoto 2026-07-01 um 01 12 48

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.

Features

  • 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.

Tech Stack

  • React 18
  • TypeScript
  • Create React App / react-scripts
  • Tailwind CSS
  • Lucide React icons
  • Devicon skill icons
  • Testing Library

Getting Started

Install dependencies:

npm install

Start the development server:

npm start

The app runs at http://localhost:3000.

Run tests:

npm test -- --watchAll=false

Create a production build:

npm run build

The compiled app is written to build/.

Project Structure

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.tsx selects the resume component rendered by the application.
  • src/components/ResumeMaxMustermann.tsx contains the safe placeholder resume used by default.
  • src/resume/ResumeShell.tsx owns editor/preview layout, local storage, print controls, and page metrics.
  • src/resume/ResumeEditor.tsx contains the editable form controls.
  • src/resume/ResumePreview.tsx renders the generic resume preview.
  • src/resume/types.ts defines the resume data model.
  • src/resume/icons.ts defines available skill icon options.

Resume Data Model

Resume content is represented by ResumeState:

typeResumeState={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:

typeTimelineEntry={id: string;date: string;title: string;org: string;location?: string;body: string;logo?: string;};

Creating a Local Resume Variant

The repository ignores personal resume components by default:

src/components/Resume*.tsx!src/components/ResumeMaxMustermann.tsx

That 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:

  1. Copy src/components/ResumeMaxMustermann.tsx.
  2. Rename the copy to a personal local component.
  3. Replace placeholder data with private resume data.
  4. Keep personal photos and logos under ignored paths such as public/logo/.
  5. Do not commit private resume files or media assets.

Privacy Rules

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 variants
  • public/logo/
  • public/bild*.png
  • public/*Bewerbungsfoto*
  • private src/components/Resume*.tsx variants, except ResumeMaxMustermann.tsx

Before publishing changes, check what will be committed:

git status --short --ignored
git diff --cached --name-status

Browser Storage

Curriculate 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.

Exporting And Printing

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.

Testing

The default test renders the app and checks that the public placeholder resume is present:

npm test -- --watchAll=false

Run this before committing changes to the public resume component or shared resume infrastructure.

Build

Create an optimized production build:

npm run build

The generated build/ directory is intentionally ignored. Deploy from the build output with your preferred static hosting provider.

Maintenance Notes

  • Keep ResumeMaxMustermann.tsx generic 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.

About

React-based resume editor with live A4 preview, customizable sections, drag-and-drop skills, local storage, and PDF/print export.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Curriculate

Bildschirmfoto 2026-07-01 um 01 12 48

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.

Features

  • 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.

Tech Stack

  • React 18
  • TypeScript
  • Create React App / react-scripts
  • Tailwind CSS
  • Lucide React icons
  • Devicon skill icons
  • Testing Library

Getting Started

Install dependencies:

npm install

Start the development server:

npm start

The app runs at http://localhost:3000.

Run tests:

npm test -- --watchAll=false

Create a production build:

npm run build

The compiled app is written to build/.

Project Structure

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.tsx selects the resume component rendered by the application.
  • src/components/ResumeMaxMustermann.tsx contains the safe placeholder resume used by default.
  • src/resume/ResumeShell.tsx owns editor/preview layout, local storage, print controls, and page metrics.
  • src/resume/ResumeEditor.tsx contains the editable form controls.
  • src/resume/ResumePreview.tsx renders the generic resume preview.
  • src/resume/types.ts defines the resume data model.
  • src/resume/icons.ts defines available skill icon options.

Resume Data Model

Resume content is represented by ResumeState:

typeResumeState={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:

typeTimelineEntry={id: string;date: string;title: string;org: string;location?: string;body: string;logo?: string;};

Creating a Local Resume Variant

The repository ignores personal resume components by default:

src/components/Resume*.tsx!src/components/ResumeMaxMustermann.tsx

That 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:

  1. Copy src/components/ResumeMaxMustermann.tsx.
  2. Rename the copy to a personal local component.
  3. Replace placeholder data with private resume data.
  4. Keep personal photos and logos under ignored paths such as public/logo/.
  5. Do not commit private resume files or media assets.

Privacy Rules

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 variants
  • public/logo/
  • public/bild*.png
  • public/*Bewerbungsfoto*
  • private src/components/Resume*.tsx variants, except ResumeMaxMustermann.tsx

Before publishing changes, check what will be committed:

git status --short --ignored
git diff --cached --name-status

Browser Storage

Curriculate 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.

Exporting And Printing

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.

Testing

The default test renders the app and checks that the public placeholder resume is present:

npm test -- --watchAll=false

Run this before committing changes to the public resume component or shared resume infrastructure.

Build

Create an optimized production build:

npm run build

The generated build/ directory is intentionally ignored. Deploy from the build output with your preferred static hosting provider.

Maintenance Notes

  • Keep ResumeMaxMustermann.tsx generic 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.

About

React-based resume editor with live A4 preview, customizable sections, drag-and-drop skills, local storage, and PDF/print export.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Curriculate

Bildschirmfoto 2026-07-01 um 01 12 48

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.

Features

  • 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.

Tech Stack

  • React 18
  • TypeScript
  • Create React App / react-scripts
  • Tailwind CSS
  • Lucide React icons
  • Devicon skill icons
  • Testing Library

Getting Started

Install dependencies:

npm install

Start the development server:

npm start

The app runs at http://localhost:3000.

Run tests:

npm test -- --watchAll=false

Create a production build:

npm run build

The compiled app is written to build/.

Project Structure

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.tsx selects the resume component rendered by the application.
  • src/components/ResumeMaxMustermann.tsx contains the safe placeholder resume used by default.
  • src/resume/ResumeShell.tsx owns editor/preview layout, local storage, print controls, and page metrics.
  • src/resume/ResumeEditor.tsx contains the editable form controls.
  • src/resume/ResumePreview.tsx renders the generic resume preview.
  • src/resume/types.ts defines the resume data model.
  • src/resume/icons.ts defines available skill icon options.

Resume Data Model

Resume content is represented by ResumeState:

typeResumeState={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:

typeTimelineEntry={id: string;date: string;title: string;org: string;location?: string;body: string;logo?: string;};

Creating a Local Resume Variant

The repository ignores personal resume components by default:

src/components/Resume*.tsx!src/components/ResumeMaxMustermann.tsx

That 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:

  1. Copy src/components/ResumeMaxMustermann.tsx.
  2. Rename the copy to a personal local component.
  3. Replace placeholder data with private resume data.
  4. Keep personal photos and logos under ignored paths such as public/logo/.
  5. Do not commit private resume files or media assets.

Privacy Rules

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 variants
  • public/logo/
  • public/bild*.png
  • public/*Bewerbungsfoto*
  • private src/components/Resume*.tsx variants, except ResumeMaxMustermann.tsx

Before publishing changes, check what will be committed:

git status --short --ignored
git diff --cached --name-status

Browser Storage

Curriculate 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.

Exporting And Printing

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.

Testing

The default test renders the app and checks that the public placeholder resume is present:

npm test -- --watchAll=false

Run this before committing changes to the public resume component or shared resume infrastructure.

Build

Create an optimized production build:

npm run build

The generated build/ directory is intentionally ignored. Deploy from the build output with your preferred static hosting provider.

Maintenance Notes

  • Keep ResumeMaxMustermann.tsx generic 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.

About

React-based resume editor with live A4 preview, customizable sections, drag-and-drop skills, local storage, and PDF/print export.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages