Jonas ForshellSenior Product Owner
jonas@jforshell.seEmail me
LiveCase · Own build

Resume Builder, structured content and reliable PDF exports

A structured CV editor that keeps reusable content separate from layout, using fast HTML previews during editing and rendered PDF checks before export.

Context
Personal CV document tool
Role
Product Owner
Date
May 2026

The short version

The problem
Keeping a CV current is mostly selecting and reshaping content, and normal editors mix content with layout.
What I did
Built an editor that stores CV content as structured data, separate from the final document layout.
What it was worth
In production. Every CV in my own job search comes out of it, and a few friends use it too.
The call
Fast preview while writing, exact PDF check at the end. Accuracy when it matters, speed the rest of the time.

Easier to watch than to describe

Nine screens, no sound, forty seconds. The editor on the left, the live document on the right, and the same header carried into the cover letter.

Recorded from the running app on a demo account, so nothing in it is real CV data.

Try it yourself

Resume Builder personal details and intro panels on the left, with the rendered CV for Jordan Sample on the right
The editor keeps CV data separate from the final document layout.

The problem

Most of the work involved in maintaining a CV is not writing everything from scratch. It is selecting relevant content, adjusting emphasis and keeping the finished document consistent.

Traditional document editors combine content and layout. Small changes can create formatting work elsewhere. Dates move, sections split badly and content has to be copied between different versions.

I wanted the underlying information to remain stable while the final document could change around it.

This is an AI build. Claude and Codex wrote essentially all the code. The data model, the scope, the trade-offs and the testing are mine.

Structured content before layout

The central design decision was to treat the CV as structured data before treating it as a document.

Personal details, summaries, employment history, education, skills, saved roles, and reusable bullet points are stored separately from the final layout. A template decides how that information is presented, but changing the template does not change the underlying content.

This makes reuse practical. I can save a role once, select it for another CV and adjust it without starting again. Individual bullet points can sit in a Bullet Bank instead of being copied between old files.

The data model places some boundaries on the templates. That is intentional. Supporting every possible document layout would make both the editor and the content structure harder to use.

Resume Builder experience panel expanded with job title, company, dates, role summary and bullet points, with education and skills panels collapsed below it
Employment history, education, skills, and reusable bullets remain editable independently of the template.
Resume Builder document settings showing four CV structure presets, Standard CV, Career pivot, Early career and European balanced, each with its own section order
Templates can change while the structured content remains stable. Structure presets change the order the story is told in, not the underlying data.

Fast preview versus exact pagination

The editor needed to show changes quickly while I was writing, but the final PDF also needed predictable pagination. Those requirements are not identical.

The HTML preview updates immediately in the browser, but it does not always paginate exactly like the final PDF renderer. Most of the time the result is very close. Near a page boundary, however, a CV that appears to fit on two pages in the live preview can become three pages when rendered as a PDF.

The most accurate alternative would be to generate a new PDF after every edit. That would reduce uncertainty, but it would also slow the interface, add latency and repeatedly invoke server-side rendering on Vercel while the document was still changing.

I chose a two-stage model.

  1. A fast HTML preview while writing and restructuring the content.
  2. A rendered PDF check when the document is close to finished.

The final download uses the same PDF pipeline as the rendered check.

This accepts a small amount of temporary uncertainty during editing in exchange for a faster interface and fewer unnecessary PDF renders. Accuracy is available when it matters without slowing every edit.

Resume Builder preview expanded to fill the workspace, with render PDF, check PDF and download controls above it
The preview can take the full workspace for the final pass, with the rendered PDF check one click away.

Deliberate scope

The product is not intended to be a general document editor, job tracker or recruitment platform. Its purpose is narrower. It manages reusable CV content and turns it into a clean final document.

The templates are restrained rather than decorative. Import creates a draft that still requires review because pasted and extracted document content is rarely reliable enough to accept without checking.

These boundaries make the tool less flexible than a general editor, but more coherent for the workflow it supports.

Current functionality

The application supports multiple CV tabs, archived versions, reusable personal details, saved experience entries, and a Bullet Bank.

It also includes cover letters, template switching, spacing controls, PDF checks, JSON backups, pasted-text imports, and signed-in workspace synchronisation.

Resume Builder education panel expanded with degree, school, year, location and details fields, skills panel collapsed below it
Education entries carry the same structured fields as experience, so they format consistently without manual tidying.
Resume Builder skills panel with two named skill groups, Product and Execution, each a comma-separated list
Skills sit in named groups, Product and Execution here, so a long list stays scannable instead of becoming one block.
Resume Builder Bullet Bank showing saved bullets with search, language, source role and tag filters, and controls to insert or copy each one
The Bullet Bank keeps reusable bullets searchable by role, tag and language, so a line written once can be inserted into another CV.
Resume Builder cover letter editor with the letter body on the left and the rendered cover letter on the right, sharing the resume header
The cover letter reuses the resume header, so the two documents cannot drift apart.

What the project demonstrates

The useful part of the project is the work across several boundaries. It sits between structured data and document layout, immediate feedback and exact rendering, flexibility and a manageable data model, local browser state and signed-in persistence, convenient import and trustworthy content, useful functionality and unnecessary scope.

I use the tool repeatedly for my own CVs. That continued use exposes small workflow problems and gives me a practical basis for deciding what to improve and what to leave out.

The result is a focused tool built around one real workflow, including the compromises that workflow requires.