Reactive Resume: A Self-Hosted Resume Builder That Keeps PDF Export Client-Side
Reactive Resume is a self-hosted resume builder with editable layouts, PDF export, import tools, and privacy-focused local control.
At a glance
- What is it?
- Reactive Resume is an open-source, self-hosted resume builder with live preview, PDF export, and import tools. Its v5.2 releases drop external print services entirely, which changes the deployment calculus for privacy-focused users.
- Who is it for?
- Adopt Reactive Resume if you want a self-hosted resume builder with no external print service and full data control. Skip it if you need a native desktop app or if your team expects a managed SaaS with guaranteed uptime.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What Reactive Resume Actually Solves
The target user is a developer or a privacy-conscious professional who wants a resume builder that lives on their own server. It is not for someone who wants a zero-setup web service. The project's homepage and README emphasize no tracking, no ads, and no hidden costs, which are direct contrasts to commercial resume builders. If you are already comfortable with Docker and PostgreSQL, Reactive Resume removes the trade-off between convenience and control.
How the Architecture Shapes the Experience
The tech stack is modern and TypeScript-heavy. The framework is TanStack Start, which runs on React 19 and Vite. The database is PostgreSQL with Drizzle ORM. The API layer uses ORPC, which the README describes as type-safe RPC. Auth is handled by Better Auth, and state management uses Zustand plus TanStack Query. This combination suggests a codebase that prioritizes type safety from the database to the API to the client. For a resume builder, that is a reasonable choice because the data model is mostly structured: sections, entries, and style rules. The client-side PDF generation is the most consequential architectural decision. By using @react-pdf/renderer, the app renders PDFs in the browser, which means no server-side rendering bottleneck and no extra service to maintain. The trade-off is that PDF output depends on the user's browser engine, so two different browsers might produce slightly different PDFs. The README does not mention this caveat, but it is a logical consequence of client-side rendering.
Getting It Running: Docker and Beyond
The quick start is straightforward. You clone the repository with git clone --depth=1, then run docker compose up -d, and access the app at localhost:3000. That command starts all services, which includes PostgreSQL and the application itself. For a permanent deployment, you pull the image from Docker Hub or GitHub Container Registry. The README gives two pull commands: docker pull amruthpillai/reactive-resume:latest and docker pull ghcr.io/amruthpillai/reactive-resume:latest. The self-hosting guide at docs.rxresu.me provides complete instructions, but the README already tells you that SeaweedFS is optional, for S3-compatible file uploads. If you are migrating from a pre-v5.1.0 deployment, the release note says you can remove the PRINTER_* and BROWSERLESS_* environment variables from your .env. That is a concrete upgrade step that simplifies your configuration. The documentation also lists a development setup guide, so you can run it without Docker if you prefer a local Node.js environment.
Templates and Customization: More Than Skins
Reactive Resume ships with 15 templates, named after Pokémon characters like Azurill, Bronzor, and Pikachu. That naming is a lighthearted touch, but the customization goes deeper. You can choose A4 or Letter page sizes, and adjust colors, fonts, and spacing. The README mentions Structured Style Rules for section and text styling, which suggests you can define style rules at a granular level, not just pick a theme. There is also drag-and-drop section ordering and custom sections for any content type. The rich text editor handles free-form descriptions. For a resume builder, this level of control matters because a template that looks good with your content might not work for someone with a two-page publication list. The trade-off is that more customization options mean more time fiddling with styles instead of writing content. The live preview as you type is a standard feature, but it is essential here because the style rules can change layout in non-obvious ways.
Import, Export, and Sharing: The Data Flow
The README lists multiple export formats: PDF, JSON, and DOCX. PDF is the primary output, and JSON export is useful for backup or migration. The import side includes JSON Resume format, which is a community standard. That is a practical feature because it lets you move from another tool without retyping everything. Sharing is done via unique links, which presumably generate a public view of your resume. The README does not specify whether those links are password-protected or time-limited, so you should check the docs if that matters. The data flow is straightforward: you enter data, the app stores it in PostgreSQL, and when you export, the client-side renderer produces the PDF. The JSON export gives you a portable copy of your data, which aligns with the privacy focus. The one-click permanent data deletion is a strong statement, but the README does not explain the mechanism, so verify it in the docs before trusting it with sensitive data.
AI Integration: A Feature With Strings Attached
Reactive Resume supports AI integration with OpenAI, Google Gemini, and Anthropic Claude. The README lists this under Extras, not core features. That distinction is telling. The AI features likely help with writing bullet points or generating summaries, but the README does not describe the exact functionality. What is clear is that you need an API key from one of those providers, which means an ongoing cost and a potential privacy leak. If you are self-hosting for privacy, sending your resume content to a third-party AI API might contradict that goal. The README does not state whether the AI calls are made client-side or server-side, but either way, your data leaves your infrastructure. This is a feature to evaluate carefully. For a resume builder, AI assistance can save time, but the trade-off between convenience and data control is real. The documentation likely has more details, but the README alone is enough to raise the concern.
Limitations and Wrong Tool Scenarios
The most obvious limitation is that PDF export is client-side. That means the quality of your PDF depends on the browser you use. In a headless environment or an older browser, the output could differ. The README does not promise pixel-perfect PDFs, so you should test on your target browser. Another limitation is that the project requires PostgreSQL. If you are used to SQLite or MySQL, you need to run a PostgreSQL instance, which adds operational overhead. The optional SeaweedFS for file uploads is another moving part if you need it. For wrong tool scenarios: if you want a resume builder that works offline as a desktop app, this is not it. It is a web app, so you need a browser and a server. If you want a managed service with no maintenance, the hosted version at rxresu.me exists, but the README does not clarify whether that hosted version is free or has limitations. For a team that needs to generate resumes at scale, the client-side PDF rendering might be a bottleneck, since each user's browser does the work, not a central server.
Alternatives: What Else Is Out There
A direct alternative is JSON Resume, which is a standard for resume data. JSON Resume is not a builder; it is a schema and a set of tools. You write your resume in a JSON file and use a theme to render it. Reactive Resume can import from JSON Resume format, so the two are complementary. But if you want a pure data-driven approach, JSON Resume gives you full control over your data without a database or a web server. Another alternative is a static site generator like Hugo with a resume theme, where you keep your resume in Markdown and generate HTML or PDF via a build pipeline. That approach has no runtime dependencies, no database, and no login system. The trade-off is that you lose the live preview and drag-and-drop editing. For a technical user, that might be acceptable. The difference is that Reactive Resume is an interactive application, while JSON Resume and static generators are more like file formats and build tools. If you want to edit your resume on your phone, Reactive Resume's web interface beats editing a JSON file.
Maintenance Cost and License Implications
The project is under the MIT license, which is permissive. You can use, modify, and distribute it, even commercially, as long as you include the original copyright notice. There is no copyleft obligation, so you can fork it and keep your changes private. That is a low-license-risk choice for a company that wants to embed a resume builder in a product. The maintenance cost is moderate. The project is actively developed, with releases every few days in August 2026 (v5.2.7, v5.2.8, v5.2.9). That means you need to track updates for security fixes. The Docker image is easy to update, but you also need to maintain PostgreSQL and possibly SeaweedFS. The README says sponsors pay for hosting and maintenance, which suggests the core project is stable, but you are on your own for your deployment. The client-side PDF rendering reduces the maintenance burden compared to older versions, but you still need to update the app regularly to get bug fixes. The documentation includes an architecture guide, which helps if you need to modify the code.
Editorial conclusion
Adopt Reactive Resume if you want a self-hosted resume builder with no external print service and full data control. Skip it if you need a native desktop app or if your team expects a managed SaaS with guaranteed uptime. Before deploying, verify your Docker and PostgreSQL versions against the docs, test PDF rendering in your target browser, and confirm that the AI features work with your chosen provider's API limits. The v5.2 release notes are clear: PDF generation is now client-side, so your infrastructure is simpler, but your browser's rendering engine becomes part of the output pipeline.
Community notes