Saltar al contenido principal

Architecture Overview

Ever Gauzy is built as a modern, full-stack TypeScript monorepo using enterprise-grade frameworks. This document provides a high-level view of the platform's architecture.

System Architecture

Architectural Layers

1. Client Layer

The client layer consists of multiple application types, all consuming the same API:

ApplicationTechnologyPackage LocationPurpose
Web UIAngular 19+, Nebular/ngx-adminapps/gauzyPrimary web interface
Desktop AppElectron + Angularapps/desktopAll-in-one desktop application
Desktop TimerElectron + Angularapps/desktop-timerTime tracking & activity monitoring
Desktop ServerElectron + NestJSapps/serverSelf-hosted API server
API Server DesktopElectron + NestJSapps/api-serverAPI-only server deployment
Ever TeamsReact/Next.js + React NativeExternal repoModern PM/Task interface

2. API Layer (NestJS)

The backend is a NestJS application following CQRS (Command Query Responsibility Segregation) patterns:

  • Controllers — handle HTTP requests, validate inputs, route to handlers
  • Commands/Queries — encapsulate business logic via the CQRS pattern
  • Services — core business logic and data access
  • Guards — authentication and authorization (JWT, Roles, Permissions, Tenant)
  • Interceptors — request/response transformation, logging
  • Pipes — input validation and transformation (class-validator)
  • Modules — NestJS dependency injection containers

3. Data Layer

The platform uses a Multi-ORM architecture supporting:

  • TypeORM — primary ORM with extensive entity definitions, repositories, and migrations
  • MikroORM — alternative ORM with its own repositories and entity metadata
  • Knex — raw SQL query builder for complex queries and migrations

All three ORMs connect to the same database and share entity definitions through a shared Multi-ORM decorator system.

4. Infrastructure Layer

  • PostgreSQL — primary production database
  • SQLite — lightweight development/demo database
  • Redis — caching, session store, and job queue
  • OpenSearch — full-text search indexing
  • MinIO/S3 — file and image storage
  • Cube — analytics and BI semantic layer
  • Zipkin/OTEL — distributed tracing

Key Architecture Patterns

Multi-Tenant Architecture

Every entity in the system is scoped to a tenant. The TenantBaseEntity base class provides:

  • Automatic tenantId injection on create/update
  • Automatic tenantId filtering on read queries
  • Cross-tenant access prevention at the ORM level

See Multi-Tenancy for details.

Plugin Architecture

The platform supports dynamic plugins for extending functionality:

@Module({})
export class PluginModule {
static forRoot(plugins: Type<any>[]): DynamicModule {
return {
module: PluginModule,
imports: plugins,
};
}
}

Plugins can add: entities, controllers, services, commands, and event handlers. See Plugin System.

CQRS Pattern

Business logic is organized into Commands (write) and Queries (read):

Controller → CommandBus/QueryBus → Handler → Service → Repository

This pattern enables:

  • Clear separation of read and write operations
  • Event-driven side effects
  • Easier testing through handler isolation

Event Bus

The platform uses NestJS @nestjs/cqrs events for inter-module communication:

// Publishing an event
this.eventBus.publish(new EmployeeCreatedEvent(employee));

// Handling an event in another module
@EventHandler(EmployeeCreatedEvent)
export class EmployeeCreatedHandler {
handle(event: EmployeeCreatedEvent) {
/* ... */
}
}

Request Context

A RequestContext utility provides access to the current request context throughout the application:

// Access current user, tenant, and organization
const tenantId = RequestContext.currentTenantId();
const userId = RequestContext.currentUserId();
const orgId = RequestContext.currentOrganizationId();

Data Flow

Typical API Request Flow

  1. Guard: Validates JWT token, checks roles/permissions, resolves tenant
  2. Pipe: Validates request body against DTO (Data Transfer Object) classes
  3. Handler: Executes business logic via CQRS command/query handler
  4. Service: Performs data access, integrations, and business rules
  5. Repository: Issues database queries through the active ORM

Guard Chain

Deployment Models

ModelComponentsBest For
SaaSCloud-hosted API + UIMulti-tenant production
Self-HostedDocker or bare metalPrivate infrastructure
Desktop ServerElectron app hosting APISmall teams, individuals
Desktop All-in-OneFull platform in single appPersonal use
Client-ServerSeparate API server + clientsTeams with centralized server