Binary Semaphore

Resume

Featured

A resume builder where the preview is the PDF: same pagination, same page breaks, no surprises on export.

Open Resume
Next.jsSupabasePDFTemplates

What you see paginated is what you export.

Free. Your data stays in your account.

Overview

Most browser-based resume builders show you a preview that is roughly what you will get. Then you export, and a bullet is cut in half across the page break, or a section heading is stranded alone at the bottom of page one. The preview and the exporter were two different pieces of code that agreed on the styling and disagreed on the math.

This one shares the math. The on-screen preview and the print document run the same pagination module, so a break in the preview is a break in the PDF, in the same place, every time. You draft on the left, watch the paginated pages on the right at true print size, and export what you already looked at.

It is free, it runs in the browser, and your resumes live in your own account. Sign in with GitHub or Google, pick from 21 templates, write with rich text where it helps, and download a PDF when you are done.

At a glance

Type
Web app, free
Live at
resume.binarysemaphore.com
Frontend
Next.js 16 · React 19 · Tailwind v4
Backend
Supabase (Postgres + Auth, RLS)
Auth
GitHub and Google OAuth
Export
puppeteer-core + @sparticuz/chromium
Templates
21
Hosting
Vercel

How it works

  1. Sign in

    GitHub or Google OAuth through Supabase Auth. Row-level security scopes every read and write to your account, so the database itself enforces the boundary rather than the application remembering to.

  2. Draft side by side

    The editor holds the content; the paper beside it renders at true print size. Rich text is supported where a resume actually needs it, and templates change the presentation without touching what you wrote.

  3. Paginate honestly

    The preview measures the laid-out document and slices it into pages at safe boundaries: between two lines of a paragraph, never through one, and never leaving a heading alone at the foot of a page.

  4. Export

    A serverless function opens the chrome-free print route in headless Chromium, carrying your session so it renders your document, and streams back a PDF as a direct download with no browser print dialog.

Capabilities

01One pagination module, two renderers

The preview and the print page import the same pure-DOM measurement code. That is the whole trick behind WYSIWYG here: there is no second implementation to drift out of agreement with the first.

02Breaks between lines, not through them

Most page-break logic works on block boundaries, which is why a five-line bullet either overflows or jumps wholesale to the next page. This measures the individual client rects of a block's text, merging the fragments a bold or a link splits a line into, so a break can land between line three and line four of one bullet.

03Headings keep their content

Section labels and entry titles are marked keep-with-next, so a page never ends with a heading whose content starts overleaf. It is a small rule that separates a document that looks typeset from one that looks generated.

04PDF export inside the size limit

Headless Chromium does not fit in a serverless bundle by default. The build ships brotli-compressed binaries via @sparticuz/chromium and runs on the Node runtime with a longer duration, so a cold start still renders. Locally it drives your installed Chrome instead.

05Export that fails loudly

The renderer authenticates by forwarding the caller's cookies, and the target host is validated before Chromium is ever pointed at it. If the forwarded session does not authenticate, the print page redirects to login, and the route returns an error rather than handing you a PDF of a login screen.

06Templates without lock-in

21 templates sit on top of one content model, so switching template is a presentation change and never a rewrite. Content stays yours in Supabase, scoped to your account.

Want to try it?

Resume is live and free to use.

resume.binarysemaphore.com