Connecting sources
A source is one external system whose records you want indexed. Moʻolelo ships with four connectors:
| Source | Authentication | Indexed records |
|---|---|---|
| GitHub | Personal Access Token | Issues, pull requests |
| Confluence Cloud | OAuth 2.0 (3LO refresh-token grant) | Pages, blog posts |
| Jira Cloud | OAuth 2.0 (3LO refresh-token grant) | Issues, comments |
| SharePoint | Microsoft Graph OAuth 2.0 (client credentials) | Drive items (files, folders) |
You can connect any combination — the same Moʻolelo deployment talks to all four. Adding a source you weren't using before is an SQL INSERT; nothing else to redeploy.
How it fits together
your source ─── webhook ──▶ Moʻolelo
(steady state)
your source ◀── REST API ─── Moʻolelo
(initial backfill, configurable polling)Each source typically goes through two phases when you onboard it:
- Backfill. The connector walks the source's REST API and pulls every existing record. This is a one-time pass that catches up on history.
- Webhook. Once the backfill finishes, you flip the source into webhook mode. The source pushes change notifications; Moʻolelo translates them into records.
Backfilling can take hours for a large corpus. Webhook mode is real-time (typically under a second from source change to indexed result).
Per-tenant configuration
Connectors are configured per tenant in a Postgres table named connector_configs. One row per (tenant, source) pair. The row contains:
- The source identifier (
github,confluence,jira,sharepoint). - The instance — the workspace / org / Cloud ID for the source-system installation.
- The mode —
backfill,webhook, ordisabled. - The resources — list of repos / spaces / sites to watch.
- The authentication credentials — source-specific JSON.
Inserting or updating a row takes effect within milliseconds; the connector picks it up via Postgres LISTEN/NOTIFY. There's no service to restart.
Webhook delivery
Webhook deliveries from your sources land at a single URL on your Moʻolelo deployment:
https://<your-moolelo-host>/webhooks/<provider>/<instance>Where <provider> is github, confluence, jira, or sharepoint, and <instance> is the same string you used in connector_configs. The webhook receiver validates the signature on each delivery and rejects unsigned or wrongly-signed traffic.
See Configuring webhooks for the per-provider signature requirements and how to register the webhook URL on the source side.
Disabling a source
To pause ingestion from a source without losing its configuration, set its mode column to disabled. The connector stops processing within milliseconds; existing indexed records remain searchable. Re-enabling is the inverse operation.
To remove a source entirely, delete the row. Already-indexed records remain in Iceberg and Vespa until you explicitly purge them — Moʻolelo doesn't auto-delete data when you change connector configuration, by design.

