Skip to content

Repository files navigation

Top Resume

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)

Contents

Features

  • 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.

Tech stack

Project structure

.
├── 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

Getting started

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 dev

Common scripts

Run 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

How it works

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

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.

Contributing

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.

Security

If you discover a security vulnerability, please follow the responsible disclosure process in SECURITY.md rather than opening a public issue.

License

MIT

Releases

Packages

Used by

Contributors

Languages