Skip to main content

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.

Which copy should I use?

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

SettingWhy it must stay as-is
socket_mode_enabled: trueOttoBot connects out to Slack over Socket Mode. Without it there is no inbound URL for Slack to call, so OttoBot never receives messages.
agent_viewMakes a DM with OttoBot an assistant thread, which is what enables the tool-activity status line while it works.
interactivity: falseOttoBot uses no buttons or modals; enabling interactivity would make Slack expect a request URL that does not exist.
token_rotation_enabled: falsePhoenix stores long-lived tokens. Enabling rotation invalidates them on Slack's schedule and OttoBot goes offline.
The bot scope listEvery 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 fieldTokenWhere to find it in Slack
Bot User OAuth Tokenstarts xoxb-OAuth & Permissions
App-Level Tokenstarts 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