Formbricks is built as a modern monorepo using pnpm workspaces and Turborepo for efficient development and builds.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/formbricks/formbricks/llms.txt
Use this file to discover all available pages before exploring further.
Monorepo Structure
The repository is organized into two main directories:Application Layer
Web Application (apps/web)
The main Next.js 16 application using the App Router architecture.
Directory Structure
Key Concepts
Route Groups: The app uses Next.js route groups:(app)- Main application with authenticated routes(auth)- Authentication flows (login, signup)(redirects)- URL redirects and legacy routes
- Each module contains its related components, services, and types
modules/ee/contains Enterprise Edition features- Services are located in
lib/for cross-cutting concerns
- Actions return
{ data }or{ error }consistently - Located alongside features they support
- Type-safe with Zod validation
Storybook (apps/storybook)
Component documentation and visual testing using Storybook.
Package Layer
Database (packages/database)
Prisma-based database layer with PostgreSQL.
Key Files:
schema.prisma- Database schema definitionmigrations/- Prisma migration filessrc/seed.ts- Database seeding utilitieszod/- Zod schemas generated from Prisma
- Multi-tenancy: All data scoped by Organization or Environment
- Soft deletion: Uses
isActiveanddeletedAtfields - pgvector extension for vector operations
Surveys (packages/surveys)
The survey runtime package compiled to UMD and ESM.
Build Process:
- Compiled with Vite to
dist/ - Bundle copied to
apps/web/public/js/ - Next.js imports from
dist/, not source
packages/survey-ui- UI componentspackages/types- Type definitionspackages/i18n-utils- Internationalization
Survey UI (packages/survey-ui)
React components for rendering surveys.
- Shared between web app and surveys package
- Uses TailwindCSS for styling
- Supports multiple question types
Types (packages/types)
Shared TypeScript types used across the monorepo.
- API types
- Database types (from Prisma)
- SDK types
- Validation schemas (Zod)
JavaScript Core (packages/js-core)
Core JavaScript SDK functionality.
- Survey loading and rendering
- Event tracking
- API communication
- Browser and Node.js compatible
Email (packages/email)
Email templates and sending utilities.
- React Email templates
- Nodemailer integration
- Multi-provider support (SMTP, Brevo)
Storage (packages/storage)
File storage abstraction layer.
- S3-compatible storage (AWS S3, MinIO)
- Local file system storage
- Image optimization with Sharp
Cache (packages/cache)
Caching utilities and abstractions.
- Redis/Valkey integration
- Request-level caching with React
cache() - Cache key utilities
Configuration Packages
config-typescript- Shared TypeScript configconfig-eslint- ESLint configurationconfig-prettier- Prettier configuration
Technology Stack
Frontend
- Next.js 16 - React framework with App Router
- React 19 - UI library
- TailwindCSS - Utility-first CSS framework
- Radix UI - Headless UI components
- Lucide React - Icon library
- Framer Motion - Animation library
- React Hook Form - Form management
- i18next - Internationalization
Backend
- Next.js API Routes - RESTful APIs
- Prisma - Database ORM
- PostgreSQL - Primary database with pgvector
- Redis (Valkey) - Caching and session storage
- Auth.js (NextAuth) - Authentication
- Zod - Schema validation
Infrastructure
- Docker - Containerization
- Turborepo - Monorepo build system
- pnpm - Package manager
- Vite - Build tool for packages
Testing
- Vitest - Unit testing framework
- Testing Library - React testing utilities
- Playwright - E2E testing
Observability
- Sentry - Error tracking
- OpenTelemetry - Distributed tracing
- Prometheus - Metrics (optional)
Build System
Turborepo Configuration
Turborepo manages the build pipeline with dependency-aware caching. Key Features:- Parallel execution of independent tasks
- Incremental builds with caching
- Dependency graph awareness
- Remote caching support
Build Dependencies
The build system enforces correct build order:Data Flow
Request Lifecycle
- Client Request → Next.js App Router
- Middleware → Authentication, routing
- Route Handler / Page → Data fetching
- Server Actions → Data mutations
- Services → Business logic
- Prisma → Database operations
- Response → JSON or React components
Caching Strategy
Levels of Caching:-
React Cache - Request-level deduplication
-
Redis Cache - Application-level caching
-
Next.js Cache - Not used (avoid
unstable_cache) - CDN Cache - Static assets and API routes
Multi-Tenancy
Formbricks implements multi-tenancy at the data layer: Hierarchy:- All queries scoped by Organization or Environment ID
- Row-level security through Prisma where clauses
- Role-based access control (Owner, Admin, Member)
Internationalization (i18n)
Formbricks supports multiple languages: Structure:- Translations in
apps/web/locales/ - Default locale:
en-US - Automatic translation via Lingo.dev
Security
Authentication
- NextAuth.js for authentication
- Supports: Email/Password, OAuth (Google, GitHub, Azure AD), SAML SSO
- Session: JWT-based sessions
- 2FA: TOTP-based two-factor authentication
Authorization
- Role-based access control (RBAC)
- Organization-level permissions
- Environment-level isolation
Data Security
- Password hashing with bcrypt
- Encryption key for sensitive data
- HTTPS/TLS in production
- CSRF protection
- Rate limiting
Performance Considerations
Database
- Never use
skip/offsetwith count queries - Use cursor-based pagination for large datasets
- Separate count and data queries (run in parallel)
- Include indexed fields when filtering by
createdAt
Frontend
- Server Components by default
- Client Components only when needed
- Image optimization with next/image
- Code splitting and lazy loading
Caching
- Redis for expensive operations
- React cache for request deduplication
- CDN for static assets
Next Steps
Local Setup
Set up your development environment
Code Style
Learn our coding standards
Testing
Write tests for your code
Contributing
Read contribution guidelines