SupaNet
Using SupaNet

Slack

Add the bot to Slack rooms and bind them to collections for contextual answers.

SupaNet can join Slack channels as a bot. Invite it to a room, bind that room to one or more collections (and optionally an agent), and mention it - it will answer using that room's context: docs, files, to-dos, and links.

By default, the bot only replies when @mentioned. You can also enable ambient mode on a channel: the bot reads every message and a cheap model decides whether to chime in unprompted, guided by a participation prompt you write. One room equals one context, Claude-Tag style. Your team can ask questions in Slack and get answers grounded in the collections you've bound to that channel.

Setup

The setup guide in Settings → Slack walks you through it step-by-step (~5 minutes). Here's what happens:

  1. Create the app — Go to https://api.slack.com/appsCreate New AppFrom a manifest, pick your workspace, and paste the manifest that Settings provides. It pre-fills the bot's name, permissions, and your workspace's event URL — nothing to configure by hand.

  2. Install and grab credentials — Click Install to Workspace, then copy the Bot User OAuth Token (starts with xoxb-) and the Signing Secret from Basic InformationApp Credentials. Paste both into Settings and hit Connect Slack. They are stored in Supabase Vault — never in a table or the browser.

  3. Verify the request URL — Back in the Slack app, open Event Subscriptions and check that the Request URL shows Verified. (Save your credentials in Settings first — verification uses them. If it fails, click Retry.)

  4. Invite the bot to a channel — In your Slack workspace, type /invite @assistant in the room you want it in.

  5. Bind the room — Go to Settings → Slack → Bind a channel:

    • Paste the Channel ID (find it in Slack: click the channel name → About tab → at the bottom)
    • Pick one or more collections the room can use
    • Optionally pick an agent (with or without tool access)
    • Optionally enable ambient mode (see below) to have the bot listen to all messages
    • Save the binding

To edit an existing binding, click Edit on its card in the Channel bindings list. You can update its collections, agent, mode, or settings. The channel ID cannot be changed — delete and re-create the binding if you need to move it to a different channel.

  1. Try it — Type in Slack: @assistant what's the latest on the launch? The bot will answer using the bound collections' content.

How it works

When someone @mentions the bot:

  1. Slack sends an event to the slack-events edge function
  2. The function verifies the request signature (HMAC using your signing secret)
  3. It looks up the channel binding (collections + agent)
  4. It loads that room's context and the recent thread transcript
  5. The bot thinks and replies in the thread

The reply uses the binding's creator's access - so if you're an admin and bind a workspace-visibility collection, everyone in that room can use it.

Tools and agents

A channel binding can have an optional agent. When set, the bot uses the agent's instructions and can run its tools - but only if you enable the Allow the agent's tools checkbox on the binding.

By default, tools are off. This means an untrusted room (or one where you just want answers, no actions) runs the bot read-only.

Ambient mode

By default the bot only replies when @mentioned. Turn on ambient mode for a channel and the bot will read every message and decide whether to chime in on its own.

How it works

  1. Absorb — Every message in the channel is saved to the unified Inbox (source='slack') when Save messages to the Inbox is enabled. This makes channel traffic searchable, filable into collections, and available to event listeners — even if the bot stays silent.

  2. Skip mentions — Messages that @mention the bot are handled by the mention-only path (no double reply).

  3. Pre-filter — Trivial messages (emoji reactions, "lol", bare links) are dropped before any model call, keeping costs low in busy channels.

  4. Decide — A cheap decision model (configurable per channel, or the workspace utility model by default) reads the message and channel context, guided by your participation prompt ("chime in on billing questions; stay quiet for banter"), and returns {respond: true/false}. It fails silent — if the check errors, the bot stays quiet (spamming is worse than missing).

  5. Reply — On respond: true, it runs the same guardrails and agent loop as a mention, replying in the thread.

Setup

When you bind a channel, a new Ambient mode section appears:

  • Enabled — Turn on to listen to all messages instead of mentions only
  • When should it chime in? — Your guidance text. Be specific: "jump in when someone asks about X or seems stuck; stay quiet for banter and greetings"
  • Decision model (optional) — Any OpenRouter slug (e.g. anthropic/claude-haiku-4.5). Leave blank to use the workspace utility model (cheapest).
  • Save messages to the Inbox — Capture every message into Inbox for search and event listeners, even when the bot doesn't reply.

Important: Before enabling ambient mode, you must subscribe your Slack app to the channel message events. Slack only sends the bot @mentions by default — ambient mode requires it to receive all messages. Go to https://api.slack.com/apps → your app → Event SubscriptionsSubscribe to bot eventsAdd Bot User Event → add message.channels for public channels (and message.groups for private channels too) → Save Changes. No reinstall needed — these events use scopes the bot already has and start flowing immediately. Apps created from the current manifest in Settings (the "Copy app manifest" button) already include these events.

Cost and noise

Ambient is opt-in per channel — existing mention-only bindings are untouched. The pre-filter + the "default to silent" guidance + the cheap decision model keep it affordable. A very busy ambient channel will make one cheap model call per non-trivial message. Point the decision model at Haiku or another cheap OpenRouter option to tune costs.

Safety

  • The endpoint is public but every request must carry a valid HMAC signature from your signing secret - there is no URL token to leak.
  • Bot messages never trigger replies (no loops).
  • Guardrails run and fail closed - if a request is blocked, you see a message in Slack and a log entry.
  • Tools are off by default per binding, mirroring webhook safety.

Activity and auditing

Every mention is logged:

  • Slack events table - admin-readable, with who asked, what they asked, and the outcome
  • Activity feed - replies log as slack.reply
  • Usage page - calls are tracked with context = 'slack' for cost tracking

Not built yet

  • DMs to the bot (replying with just your own context)
  • send_slack_message builtin for agents to proactively post into bound rooms
  • In-channel / commands to manage bindings without leaving Slack
  • Per-thread cooldown / rate cap for ambient channels
  • Resolving Slack display names on captured inbox messages (they store the raw user id today)

On this page