Your AI agent runs a task, hits a manual checkpoint, and posts a message in your Slack channel asking for approval. Reply yes — the pipeline continues. Reply no — it stops. No dashboard, no browser tab, just Slack.
A three-skill pipeline connected to your Slack workspace. The first two skills run automatically, then the pipeline pauses for your approval before the third runs:
At the manual step, your Slack bot posts a message and waits. You reply yes in the channel — the final skill runs and posts the result.
run hello-world responds in Slack before continuing here.npxCreate a folder called chain-slack/. One root agent.yaml orchestrates all three skills — no separate YAML files per skill needed:
The root agent.yaml lists all three skills in the order they run. auto skills fire immediately; manual skills pause for your approval in Slack.
name: Chain Slack — Approval Demo
description: Three-skill pipeline with automatic and manual approval stages.
skills:
# Runs first — auto (no approval needed)
- path: ./chain-test
trigger_type: auto
# Runs second — auto (fires immediately after chain-test)
- path: ./chain-followup
trigger_type: auto
# Runs third — manual (pauses and asks for your approval in Slack)
- path: ./chain-manual
trigger_type: manual
trigger_type: auto fires immediately and passes output as context to the next skill. trigger_type: manual pauses the pipeline and posts a Slack message asking for your approval before continuing.
---
name: chain-test
description: Greets you and chains to two follow-up skills. Tests auto and manual skill behaviour.
license: Apache-2.0
metadata:
author: Open Enthrium
version: "1.0"
---
You are a helpful assistant.
## Step 1: Greet
Say hello, mention today's date, and give one fun fact about today in history.
chain-followup/SKILL.md
---
name: chain-followup
description: Runs automatically after the greeter and summarises its output.
license: Apache-2.0
metadata:
author: Open Enthrium
version: "1.0"
---
You are a summarizer assistant.
## Step 1: Summarize
The previous skill just ran. Summarize its output in one sentence
and say "Auto skill complete ✅".
chain-manual/SKILL.md
---
name: chain-manual
description: Runs only after the user approves in Slack.
license: Apache-2.0
metadata:
author: Open Enthrium
version: "1.0"
---
You are an assistant that confirms tasks.
## Step 1: Confirm
The user approved running you from Slack.
Acknowledge the approval, briefly reference what the previous skills said,
and say "Manual approval complete ✅".
Add your LLM key, server settings, and Slack bot token. Leave publicUrl blank — 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 your Slack bot token. See Connect OE Runtime to Slack for how to create a Slack app and get the token.
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
Copy that URL. 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"
Open a second terminal and start OE Runtime from inside the chain-slack/ folder:
cd chain-slack
npx -y @openenthrium/oe-runtime@latest --serve --config oe-config.json
The server prints the exact webhook URL to paste into your Slack app. Make sure Socket Mode is OFF in your Slack app (Settings → Socket Mode) — when Socket Mode is on, Slack ignores the webhook URL and your server receives nothing.
In your Slack app at api.slack.com/apps, confirm that:
message.channels and message.im/invite @OE BotThe Cloudflare tunnel URL changes every time you restart npx cloudflared. Each new session: update publicUrl in oe-config.json, restart the server, then paste the new URL in Event Subscriptions and re-verify.
In your Slack channel, type (no slash needed):
Reply no instead of yes when the bot asks for approval:
Both yes and approve approve the pending skill. Both no and cancel reject it. The bot tracks the pending skill per channel — you do not need to pass any ID manually.
| Type in Slack | What it does |
|---|---|
| run <skill-name> | Run a named skill — triggers its full pipeline automatically |
| yes / approve | Approve the pending manual skill and run it |
| no / cancel | Reject and discard the pending manual skill |
| skills | List all available skills in your project |
| help | Show all supported commands |
| Any plain message | Routes to the default: true skill |
Slack intercepts messages starting with / as Slack slash commands — they never reach your bot. Always type commands without the slash: run chain-test, yes, no, help.
yes, the server runs the next skill with the previous output as context and posts the result to Slack.no, the skill is discarded and the bot confirms cancellation.Pending skills are held in memory. If the server restarts, any skill waiting for approval is lost — you will need to run the agent again. Each channel can have at most one pending skill at a time.
Download OE Runtime and start running approval workflows from your Slack workspace — no code, no backend, no dashboard.
Get OE Runtime →