> ## Documentation Index
> Fetch the complete documentation index at: https://docs.userepo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Connectors

> OAuth integrations that bring source data into Repo's memory.

A **connector** is a live OAuth integration with one provider — one Slack workspace, one Notion workspace, one Drive account, one Gmail mailbox. An organization can have multiple connectors of the same provider (e.g. two Slack workspaces) and they'll be treated as distinct sources.

## Lifecycle

```
pending → active → (error | disabled)
```

* **pending** — OAuth callback completed, credentials encrypted and stored, first sync queued but not finished.
* **active** — Sync running on schedule. The provider's API is responsive.
* **error** — Last sync failed. The connector card shows the error message; sync retries continue.
* **disabled** — Manually disabled in the console. The scheduler skips it.

## Sync schedule

The worker runs a scheduler tick every `SYNC_POLL_INTERVAL_MS` (default 5s). Any connector whose `last_synced_at` is older than `AUTO_SYNC_INTERVAL_MIN` (default 15 minutes) gets queued for a sync run. You can also trigger a manual sync via `POST /v1/sync-runs` or the **Sync now** button in the console.

A full resync (`fullResync: true`) discards the cursor and re-ingests every source item — useful after a schema change or a connector reauthorization.

## Credentials at rest

OAuth tokens are encrypted with AES-256-GCM using the `ENCRYPTION_KEY_BASE64` master key. The encrypted bytes sit in the `connectors.encrypted_credentials` column. Plaintext tokens never touch the database, never leave the API process, never appear in logs.

Rotating `ENCRYPTION_KEY_BASE64` requires re-encrypting every connector row — there's no built-in rotation tool yet. If you need this, contact support.

## Provider-specific notes

<CardGroup cols={2}>
  <Card title="Slack" icon="slack" href="/connectors/slack">
    Channels + threads + permalinks. Channel allowlist for noise control.
  </Card>

  <Card title="Notion" icon="square-n" href="/connectors/notion">
    Pages + blocks. Per-page integration grant means narrow scope by default.
  </Card>

  <Card title="Google Drive" icon="google-drive" href="/connectors/google-drive">
    Docs, sheets, Markdown, CSV, PDF. Per-file ACLs preserved.
  </Card>

  <Card title="Gmail" icon="envelope" href="/connectors/gmail">
    Threads + headers + bodies. gmail.readonly scope.
  </Card>
</CardGroup>

## Disconnecting

There's currently no "Disconnect" button in the console UI. To remove a connector, contact support or (if self-hosted) delete the row from `connectors` and let the cascade clean up source items + embeddings.
