Passa al contenuto principale

Built-in Plugins Overview

Ever Gauzy uses a plugin-based architecture to extend the platform with optional features, integrations, analytics, and media capture capabilities. Built-in plugins are NestJS dynamic modules that ship with the monorepo and are registered through the PluginModule system at bootstrap time.

Architecture​

Each plugin:

  • Registers its own entities, services, and controllers
  • Can extend existing entities with custom fields
  • Runs migrations independently
  • Has its own configuration via environment variables

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

Available Built-in Plugins​

Integration Plugins​

PluginPackageDescription
AI@gauzy/plugin-integration-aiGauzy AI assistant, NLP, smart matching
GitHub@gauzy/plugin-integration-githubIssue sync, PRs, repos, webhooks
Upwork@gauzy/plugin-integration-upworkTime tracking and contract sync
HubStaff@gauzy/plugin-integration-hubstaffTime tracking sync
Jira@gauzy/plugin-integration-jiraIssue tracking sync
WakaTime@gauzy/plugin-integration-wakatimeDeveloper metrics
SIM@gauzy/plugin-integration-simAI workflow orchestration

Automation Plugins​

PluginPackageDescription
Zapier@gauzy/plugin-integration-zapier5,000+ app automations
Make@gauzy/plugin-integration-makeVisual workflow builder
Activepieces@gauzy/plugin-integration-activepiecesOpen-source automation

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
Job Proposal@gauzy/plugin-job-proposalJob proposal management
Changelog@gauzy/plugin-changelogRelease changelog management

Analytics & Monitoring Plugins​

PluginPackageDescription
Sentry@gauzy/plugin-sentryError tracking & performance
Analytics@gauzy/plugin-jitsu-analyticsProduct analytics, event tracking

Media & Capture Plugins​

PluginPackageDescription
Media Capturecamshot, soundshot, videosScreenshot, audio, video capture

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 Loading & Registration​

Plugins are loaded through the PluginModule in the API bootstrap:

// apps/api/src/plugin-config.ts
@Module({
imports: [
PluginModule.init({
plugins: [
IntegrationAIModule,
IntegrationGitHubModule,
SentryTracingModule,
// ... more plugins
],
}),
],
})
export class AppModule {}

The platform discovers and dynamically imports each plugin into the NestJS dependency injection container.

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
}

Environment-Based Activation​

Most plugins are controlled by environment variables:

# Feature flags
FEATURE_APP_INTEGRATION=true
FEATURE_JOB=true
FEATURE_ORGANIZATION_HELP_CENTER=true

# Integration-specific credentials
GAUZY_AI_GRAPHQL_ENDPOINT=http://localhost:3005/graphql
GITHUB_CLIENT_ID=your-github-id
HUBSTAFF_CLIENT_ID=your-hubstaff-id
JIRA_CLIENT_ID=your-jira-id

Creating a Custom 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​

Add the plugin module to your API configuration:

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

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

For a deeper dive into plugin development, see the Plugin System guide.