Pular para o conteúdo principal

Plugin System

Ever Gauzy uses a modular plugin architecture that allows extending the platform with new features, integrations, entities, and UI components without modifying the core codebase.

Plugin Architecture

Plugin Types

Backend Plugins

Backend plugins can add:

CapabilityDescription
EntitiesNew database tables/columns
ControllersNew API endpoints
ServicesBusiness logic
Commands/QueriesCQRS handlers
Event HandlersReact to platform events
MiddlewareRequest processing
GuardsAuthorization rules

UI Plugins

UI plugins provide:

CapabilityDescription
PagesNew routes and views
ComponentsReusable UI components
ModulesAngular feature modules
ServicesFrontend business logic

Creating a Plugin

Step 1: Create Plugin Module

// packages/plugins/my-plugin/src/lib/my-plugin.module.ts
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { MikroOrmModule } from "@mikro-orm/nestjs";
import { MyPluginEntity } from "./my-plugin.entity";
import { MyPluginService } from "./my-plugin.service";
import { MyPluginController } from "./my-plugin.controller";

@Module({
imports: [
TypeOrmModule.forFeature([MyPluginEntity]),
MikroOrmModule.forFeature([MyPluginEntity]),
],
controllers: [MyPluginController],
providers: [MyPluginService],
exports: [MyPluginService],
})
export class MyPluginModule {}

Step 2: Define Entity

import { MultiORMEntity, MultiORMColumn } from "@gauzy/core";
import { TenantOrganizationBaseEntity } from "@gauzy/core";

@MultiORMEntity("my_plugin_data")
export class MyPluginEntity extends TenantOrganizationBaseEntity {
@MultiORMColumn()
name: string;

@MultiORMColumn({ type: "jsonb", nullable: true })
config?: Record<string, any>;
}

Step 3: Create Service

import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { TenantAwareCrudService } from "@gauzy/core";
import { MyPluginEntity } from "./my-plugin.entity";

@Injectable()
export class MyPluginService extends TenantAwareCrudService<MyPluginEntity> {
constructor(
@InjectRepository(MyPluginEntity)
private readonly myPluginRepository,
) {
super(myPluginRepository);
}
}

Step 4: Register the Plugin

Register the plugin in the API application:

// apps/api/src/plugin-config.ts
import { MyPluginModule } from "@gauzy/plugin-my-plugin";

export const pluginConfig = {
plugins: [
MyPluginModule,
// ... other plugins
],
};

Built-in Plugins

Integration Plugins

PluginPackageDescription
GitHub@gauzy/plugin-integration-githubGitHub App integration (issues, PRs, repos)
Upwork@gauzy/plugin-integration-upworkUpwork time tracking and contracts
HubStaff@gauzy/plugin-integration-hubstaffHubStaff time tracking sync
Jira@gauzy/plugin-integration-jiraJira issue synchronization
Zapier@gauzy/plugin-integration-zapierZapier automation webhooks
Make.com@gauzy/plugin-integration-makeMake.com automation
ActivePieces@gauzy/plugin-integration-activepiecesActivePieces automation
Gauzy AI@gauzy/plugin-integration-aiAI-powered features

Feature Plugins

PluginPackageDescription
Knowledge Base@gauzy/plugin-knowledge-baseHelp center / knowledge base
Product Reviews@gauzy/plugin-product-reviewsProduct review system
Job Search@gauzy/plugin-job-searchJob board search integration
Changelog@gauzy/plugin-changelogActivity audit trail

Analytics & Monitoring Plugins

PluginPackageDescription
Sentry@gauzy/plugin-sentryError tracking integration
Jitsu Analytics@gauzy/plugin-jitsu-analyticsJitsu data ingestion

UI Plugins

PluginPackageDescription
GitHub UI@gauzy/plugin-integration-github-uiGitHub settings UI
Job Search UI@gauzy/plugin-job-search-uiJob board search UI
Job Matching UI@gauzy/plugin-job-matching-uiJob matching interface
Knowledge Base UI@gauzy/plugin-knowledge-base-uiKnowledge base frontend
Onboarding UI@gauzy/plugin-onboarding-uiSetup/onboarding wizard UI
Legal UI@gauzy/plugin-legal-uiPrivacy/Terms pages

Plugin Configuration

Integration Plugin Pattern

Integration plugins follow a common pattern:

@Module({
imports: [
TypeOrmModule.forFeature([IntegrationEntity, IntegrationSetting]),
HttpModule,
],
controllers: [IntegrationController],
providers: [
IntegrationService,
IntegrationCommandHandler,
IntegrationEventHandler,
],
})
export class IntegrationPluginModule {
// Register OAuth callbacks, webhook endpoints, and settings
}

Feature Flags

Plugins can be enabled/disabled via environment variables:

# Enable/disable integrations
FEATURE_APP_INTEGRATION=true

# Feature-specific flags
FEATURE_JOB=true
FEATURE_ORGANIZATION_HELP_CENTER=true

Plugin Discovery

The platform discovers plugins through the module registration in the API bootstrap:

// packages/core/src/lib/bootstrap/index.ts
const app = await NestFactory.create(
AppModule.forRoot({
plugins: pluginConfig.plugins,
}),
);

Plugins are dynamically imported into the NestJS dependency injection container.