Open-source project
LiuMengxuan04/vibe-resume avatar
LiuMengxuan04/vibe-resume

VibeResume: an HTML resume template that AI edits and Chromium exports to PDF

make your resume by vibe-coding!

629 stars49 forksHTMLMIT

At a glance

What is it?
VibeResume keeps a resume as HTML and CSS, lets an AI agent rewrite those files, and exports a fixed-layout PDF through a Chromium script instead of the browser print dialog. Here is the mechanism, the install path, and where it breaks.
Who is it for?
Adopt VibeResume if you already work in a terminal, want your resume under Git, and intend to let an AI agent edit index.html and styles.css directly. Skip it if you need a visual drag-and-drop editor, or if your environment blocks headless Chromium, because the README states that CHROME_PATH selects a browser but cannot bypass a system sandbox.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 31 days ago.
What is it written in?
Mainly HTML, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 1, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What VibeResume replaces, and who it is aimed at

The README frames the problem in three parts: AI tools edit Word and PDF files badly, a page that looks correct in a browser can shift once it goes through print-to-PDF, and tailoring a resume per job posting rarely produces a repeatable loop. VibeResume answers by treating the web page as the source file, the AI as the editor, and the PDF as a build artifact. Content, layout, icons and links live in static HTML and CSS, which means Git diffs work the way they do on any other code.

The intended user is a candidate who is comfortable running npm scripts and who wants an AI agent to do the layout work. The repository ships three templates split across two categories. Under templates/internship-employment/ there is a standard-one-page template for candidates with less experience, and a dense-two-page template aimed at people with algorithm, AI agent, infrastructure, research or open source material to show. Under templates/research-application/ there is research-classic, described as a continuous long page in a classic academic style, intended for PhD applications, research internships and research assistant roles. If you want a form-based editor with drag handles, this is the wrong shape of tool.

How the export pipeline actually works

The export entry point is export-pdf.sh at the repository root, and package.json wires npm scripts to scripts/export-pdf.mjs with an output path and a template HTML path. The exporter drives Chromium through playwright-core and renders the page using the screen layout rather than a print stylesheet. That choice is the whole point: the README states the project avoids manual browser printing precisely because paper margins, pagination, scaling and @media print differences are not under its control.

Page handling differs by template. The one-page template measures the .page element dynamically. The two-page template looks for .resume-page elements and exports them page by page. The README notes that deleting the second .resume-page from the dense template makes the same exporter produce a single-page PDF, so page count is a property of the markup rather than of a script flag.

There is a text-layer check in the exporter. The README describes a failure mode where a Chromium version mismatch produces a PDF containing only backgrounds, borders and images with no body text; when that happens the exporter inspects the PDF text drawing instructions, deletes the invalid file, and returns an error instead of reporting success. That check is the most interesting design decision in the repository, because it turns a silent, hard-to-notice output defect into a failed command.

Installing VibeResume and exporting your first PDF

The README requires Node.js 18 or newer, which package.json also declares under engines. Install dependencies from the repository root:

bash
npm install

Start the local preview server:

bash
npm run preview

That script runs python3 -m http.server 4173, so the preview depends on a system Python 3 rather than on a Node dev server. Open http://localhost:4173 in a browser to see the template.

Export the default one-page template:

bash
npm run export:pdf

The README gives export/vibe-resume-demo.pdf as the default output. The other scripts follow the same pattern: npm run export:pdf:dense-two-page writes export/vibe-resume-dense-two-page-demo.pdf, and npm run export:pdf:research-classic writes export/vibe-resume-research-classic-demo.pdf. You can also call the shell script directly with your own path, or with a path plus a template:

bash
./export-pdf.sh export/my-resume.pdf templates/internship-employment/dense-two-page/index.html

If the script cannot find a browser, the README shows CHROME_PATH being set before the same command, and warns that a system Chrome newer than the pinned playwright-core version can be the cause of the missing-text PDF. It also states that filenames should avoid shell special characters such as *, even when quoted.

Editing the resume through the bundled agent skill

The repository includes a Codex-style skill at skills/vibe-resume-editor/SKILL.md. The README installs it by copying the directory into a local Codex skills folder:

bash
mkdir -p ~/.codex/skills
cp -R skills/vibe-resume-editor ~/.codex/skills/

After that, a new Codex session can be asked to use the skill to rewrite the resume and export a one-page PDF. For tools that do not support Codex skills, the README suggests pasting the contents of SKILL.md into the conversation as project context.

The recommended loop is: describe the target role, company, language and experience to the AI; have it replace the mock content in index.html; have it adjust density, font size, width, spacing, icons and section order in styles.css; preview in the browser or send a screenshot back for another pass; then run the export script and check that the PDF is still one page with nothing dropped. The README supplies a sample prompt that asks for an AI agent internship resume, one page, emphasising tool calling, RAG, agent runtime, evaluation and engineering practice, with an instruction not to invent experience. Repeating this per job description is how the project expects you to produce multiple role-specific versions.

Where the workflow breaks down

Sandboxed environments are the clearest limitation. The README states that in Codex, CI, containers or other restricted environments Chromium may fail to start, producing Permission denied, MachPortRendezvousServer, or a browser that closes immediately. The exporter translates those logs into hints, but the documented remedy is to run ./export-pdf.sh in a local terminal or to grant the environment permission to launch a headless browser. Setting CHROME_PATH only selects a browser; per the README it does not bypass the system sandbox. If your only machine is a locked-down work laptop, that is a real obstacle.

Browser version drift is the second failure mode. The README recommends preferring the Playwright Chromium that matches the installed playwright-core version, because a newer system Chrome can produce a PDF with no text. The text-layer check catches this, but it catches it as an error rather than as a fix, so you may need to unset CHROME_PATH and let the exporter pick from the Playwright cache.

Page count is manual. Nothing in the README describes automatic reflow or content trimming when your text overflows; the documented loop ends with the human checking whether the PDF is still one page. And the content is mock by default: fabricated names, schools, phone numbers, awards, internship roles and dates, an AI-generated avatar at assets/avatar.png, and dense-template entries labelled Mock. The research-classic template ships a Southeast University emblem as an example that the README tells you to replace or delete. None of that is usable in a real application without replacement.

VibeResume compared with LaTeX and with a visual builder

The obvious alternative for a version-controlled resume is LaTeX, or a template built on it. The difference is in what the AI has to manipulate. A LaTeX resume is compiled by a TeX distribution, and an agent editing it works against macro syntax, package behaviour and compile errors. VibeResume keeps the source as HTML and CSS, which is the format most language models have seen the most of, and the renderer is Chromium, so what the preview shows is close to what the exporter captures. The trade-off runs the other way too: LaTeX gives you decades of typographic defaults and a compile step that fails loudly on bad markup, while VibeResume's fidelity depends on a specific Chromium build, which is exactly why the project pins playwright-core and ships a text-layer check.

Against a visual builder, the difference is ownership. A builder gives you a drag-and-drop canvas and stores your resume in its own format; VibeResume gives you two files you can diff, branch and revert, and a shell script you run yourself. The README also positions the project inside a three-part pipeline with two related repositories, shushu-internship-tool for planning and building a project to write about, and shushu-internship-resume-optimizer for turning project evidence into resume bullets. VibeResume covers the last step only: page layout and PDF output. It does not audit your experience or check your claims.

Licence, upgrade cost and what to verify first

The repository is MIT licensed, with the LICENSE file at the root and the licence declared in package.json. For a resume template that means you can modify, reuse and redistribute the HTML, CSS and scripts, including commercially, provided the licence terms are honoured. That is a statement about the licence text, not legal advice; if you redistribute the templates, read the file yourself.

Upgrade surface is small and mostly pinned. package.json lists two runtime dependencies, @lobehub/icons and playwright-core, plus a sync:logos script at scripts/sync-lobe-icons.mjs, and a test script that runs node --test against the test/ directory. The main upgrade risk is the Chromium pairing described in the README: a system browser that drifts ahead of playwright-core can break text rendering, so pinning and re-running the export after any dependency bump is the practical check.

The README's own warning is worth repeating as a boundary: the browser is for preview only, and the final PDF must come from the project's export script. If you produce the deliverable through the browser print dialog, you have bypassed the text-layer check and the page measurement logic, and you are back to the problem the project was built to avoid.

Editorial conclusion

Adopt VibeResume if you already work in a terminal, want your resume under Git, and intend to let an AI agent edit index.html and styles.css directly. Skip it if you need a visual drag-and-drop editor, or if your environment blocks headless Chromium, because the README states that CHROME_PATH selects a browser but cannot bypass a system sandbox. Before trusting it with a real application, run npm install, npm run preview, and npm run export:pdf, then open the PDF and confirm the text layer is present rather than only backgrounds and images. The repository's own mock content, including the avatar and the labelled Mock internship entries, must be replaced before you send anything out.

Frequently asked questions

Is vibe coding good for a resume?

VibeResume is built on the premise that it works well for layout, because the AI edits index.html and styles.css directly and the export script turns the result into a PDF. The README's sample prompt still tells the AI not to invent experience, so content accuracy remains your responsibility.

Can ChatGPT make me a resume with VibeResume?

The repository ships a Codex-style skill at skills/vibe-resume-editor/SKILL.md, and the README says that if your AI tool does not support Codex skills you can paste the contents of SKILL.md into the conversation as project context. Any assistant that can edit files in the repository can then follow the documented loop.

How do I get a PDF out of a VibeResume template?

Run npm install, then npm run export:pdf, which the README says writes export/vibe-resume-demo.pdf. Separate scripts cover the dense two-page and research-classic templates, and ./export-pdf.sh accepts a custom output path and template HTML.

Why does my exported VibeResume PDF have no text?

The README attributes this to a Chromium version mismatch, where a system Chrome newer than the pinned playwright-core produces a PDF containing only backgrounds, borders and images. The exporter detects it, deletes the invalid file and returns an error; unset CHROME_PATH so the Playwright cache is used instead.

Does VibeResume work in a container or CI environment?

Not reliably. The README states that Chromium may fail to start under sandbox policies, showing Permission denied or MachPortRendezvousServer errors, and that CHROME_PATH selects a browser but cannot bypass the system sandbox. Running ./export-pdf.sh in a local terminal is the documented workaround.

Can I use the VibeResume template content as my own resume?

No. The README states that names, schools, phone numbers, emails, awards, internship roles, project descriptions, dates and skills are all fictional mock data, that assets/avatar.png is an AI-generated image, and that the dense two-page template's company entries are explicitly labelled as mock.

Official sources

  1. Issues
  2. License: MIT
  3. LiuMengxuan04/vibe-resume on GitHub
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/liumengxuan04-vibe-resume.svg)](https://hysenlabs.com/projects/liumengxuan04-vibe-resume)