reactive-resume Documentation

A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today!

RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy reactive-resume on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name reactive-resume -p 5432:5432 --restart always postgres:latest
Configured Services & Ports
โš™๏ธ postgres
image: postgres:latest
๐Ÿ”Œ Ports: 5432:5432
โš™๏ธ redis
image: redis:latest
โš™๏ธ seaweedfs
image: chrislusf/seaweedfs:latest
๐Ÿ”Œ Ports: 8333:8333
โš™๏ธ seaweedfs_create_bucket
image: amazon/aws-cli:latest
โš™๏ธ reactive_resume
image: build locally
๐Ÿ”Œ Ports: 3000:3000
docker-compose.yml
yaml (docker-compose.yml)
name: reactive_resume

services:
  postgres:
    image: postgres:latest
    restart: unless-stopped
    networks:
      - data_network
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres", "-d", "postgres"]
      start_period: 10s
      interval: 30s
      timeout: 10s
      retries: 3

  redis:
    image: redis:latest
    restart: unless-stopped
    command: redis-server --appendonly yes
    networks:
      - data_network
    # Not exposed on the host by default. Redis can contain agent stream data
    # including user chat content; keep it internal to the Docker network.
    # Uncomment the ports block below if you need host access for tooling.
    # ports:
    #   - "127.0.0.1:6379:6379"
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      start_period: 5s
      interval: 30s
      timeout: 10s
      retries: 3

  seaweedfs:
    image: chrislusf/seaweedfs:latest
    restart: unless-stopped
    command: server -s3 -filer -dir=/data -ip=0.0.0.0
    networks:
      - storage_network
    environment:
      - AWS_ACCESS_KEY_ID=seaweedfs
      - AWS_SECRET_ACCESS_KEY=seaweedfs
    ports:
      - "8333:8333"
    volumes:
      - seaweedfs_data:/data
    healthcheck:
      test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:8888"]
      start_period: 10s
      interval: 30s
      timeout: 10s
      retries: 3

  seaweedfs_create_bucket:
    image: amazon/aws-cli:latest
    restart: on-failure
    environment:
      - AWS_ACCESS_KEY_ID=seaweedfs
      - AWS_SECRET_ACCESS_KEY=seaweedfs
      - AWS_DEFAULT_REGION=us-east-1
    entrypoint: >
      /bin/sh -c "
        aws --endpoint-url http://seaweedfs:8333 s3api head-bucket --bucket reactive-resume 2>/dev/null ||
        aws --endpoint-url http://seaweedfs:8333 s3 mb s3://reactive-resume
      "
    networks:
      - storage_network
    depends_on:
      seaweedfs:
        condition: service_healthy

  reactive_resume:
    # image: ghcr.io/reactive-resume/reactive-resume:latest
    build:
      context: .
      dockerfile: Dockerfile
    networks:
      - data_network
      - storage_network
    ports:
      - "3000:3000"
    env_file:
      - path: .env.example
        required: false
      - path: .env
        required: false
    volumes:
      - ./data:/app/data
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
      seaweedfs:
        condition: service_healthy
      seaweedfs_create_bucket:
        condition: service_completed_successfully
    healthcheck:
      test:
        [
          "CMD",
          "node",
          "-e",
          "fetch('http://127.0.0.1:3000/api/health').then((r) => { if (!r.ok) process.exit(1); }).catch(() => process.exit(1));",
        ]
      start_period: 10s
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  postgres_data:
  redis_data:
  seaweedfs_data:

networks:
  data_network:
  storage_network:

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.

Sponsors

Reactive Resume stays free, open-source, and independent because companies choose to support the work behind it. Thank you to every sponsor who helps fund hosting, maintenance, and continued development for the community.

Atlas Cloud supports Reactive Resume as a project sponsor. Atlas Cloud provides a unified AI platform for developers, with access to hundreds of models for chat, image generation, video generation, media processing, and GPU cloud workloads through one API key, one endpoint, and one billing account.

If your company would like to sponsor Reactive Resume, email [email protected].

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

bash
# Clone the repository
git clone --depth=1  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 Base UI + shadcn-style package
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. The PRINTER_* and BROWSERLESS_* environment variables are no longer read and can be removed from your .env.

Pull the latest image from Docker Hub or GitHub Container Registry:

bash
# 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 reproducible bugs and suggest actionable features
  • Help other users in GitHub Discussions
  • 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.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

See the development setup guide for detailed instructions on how to set up 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.