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 |
|---|---|---|
| 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β
| Plugin | Package | Description |
|---|---|---|
| GitHub UI | @gauzy/plugin-integration-github-ui | GitHub settings UI |
| Job Search UI | @gauzy/plugin-job-search-ui | Job board search UI |
| Job Matching UI | @gauzy/plugin-job-matching-ui | Job matching interface |
| 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 |
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