A free, open-source resume editor. Write once, preview instantly, export to PDF — no account required.
Resummme is a free, open-source resume editor. Write once, preview instantly, export to PDF — no account required.
Built with privacy as a core principle, Resummme gives you complete ownership of your data. The codebase is fully open-source under the GNU Affero General Public License v3, with no tracking, no ads, and no paywalls. All your data stays in your browser and never leaves your machine unless you choose to use the AI or PDF export features.
Resume Building
- Sidebar editor + live canvas preview: Form fields on the left, an instant pan-and-zoom preview of the actual paper on the right, always in sync — no save button, autosave is a side effect of typing.
- Drag-to-reorder sections and items: Reorder sections and repeatable items (jobs, projects, education) directly in the sidebar.
- Undo/redo: Full history for every edit, not just the last one.
- Rich text editor: Edit with formatting support powered by TipTap.
- Import and export: Bring in an existing resume to get started, or download/upload your resume data as portable JSON.
Templates & Style Control
- 58 templates on 25 layouts: Switch between fifty-eight polished templates without retyping a thing — each pairs a layout (Classic, Folio, Timeline, Academic, Inset, Split, Duet, Bold Type, Studio, Aurora, Ledger, Dossier, Crest, Masthead, Compass, Numeral, Atlas, Editorial, Harvard, Rirekisho, Monolith, Marquee, Duotone, Meridian, Lintel) with a curated presentation, and several templates can share one layout. Filter the gallery by ATS, Professional or Creative.
- Typography: Choose from Google Fonts and web-safe system fonts, with each option rendered in its own typeface in the font picker.
- Design control: Full control over accent color, font scale, line height, section spacing, paper size (A4 / Letter / JIS B5), and page margins.
AI Assistance
- AI PDF extraction: Upload an existing resume PDF and Gemini parses it directly into the editor fields.
- AI writing assistant: Improve any bullet point with AI; choose quick actions (stronger verb, add a metric, make it concise) or write custom instructions powered by Gemini.
- ATS score: Live structural/content scoring with feedback and keyword-gap analysis against any job description.
Privacy & Security
- No account required: Start building immediately. No registration, login, or passwords needed.
- Private by default: Your data is stored locally in the browser via
localStorageand never leaves your device.
Classic |
Folio |
Timeline |
Academic |
Inset |
Split |
Duet |
Bold Type |
Studio |
Aurora |
Ledger |
Dossier |
Crest |
Masthead |
Compass |
Numeral |
Atlas |
Editorial |
Harvard |
Rirekisho |
Monolith |
Marquee |
Duotone |
Meridian |
Lintel |
The quickest way to run Resummme locally:
# Clone the repository
git clone https://github.com/angkasa27/resummme.git
cd resummme
# Install dependencies
pnpm install
# Setup environment variables
cp .env.example .env.local
# Start development server
pnpm devOpen http://localhost:4000 to see the application.
| Category | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| Runtime | Node.js 20.9+ (CI runs 24) |
| Language | TypeScript |
| Styling | Tailwind CSS 4 |
| UI Primitives | React 19, Base UI |
| Rich Text | TipTap |
| State Management | Zustand |
| Drag & Drop | dnd-kit |
| Motion | motion |
| PDF Export | Puppeteer (local) / Cloudflare Browser Run (prod) |
| PDF Text Extraction | pdf-parse |
| AI | Google Gemini API |
| Forms | React Hook Form + Zod |
| Testing | Vitest + Testing Library |
pnpm dev # Start the development server
pnpm build # Build for production
pnpm start # Start the production server
pnpm lint # Run ESLint
pnpm test # Run Vitest (single pass)
pnpm test:watch # Run Vitest in watch mode
pnpm typecheck # Generate Next.js route types, then type-check with tsc
pnpm screenshots # Regenerate template preview images in public/templates
pnpm og:image # Regenerate public/og-image.pngEnd-to-end checks for the preview/PDF pipeline. These drive headless Puppeteer against a running app, so start pnpm dev first. They are pass/fail gates, not part of pnpm test — see docs/testing.md:
pnpm e2e:pagebreak # Assert no block lands in a page's margin band
pnpm e2e:pagination # Assert the zoomed preview paginates like the export
pnpm inspect:layout # Dump computed geometry for one layout (a tool, not a check)Create a .env.local from the template:
cp .env.example .env.localPowers "Extract from PDF", "Improve with AI", and "Analyze job description".
GEMINI_API_KEY= # https://aistudio.google.com/
GEMINI_MODEL= # Optional; defaults to gemini-3.5-flashBoth accept a comma-separated list. Every key is tried on the first model before the next model is attempted, so a rate-limited key falls back to a sibling key rather than dropping straight to a weaker model:
GEMINI_API_KEY=key_one,key_two
GEMINI_MODEL=gemini-3.5-flash,gemini-3-flash-previewWithout a key, the AI buttons are visible but calls will return a 503 error.
# "auto" (default) | "puppeteer" | "cloudflare-browser-run"
PDF_EXPORT_PROVIDER=autoauto uses local Puppeteer in development. For production with Cloudflare Browser Run:
CLOUDFLARE_ACCOUNT_ID=
CLOUDFLARE_BROWSER_RUN_API_TOKEN=
CLOUDFLARE_BROWSER_RUN_KEEP_ALIVE_MS=60000# Comma-separated origins allowed to call /api/export-pdf cross-origin.
# Same-origin requests are always allowed without this.
PDF_EXPORT_TRUSTED_ORIGINS=https://example.comsrc/
app/
(landing routes) # Marketing homepage ("/")
editor/ # The actual editor ("/editor")
resume-pdf/ # Headless page Puppeteer captures to produce the PDF
api/ # export-pdf, import-pdf, improve-content, insights/match-keywords
components/ui/ # Shared UI primitives (Button, Dialog, Select…)
components/landing/ # Landing page sections
hooks/ # App-level React hooks
lib/ # Utilities (cn, etc.)
test/ # Vitest setup
features/resume-editor/
domain/
draft/ # Draft storage interface, local-storage impl, default draft
insights/ # ATS scoring, keyword matching, text extraction
presentation/ # Layout ids, color/font presets, margins
rich-text/ # Sanitizers
schema/ # Zod schemas for the resume draft (versioned)
sections/ # Section config & metadata
editor/
desktop/ # Split-panel layout: sidebar + zoomable canvas preview
mobile/ # Full-screen guided-forms layout
panels/ # Style tab, Design panel, template gallery, Insights tab, extract-CV dialog
sections/ # Section list, drag-to-reorder, per-section forms
shared/, top-bar/ # Header (undo/redo, save indicator, Download PDF)
forms/ # react-hook-form field bindings, rich-text, schemas
preview/
layouts/ # One folder per layout; layout-registry.tsx holds the registered list
layout-registry.tsx # layout id -> definition (the render half of a "template")
engine.ts # Layout descriptors + render pipeline
paginate-document.ts # Multi-page break pass
resume-document.tsx # The paper surface
resume-pdf-page.tsx # The page Puppeteer captures
components/, descriptors/, kit/, helpers/
server/ # Server-side PDF export & Gemini helpers
state/ # Zustand store
The homepage at / is just marketing; the editor itself lives at /editor. On desktop it's a split layout: sidebar form editor on the left, a live pan-and-zoom preview of the actual paper on the right, plus a Style/Insights panel. On mobile it's full-screen guided forms. There's no save button, since every keystroke autosaves.
Downloading a PDF opens /resume-pdf, a plain page that Puppeteer (or Cloudflare Browser Run in production) loads and captures. Before the page loads, the export API drops the draft into sessionStorage under resume-editor:pdf-draft, so the rendering page picks it up from there — no draft data ever touches a query string.
The AI features are thin wrappers around Gemini: importing a PDF extracts its text and asks Gemini to map it into a structured draft, "Improve with AI" sends the current field's HTML plus instructions and gets sanitized HTML back, and the ATS job match endpoint asks Gemini for keywords from a job description and matches them against the current draft on the client.
Contributions make open-source thrive. Whether fixing a typo or adding a feature, all contributions are welcome.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Please read CONTRIBUTING.md before opening a pull request.
Licensed under the GNU Affero General Public License v3.
























