Tailor your resume to any job in minutes.
Paste a job link and AI rewrites your resume to match — surfacing your real experience and the right keywords. An AI interview builds your profile; pick from 65 templates; export a clean, ATS-friendly PDF. Free, open-source, and your data never leaves your browser.
Website · Try it · Report a bug · @sardorml
- Free & open-source LLM — runs on Groq's free tier (Llama 3.3 70B for reasoning, Llama 3.1 8B for fast tasks; any Groq-hosted open model works). No credit card.
- Private — your resume lives in your browser (
localStorage). There's no database and no account; text is only sent to the LLM to be rewritten. - ATS-friendly PDFs — real selectable text via Typst, with 65 templates and a live preview.
Prerequisites: Node ≥ 22.11 (the repo pins 22.13 in .node-version) and pnpm 10.
pnpm install
# Get a FREE Groq API key (no credit card): https://console.groq.com/keys
cp .env.example .env.local
# then paste your key into GROQ_API_KEY=
pnpm dev # http://localhost:3000Verify your key works: open http://localhost:3000/api/health?ping=1 — it should return {"ok":true,...}.
| Command | Description |
|---|---|
pnpm dev |
Dev server |
pnpm build / pnpm start |
Production build / serve |
pnpm typecheck |
tsc --noEmit |
pnpm lint |
ESLint |
pnpm test / pnpm test:watch |
Vitest (schema + PDF render tests) |
pnpm thumbs |
Regenerate template thumbnails into public/thumbs/ |
flowchart TD
U["Upload PDF/DOCX"] -->|"POST /api/parse → LLM"| R(["JSON Resume<br/>in-browser · Zustand + localStorage"])
IV["AI interview"] -->|"POST /api/interview → LLM"| R
J["Job link / paste"] -->|"POST /api/job"| E["Jina Reader → Readability → paste"]
E -->|"LLM"| Q["Job requirements"]
R --> T["POST /api/tailor → LLM"]
Q --> T
T --> O["Tailored resume<br/>+ honest match report"]
O --> P["Pick a template"] --> V["Live Typst SVG preview"] --> D["Download PDF<br/>POST /api/render → Typst"]
- Stack: Next.js 16 (App Router) · React 19 · TypeScript · Ant Design v6 · Zustand (
persist). - Data model: JSON Resume (
src/lib/resume/schema.ts), validated with Zod. - LLM: thin Groq wrapper in
src/lib/llm/provider.ts(swap the model viaGROQ_MODEL/GROQ_MODEL_FAST). Every LLM response is re-validated with Zod — raw output is never trusted. - Job ingest:
src/lib/job/extract.tstries Jina Reader first, then Mozilla Readability, then falls back to pasted text (LinkedIn/Indeed often block bots). - Templates:
src/templates/<id>/are Typst templates (65, mostly Typst Universe@previewCV packages). Each has anadapter.ts(maps the resume → the template's input JSON), aresume.typ(entry point), and ameta.json; these are generated intosrc/templates/registry.ts. PDFs are compiled server-side via@myriaddreamin/typst-ts-node-compilerinPOST /api/render. The live preview uses the same engine rendered to SVG so it's pixel-identical to the export. - Truthfulness: the tailoring prompt only rephrases/reorders your real content and reports gaps honestly — it never invents employers, dates, or skills.
Create src/templates/<id>/{adapter.ts,resume.typ,meta.json}, then run node scripts/build-registry.mjs to
regenerate the registry. Verify one with npx tsx scripts/verify-template.mjs <id> (or all with
scripts/verify-all.mjs), and regenerate thumbnails with pnpm thumbs. See CLAUDE.md for the full details.
The repo ships a Render Blueprint (render.yaml):
- Push to GitHub.
- In the Render dashboard: New + → Blueprint, connect the repo.
- Set the
GROQ_API_KEYenvironment variable (and optionallyNEXT_PUBLIC_SITE_URLfor canonical SEO/Open-Graph URLs). - Deploy.
Render's free tier (512 MB RAM, spins down after ~15 min idle) is enough for personal use. The Typst PDF compiler is a native addon warmed at boot, so it's best suited to a long-running Node server rather than a serverless/edge host.
- Groq's free tier is rate-limited (per-minute/day). The UI surfaces a friendly message on 429s;
wait a moment and retry. You can point
GROQ_MODELat any Groq-hosted open model. - Some job sites block automated reading — use the paste fallback in the Tailor tab.
MIT © Sardor Mamadaliev.
Bundled third-party assets keep their own licenses: the swe and vantage templates are MIT
(see their LICENSE files), the Font Awesome Free icon fonts in src/templates/_fonts/ are SIL OFL 1.1
(OFL.txt), PT Sans in src/templates/vantage/fonts/ is SIL OFL 1.1, and the remaining templates wrap
their respective Typst Universe @preview packages under each package's own license.