Tech Stack Overview
Reactive Resume is built with a modern, type-safe stack:Frontend
- React 19 with TanStack Start
- TypeScript for type safety
- Tailwind CSS for styling
- Radix UI for accessible components
Backend
- ORPC for type-safe RPC
- Drizzle ORM with PostgreSQL
- Better Auth for authentication
- Sharp for image processing
Application Architecture
Diagram: This flow shows data and control flow between the main architectural layers of Reactive Resume.Directory Structure
Root Level
| Directory | Purpose |
|---|---|
src/ | Main application source code |
public/ | Static assets served directly |
locales/ | Translation files (.po format) |
migrations/ | Database migration files |
docs/ | Mintlify documentation |
data/ | Local data storage (fonts, uploads) |
scripts/ | Utility scripts |
Source Code (src/)
components/
components/
Reusable React components organized by category:
ui/— Base UI components (Button, Card, Dialog, etc.)resume/— Resume-specific components (sections, templates)input/— Form input components (ColorPicker, RichInput)layout/— Layout components (Sidebar, LoadingScreen)animation/— Animation components (Spotlight, TextMask)theme/— Theme management componentstypography/— Font management components
routes/
routes/
File-based routing using TanStack Router:
__root.tsx— Root layout with providers_home/— Public home page routesauth/— Authentication routes (login, register, etc.)dashboard/— User dashboard routesbuilder/— Resume builder routes (the main editor)printer/— PDF printing routeapi/— API routes
integrations/
integrations/
Third-party service integrations:
auth/— Better Auth client configurationdrizzle/— Database schema and utilitiesorpc/— API router, client, and servicesai/— AI service integrationsimport/— Resume import utilities
dialogs/
dialogs/
Modal dialog components:
auth/— Authentication dialogsresume/— Resume management dialogsapi-key/— API key management dialogsmanager.tsx— Dialog manager componentstore.ts— Dialog state management (Zustand)
schema/
schema/
Zod schemas for validation:
resume/— Resume data schemasicons.ts— Icon definitionstemplates.ts— Template definitions
hooks/
hooks/
Custom React hooks:
use-confirm.tsx— Confirmation dialog hookuse-prompt.tsx— Prompt dialog hookuse-mobile.tsx— Mobile detection hookuse-safe-context.tsx— Safe context consumption
utils/
utils/
Utility functions:
env.ts— Environment variable validationlocale.ts— Locale utilitiestheme.ts— Theme utilitiesstring.ts— String manipulationfile.ts— File handling utilities
Key Concepts
File-Based Routing
Routes are automatically generated from the file structure insrc/routes/. TanStack Router conventions:
| Pattern | Description | Example |
|---|---|---|
index.tsx | Index route | /dashboard |
$param.tsx | Dynamic parameter | /builder/$resumeId |
_layout/ | Layout group (prefix) | _home/ |
__root.tsx | Root layout | Wraps all routes |
API Layer (ORPC)
ORPC provides end-to-end type safety for API calls:State Management
Reactive Resume uses a hybrid approach:| Type | Tool | Use Case |
|---|---|---|
| Server State | TanStack Query | API data, caching, sync |
| Client State | Zustand | UI state, dialogs, preferences |
| Form State | React Hook Form | Form inputs and validation |
Database Schema
The database schema is defined using Drizzle ORM insrc/integrations/drizzle/schema.ts:
Common Development Patterns
Adding a New Component
- Create the component in the appropriate
src/components/subdirectory - Export it from the directory’s index file (if applicable)
- Use TypeScript props interfaces for type safety
- Follow existing patterns for consistency
Adding a New Route
- Create a new file in
src/routes/following TanStack Router conventions - The route tree auto-generates when you save
- Use
createFileRoutefor type-safe routes
Adding an API Endpoint
- Add the route handler in
src/integrations/orpc/router/ - Create service functions in
src/integrations/orpc/services/if needed - The endpoint is automatically typed on the client
Adding Translations
- Wrap text with
tmacro or<Trans>component - Run
bun run lingui:extractto update locale files - Edit the
.pofiles inlocales/to add translations
Configuration Files
| File | Purpose |
|---|---|
vite.config.ts | Vite bundler configuration |
tsconfig.json | TypeScript configuration |
biome.json | Linter and formatter settings |
drizzle.config.ts | Drizzle ORM configuration |
lingui.config.ts | Lingui i18n configuration |
components.json | shadcn/ui component configuration |
Contributing Guidelines
1
Fork & Clone
Fork the repository on GitHub and clone your fork locally.
2
Create a Branch
Create a feature branch from
main:3
Make Changes
Implement your changes following the patterns described above.
4
Test Locally
Ensure the app works correctly with your changes:
5
Commit & Push
Write clear commit messages and push to your fork.
6
Open a Pull Request
Open a PR against the main repository with a clear description of your changes.
Make sure to read any
CONTRIBUTING.md file in the repository for additional guidelines.