A modern, full-stack application built with TypeScript, featuring a React frontend, Fastify API, and Astro marketing website.
This is a monorepo managed with Turbo and pnpm.
apps/
βββ api/ # Fastify API server
βββ frontend/ # React 19 + TanStack Router SPA
βββ promo/ # Astro marketing website
packages/
βββ email-templates/ # React Email templates
- Runtime: Node.js with TypeScript
- Framework: Fastify with plugins
- Database: PostgreSQL with Drizzle ORM
- Authentication: Better Auth
- File Storage: S3-compatible storage
- Email: SendGrid
- Billing: Autumn.js
- Framework: React 19 with new hooks (useActionState, useOptimistic)
- Routing: TanStack Router
- Styling: Tailwind CSS + shadcn/ui
- Internationalization: Lingui
- File Uploads: Better Upload
- Build Tool: Vite
- Framework: Astro with TypeScript
- Styling: Tailwind CSS v4
- Internationalization: Built-in Astro i18n (English/German)
- Content: Markdown with frontmatter
- Animations: GSAP + Embla Carousel
- Node.js 22+
- pnpm 9+
- Docker and Docker Compose
- PostgreSQL (or use Docker)
-
Clone the repository
git clone <repository-url> cd olhapi-stack
-
Install dependencies
pnpm install
-
Start development services
# Start PostgreSQL and Redis with Docker pnpm dev:services
-
Set up environment variables
Copy and configure environment files:
# API configuration cp apps/api/.env.example apps/api/.env # Frontend configuration cp apps/frontend/.env.example apps/frontend/.env # Promo site configuration cp apps/promo/.env.example apps/promo/.env
See individual app README files for detailed environment setup.
-
Run database migrations
cd apps/api pnpm dlx drizzle-kit generate pnpm dlx drizzle-kit migrate
-
Start development servers
# Start all apps in development mode pnpm dev
This will start:
- API server: http://localhost:3001
- Frontend app: http://localhost:3000
- Promo site: http://localhost:4321
# Development
pnpm dev # Start all apps (excludes email templates)
pnpm dev:services # Start Docker services (PostgreSQL, Redis)
pnpm dev:apps # Start all apps including email templates
pnpm dev:stop # Stop Docker services
# Building
pnpm build # Build all packages and apps
pnpm check-types # Run TypeScript checks across all projects
# Code Quality
pnpm lint # Lint all files with oxlint
pnpm format # Format code with Prettier
# Production
pnpm start # Start production Docker compose
pnpm docker:up # Start production services
pnpm docker:down # Stop production services
pnpm docker:logs # View production logs
pnpm docker:clean # Clean up Docker volumes
# Billing
pnpm billing:push # Push billing configuration to Autumn
pnpm billing:pull # Pull billing configuration from Autumn
Navigate to individual app directories for app-specific commands:
# API (apps/api)
cd apps/api
pnpm dev # Start API development server
pnpm build # Build API for production
pnpm test # Run API tests
# Frontend (apps/frontend)
cd apps/frontend
pnpm dev # Start frontend development server
pnpm build # Build frontend for production
pnpm test # Run frontend tests
pnpm lingui:extract # Extract translatable strings
pnpm lingui:compile # Compile translations
# Promo Site (apps/promo)
cd apps/promo
pnpm dev # Start promo site development server
pnpm build # Build promo site for production
pnpm preview # Preview production build
The project uses PostgreSQL with Drizzle ORM for type-safe database operations.
# Generate migration files
pnpm dlx drizzle-kit generate
# Apply migrations
pnpm dlx drizzle-kit migrate
# View database in Drizzle Studio
pnpm dlx drizzle-kit studio
The development setup uses Docker Compose to run PostgreSQL and Redis:
# Start services
pnpm dev:services
# View logs
pnpm docker:logs
# Reset database (β οΈ destroys data)
pnpm docker:clean && pnpm dev:services
Authentication is handled by Better Auth using passwordless magic links:
- Magic link authentication (no passwords required)
- Automatic account creation on first login
- Session management
- User management
- Rate limiting
Email templates are built with React Email:
- Magic link authentication emails
- Contact form notifications
- System notifications via SendGrid
Billing is powered by Autumn.js:
- Subscription management
- Usage-based billing
- Payment processing
- Customer portal
# Extract new translatable strings
pnpm lingui:extract
# Compile translations for production
pnpm lingui:compile
- Supports multiple locales (English, German)
- Content-driven translations
- Localized URLs and routing
# Build all applications
pnpm build
# Start production services
pnpm start
Each application requires specific environment variables. See:
apps/api/.env.example
- API configurationapps/frontend/.env.example
- Frontend configurationapps/promo/.env.example
- Promo site configuration
# Run all tests
pnpm test
# Run tests for specific app
cd apps/frontend && pnpm test
cd apps/api && pnpm test
- Create a feature branch
- Make your changes
- Add tests if applicable
- Run
pnpm lint
andpnpm check-types
- Submit a pull request
MIT