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 components - typography/ — Font management
componentsroutes/
routes/
File-based routing using TanStack Router: -
__root.tsx — Root layout with providers - _home/ — Public
home page routes - auth/ — Authentication routes (login, register, etc.) - dashboard/ — User dashboard
routes - builder/ — Resume builder routes (the main editor) - printer/ — PDF printing route - api/
— API routesintegrations/
integrations/
Third-party service integrations: -
auth/ — Better Auth client configuration - drizzle/ — Database
schema and utilities - orpc/ — API router, client, and services - ai/ — AI service integrations -
import/ — Resume import utilitiesdialogs/
dialogs/
Modal dialog components: -
auth/ — Authentication dialogs - resume/ — Resume management dialogs -
api-key/ — API key management dialogs - manager.tsx — Dialog manager component - store.ts — Dialog
state management (Zustand)schema/
schema/
Zod schemas for validation: -
resume/ — Resume data schemas - icons.ts — Icon definitions -
templates.ts — Template definitionshooks/
hooks/
Custom React hooks: -
use-confirm.tsx — Confirmation dialog hook - use-prompt.tsx — Prompt dialog hook -
use-mobile.tsx — Mobile detection hook - use-safe-context.tsx — Safe context consumptionutils/
utils/
Utility functions: -
env.ts — Environment variable validation - locale.ts — Locale utilities - theme.ts —
Theme utilities - string.ts — String manipulation - file.ts — File handling utilitiesKey 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
pnpm 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 |
.oxfmtrc.json | Formatter settings |
.oxlintrc.json | Linter settings |
drizzle.config.ts | Drizzle ORM configuration |
lingui.config.ts | Lingui i18n configuration |
components.json | shadcn/ui component configuration |
Contributing Guidelines
Test Locally
Ensure the app works correctly with your changes:
bash pnpm run dev pnpm run lint pnpm run typecheck Make sure to read any
CONTRIBUTING.md file in the repository for additional guidelines.Need Help?
GitHub Discussions
Ask questions and discuss ideas with the community.
GitHub Issues
Report bugs or request features.