Slack app manifest
OttoBot is not yet listed in the Slack App Directory, so every installation is a manual "From a manifest" install. This page carries the manifest to paste.
The manifest below is a convenience copy for manual installs. The authoritative version
lives in the OttoBot repository at
deploy/slack-app-manifest.yaml.
If you have access to that repository, prefer it — it is always current. If the two ever
disagree, the repository copy wins.
For the full walkthrough — creating the app, installing it, and obtaining both tokens — see Slack Integration. This page is only the manifest itself.
Paste this into Slack
At api.slack.com/apps, choose Create New App → From a manifest, select your workspace, then paste the YAML below unmodified. Editing it is the most common cause of an install that appears to succeed but leaves OttoBot silent.
display_information:
name: OttoBot
description: AI sales assistant — ask me about accounts, contacts, and deals.
background_color: "#3E78B9"
features:
bot_user:
display_name: OttoBot
always_online: true
app_home:
messages_tab_enabled: true
messages_tab_read_only_enabled: false
# Makes a DM with OttoBot an assistant thread, which is what enables the
# tool-activity status line. Use `agent_view` (not the legacy `assistant_view`).
agent_view:
agent_description: Ask OttoBot about accounts, contacts, and deals.
oauth_config:
scopes:
bot:
- app_mentions:read
- channels:history
- channels:read
- chat:write
- files:write
- groups:history
- groups:read
- im:history
- im:read
- im:write
- users:read
- users:read.email
- reactions:read
- reactions:write
# Slack adds this automatically when the agent surface is enabled; it is declared
# here so the manifest matches what Slack actually provisions.
- assistant:write
settings:
event_subscriptions:
bot_events:
- app_mention
- message.channels
- message.groups
- message.im
# Required by the agent surface. Do not add `assistant_thread_started` — it belongs
# to the superseded `assistant_view` surface.
- app_home_opened
- app_context_changed
interactivity:
is_enabled: false
org_deploy_enabled: false
socket_mode_enabled: true
token_rotation_enabled: false
Why these settings matter
| Setting | Why it must stay as-is |
|---|---|
socket_mode_enabled: true | OttoBot connects out to Slack over Socket Mode. Without it there is no inbound URL for Slack to call, so OttoBot never receives messages. |
agent_view | Makes a DM with OttoBot an assistant thread, which is what enables the tool-activity status line while it works. |
interactivity: false | OttoBot uses no buttons or modals; enabling interactivity would make Slack expect a request URL that does not exist. |
token_rotation_enabled: false | Phoenix stores long-lived tokens. Enabling rotation invalidates them on Slack's schedule and OttoBot goes offline. |
The bot scope list | Every scope backs a capability OttoBot uses (reading channel history, posting replies, resolving user names, uploading files). Hand-picking a subset produces partial failures that are hard to diagnose. |
After creating the app
You need two different tokens, from two different screens — they are routinely swapped:
| Phoenix field | Token | Where to find it in Slack |
|---|---|---|
| Bot User OAuth Token | starts xoxb- | OAuth & Permissions |
| App-Level Token | starts xapp- | Basic Information → App-Level Tokens (scope connections:write) |
Enter both under Integrations → Slack → Connect in your Phoenix organization settings. They are stored encrypted at rest and never returned to the browser in plaintext.
Next steps
- Slack Integration — the full setup and troubleshooting guide