* feat(import): add LinkedIn data export as a resume import source LinkedIn's "Get a copy of your data" export ships a ZIP of per-topic CSVs (Profile, Positions, Education, Skills, Languages, Certifications). Reading these directly gives structured data without needing a connected AI provider, unlike the existing PDF/DOCX import path. Also fixes a latent bug found while building this: parseJSONResume (and the new LinkedIn parser) built their result via a shallow spread of the shared `defaultResumeData` singleton, so assigning into `result.sections.x` mutated that singleton in place and leaked section data into the next unrelated import call in the same process. Both now start from a structuredClone. * fix(import): escape LinkedIn text, harden zip parsing and date handling Move escapeHtml and toHtml from the plain-text importer into html.ts and use them for LinkedIn summary, position descriptions and education notes, so CSV text is HTML-escaped and line breaks become paragraphs or bullet lists instead of collapsing into one run-on paragraph. Only an empty end date now marks an entry as ongoing. Date cells that are not "Mon YYYY" are kept verbatim, so a finished role with an unexpected date format no longer reads as "Present". Unzip only the six CSVs the importer reads, matched by exact file name, and reject any of them larger than 5 MB. This avoids inflating the rest of a complete LinkedIn export in the browser and stops Learning_Profile.csv being read as Profile.csv. Map LinkedIn's five language proficiency options onto levels 5 to 1, falling back to parseLevel for anything else. Drop the literal BOM strip, which TextDecoder already handles. The import dialog no longer mentions an AI provider in the loading toast for LinkedIn imports, which are parsed entirely in the browser. Add a regression test for the JSON Resume importer leaking section data through the shared defaultResumeData object, plus LinkedIn tests for HTML escaping, unrecognised end dates, BOM headers, exact file name matching, language levels and oversized entries. --------- Co-authored-by: Amruth Pillai <im.amruth@gmail.com>
Important
Repository moved: Reactive Resume now lives at
reactive-resume/reactive-resumeon GitHub. Docker Hub stays atamruthpillai/reactive-resume. GHCR builds now publish toghcr.io/reactive-resume/reactive-resume. Verified image tags:latest,v5,v5.3, andv5.3.0(AMD64 and ARM64). The current version was rebuilt and production redeployed for this rename; no new GitHub release or version bump was made. See migration details. GitHub Sponsors and Open Collective funding links remain unchanged.
Reactive Resume
Reactive Resume is a free and open-source resume builder that makes it easy to create, update, and share your resume.
Pick a template, fill in your details, and export to PDF. Basic use needs no account. If you want more control, you can run the whole application on your own infrastructure.
You own your data. The codebase is open source under the MIT license, with no tracking, no ads, and no hidden costs.
Features
Resume Building
- Live preview as you type
- Multiple export formats (PDF, JSON, DOCX)
- Drag-and-drop section ordering
- Custom sections for any content type
- Rich text editor
Templates
- 15 templates to choose from
- A4 and Letter page sizes
- Customizable colors, fonts, and spacing
- Structured Style Rules for section and text 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
- 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 --depth=1 https://github.com/reactive-resume/reactive-resume.git reactive-resume
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 Router (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 | Base UI + shadcn-style package |
| State Management | Zustand + TanStack Query |
Documentation
The full documentation lives 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 supports Docker and Vercel Hobby.
Vercel provisions Neon PostgreSQL, private Blob storage, and Upstash Redis through its deployment wizard. Supply two persistent secrets, then deploy. See the Vercel guide for setup, limits, and optional SMTP/OAuth configuration.
For 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 runs entirely client-side via
@react-pdf/renderer. New deployments no longer need Browserless, Chromium, or any external print service. 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/reactive-resume/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 reproducible bugs and suggest actionable features
- Help other users in GitHub Discussions
- Improve documentation
- Help with translations
Star History
Contributing
Every contribution helps, whether it is a typo fix or a new feature.
- 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 how to run the project locally.
Maintainers review the status: needs triage queue
weekly. Triaged bugs become status: confirmed; feature proposals become status: accepted; reports that need details become
status: needs info.
License
MIT — do whatever you want with it.














