This guide walks an operator through enabling theDocumentation Index
Fetch the complete documentation index at: https://allhandsai-docs-enterprise-slack-integration.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
@OpenHands Slack integration on a
self-hosted OpenHands Enterprise (OHE) installation — both the Replicated VM-based
install (see the Quick Start) and standalone Helm
(Kubernetes Installation).
Once enabled, end users can mention @openhands in any Slack channel or thread to start
and follow up on conversations from Slack, exactly like they can on OpenHands Cloud.
If you are looking for the OpenHands Cloud Slack integration (no self-hosting
involved), see Slack Integration
instead — that page uses the All-Hands-managed Slack App and skips the steps below.
Overview
Unlike OpenHands Cloud, a self-hosted install needs its own Slack App so that Slack webhooks land on your domain rather thanapp.all-hands.dev. The configuration involves
four phases:
- Create a Slack App for your install (one-time, by a Slack workspace admin).
- Configure OHE with the Slack App’s credentials (one-time, by the OHE operator).
- Install the Slack App into your workspace (one-time, by a Slack workspace admin).
- Link each user’s account in OpenHands ↔ Slack (per-user, self-service).
Prerequisites
Before you start, confirm:- OHE is already installed and reachable. You can sign in to OpenHands Enterprise at
https://app.<your-base-domain>(e.g.https://app.mycompany.com). - Inbound HTTPS from the public internet terminates at your OHE ingress on
https://app.<your-base-domain>/slack/*. Slack delivers webhooks from public IPs, so fully air-gapped installs are not supported by this integration today (Slack Socket Mode is disabled). - Valid TLS certificate on
app.<your-base-domain>. Slack will reject webhook URLs with untrusted certificates. - A Slack workspace admin/owner is available to install the app and generate a short-lived Slack App Configuration Token.
- A workstation with
uvinstalled and outbound network access toslack.com(only needed for the optional helper script in Step 2).
Replace
<your-base-domain> throughout this guide with the same domain you used during
installation (the value behind KOTS_HOSTNAME or the ingress.host Helm value).Step 1: Create the Slack App
You can mint the Slack App either with the helper script inOpenHands-Cloud (recommended) or by
pasting the manifest into Slack’s UI. Either path produces the same app.
Option A: Helper script (recommended)
-
Generate a Slack App Configuration Token:
- Sign in to https://api.slack.com/apps as a workspace admin/owner.
- In Your App Configuration Tokens, click Generate Token.
- Select your workspace and click Generate.
- Copy the access token (starts with
xoxe.xoxp-). Treat it like a password — it is short-lived but is sufficient to create apps in your workspace.
-
Clone OpenHands-Cloud and run the script:
-
The script prints three values. Save them now — Slack will let you retrieve them
again from the app’s “Basic Information” page, but the script does not store them
anywhere:
https://app.<your-base-domain>):
| Slack setting | URL |
|---|---|
| OAuth Redirect URL | /slack/install-callback |
| Event Subscriptions Request URL | /slack/on-event |
| Interactivity Request URL | /slack/on-form-interaction |
| Options Load URL | /slack/on-options-load |
app_mentions:read, chat:write, users:read, channels:history,
groups:history, mpim:history, im:history.
Socket Mode, Org Deploy, and Token Rotation are intentionally disabled to match
what the OHE backend expects today.
Option B: Paste the manifest into Slack’s UI
If you can’t run the script (e.g. your workstation has no outbound Slack access), open https://api.slack.com/apps → Create New App → From an app manifest, choose your workspace, and paste the YAML below. Replace<your-base-domain> first.
Step 2: Configure OpenHands Enterprise
Pick the path that matches how OHE is deployed.- Replicated (VM/embedded cluster)
- Standalone Helm
-
Open the Replicated admin console at
https://<admin-console-host>:30000and sign in. - Navigate to Config → Enable Slack (or search “Slack” in the config side panel).
-
Set the following values:
Field Value Enable Slack Integration ✅ on Slack Client ID from Step 1 Slack Client Secret from Step 1 Slack Signing Secret from Step 1 - Click Save config and then Deploy the new version.
- Wait for the deployment to reach Ready — Replicated will roll the integrations pod with the new secrets and environment variables.
- Creates a Kubernetes
Secret/slack-authholding the client and signing secrets. - Sets
slack.enabled=true,slack.clientId=<client-id>, andENABLE_V1_SLACK_RESOLVER=trueon the integrations service. - Exposes
/slack/*on the integrations ingress on port 3000.
SLACK_CLIENT_ID, SLACK_CLIENT_SECRET, SLACK_SIGNING_SECRET, and
SLACK_WEBHOOKS_ENABLED=true.
Step 3: Install the Slack App into your workspace
With OHE configured, point your browser at:If Slack reports
missing_scope after install, the most likely cause is that the
manifest was edited to drop one of the *:history scopes. Re-run Step 1 (or fix the
scopes in the Slack App OAuth & Permissions page) and then re-install via the
same URL.Step 4: Have users link their Slack accounts
@OpenHands will only respond to users whose Slack identity has been linked to an
OpenHands user. Every user — including the admin who installed the app — needs to do
this once. They have two options:
- From OpenHands: sign in at
https://app.<your-base-domain>, open Settings → Integrations, and click Install OpenHands Slack App. - From Slack: the first time they mention
@openhands, the bot will reply with a one-time login link that completes the same flow.
slack_users table, mapping the Slack user
ID to a Keycloak (OpenHands) user. Once linked, any conversation started from Slack runs
as that OpenHands user — using their LLM keys, provider tokens, and organization.
Using the integration
Day-to-day usage is identical to OpenHands Cloud — see Working With the Slack App for screenshots and the “mention@openhands in a thread” follow-up flow.
A few self-hosted specifics worth knowing:
- Repo selection. When a user starts a new conversation without an obvious repo in
the message, OpenHands posts an ephemeral repo picker. The picker calls back to
/slack/on-options-loadon your domain and lists repositories the user can access through their linked Git provider. - Thread ownership. Only the user who started a thread conversation can
@openhandsin follow-up replies — other workspace members mentioning the bot in the same thread will get an “not authorized to send messages to this conversation” response. This is intentional until per-org access lands. - Conversation links. The bot’s “I’m on it!” reply links to
https://app.<your-base-domain>/conversations/<id>. Users must be signed in to OHE to view it.
Limitations
- No Slack Socket Mode. Your OHE install must be reachable from the public internet
on
https://app.<your-base-domain>/slack/*. Air-gapped installs cannot use this integration today. - No token rotation. The bot uses a long-lived
xoxb-token issued at install time. If you regenerate the Slack App’s credentials, re-run Steps 2 and 3. - Single Slack App per install. The OHE backend assumes one Slack App per deployment. To support multiple workspaces, install the same Slack App into each workspace via Step 3 — do not create separate apps.
- Slack Connect / externally shared channels are not supported for posting from the bot.
Troubleshooting
Slack reports 'Your URL didn't respond with the value of the challenge parameter'
Slack reports 'Your URL didn't respond with the value of the challenge parameter'
Slack could not reach You should get an HTTP response (a 403 is expected and fine — it means the route
exists). If the request times out or the certificate is rejected, fix DNS / firewall
/ TLS before clicking Retry in Slack’s Event Subscriptions panel.
https://app.<your-base-domain>/slack/on-event from the
public internet, or the TLS certificate isn’t trusted. Verify from a machine outside
your network:`@openhands` mentions are ignored
`@openhands` mentions are ignored
- Check that
SLACK_WEBHOOKS_ENABLED=trueis set on the integrations pod. If it is missing, your OHE deployment did not re-roll after Step 2 — redeploy. - Tail the integrations pod logs and mention
@openhandsagain. You should see aslack_on_eventlog line. If you don’t, Slack isn’t reaching your install. - If you see
slack_on_eventfollowed byslack_is_duplicate, Slack is retrying an old delivery — wait 60 seconds and try a fresh message.
Users get a login link every time they mention @openhands
Users get a login link every time they mention @openhands
The user’s Slack ID is not linked to an OpenHands user. Have them complete Step 4
once. If they have already linked but still see the login prompt, check that their
Keycloak user is active and that the
slack_users row exists:`missing_scope` error in pod logs
`missing_scope` error in pod logs
The Slack App is missing one of the bot scopes listed in Step 1. Open the app’s
OAuth & Permissions page in Slack, add the missing scope, then re-install via
https://app.<your-base-domain>/slack/install. Users do not need to re-link.Re-installing after rotating Slack credentials
Re-installing after rotating Slack credentials
- Regenerate the Slack App’s Client Secret / Signing Secret on Slack’s app config page.
- Update them in Step 2 (Replicated admin console or the Helm secret).
- Redeploy OHE so the integrations pod picks up the new values.
- Existing user account links remain valid — no need to re-run Step 4.
Reference
- Helper script:
scripts/create_slack_app/inOpenHands-Cloud - Replicated config group:
replicated/config.yaml(slack_configuration) - Helm chart values:
charts/openhands/values.yaml(slack.*) - Cloud-hosted Slack flow (for end-user UX reference): Slack Integration

