mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-06-23 21:01:55 +10:00
62f8270b3e
commit b2b0470a1d9267d042ec0ac66523c6635bf5b199
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 13:13:38 2026 +0200
chore: update .gitignore to include .vite-hooks and modify pnpm-lock.yaml for dependencies
commit d28fadb5cd8706c874e616102878b4a394ec84c1
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 13:08:04 2026 +0200
fix: remove timestamp conflict guard
commit c6998d9dbab19d09d3c8054feef1d2e4117555eb
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 12:11:51 2026 +0200
chore(release): v5.1.5
commit f33d168711804880e1f12e88d24290aae16cc258
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 11:58:35 2026 +0200
revert: compose.yml
commit d961e6535811a10c335525fb33a08d03e737278d
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 11:58:08 2026 +0200
refactor(agent): replace 'revert' terminology with 'restore' for clarity, resolves #3086
commit 17f351171be218e33f01c469d95e4164d4c8dc57
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 11:10:41 2026 +0200
refactor(pdf): simplify sidebar section filtering and update summary feature logic
commit d55179b9d76879e3204de185e8b53fadd0a107ed
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 09:53:37 2026 +0200
chore: update pnpm-lock.yaml and turbo.json
commit 7cade6980e1a04352536bd44ef773f338c4ef599
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 09:38:30 2026 +0200
fix(polyfill): add tested polyfill for Map Upsert methods
commit 26d175bb9c53d93225d1e907678445252c13d660
Merge: 1cf33dc6c 5b1297fa2
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 09:23:29 2026 +0200
Merge remote-tracking branch 'origin/main' into feat/explore-hono-orpc-migration
# Conflicts:
# packages/api/src/services/agent-url.ts
# packages/runtime-externals/package.json
commit 1cf33dc6c9d81735730ad656e16dab6501c6d6a1
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 09:22:12 2026 +0200
chore: preserve branch changes before main sync
commit b380a4b00fdbcdd81ff4f8ef72b330fd027ccda5
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Mon May 18 07:50:28 2026 +0200
chore: lot of fixes for monorepo migration
commit 8fcf0ec64e1c29572ebaff494338368bfcf75760
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 13:57:17 2026 +0200
chore: update knip version and refine web app routing with new SEO endpoints
commit 234e68086ff15610a93877354c98e2c020364533
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 12:10:06 2026 +0200
refactor(auth): update OAuth routes to include API prefix and remove unused schema endpoint
commit 91c84b9a8496b0ce21d71cae9f8b2a027638c9ac
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:54:29 2026 +0200
chore: update dependencies and enhance PWA metadata in web app
commit 150117d4a5a9dd6cd92c64891aad8cae90f6a7af
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:12:35 2026 +0200
docs: revise manifest-only pwa testing scope
commit 6b939a55661aec9dd8122b184e4b60a5c7325fb5
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:11:33 2026 +0200
docs: add manifest-only pwa design
commit 1422e1fc96c400948b273210a1067251087d15d4
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:05:04 2026 +0200
chore(dev): simplify server proxy config
commit bc2ff5a9f6fda41e6c40333c8f163aa23a6c5e48
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:04:50 2026 +0200
docs: add unsafe oauth redirect plan
commit 445359ebe9b96c1515bf1c4c3f73ba8a8448ec12
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:04:34 2026 +0200
feat(auth): add unsafe oauth redirect flag
commit 73fffdd24598e56b2793f7657919bc794835892e
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 10:55:02 2026 +0200
docs: design unsafe oauth redirect flag
commit c0066aa19c15fc8a4c8e5179ed49889c117519f4
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 10:22:04 2026 +0200
chore: update translation source paths
commit 9033da082418d252aafd6c2eed72f71f014be3d9
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 10:09:25 2026 +0200
refactor(arch): react spa + hono migration
commit 6f27936c11bda895977dc63ee550c3346d4ce24b
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 01:10:47 2026 +0200
docs: add docker nightly tagging design
commit ecc1fd9a88a0ee1dca2f1977dfc17f74527fe1da
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Thu May 14 20:05:44 2026 +0200
feat: migrate to hono spa server
306 lines
10 KiB
Plaintext
306 lines
10 KiB
Plaintext
---
|
|
title: "Development Setup"
|
|
description: "Set up a local development environment for Reactive Resume"
|
|
---
|
|
|
|
<Info>
|
|
**Prerequisites**: - [Node.js](https://nodejs.org/) v24 - [pnpm](https://pnpm.io/) v11.1.2 through Corepack -
|
|
[Docker](https://docs.docker.com/get-docker/) and Docker Compose - [Git](https://git-scm.com/)
|
|
</Info>
|
|
|
|
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
|
|
|
|
<Steps>
|
|
<Step title="Clone the Repository">
|
|
```bash
|
|
git clone https://github.com/amruthpillai/reactive-resume.git
|
|
cd reactive-resume
|
|
```
|
|
</Step>
|
|
|
|
<Step title="Install Dependencies">
|
|
This project uses [pnpm](https://pnpm.io/) through Corepack.
|
|
|
|
```bash
|
|
# Enable the package manager version from package.json
|
|
corepack enable
|
|
|
|
# Install project dependencies
|
|
pnpm install
|
|
```
|
|
</Step>
|
|
|
|
<Step title="Start Infrastructure Services">
|
|
If you want to run the app directly on your machine with `pnpm dev`, start only the infrastructure services:
|
|
|
|
```bash
|
|
docker compose -f compose.dev.yml up -d postgres redis seaweedfs seaweedfs_create_bucket
|
|
```
|
|
|
|
This starts the following infrastructure services:
|
|
- **PostgreSQL** — Database (port 5432)
|
|
- **Redis** — AI Agent workspace streams/state (port 6379)
|
|
- **SeaweedFS** — S3-compatible storage (port 8333)
|
|
|
|
<Info>
|
|
**From v5.1.0 onwards** — PDF generation now runs entirely in the browser via `@react-pdf/renderer`, so no Browserless or Chromium container is required for development.
|
|
</Info>
|
|
|
|
<Tip>
|
|
`compose.dev.yml` can also run the app in a development container with `docker compose -f compose.dev.yml up -d`.
|
|
Use the service-filtered command above when you want local editor tooling and `pnpm dev` on the host.
|
|
</Tip>
|
|
|
|
<Tip>
|
|
Wait for all services to be healthy before proceeding. Check with `docker compose -f compose.dev.yml ps`.
|
|
</Tip>
|
|
</Step>
|
|
|
|
<Step title="Configure Environment Variables">
|
|
Create a `.env` file in the project root:
|
|
|
|
```bash
|
|
# Application
|
|
PORT=3000
|
|
SERVER_PORT=3001
|
|
APP_URL=http://localhost:3000
|
|
|
|
# Database
|
|
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres
|
|
|
|
# Authentication
|
|
AUTH_SECRET=development-secret-change-in-production
|
|
|
|
# Storage (SeaweedFS)
|
|
S3_ACCESS_KEY_ID=seaweedfs
|
|
S3_SECRET_ACCESS_KEY=seaweedfs
|
|
S3_ENDPOINT=http://localhost:8333
|
|
S3_BUCKET=reactive-resume
|
|
S3_FORCE_PATH_STYLE=true
|
|
|
|
# Email (Mailpit for local development)
|
|
SMTP_HOST=localhost
|
|
SMTP_PORT=1025
|
|
SMTP_FROM="Reactive Resume <noreply@rxresu.me>"
|
|
|
|
# AI Agent workspace and saved AI providers
|
|
REDIS_URL=redis://localhost:6379
|
|
ENCRYPTION_SECRET=change-me-to-a-secure-agent-secret-in-production
|
|
```
|
|
|
|
<Tip>
|
|
**Email Testing**: The development stack includes [Mailpit](https://mailpit.axllent.org/), an email testing tool. All emails sent by the application will be captured and viewable at [http://localhost:8025](http://localhost:8025). No emails will actually be sent to real addresses during development.
|
|
</Tip>
|
|
|
|
</Step>
|
|
|
|
<Step title="Run Database Migrations If Needed">
|
|
The server startup path runs migrations before serving traffic. To apply migrations manually without starting the app,
|
|
export `DATABASE_URL` because Drizzle Kit reads directly from `process.env`:
|
|
|
|
```bash
|
|
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres" pnpm run db:migrate
|
|
```
|
|
</Step>
|
|
|
|
<Step title="Start the Development Server">
|
|
```bash
|
|
pnpm run dev
|
|
```
|
|
|
|
Your local Reactive Resume instance will be available at [http://localhost:3000](http://localhost:3000).
|
|
</Step>
|
|
</Steps>
|
|
|
|
---
|
|
|
|
## Available Scripts
|
|
|
|
Here are the most commonly used scripts during development:
|
|
|
|
### Development
|
|
|
|
| Command | Description |
|
|
| ------------------------------ | ----------------------------------------------------------- |
|
|
| `pnpm dev` | Start the web and server development processes |
|
|
| `pnpm build` | Build the production web bundle and server bundle |
|
|
| `pnpm start` | Start the built production server |
|
|
| `pnpm typecheck` | Run TypeScript type checking |
|
|
| `pnpm test` | Run Vitest across workspaces |
|
|
| `pnpm exec biome check .` | Run a non-mutating Biome check |
|
|
| `pnpm check` | Run Biome with write/fix behavior (`--write --unsafe`) |
|
|
| `pnpm exec turbo boundaries` | Check workspace/package boundary rules |
|
|
|
|
### 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 |
|
|
|
|
## Understanding the Project Structure
|
|
|
|
Understanding the project structure will help you navigate the codebase:
|
|
|
|
```
|
|
reactive-resume/
|
|
├── apps/
|
|
│ ├── web/ # TanStack Start routes, web features, and browser UI
|
|
│ └── server/ # Hono production server, HTTP adapters, static serving
|
|
├── packages/
|
|
│ ├── api/ # oRPC features and business behavior
|
|
│ ├── auth/ # Better Auth configuration and helpers
|
|
│ ├── db/ # Drizzle client and schema
|
|
│ ├── docx/ # DOCX export generation
|
|
│ ├── mcp/ # MCP tools, prompts, resources, and metadata
|
|
│ ├── pdf/ # React PDF rendering and PDF generation adapters
|
|
│ ├── resume/ # Pure resume-domain helpers
|
|
│ ├── schema/ # Zod schemas and typed models
|
|
│ ├── ui/ # Shared Base UI/shadcn-style primitives
|
|
│ └── ...
|
|
├── tooling/ # Development-only scripts and repository tooling
|
|
├── migrations/ # Generated database migrations
|
|
├── docs/ # Documentation
|
|
└── data/ # Local development data and uploads
|
|
```
|
|
|
|
---
|
|
|
|
## Working with the Database
|
|
|
|
### Viewing the Database
|
|
|
|
Use Drizzle Studio to explore and manage your database:
|
|
|
|
```bash
|
|
pnpm run db:studio
|
|
```
|
|
|
|
This opens a web-based GUI at [https://local.drizzle.studio](https://local.drizzle.studio).
|
|
|
|
### Making Schema Changes
|
|
|
|
1. Edit the schema in `packages/db/src/schema/*`
|
|
2. Generate a migration:
|
|
```bash
|
|
pnpm run db:generate
|
|
```
|
|
3. Apply the migration:
|
|
```bash
|
|
pnpm run db:migrate
|
|
```
|
|
|
|
<Warning>Always review generated migrations before applying them, especially when working with existing data.</Warning>
|
|
|
|
---
|
|
|
|
## Working with Translations
|
|
|
|
Reactive Resume uses [Lingui](https://lingui.dev/) for internationalization.
|
|
|
|
### Adding Translatable Text
|
|
|
|
Use the `t` macro for strings or `<Trans>` component for JSX:
|
|
|
|
```tsx
|
|
import { t } from "@lingui/core/macro";
|
|
import { Trans } from "@lingui/react/macro";
|
|
|
|
// For plain strings
|
|
const message = t`Hello, World!`;
|
|
|
|
// For JSX content
|
|
<Trans>Welcome to Reactive Resume</Trans>;
|
|
```
|
|
|
|
### Extracting Translations
|
|
|
|
After adding new translatable text, extract them to the locale files:
|
|
|
|
```bash
|
|
pnpm run lingui:extract
|
|
```
|
|
|
|
Translation files are located in `apps/web/locales` in `.po` format.
|
|
|
|
---
|
|
|
|
## Code Quality
|
|
|
|
### Linting & Formatting
|
|
|
|
Uses [Biome](https://biomejs.dev/) for linting, formatting, import organization, and Tailwind class sorting:
|
|
|
|
```bash
|
|
# Non-mutating check
|
|
pnpm exec biome check .
|
|
|
|
# Project script with write/fix behavior
|
|
pnpm check
|
|
```
|
|
|
|
### Type Checking
|
|
|
|
Run TypeScript type checking:
|
|
|
|
```bash
|
|
pnpm run typecheck
|
|
```
|
|
|
|
<Tip>
|
|
Configure your IDE to use Biome for formatting and lint diagnostics. The repo uses tabs, double quotes, 120-column
|
|
lines, and organized import groups.
|
|
</Tip>
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
<AccordionGroup>
|
|
<Accordion title="Port 3000 or 3001 is already in use">
|
|
The Vite web server uses `PORT` (default `3000`), and the Hono server uses `SERVER_PORT` (default `3001`).
|
|
Either stop the conflicting process or choose alternate ports: ```bash PORT=3002 SERVER_PORT=3003 pnpm dev ```
|
|
</Accordion>
|
|
|
|
<Accordion title="Database connection refused">
|
|
Ensure Docker containers are running: ```bash docker compose -f compose.dev.yml ps docker compose -f compose.dev.yml
|
|
up -d ``` Check that PostgreSQL is healthy and accessible on port 5432.
|
|
</Accordion>
|
|
|
|
<Accordion title="S3/Storage errors">
|
|
Verify SeaweedFS is running and the bucket exists: ```bash docker compose -f compose.dev.yml logs seaweedfs docker
|
|
compose -f compose.dev.yml logs seaweedfs_create_bucket ``` If the bucket wasn't created, restart the bucket
|
|
creation service: ```bash docker compose -f compose.dev.yml restart seaweedfs_create_bucket ```
|
|
</Accordion>
|
|
|
|
<Accordion title="Type errors after pulling changes">
|
|
The route tree may need regeneration. Run the dev server which auto-generates routes: ```bash pnpm run dev ``` Or
|
|
run type checking to see specific errors: ```bash pnpm run typecheck ```
|
|
</Accordion>
|
|
|
|
</AccordionGroup>
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
<CardGroup cols={2}>
|
|
<Card title="Project Architecture" icon="folder-open" href="/contributing/architecture">
|
|
Deep dive into the project architecture and codebase structure.
|
|
</Card>
|
|
<Card title="GitHub Repository" icon="github" href="https://github.com/amruthpillai/reactive-resume">
|
|
View the source code and contribute to the project.
|
|
</Card>
|
|
</CardGroup>
|