Twenty is an open-source CRM built with modern technologies, using TypeScript for both frontend and backend development. This document outlines the core architectural decisions and structure of the project.
The project is organized as a monorepo using nx, with the following main packages:
-
packages/twenty-front
: Main Frontend application- Technology: React
- Purpose: Provides the main user interface for the CRM
- Key responsibilities: User interactions, state management, data display
-
packages/twenty-server
: Main Backend application- Technology: NestJS
- Purpose: Handles business logic, data persistence, and API
- Key responsibilities: Data processing, authentication, API endpoints
-
packages/twenty-website
: Marketing Website and Documentation- Technology: NextJS
- Purpose: Public-facing website and documentation
- Key responsibilities: Marketing content, documentation, SEO
-
packages/twenty-ui
: UI Component Library- Technology: React
- Purpose: Shared UI components and design system
- Key responsibilities: Reusable components, design consistency
-
packages/twenty-shared
: Shared Utilities- Purpose: Cross-package shared code between frontend and backend
- Contents: Utils, constants, types, interfaces
- Package Manager: yarn
- Monorepo Tool: nx
- Benefits: Consistent dependency management, shared configurations
- Primary Database: PostgreSQL
- Schema Structure:
- Core schema: Main application data
- Metadata schema: Configuration and customization data
- Workspace schemas: One schema per tenant, containing tenant-specific data
- ORM Layer:
- TypeORM: For core and metadata schemas
- Purpose: Type-safe database operations for system data
- Benefits: Strong typing, migration support
- TwentyORM: For workspace schemas
- Purpose: Manages tenant-specific entities and customizations
- Benefits: Dynamic entity management, per-tenant customization
- Example: Entities like CompanyWorkspaceEntity are managed per workspace
- TypeORM: For core and metadata schemas
- Frontend State: Recoil
- Purpose: Global state management
- Use cases: User preferences, UI state, cached data
- API Technology: GraphQL
- Client: Apollo Client
- Purpose: Data fetching and caching
- Benefits: Type safety, efficient data loading
-
Cache: Redis
- Purpose: High-performance caching layer
- Use cases: Session data, frequent queries
-
Authentication: JWT
- Purpose: Secure user authentication
- Implementation: Token-based auth flow
-
Queue System: BullMQ
- Purpose: Background job processing
- Use cases: Emails, exports, imports
-
Storage: S3/Local Filesystem
- Purpose: File storage and management
- Flexibility: Configurable for cloud or local storage
-
Backend Testing:
- Framework: Jest
- API Testing: Supertest
- Coverage: Unit tests, integration tests
-
Frontend Testing:
- Framework: Jest
- Component Testing: Storybook
- API Mocking: MSW (Mock Service Worker)
-
End-to-End Testing:
- Framework: Playwright
- Coverage: Critical user journeys