Skip to content

Connectors Overview

A connector is a plugin that knows how to talk to one external system. It receives raw data from that system and normalizes it into NormalizedEvent[].

TypeHow data arrivesKey methods
webhookHTTP POST from external serviceverifyWebhook() + normalize()
pollerKairosis fetches on a cron schedulepoll(config, workspaceId)
devicePush from a local device or appnormalize()
importBulk one-time or periodic importimport() as AsyncGenerator
syncBidirectional — import + export + live syncimport() + export() + sync?()
ConnectorTypeStatusEvents emitted
GitHubwebhookStablegithub.commit.pushed, github.pr.*, github.issue.*
SlackwebhookPlannedslack.message.*, slack.reaction.*
EmailpollerPlannedemail.received, email.sent
Google CalendarpollerPlannedcalendar.event.*
ObsidiandevicePlannedobsidian.note.*
NotionpollerPlannednotion.page.*

Every connector implements IKairosisConnector:

export interface IKairosisConnector {
manifest: ConnectorManifest;
configSchema(): ZodSchema;
secretsSchema?(): ZodSchema;
onInit?(config: unknown): Promise<void>;
onDestroy?(): Promise<void>;
}

Plus the type-specific interface (IWebhookConnector, IPollerConnector, etc.).

Each connector declares a manifest describing its identity and capabilities:

{
id: 'github', // kebab-case, unique
name: 'GitHub',
description: 'GitHub webhook connector',
version: '1.0.0',
author: 'Kairosis',
type: 'webhook',
triggers: ['github.commit.pushed', 'github.pr.opened', ...],
requiresAuth: true,
authType: 'none', // auth handled via webhook secret
setupInstructions: [
'Create a webhook in your GitHub repository settings.',
'Set the payload URL to the webhook URL shown below.',
...
],
}

Every connector has two separate Zod schemas:

SchemaStored asReturned via API
configSchema()JSONB (plaintext)Yes
secretsSchema()BYTEA (AES-256-GCM)Never — only hasSecrets: boolean

Never merge config and secrets. Never return secrets via the API.