If you've ever tried to maintain a polished, job-tailored resume across multiple roles, you know the pain: styling drifts with every regeneration, there's no single source of truth, and swapping layouts means touching every word in your document. A new open-source tool called cv-claw aims to fix that by splitting resumes into structured JSON and visual templates, letting Claude handle both authoring and rendering without ever opening a word processor. The project, posted to Hacker News on May 16 by developer farhan0167, is built as a standalone Python CLI paired with a Claude Agent Skill. The core idea is clean: your resume content lives in a JSON document validated against a fixed schema, while the visual presentation is a plain Jinja2 template backed by CSS. Run cv-claw render and it produces a self-contained HTML file — no browser automation, dev server, or frontend toolchain involved. The skill ships with four tasks that Claude can invoke on demand: ingest (converting a PDF, screenshot, or job posting into structured JSON), tailor (adapting your resume for a specific role), tweak-template (restyling the current layout), and create-template (authoring a new Jinja2 layout from scratch). Because content and template are decoupled, reformatting your resume's look never touches a single word of your actual work history. Describe the aesthetic you want in plain language — "make it minimalist," "add a two-column layout" — and Claude authors the CSS and template to match. Installation is straightforward for anyone already managing Python tools: pip install cv-claw or uv tool install cv-claw. The skill zip can be dropped into ~/.claude/skills/ for use with Claude Code, or imported through the Skills UI on claude.ai and Claude Desktop. For manual CLI work, cv-claw init scaffolds a complete example resume so you have something to start from immediately. The template system supports two discovery roots: bundled templates ship inside the package (the "classic" template is included out of the box), while workspace templates live under .cvclaw/templates/ in your project directory. A workspace template shadows any bundled one of the same name, which is the supported path for forking and customizing a design without modifying cv-claw itself. The classic tree structure includes an entry point HTML file, a CSS file that gets inlined into the rendered output, and optional macro partials for reusable section renderers. JSON schema validation happens at render time — cv-claw validate runs a standalone sanity check before you produce HTML. Each resume JSON carries a template field pointing to its layout; four section types are supported (prose, keyvalue, list, timeline) and dispatched to matching renderers in the template layer. The bundled example exercises every section kind so you can see how each maps when rendered. For PDF export, install with pip install 'cv-claw[pdf]' and use the native backend — otherwise open the HTML file in any browser and use its print dialog. Additional flags let you redirect output to a specific directory, override the template at render time without touching JSON, or point cv-claw at an alternate templates directory entirely.
Key Takeaways
- Resume content (JSON) stays separate from visual design (Jinja2 + CSS), so layout changes never affect your text
- Claude drives both content authoring and template creation through four on-demand skill tasks: ingest, tailor, tweak-template, create-template
- Self-contained HTML output with no browser automation or dev server required; optional native PDF export via pip extra
The Bottom Line
cv-claw solves a real infrastructure gap for developers who live in the terminal — instead of wrestling with Google Docs exports or LaTeX templates, you get a clean separation between what your resume says and how it looks, backed by an AI agent that understands both. If you're already using Claude Code, dropping this into your skills directory is a five-minute setup that pays off every time you apply for a new role.