* fix(fonts): restore legacy local font names via metric-compatible aliases Closes #2989. In v5.0.x the Puppeteer renderer resolved fonts like 'Times New Roman' or 'Arial' through the browser's font stack. The v5.1 migration to @react-pdf/renderer requires every font to be Font.register()-ed; the legacy local-font names were not carried over, so resumes upgraded from v5.0.x had their typography silently replaced with IBM Plex Serif, changing line breaks, page counts and overall layout. This adds a render-time alias layer mapping the old names to metric-compatible web fonts already shipped in the webfont list: Times New Roman → Tinos Cambria → Tinos Arial → Arimo Garamond → EB Garamond Calibri → Source Sans 3 - packages/fonts: - new `legacyFontAliases` map and `resolveLegacyFontAlias` helper. - `getFont` falls back to the alias map when the direct lookup misses, so any caller that asked 'is this a known family?' now answers truthfully for the legacy names. - `getFontDisplayName` is intentionally unchanged: the typography sidebar keeps showing the user's original choice ('Times New Roman'), while the renderer transparently swaps in the alias target. - packages/pdf/use-register-fonts: - `resolvePdfFontFamily` returns the alias target when one applies, so `Font.register` runs against the right web font and templates receive a family name they can actually render. Backwards compatible: families that were never aliased (Roboto, IBM Plex Serif, the standard PDF fonts, ...) take exactly the same code path as before. The CJK glyph fallback added in #2986 / PR #3013 continues to apply on top of the resolved primary family. * fix(fonts): use Carlito (not Source Sans 3) as Calibri alias Per maintainer review feedback: Carlito is metric-compatible with Calibri, while Source Sans 3 only matches visually. Switching gives upgraded resumes the same line widths, line breaks and page counts they had under v5.0.x. - packages/fonts/webfontlist.json: add Carlito (Google Fonts, weights 400/700 + italics) so it's a registerable target. - packages/scripts/fonts/generate.ts: add a getMetricCompatibleFonts helper and merge it into the output, mirroring how Computer Modern fonts are appended. This way regenerating the list (`pnpm generate`) re-emits Carlito automatically and dedupes if it ever enters the Google Fonts popularity slice. - packages/fonts/src/index.ts: alias `Calibri → Carlito`. - packages/fonts/src/index.test.ts: update alias test cases.
Reactive Resume
Reactive Resume is a free and open-source resume builder that simplifies the process of creating, updating, and sharing your resume.
Reactive Resume makes building resumes straightforward. Pick a template, fill in your details, and export to PDF—no account required for basic use. For those who want more control, the entire application can be self-hosted on your own infrastructure.
Built with privacy as a core principle, Reactive Resume gives you complete ownership of your data. The codebase is fully open-source under the MIT license, with no tracking, no ads, and no hidden costs.
Features
Resume Building
- Real-time preview as you type
- Multiple export formats (PDF, JSON, DOCX)
- Drag-and-drop section ordering
- Custom sections for any content type
- Rich text editor with formatting support
Templates
- Professionally designed templates
- A4 and Letter size support
- Customizable colors, fonts, and spacing
- Custom CSS for advanced styling
Privacy & Control
- Self-host on your own infrastructure
- No tracking or analytics by default
- Full data export at any time
- Delete your data permanently with one click
Extras
- AI integration (OpenAI, Google Gemini, Anthropic Claude)
- Multi-language support
- Share resumes via unique links
- Import from JSON Resume format
- Dark mode support
- Passkey and two-factor authentication
Templates
Azurill |
Bronzor |
Chikorita |
Ditto |
Gengar |
Glalie |
Kakuna |
Lapras |
Leafish |
Onyx |
Pikachu |
Rhyhorn |
Ditgar |
Meowth |
Scizor |
Quick Start
The quickest way to run Reactive Resume locally:
# Clone the repository
git clone https://github.com/amruthpillai/reactive-resume.git
cd reactive-resume
# Start all services
docker compose up -d
# Access the app
open http://localhost:3000
For detailed setup instructions, environment configuration, and self-hosting guides, see the documentation.
Tech Stack
| Category | Technology |
|---|---|
| Framework | TanStack Start (React 19, Vite) |
| Runtime | Node.js |
| Language | TypeScript |
| Database | PostgreSQL with Drizzle ORM |
| API | ORPC (Type-safe RPC) |
| Auth | Better Auth |
| Styling | Tailwind CSS |
| UI Components | Radix UI |
| State Management | Zustand + TanStack Query |
Documentation
Comprehensive guides are available at docs.rxresu.me:
| Guide | Description |
|---|---|
| Getting Started | First-time setup and basic usage |
| Self-Hosting | Deploy on your own server |
| Development Setup | Local development environment |
| Project Architecture | Codebase structure and patterns |
| Exporting Your Resume | PDF and JSON export options |
Self-Hosting
Reactive Resume can be self-hosted using Docker. The stack includes:
- PostgreSQL — Database for storing user data and resumes
- SeaweedFS (optional) — S3-compatible storage for file uploads
From v5.1.0 onwards — PDF generation now runs entirely client-side via
@react-pdf/renderer. New deployments no longer require Browserless, Chromium, or any external print service as a dependency. ThePRINTER_*andBROWSERLESS_*environment variables are no longer read and can be removed from your.env.
Pull the latest image from Docker Hub or GitHub Container Registry:
# Docker Hub
docker pull amruthpillai/reactive-resume:latest
# GitHub Container Registry
docker pull ghcr.io/amruthpillai/reactive-resume:latest
See the self-hosting guide for complete instructions.
Support
Reactive Resume is and always will be free and open-source. If it has helped you land a job or saved you time, please consider supporting continued development:
Other ways to support:
- Star this repository
- Report bugs and suggest features
- Improve documentation
- Help with translations
Star History
Contributing
Contributions make open-source thrive. Whether fixing a typo or adding a feature, all contributions are welcome.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
See the development setup guide for detailed instructions on how to set up the project locally.
License
MIT — do whatever you want with it.














