Curiosity

Slack

Ingests Slack channels, threaded conversations, file attachments, and user identities. Maps channel membership onto workspace access groups so private channels stay private.

variant=info text="Chat" variant=success text="OAuth" variant=success text="Maps ACLs"

What gets ingested

Element Mapped to
Workspace / team _Workspace
Channel (public, private, DM, group DM) _Channel with IsPrivate property
Channel members _User linked by _HasMember
Message _Message
Thread / reply _Message with _RepliesTo edge
Attached file _FileEntry + _Blob
Reactions Mapped onto the _Message as properties

Authentication

  • Type: Slack OAuth 2.0 (bot + user token).
  • Token is long-lived; the connector does not need to refresh.
sequenceDiagram participant Admin participant WS as Workspace participant Slack as Slack OAuth Admin->>WS: Click "Connect Slack" WS->>Slack: /oauth/v2/authorize Slack->>Admin: Consent screen Admin->>Slack: Approve Slack->>WS: oauth code WS->>Slack: oauth.v2.access Slack->>WS: bot + user tokens

Access control mapping

Source Carried into the graph?
Public-channel membership Yes — anyone in the workspace can see. Mapped to the workspace-wide access group.
Private-channel membership Yes — each private channel becomes its own _AccessGroup. Only members get permission.
DM / Group DM Yes — modeled as a per-participant access group.
External-shared channels (Slack Connect) Members from both workspaces are added to the channel's access group.

Sync cadence

  • Default cron: daily at 02:00 UTC for full reconciliation; threads are tracked incrementally between runs.
  • Incremental sync: per-thread latest-timestamp watermark. New messages and edits are picked up incrementally.

Notable

  • The connector can be configured for channels only, DMs only, or both.
  • Slack rate-limits are respected automatically — the SDK backs off on 429.
  • Built on Slack.NetStandard.