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:
| Capability | Description |
|---|---|
| Entities | New database tables/columns |
| Controllers | New API endpoints |
| Services | Business logic |
| Commands/Queries | CQRS handlers |
| Event Handlers | React to platform events |
| Middleware | Request processing |
| Guards | Authorization rules |
UI Pluginsβ
UI plugins provide:
| Capability | Description |
|---|---|
| Pages | New routes and views |
| Components | Reusable UI components |
| Modules | Angular feature modules |
| Services | Frontend business logic |
Available Built-in Pluginsβ
Integration Pluginsβ
| Plugin | Package | Description |
|---|---|---|
| AI | @gauzy/plugin-integration-ai | Gauzy AI assistant, NLP, smart matching |
| GitHub | @gauzy/plugin-integration-github | Issue sync, PRs, repos, webhooks |
| Upwork | @gauzy/plugin-integration-upwork | Time tracking and contract sync |
| HubStaff | @gauzy/plugin-integration-hubstaff | Time tracking sync |
| Jira | @gauzy/plugin-integration-jira | Issue tracking sync |
| WakaTime | @gauzy/plugin-integration-wakatime | Developer metrics |
| SIM | @gauzy/plugin-integration-sim | AI workflow orchestration |
Automation Pluginsβ
| Plugin | Package | Description |
|---|---|---|
| Zapier | @gauzy/plugin-integration-zapier | 5,000+ app automations |
| Make | @gauzy/plugin-integration-make | Visual workflow builder |
| Activepieces | @gauzy/plugin-integration-activepieces | Open-source automation |
Feature Pluginsβ
| Plugin | Package | Description |
|---|---|---|
| Documents | @gauzy/plugin-docs | Document hub, wiki pages, review, AI knowledge |
| Knowledge Base | @gauzy/plugin-knowledge-base | Help center / knowledge base |
| Product Reviews | @gauzy/plugin-product-reviews | Product review system |
| Job Search | @gauzy/plugin-job-search | Job board search integration |
| Job Proposal | @gauzy/plugin-job-proposal | Job proposal management |
| Changelog | @gauzy/plugin-changelog | Release changelog management |
Analytics & Monitoring Pluginsβ
| Plugin | Package | Description |
|---|---|---|
| Sentry | @gauzy/plugin-sentry | Error tracking & performance |
| Analytics | @gauzy/plugin-jitsu-analytics | Product analytics, event tracking |
Media & Capture Pluginsβ
| Plugin | Package | Description |
|---|---|---|
| Media Capture | camshot, soundshot, videos | Screenshot, audio, video capture |
UI Pluginsβ
UI plugins extend the frontend with pages, navigation, tabs, and dashboard widgets. They are registered in apps/gauzy/src/plugin-ui.config.ts and built on the Plugin UI System (@gauzy/plugin-ui).
Integration UIβ
| Plugin | Package | Description |
|---|---|---|
| Upwork UI | @gauzy/plugin-integration-upwork-ui | Upwork authorization, contracts, reports, transactions |
| GitHub UI | @gauzy/plugin-integration-github-ui | GitHub integration settings UI |
Jobs UI (Plugin Group)β
The Jobs UI plugins use a parent-child architecture. JobsPlugin is the parent; child plugins contribute tabs:
| Plugin | Package | Tab / Page | Permission |
|---|---|---|---|
| JobsPlugin | @gauzy/plugin-jobs-ui | /pages/jobs (parent layout) | FEATURE_JOB |
| JobEmployeePlugin | @gauzy/plugin-job-employee-ui | Employee tab | ORG_JOB_EMPLOYEE_VIEW |
| JobSearchPlugin | @gauzy/plugin-job-search-ui | Browse tab | ORG_JOB_SEARCH |
| JobMatchingPlugin | @gauzy/plugin-job-matching-ui | Matching tab | ORG_JOB_MATCHING_VIEW |
| JobProposalTemplatePlugin | @gauzy/plugin-job-proposal-ui | Proposal Template tab | ORG_PROPOSAL_TEMPLATES_VIEW |
| JobProposalPlugin | @gauzy/plugin-job-proposal-ui | /pages/sales/proposals | ORG_PROPOSALS_VIEW |
Dashboard UIβ
| Plugin | Package | Description |
|---|---|---|
| Dashboard Time Track React UI | @gauzy/plugin-dashboard-time-track-react-ui | React-based time tracking widgets (demo only) |
Other UI Pluginsβ
| Plugin | Package | Description |
|---|---|---|
| Documents UI | @gauzy/plugin-docs-ui | Documents hub, tree, page editor, review queue |
| Knowledge Base UI | @gauzy/plugin-knowledge-base-ui | Knowledge base frontend |
| Onboarding UI | @gauzy/plugin-onboarding-ui | Setup/onboarding wizard UI |
| Legal UI | @gauzy/plugin-legal-ui | Privacy/Terms pages |
UI Plugin Registrationβ
All UI plugins are registered in a single config file β apps/gauzy/src/plugin-ui.config.ts:
import { IntegrationUpworkPlugin } from '@gauzy/plugin-integration-upwork-ui';
import { JobsPlugin } from '@gauzy/plugin-jobs-ui';
import { JobProposalPlugin, JobProposalTemplatePlugin } from '@gauzy/plugin-job-proposal-ui';
import { JobEmployeePlugin } from '@gauzy/plugin-job-employee-ui';
import { JobSearchPlugin } from '@gauzy/plugin-job-search-ui';
import { JobMatchingPlugin } from '@gauzy/plugin-job-matching-ui';
import { DashboardTimeTrackReactUiPlugin } from '@gauzy/plugin-dashboard-time-track-react-ui';
export const uiPluginConfig: PluginUiConfig = {
// ... i18n config
plugins: [
// Flat plugin
IntegrationUpworkPlugin,
// Plugin group β parent with child plugins
JobsPlugin.init({
plugins: [
JobProposalPlugin,
JobEmployeePlugin,
JobSearchPlugin,
JobMatchingPlugin,
JobProposalTemplatePlugin
]
}),
// Conditional β demo environments only
...(environment.DEMO ? [DashboardTimeTrackReactUiPlugin] : [])
]
};
For the full Plugin UI architecture, see the Plugin UI System guide. To build your own UI plugin, see Getting Started.
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.
Related Pagesβ
- Plugin System β how to build plugins
- Architecture: Plugin System β plugin architecture
- Custom Integrations β API-based integrations