This guide walks you through setting up Reactive Resume for local development. Whether you’re contributing to the project or customizing it for your needs, these steps will get you up and running.
Setting Up Your Development Environment
Install Dependencies
This project uses pnpm as its package manager for its speed and efficiency.
Start Infrastructure Services
Start the required services using the development-specific Docker Compose file:This starts the following infrastructure services:
- PostgreSQL — Database (port 5432)
- SeaweedFS — S3-compatible storage (port 8333)
- Printer — PDF and screenshot generation service (port 4000)
- Mailpit — Email testing server (SMTP on port 1025, UI on port 8025)
Configure Environment Variables
Create a
.env file in the project root:PDF Generation Note: The
PRINTER_APP_URL variable is required when running Reactive Resume outside of Docker while the printer service is running inside Docker (which is the case when using compose.dev.yml). The printer needs to reach your local app to render resumes for PDF generation. Since Docker containers cannot access localhost on your host machine directly, you must set PRINTER_APP_URL to http://host.docker.internal:3000. This special hostname allows Docker containers to communicate with services running on your host machine.Start the Development Server
Available Scripts
Here are the most commonly used scripts during development:Development
| Command | Description |
|---|---|
pnpm run dev | Start the development server with hot reload |
pnpm run build | Build the application for production |
pnpm run start | Start the production server |
pnpm run lint | Run Biome linter and formatter |
pnpm run typecheck | Run TypeScript type checking |
Database
| Command | Description |
|---|---|
pnpm run db:generate | Generate migration files from schema changes |
pnpm run db:migrate | Apply pending migrations |
pnpm run db:studio | Open Drizzle Studio (database GUI) |
Internationalization
| Command | Description |
|---|---|
pnpm run lingui:extract | Extract translatable strings from code |
Documentation
| Command | Description |
|---|---|
pnpm run docs:dev | Start the Mintlify docs development server |
Understanding the Project Structure
Understanding the project structure will help you navigate the codebase:Working with the Database
Viewing the Database
Use Drizzle Studio to explore and manage your database:Making Schema Changes
- Edit the schema in
src/integrations/drizzle/schema.ts - Generate a migration:
- Apply the migration:
Working with Translations
Reactive Resume uses Lingui for internationalization.Adding Translatable Text
Use thet macro for strings or <Trans> component for JSX:
Extracting Translations
After adding new translatable text, extract them to the locale files:locales/ directory in .po format.
Code Quality
Linting & Formatting
Uses Biome for linting and formatting:Type Checking
Run TypeScript type checking:Troubleshooting
Port 3000 is already in use
Port 3000 is already in use
Another process is using port 3000. Either stop that process or start the dev server on a different port:
Database connection refused
Database connection refused
Ensure Docker containers are running:Check that PostgreSQL is healthy and accessible on port 5432.
S3/Storage errors
S3/Storage errors
Verify SeaweedFS is running and the bucket exists:If the bucket wasn’t created, restart the bucket creation service:
Type errors after pulling changes
Type errors after pulling changes
The route tree may need regeneration. Run the dev server which auto-generates routes:Or run type checking to see specific errors: