Create a Slack app, paste a webhook URL, and your entire OE agent library is available inside Slack. Any message triggers your default agent. Named commands run specific ones. Manual approval chains pause and wait for your reply — right inside the channel.
A Slack bot powered by OE Runtime that lives in your workspace. Once connected:
npxGo to api.slack.com/apps and click Create New App. Choose From scratch, give it a name (e.g. OE Bot), and select your workspace.
Once created you land on the app's Basic Information page. Keep this tab open — you will come back to it several times during setup.
In the left sidebar click OAuth & Permissions. Scroll down to Bot Token Scopes and add all six of these:
chat:write — lets the bot send messages to channels and DMschannels:history — lets the bot read channel messages (required to receive events)im:history + im:read + im:write — lets the bot send and receive direct messageschannels:read — lets the bot see which channels it belongs toStill on the OAuth & Permissions page, scroll up and click Install to Workspace. Slack will ask you to confirm the permissions — click Allow.
After installation, the page shows your Bot User OAuth Token — it starts with xoxb-. Copy it. You will paste it into oe-config.json in the next step.
The bot token is the one that starts with xoxb-. Ignore the User OAuth Token (xoxp-) and any App-Level Tokens — only the xoxb- token goes in oe-config.json.
In your OE project folder, open oe-config.json and add the Slack connector. Leave publicUrl blank for now — you will fill it in after the Cloudflare tunnel starts.
{
"llm": {
"provider": "openai",
"model": "gpt-4o",
"apiKey": "sk-..."
},
"server": {
"enabled": true,
"port": 3333,
"publicUrl": "",
"webhook": true
},
"connectors": [
{
"connection_name": "My Slack Bot",
"connection_type": "slack",
"botToken": "xoxb-YOUR-BOT-TOKEN",
"auto_reply": true,
"rate_limit": { "messages_per_minute": 10 },
"history": { "enabled": true, "max_messages": 10 }
}
]
}
Replace sk-... with your LLM API key and xoxb-YOUR-BOT-TOKEN with the token you copied in Step 3.
"webhook": true activates the webhook receiver. "auto_reply": true tells the server to post replies back to the same Slack channel automatically. rate_limit caps messages per minute to prevent abuse.
Create a hello-world/ folder in your project and add a SKILL.md inside it. This is the first skill you will call from Slack to confirm everything is working. Also create a root agent.yaml that lists it:
---
name: hello-world
description: Greets the user and shares a fun fact about today in history. Use to verify your Slack bot is connected and responding.
license: Apache-2.0
metadata:
author: Open Enthrium
version: "1.0"
---
You are a friendly, concise AI assistant.
## Step 1: Greet
Say hello, mention today's date, and share one fun fact about today in history. Keep it brief.
agent.yaml
name: Hello World Slack Bot
description: Slack bot with a hello-world skill.
skills:
- path: ./hello-world
trigger_type: auto
default: true
Slack needs a public HTTPS URL to deliver events to your server. Cloudflare Tunnel gives you one for free — no account or signup needed.
npx cloudflared tunnel --url http://localhost:3333
You will see a URL like this appear in the output:
Copy that URL and keep this terminal open — the tunnel must stay running while you test.
Open oe-config.json and paste the Cloudflare URL into publicUrl:
"publicUrl": "https://purple-mouse-1234.trycloudflare.com"
This tells OE Runtime what public address to advertise as the Slack webhook URL. You will start the server in Step 11 after finishing the Slack configuration.
This is the most commonly missed step. When you create a Slack app using certain templates, Socket Mode is enabled by default. When Socket Mode is ON, Slack uses a WebSocket connection instead of HTTP webhooks — it ignores the Event Subscriptions URL entirely, even if it shows Verified ✓. Your server will never receive any messages.
Symptom: Event Subscriptions shows Verified ✓, bot is in the channel, but the server terminal shows nothing when messages are sent. The fix is always the same — disable Socket Mode.
In the left sidebar click Event Subscriptions.
https://purple-mouse-1234.trycloudflare.com/webhook/slack
The OE server and Cloudflare tunnel must both be active when you paste the URL. If Slack cannot reach the URL it shows a red error instead of Verified ✓. Check that both terminals are still running.
Still on the Event Subscriptions page, scroll down to Subscribe to bot events and click Add Bot User Event. Add both of these:
message.channels — fires when someone sends a message in a channel the bot is inmessage.im — fires when someone sends the bot a direct messageClick Save Changes. Slack will prompt you to reinstall the app — click reinstall your app and go through the confirmation. This regenerates the bot token. Copy the new xoxb- token from the OAuth & Permissions page and update botToken in your oe-config.json.
While you're in the Slack app settings, also enable direct messages to the bot:
This lets users DM the bot directly without a channel invite.
Open a second terminal (keep the Cloudflare one running). Navigate to your project folder — the folder that contains agent.yaml and oe-config.json — then start OE Runtime in server mode:
cd path/to/your-project-folder
npx -y @openenthrium/oe-runtime@latest --serve --config oe-config.json
The server must be started from the same folder as agent.yaml so it can discover the skills listed inside it.
You now have three terminals running: Cloudflare tunnel, OE Runtime server, and your regular shell. Keep all three open.
Invite the bot to a channel first:
/invite @OE Bot
Then send commands as plain text — no slash needed. Start with the hello-world skill you created in Step 5:
Slack intercepts messages that start with / as Slack slash commands — they never reach your bot. Use commands without the slash: type help, agents, run hello instead of /help, /agents, /run hello. For approving chains, type yes or no as plain messages.
| Type this in Slack | What it does |
|---|---|
| help | Show all supported commands |
| skills | List all available skills in your project |
| run <skill-name> | Run a named skill from your agent.yaml |
| status | Health check — LLM, connectors, uptime |
| yes / no | Approve or reject a pending manual chain |
| Any plain message | Routes to the default: true agent |
Socket Mode is enabled. Go to Socket Mode in the left sidebar and toggle it OFF. This is the most common cause — when Socket Mode is on, Slack uses WebSockets instead of HTTP webhooks and the Request URL is never called, even if it shows Verified ✓.
Check that Event Subscriptions shows Verified ✓ and that message.channels is listed under bot events. Also confirm the bot has been invited to the channel with /invite @OE Bot.
Go to App Home → Messages Tab → tick "Allow users to send Slash commands and messages from the messages tab". This only affects DMs — channel messages are not affected.
Your OE server is not reachable. Make sure both terminals are running — the Cloudflare tunnel and the OE Runtime server. If the tunnel URL changed (it changes every time you restart it), update publicUrl in oe-config.json, restart the server, and paste the new URL in Event Subscriptions.
You typed a command starting with /. Slack intercepts those. Type without the slash: run hello instead of /run hello.
The Cloudflare tunnel URL changes every time you run npx cloudflared. Each session you need to update publicUrl in oe-config.json and paste the new URL in Event Subscriptions. For a permanent setup, run OE Runtime on a server with a fixed domain — no tunnel needed.
Download OE Runtime and connect your entire agent library to Slack — no backend code, no framework, no lock-in.
Get OE Runtime →