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.
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.
Formatting breaks when you copy. Different fonts on different machines. "Just a quick tweak" becomes 45 minutes of margin therapy.
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.
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:
- html2pdf.js — client-side HTML to PDF generation
- LinkedIn API — LinkedIn profile data API documentation