Live connectors

Memory that keeps up with your tools.

Live connectors are the continuous ingest path. They run on a schedule, remember where they left off, and pull only new documents from external services into your memory directory. Connect once, and your docs stay searchable alongside everything else your agents know.

Different from importers

Importers transform a one-shot export file into memories in a single pass, then their job is done. Live connectors are continuous and cursor-based: every invocation is an incremental sync that picks up where the last one stopped, using a stored cursor so only new documents are fetched. If you have a single export file, use an importer. If you have a service you want Remnic to keep watching, use a live connector.

What the connectors do

Google Drive

Polls for changed documents and exports Google Docs, Sheets, and Slides to text. Read-only scope. The first sync seeds a cursor and imports no history, so enabling it does not flood memory. Scope with folder ids or leave empty for all accessible files.

Notion

Imports Notion database page content on a poll schedule via the Notion REST API. Limited to the database ids you list, with an empty list meaning the connector does nothing.

Gmail and GitHub

Both run on the scheduled runner as built-in connectors. The manual remnic connectors run target currently covers Google Drive and Notion.

Read-only by contract

Connectors never mutate the upstream service: no marking emails read, no editing pages, no archiving. They are idempotent, cancellable, and never log document content.

OAuth and credentials, honestly

Keychain-backed credential storage is still deferred. Connectors currently read OAuth credentials directly from the validated config, so the intended pattern is to populate clientId, clientSecret, and refreshToken from a secret store (environment variables, an OS keychain, or a systemd EnvironmentFile) rather than committing real values.

Credentials are never written through the connector state store. Only the cursor and sync-status metadata are persisted, at <memoryDir>/state/connectors/<id>.json on your disk. Each connector documents the minimum OAuth scope it needs (Google Drive uses read-only drive.readonly), and connectors are off until you explicitly configure them.

Configuration

Enable Google Drive with credentials from a secret store:

{
  "connectors": {
    "googleDrive": {
      "enabled": true,
      "clientId": "${GOOGLE_DRIVE_CLIENT_ID}",
      "clientSecret": "${GOOGLE_DRIVE_CLIENT_SECRET}",
      "refreshToken": "${GOOGLE_DRIVE_REFRESH_TOKEN}",
      "pollIntervalMs": 300000,
      "folderIds": []
    }
  }
}

The googleapis package is not a hard dependency of core: install it in the host package when you enable the connector.

CLI

remnic connectors list        # enabled state, last poll, last error
remnic connectors status      # same data, JSON for scripting
remnic connectors run google-drive
remnic connectors run notion

When any connector is enabled, the scheduled runner wakes on a cron and runs only the connectors whose own poll interval says they are due. Full reference: docs/live-connectors.md.

Remnic was formerly named engram. Legacy names remain during the compatibility window. See the rename note.