A block-based resume builder. Compose your resume out of reorderable content blocks, style it with themes and rich text, and export a pixel-accurate PDF straight from the page. Sign in once and your resume autosaves to your account and follows you across devices.
Live: topresume.me (marketing + docs) · app.topresume.me (the builder)
- Features
- Tech stack
- Project structure
- Getting started
- Environment variables
- How it works
- Releases
- Contributing
- Security
- License
- Block-based editor — build your resume from draggable blocks (Work Experience, Education, custom sections). Blocks can be full-width or split into left/right halves for a two-column layout.
- Rich text per element — headings, bullet/numbered lists, bold, italic, subscript/superscript, and one-click case transforms (UPPERCASE, lowercase, Capitalize Each Word).
- Per-element typography — override the font family and size on any element, or reset back to the theme default at any time.
- Optional dates — attach a right-aligned date/date-range to any entry, baseline-aligned with the first line of content.
- Themes — several ready-made looks (Minimal, Classic Serif, Modern Sidebar, Creative Gradient, Bold Geometric, Doctor, Minecraft) with distinct fonts, accent colors, and page backgrounds.
- Google Fonts — a curated font list is loaded on demand as you use it.
- Photo + contact header — upload a photo and manage links/contact details.
- WYSIWYG PDF export — "Download PDF" prints the live preview through the browser, so the PDF matches exactly what you see (selectable, searchable text).
- Accounts & autosave — sign in with email/password, Google, or Apple (Better Auth); every edit autosaves to a per-user Postgres row on Neon.
- Photo storage — photos are downscaled client-side and stored in Vercel Blob, access-scoped to your account.
- Next.js 16 (App Router) + React 19
- Tailwind CSS v4
- Tiptap v3 for rich text editing
- dnd-kit for drag-and-drop reordering
- docx for Word export; browser print for PDF
- Better Auth + Drizzle on Neon Postgres; Vercel Blob for photos
- Motion + Lenis for the marketing site's scroll animations
- Turborepo + bun for the monorepo
.
├── apps/
│ ├── web/ # The builder app → app.topresume.me
│ │ ├── app/ # App Router entry, auth routes, global + print CSS
│ │ ├── components/resume/ # Editor UI, preview, toolbars, pickers
│ │ └── lib/ # Resume state/themes/exports, auth, db
│ └── site/ # Marketing + docs site → topresume.me
│ ├── app/ # Landing page and /docs pages
│ └── components/ # Hero, reveals, smooth scroll, docs nav
└── packages/
├── ui/ # Shared UI component library (@workspace/ui)
├── eslint-config/ # Shared ESLint config
└── typescript-config/ # Shared tsconfig bases
Prerequisites: bun 1.3+ and Node.js >=20.
# Install dependencies
bun install
# Configure the builder app (database, auth, blob storage)
cp apps/web/.env.example apps/web/.env.local # then fill in the values
# Start the dev servers (web → :3000, site → :3001)
bun devRun from the repo root (they fan out through Turborepo):
| Command | Description |
|---|---|
bun dev |
Start the development server |
bun run build |
Production build |
bun run lint |
Lint all packages |
bun run format |
Format with Prettier |
bun typecheck |
Type-check all packages |
The entire resume lives in a single ResumeData object managed by a reducer
(lib/resume/reducer.ts) and autosaved to a per-user row in Postgres. The
on-screen preview (components/resume/resume-preview.tsx) renders that state
into paginated A4 pages. PDF export doesn't reconstruct the document — it
prints the live preview via a print stylesheet (app/resume-print.css), which
is why the output matches the editor exactly.
Releases are automated with GitHub Actions: run Prepare release from the
Actions tab with a version (e.g. 0.5.0 or 0.5.0-alpha.1), merge the PR it
opens, and Publish release tags and publishes the GitHub Release —
-alpha/-beta/-rc versions are flagged as pre-releases automatically.
Contributions are welcome. Please read our
Code of Conduct and the versioning policy
before opening a pull request. Run bun run lint and bun typecheck before
submitting.
If you discover a security vulnerability, please follow the responsible disclosure process in SECURITY.md rather than opening a public issue.