Ga naar hoofdinhoud

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.