Overview
CV Builder is a fully client-side application for creating professional CVs directly in the browser. It supports multiple templates, real-time preview, and a robust history system — all without requiring a backend.
Problem
Most CV builders lock the most useful feature — exporting your CV — behind a paywall. You spend time filling in your data, choosing a template, getting everything just right, then hit download — and get a subscription prompt instead.
CV Builder was built to fix exactly that: no accounts, no paywalls, no subscriptions. Just build, preview, and download.
Key Features
- Multi-template support — switch between templates while preserving all form data
- Live preview — real-time A4 preview rendered inside an iframe via
createPortal - Undo/redo history — debounced history snapshots using Zustand for performant state tracking
- Export options — export to PDF, image (PNG), standalone HTML, and JSON
- Section management — add, remove, and reorder CV sections dynamically
Open Contribution
CV Builder's template system is open to contribution. Developers and designers can submit new templates via pull request on GitHub — keeping the project growing without a central gatekeeper.
Technical Highlights
Iframe-based A4 preview uses createPortal to render the CV template inside a sandboxed iframe, ensuring complete style isolation between the editor UI and the preview output.
Undo/redo with debounce — history snapshots are recorded via a debounced Zustand middleware pattern, preventing excessive entries during rapid typing while keeping the history meaningful and accurate.
Template switching with data preservation — switching templates does not reset the user's data. The form state is decoupled from the template layer, allowing seamless visual changes without data loss.
html2canvas-pro was chosen over the standard html2canvas for its support of oklch color space used by Tailwind CSS v4, enabling accurate image exports that match the live preview.
Export to HTML generates a fully self-contained HTML file with inlined styles — no dependencies required to open or share the exported CV.
Ring-based focus indicator fix — a requestAnimationFrame workaround was applied to prevent the inspector UI's focus ring from leaking into canvas-based exports.
