Project Structure Overview

The Formbricks codebase follows a monorepo structure using pnpm workspaces, with two main directories:

  • apps/ - Contains full applications

  • packages/ - Contains shared libraries and utilities

Apps Directory

The apps/ directory contains complete applications:

apps/web/

  • Main Formbricks web application (Next.js)

  • Primary application with full feature set

  • Uses App Router architecture

  • Contains environment-specific settings and configurations

apps/demo/

  • Demo application (Next.js)

  • Showcases Formbricks in-product surveying functionality

  • Used for testing and demonstration purposes

apps/demo-react-native/

  • React Native demo app (React Native)

  • Demonstrates mobile integration capabilities

  • Example implementation for React Native

apps/storybook/

  • Component documentation

  • Visual documentation of UI components

  • Testing environment for isolated components

Packages Directory

The packages/ directory contains shared libraries and utilities:

packages/js-core/

  • Contains core functionality for in-product surveys

  • Shared logic between different SDK implementations

  • Base classes and utilities

packages/js/

  • JavaScript SDK for browser-based applications

  • Used for running surveys on websites and web apps (browser)

  • Public NPM package

packages/react-native/

  • React Native SDK

  • Used to run surveys in mobile apps built with React Native / Expo

  • Includes native platform adaptations

packages/lib/

  • Shared business logic

  • Shared utilities and helpers

packages/types/

  • TypeScript type definitions

  • Zod schemas for validation

packages/database/

  • Database schemas and migrations

  • Prisma schema definitions

  • Migration management

packages/surveys/

  • Survey-specific functionality

  • Survey rendering logic and UI components

  • Survey state management

Module Organization

Core Module Structure

Each feature module follows a consistent structure:

modules/
└── ee/
├── insights/
│ ├── components/
│ ├── experience/
│ └── types/
└── contacts/
├── segments/
└── components/

Adding New Code

New Features

When adding new features, follow these guidelines:

  1. Determine Scope:

    • Complete application → apps/

    • Shared library → packages/

    • Feature for existing app → appropriate module in apps/web/modules/

  2. Module Creation: Create a new module with the standard structure:

    modules/
    └── your-feature/
        ├── components/    # React components
        ├── lib/           # Business logic
        ├── types/         # TypeScript types
        ├── actions.ts     # Server actions
        └── route.ts       # API routes
    
  3. Component Organization:

    • Base UI components → modules/ui/components/

    • Feature-specific components → modules/[feature]/components/

Best Practices

Code Organization

  • Keep modules focused and single-purpose

  • Maintain clear separation between UI and business logic

  • Use proper TypeScript interfaces and types

File Structure

  • Group related files in descriptive directories

  • Use consistent naming patterns

  • Keep files focused and modular

Module Independence

  • Minimize dependencies between modules

  • Share common utilities through appropriate packages

  • Maintain clear module boundaries

Documentation

  • Document complex logic and APIs as laid out in the Documentation section

  • Keep documentation current with code changes

Testing Organization

Test File Location

  • Test files should be located alongside the code they test

  • Use .test.ts or .spec.ts suffix for test files

  • Example: user-service.test.ts for user-service.ts

Test Directory Structure

feature/
├── tests/ # Test directory (if grouping tests)
├── components/ # Feature components
└── lib/ # Business logic

Configuration Files

Root Level Configuration

  • .eslintrc.js - ESLint configuration

  • tsconfig.json - TypeScript configuration

  • package.json - Package metadata and scripts

  • .env - Environment variables

Package Level Configuration

Each package maintains its own configuration files:

  • package.json - Package-specific dependencies and scripts

  • tsconfig.json - Package-specific TypeScript settings

  • .eslintrc.js - Package-specific linting rules

Version Control

Git Organization

  • .gitignore - Specifies ignored files and directories

  • .github/ - GitHub specific configurations and workflows

  • CHANGELOG.md - Documents version changes

  • LICENSE - License information

Conclusion

Following these organizational patterns ensures:

  • Consistent code structure across the project

  • Easy navigation and maintenance

  • Clear separation of concerns

  • Scalable architecture for future growth

Remember to maintain these patterns when adding new code to keep the codebase organized and maintainable.