← Back to blog

I Built a CV Generator So I Never Touch Google Docs Again

Every developer I know has five versions of their CV scattered across Google Drive. One is outdated. Two have broken formatting. One is a PDF someone asked for three months ago. And the “real” one? Nobody’s sure which file that is.

Updating a CV shouldn’t require fighting with margin sizes in a word processor. So I built a tool that skips all of that.

What It Does

Head to /cv on this site. Fill in your details — name, experience, skills, education, projects. Hit generate. Get a clean, consistently formatted PDF. Done.

Fill in details
Preview
Download PDF

No account. No login. No templates to wrestle with. You type, you download.

Why Not Just Use Google Docs

Because Google Docs is a general-purpose document editor pretending to be a layout tool. You spend more time nudging bullet points than writing about your actual experience.

Document editors
Formatting breaks when you copy. Different fonts on different machines. "Just a quick tweak" becomes 45 minutes of margin therapy.
Web-based generator
Same output every time. Structured input fields. One click to PDF. Looks identical on every machine.

A CV is structured data. It has sections, dates, lists. Treating it like a freeform document is the wrong abstraction.

How It Works Under the Hood

The entire thing runs client-side. No server. No data leaves your browser.

You fill in an HTML form. The form data renders into a styled HTML template. Then html2pdf.js converts that rendered HTML into a PDF you can download. That’s it.

Here’s the core of the PDF generation:

import html2pdf from "html2pdf.js";

async function generatePdf(element: HTMLElement): Promise<void> {
  const options = {
    margin: [10, 10, 10, 10],
    filename: "resume.pdf",
    image: { type: "jpeg", quality: 0.98 },
    html2canvas: { scale: 2, useCORS: true },
    jsPDF: { unit: "mm", format: "a4", orientation: "portrait" },
  };

  await html2pdf().set(options).from(element).save();
}

You pass it the DOM element containing your rendered CV. It screenshots it with html2canvas, wraps it in a PDF with jsPDF, and triggers a download. The whole library chain is around 200KB gzipped.

The beauty of this approach: you style the CV with regular CSS. No PDF-specific layout language. No coordinate math. Just HTML and CSS doing what they already do well.

One Source of Truth

The real win isn’t the PDF generation. It’s having a single place where your CV lives.

When you get that recruiter message on a Tuesday afternoon and they want your resume “by end of day” — you don’t dig through folders. You go to /cv, check that everything is current, and hit download. Thirty seconds.

When you finish a project worth mentioning, you add it once. When you learn a new technology, you update one list. No syncing between files. No “wait, did I update the PDF version too?”

What’s Coming Next

The next step is LinkedIn integration.

The LinkedIn API lets you pull profile data — work history, education, skills, certifications. The plan is to connect your LinkedIn account and have the generator auto-populate your fields. Your CV stays current without you touching it.

Update LinkedIn
Auto-sync to generator
Always-current CV
Download anytime

You update your experience in one place — LinkedIn, where you’re probably updating it anyway — and the CV follows. No duplicate effort.

Try It

The tool is live at /cv. It’s free, it’s fast, and it doesn’t store your data anywhere.

Stop maintaining five versions of the same document. Have one source of truth, generate a clean PDF when you need it, and spend your time on work that actually matters.


Sources: