2026-03-05 05:24:55 -08:00
---
sidebar_position: 4
title: "Slack"
2026-03-08 19:51:17 -07:00
description: "Set up Hermes Agent as a Slack bot using Socket Mode"
2026-03-05 05:24:55 -08:00
---
# Slack Setup
2026-03-08 19:51:17 -07:00
Connect Hermes Agent to Slack as a bot using Socket Mode. Socket Mode uses WebSockets instead of
public HTTP endpoints, so your Hermes instance doesn't need to be publicly accessible — it works
behind firewalls, on your laptop, or on a private server.
2026-03-05 05:24:55 -08:00
2026-03-08 19:51:17 -07:00
:::warning Classic Slack Apps Deprecated
Classic Slack apps (using RTM API) were **fully deprecated in March 2025 ** . Hermes uses the modern
Bolt SDK with Socket Mode. If you have an old classic app, you must create a new one following
the steps below.
:::
## Overview
| Component | Value |
|-----------|-------|
docs: expand Docusaurus coverage across CLI, tools, skills, and skins (#1232)
- add code-derived reference pages for slash commands, tools, toolsets,
bundled skills, and official optional skills
- document the skin system and link visual theming separately from
conversational personality
- refresh quickstart, configuration, environment variable, and messaging
docs to match current provider, gateway, and browser behavior
- fix stale command, session, and Home Assistant configuration guidance
2026-03-13 21:34:41 -07:00
| **Library ** | `slack-bolt` / `slack_sdk` for Python (Socket Mode) |
2026-03-08 19:51:17 -07:00
| **Connection ** | WebSocket — no public URL required |
| **Auth tokens needed ** | Bot Token (`xoxb-` ) + App-Level Token (`xapp-` ) |
| **User identification ** | Slack Member IDs (e.g., `U01ABC2DEF3` ) |
---
## Step 1: Create a Slack App
1. Go to [https://api.slack.com/apps ](https://api.slack.com/apps )
2. Click **Create New App **
3. Choose **From scratch **
4. Enter an app name (e.g., "Hermes Agent") and select your workspace
5. Click **Create App **
You'll land on the app's **Basic Information ** page.
---
## Step 2: Configure Bot Token Scopes
Navigate to **Features → OAuth & Permissions ** in the sidebar. Scroll to **Scopes → Bot Token Scopes ** and add the following:
| Scope | Purpose |
|-------|---------|
| `chat:write` | Send messages as the bot |
2026-03-09 14:00:11 -07:00
| `app_mentions:read` | Detect when @mentioned in channels |
2026-03-08 19:51:17 -07:00
| `channels:history` | Read messages in public channels the bot is in |
| `channels:read` | List and get info about public channels |
2026-03-09 14:00:11 -07:00
| `groups:history` | Read messages in private channels the bot is invited to |
2026-03-08 19:51:17 -07:00
| `im:history` | Read direct message history |
| `im:read` | View basic DM info |
| `im:write` | Open and manage DMs |
| `users:read` | Look up user information |
2026-04-13 17:06:37 -06:00
| `files:read` | Read and download attached files, including voice notes/audio |
2026-03-09 14:00:11 -07:00
| `files:write` | Upload files (images, audio, documents) |
:::caution Missing scopes = missing features
Without `channels:history` and `groups:history` , the bot **will not receive messages in channels ** —
it will only work in DMs. These are the most commonly missed scopes.
:::
2026-03-08 19:51:17 -07:00
**Optional scopes:**
| Scope | Purpose |
|-------|---------|
2026-03-09 14:00:11 -07:00
| `groups:read` | List and get info about private channels |
2026-03-08 19:51:17 -07:00
---
## Step 3: Enable Socket Mode
Socket Mode lets the bot connect via WebSocket instead of requiring a public URL.
1. In the sidebar, go to **Settings → Socket Mode **
2. Toggle **Enable Socket Mode ** to ON
3. You'll be prompted to create an **App-Level Token ** :
- Name it something like `hermes-socket` (the name doesn't matter)
- Add the * * `connections:write` ** scope
- Click **Generate **
4. **Copy the token ** — it starts with `xapp-` . This is your `SLACK_APP_TOKEN`
:::tip
You can always find or regenerate app-level tokens under **Settings → Basic Information → App-Level Tokens ** .
:::
---
## Step 4: Subscribe to Events
2026-03-09 14:00:11 -07:00
This step is critical — it controls what messages the bot can see.
feat(honcho): async memory integration with prefetch pipeline and recallMode
Adds full Honcho memory integration to Hermes:
- Session manager with async background writes, memory modes (honcho/hybrid/local),
and dialectic prefetch for first-turn context warming
- Agent integration: prefetch pipeline, tool surface gated by recallMode,
system prompt context injection, SIGTERM/SIGINT flush handlers
- CLI commands: setup, status, mode, tokens, peer, identity, migrate
- recallMode setting (auto | context | tools) for A/B testing retrieval strategies
- Session strategies: per-session, per-repo (git tree root), per-directory, global
- Polymorphic memoryMode config: string shorthand or per-peer object overrides
- 97 tests covering async writes, client config, session resolution, and memory modes
2026-03-09 15:58:22 -04:00
2026-03-08 19:51:17 -07:00
1. In the sidebar, go to **Features → Event Subscriptions **
2. Toggle **Enable Events ** to ON
3. Expand **Subscribe to bot events ** and add:
2026-03-09 14:00:11 -07:00
| Event | Required? | Purpose |
|-------|-----------|---------|
| `message.im` | **Yes ** | Bot receives direct messages |
| `message.channels` | **Yes ** | Bot receives messages in **public ** channels it's added to |
| `message.groups` | **Recommended ** | Bot receives messages in **private ** channels it's invited to |
| `app_mention` | **Yes ** | Prevents Bolt SDK errors when bot is @mentioned |
2026-03-08 19:51:17 -07:00
4. Click **Save Changes ** at the bottom of the page
2026-03-09 14:00:11 -07:00
:::danger Missing event subscriptions is the #1 setup issue
If the bot works in DMs but **not in channels ** , you almost certainly forgot to add
`message.channels` (for public channels) and/or `message.groups` (for private channels).
Without these events, Slack simply never delivers channel messages to the bot.
:::
feat(honcho): async memory integration with prefetch pipeline and recallMode
Adds full Honcho memory integration to Hermes:
- Session manager with async background writes, memory modes (honcho/hybrid/local),
and dialectic prefetch for first-turn context warming
- Agent integration: prefetch pipeline, tool surface gated by recallMode,
system prompt context injection, SIGTERM/SIGINT flush handlers
- CLI commands: setup, status, mode, tokens, peer, identity, migrate
- recallMode setting (auto | context | tools) for A/B testing retrieval strategies
- Session strategies: per-session, per-repo (git tree root), per-directory, global
- Polymorphic memoryMode config: string shorthand or per-peer object overrides
- 97 tests covering async writes, client config, session resolution, and memory modes
2026-03-09 15:58:22 -04:00
2026-03-08 19:51:17 -07:00
---
2026-03-05 05:24:55 -08:00
2026-03-28 14:23:19 -07:00
## Step 5: Enable the Messages Tab
This step enables direct messages to the bot. Without it, users see * * "Sending messages to this app has been turned off"** when trying to DM the bot.
1. In the sidebar, go to **Features → App Home **
2. Scroll to **Show Tabs **
3. Toggle **Messages Tab ** to ON
4. Check * * "Allow users to send Slash commands and messages from the messages tab"**
:::danger Without this step, DMs are completely blocked
Even with all the correct scopes and event subscriptions, Slack will not allow users to send direct messages to the bot unless the Messages Tab is enabled. This is a Slack platform requirement, not a Hermes configuration issue.
:::
---
## Step 6: Install App to Workspace
2026-03-08 19:51:17 -07:00
1. In the sidebar, go to **Settings → Install App **
2. Click **Install to Workspace **
3. Review the permissions and click **Allow **
4. After authorization, you'll see a **Bot User OAuth Token ** starting with `xoxb-`
5. **Copy this token ** — this is your `SLACK_BOT_TOKEN`
:::tip
2026-03-09 14:00:11 -07:00
If you change scopes or event subscriptions later, you **must reinstall the app ** for the changes
to take effect. The Install App page will show a banner prompting you to do so.
2026-03-08 19:51:17 -07:00
:::
---
2026-03-28 14:23:19 -07:00
## Step 7: Find User IDs for the Allowlist
2026-03-08 19:51:17 -07:00
Hermes uses Slack **Member IDs ** (not usernames or display names) for the allowlist.
To find a Member ID:
1. In Slack, click on the user's name or avatar
2. Click **View full profile **
3. Click the * * ⋮** (more) button
4. Select **Copy member ID **
Member IDs look like `U01ABC2DEF3` . You need your own Member ID at minimum.
---
2026-03-28 14:23:19 -07:00
## Step 8: Configure Hermes
2026-03-08 19:51:17 -07:00
Add the following to your `~/.hermes/.env` file:
```bash
# Required
SLACK_BOT_TOKEN=xoxb-your-bot-token-here
2026-03-09 14:00:11 -07:00
SLACK_APP_TOKEN=xapp-your-app-token-here
2026-03-08 19:51:17 -07:00
SLACK_ALLOWED_USERS=U01ABC2DEF3 # Comma-separated Member IDs
# Optional
SLACK_HOME_CHANNEL=C01234567890 # Default channel for cron/scheduled messages
docs: add missing skills, CLI commands, and messaging env vars
Complete the documentation gaps identified in the previous audit:
Skills catalogs:
- skills-catalog.md: Add 7 missing bundled skills — data-science/
jupyter-live-kernel, dogfood/hermes-agent-setup, inference-sh/
inference-sh-cli, mlops/huggingface-hub, productivity/linear,
research/parallel-cli, social-media/xitter
- optional-skills-catalog.md: Add 8 missing optional skills —
blockchain/base, creative/blender-mcp, creative/meme-generation,
mcp/fastmcp, productivity/telephony, research/bioinformatics,
security/oss-forensics, security/sherlock
CLI commands reference:
- cli-commands.md: Add full documentation for hermes mcp (add/remove/
list/test/configure) and hermes plugins (install/update/remove/list)
Messaging platform docs:
- discord.md: Add DISCORD_REQUIRE_MENTION and
DISCORD_FREE_RESPONSE_CHANNELS to manual config env vars section
- signal.md: Add SIGNAL_ALLOW_ALL_USERS to env var reference table
- slack.md: Add SLACK_HOME_CHANNEL_NAME to config section
2026-03-24 08:12:37 -07:00
SLACK_HOME_CHANNEL_NAME=general # Human-readable name for the home channel (optional)
2026-03-08 19:51:17 -07:00
```
Or run the interactive setup:
2026-03-05 05:24:55 -08:00
```bash
2026-03-08 19:51:17 -07:00
hermes gateway setup # Select Slack when prompted
2026-03-05 05:24:55 -08:00
```
2026-03-08 19:51:17 -07:00
Then start the gateway:
2026-03-05 05:24:55 -08:00
```bash
2026-03-08 19:51:17 -07:00
hermes gateway # Foreground
2026-03-14 21:17:41 -07:00
hermes gateway install # Install as a user service
sudo hermes gateway install --system # Linux only: boot-time system service
2026-03-05 05:24:55 -08:00
```
2026-03-08 19:51:17 -07:00
---
2026-03-28 14:23:19 -07:00
## Step 9: Invite the Bot to Channels
2026-03-09 14:00:11 -07:00
After starting the gateway, you need to **invite the bot ** to any channel where you want it to respond:
```
/invite @Hermes Agent
```
The bot will **not ** automatically join channels. You must invite it to each channel individually.
---
## How the Bot Responds
Understanding how Hermes behaves in different contexts:
| Context | Behavior |
|---------|----------|
| **DMs ** | Bot responds to every message — no @mention needed |
2026-03-14 23:15:13 -07:00
| **Channels ** | Bot **only responds when @mentioned ** (e.g., `@Hermes Agent what time is it?` ). In channels, Hermes replies in a thread attached to that message. |
2026-04-07 10:21:03 -07:00
| **Threads ** | If you @mention Hermes inside an existing thread, it replies in that same thread. Once the bot has an active session in a thread, **subsequent replies in that thread do not require @mention ** — the bot follows the conversation naturally. |
2026-03-09 14:00:11 -07:00
:::tip
2026-04-07 10:21:03 -07:00
In channels, always @mention the bot to start a conversation. Once the bot is active in a thread, you can reply in that thread without mentioning it. Outside of threads, messages without @mention are ignored to prevent noise in busy channels.
2026-03-09 14:00:11 -07:00
:::
2026-04-02 12:38:13 -07:00
---
## Configuration Options
Beyond the required environment variables from Step 8, you can customize Slack bot behavior through `~/.hermes/config.yaml` .
2026-04-02 12:15:10 -07:00
2026-04-02 12:38:13 -07:00
### Thread & Reply Behavior
2026-04-02 12:15:10 -07:00
```yaml
platforms:
slack:
2026-04-02 12:38:13 -07:00
# Controls how multi-part responses are threaded
# "off" — never thread replies to the original message
# "first" — first chunk threads to user's message (default)
# "all" — all chunks thread to user's message
reply_to_mode: "first"
2026-04-02 12:15:10 -07:00
extra:
2026-04-02 12:38:13 -07:00
# Whether to reply in a thread (default: true).
# When false, channel messages get direct channel replies instead
# of threads. Messages inside existing threads still reply in-thread.
reply_in_thread: true
# Also post thread replies to the main channel
# (Slack's "Also send to channel" feature).
# Only the first chunk of the first reply is broadcast.
reply_broadcast: false
```
| Key | Default | Description |
|-----|---------|-------------|
| `platforms.slack.reply_to_mode` | `"first"` | Threading mode for multi-part messages: `"off"` , `"first"` , or `"all"` |
| `platforms.slack.extra.reply_in_thread` | `true` | When `false` , channel messages get direct replies instead of threads. Messages inside existing threads still reply in-thread. |
| `platforms.slack.extra.reply_broadcast` | `false` | When `true` , thread replies are also posted to the main channel. Only the first chunk is broadcast. |
### Session Isolation
```yaml
# Global setting — applies to Slack and all other platforms
group_sessions_per_user: true
```
When `true` (the default), each user in a shared channel gets their own isolated conversation session. Two people talking to Hermes in `#general` will have separate histories and contexts.
Set to `false` if you want a collaborative mode where the entire channel shares one conversation session. Be aware this means users share context growth and token costs, and one user's `/reset` clears the session for everyone.
### Mention & Trigger Behavior
```yaml
slack:
# Require @mention in channels (this is the default behavior;
# the Slack adapter enforces @mention gating in channels regardless,
# but you can set this explicitly for consistency with other platforms)
require_mention: true
# Custom mention patterns that trigger the bot
# (in addition to the default @mention detection)
mention_patterns:
- "hey hermes"
- "hermes,"
# Text prepended to every outgoing message
reply_prefix: ""
```
:::info
2026-04-07 10:21:03 -07:00
Unlike Discord and Telegram, Slack does not have a `free_response_channels` equivalent. The Slack adapter requires `@mention` to start a conversation in channels. However, once the bot has an active session in a thread, subsequent thread replies do not require a mention. In DMs, the bot always responds without needing a mention.
2026-04-02 12:38:13 -07:00
:::
### Unauthorized User Handling
```yaml
slack:
# What happens when an unauthorized user (not in SLACK_ALLOWED_USERS) DMs the bot
# "pair" — prompt them for a pairing code (default)
# "ignore" — silently drop the message
unauthorized_dm_behavior: "pair"
```
You can also set this globally for all platforms:
```yaml
unauthorized_dm_behavior: "pair"
2026-04-02 12:15:10 -07:00
```
2026-04-02 12:38:13 -07:00
The platform-specific setting under `slack:` takes precedence over the global setting.
### Voice Transcription
```yaml
# Global setting — enable/disable automatic transcription of incoming voice messages
stt_enabled: true
```
2026-04-02 12:15:10 -07:00
2026-04-02 12:38:13 -07:00
When `true` (the default), incoming audio messages are automatically transcribed using the configured STT provider before being processed by the agent.
### Full Example
```yaml
# Global gateway settings
group_sessions_per_user: true
unauthorized_dm_behavior: "pair"
stt_enabled: true
# Slack-specific settings
slack:
require_mention: true
unauthorized_dm_behavior: "pair"
# Platform config
platforms:
slack:
reply_to_mode: "first"
extra:
reply_in_thread: true
reply_broadcast: false
```
2026-04-02 12:15:10 -07:00
2026-03-09 14:00:11 -07:00
---
feat(honcho): async memory integration with prefetch pipeline and recallMode
Adds full Honcho memory integration to Hermes:
- Session manager with async background writes, memory modes (honcho/hybrid/local),
and dialectic prefetch for first-turn context warming
- Agent integration: prefetch pipeline, tool surface gated by recallMode,
system prompt context injection, SIGTERM/SIGINT flush handlers
- CLI commands: setup, status, mode, tokens, peer, identity, migrate
- recallMode setting (auto | context | tools) for A/B testing retrieval strategies
- Session strategies: per-session, per-repo (git tree root), per-directory, global
- Polymorphic memoryMode config: string shorthand or per-peer object overrides
- 97 tests covering async writes, client config, session resolution, and memory modes
2026-03-09 15:58:22 -04:00
2026-03-08 19:51:17 -07:00
## Home Channel
Set `SLACK_HOME_CHANNEL` to a channel ID where Hermes will deliver scheduled messages,
cron job results, and other proactive notifications. To find a channel ID:
2026-03-05 05:24:55 -08:00
2026-03-08 19:51:17 -07:00
1. Right-click the channel name in Slack
2. Click **View channel details **
3. Scroll to the bottom — the Channel ID is shown there
2026-03-05 05:24:55 -08:00
```bash
SLACK_HOME_CHANNEL=C01234567890
```
2026-03-08 19:51:17 -07:00
Make sure the bot has been **invited to the channel ** (`/invite @Hermes Agent` ).
2026-03-05 05:24:55 -08:00
2026-03-08 19:51:17 -07:00
---
2026-03-05 05:24:55 -08:00
docs: comprehensive documentation audit — fix 9 HIGH, 20+ MEDIUM gaps (#4087)
Reference docs fixes:
- cli-commands.md: remove non-existent --provider alibaba, add hermes
profile/completion/plugins/mcp to top-level table, add --profile/-p
global flag, add --source chat option
- slash-commands.md: add /yolo and /commands, fix /q alias conflict
(resolves to /queue not /quit), add missing aliases (/bg, /set-home,
/reload_mcp, /gateway)
- toolsets-reference.md: fix hermes-api-server (not same as hermes-cli,
omits clarify/send_message/text_to_speech)
- profile-commands.md: fix show name required not optional, --clone-from
not --from, add --remove/--name to alias, fix alias path, fix export/
import arg types, remove non-existent fish completion
- tools-reference.md: add EXA_API_KEY to web tools requires_env
- mcp-config-reference.md: add auth key for OAuth, tool name sanitization
- environment-variables.md: add EXA_API_KEY, update provider values
- plugins.md: remove non-existent ctx.register_command(), add
ctx.inject_message()
Feature docs additions:
- security.md: add /yolo mode, approval modes (manual/smart/off),
configurable timeout, expanded dangerous patterns table
- cron.md: add wrap_response config, [SILENT] suppression
- mcp.md: add dynamic tool discovery, MCP sampling support
- cli.md: add Ctrl+Z suspend, busy_input_mode, tool_preview_length
- docker.md: add skills/credential file mounting
Messaging platform docs:
- telegram.md: add webhook mode, DoH fallback IPs
- slack.md: add multi-workspace OAuth support
- discord.md: add DISCORD_IGNORE_NO_MENTION
- matrix.md: add MSC3245 native voice messages
- feishu.md: expand from 129 to 365 lines (encrypt key, verification
token, group policy, card actions, media, rate limiting, markdown,
troubleshooting)
- wecom.md: expand from 86 to 264 lines (per-group allowlists, media,
AES decryption, stream replies, reconnection, troubleshooting)
Configuration docs:
- quickstart.md: add DeepSeek, Copilot, Copilot ACP providers
- configuration.md: add DeepSeek provider, Exa web backend, terminal
env_passthrough/images, browser.command_timeout, compression params,
discord config, security/tirith config, timezone, auxiliary models
21 files changed, ~1000 lines added
2026-03-30 17:15:21 -07:00
## Multi-Workspace Support
Hermes can connect to **multiple Slack workspaces ** simultaneously using a single gateway instance. Each workspace is authenticated independently with its own bot user ID.
### Configuration
Provide multiple bot tokens as a **comma-separated list ** in `SLACK_BOT_TOKEN` :
```bash
# Multiple bot tokens — one per workspace
SLACK_BOT_TOKEN=xoxb-workspace1-token,xoxb-workspace2-token,xoxb-workspace3-token
# A single app-level token is still used for Socket Mode
SLACK_APP_TOKEN=xapp-your-app-token
```
Or in `~/.hermes/config.yaml` :
```yaml
platforms:
slack:
token: "xoxb-workspace1-token,xoxb-workspace2-token"
```
### OAuth Token File
In addition to tokens in the environment or config, Hermes also loads tokens from an **OAuth token file ** at:
```
docs: fix 40+ discrepancies between documentation and codebase (#5818)
Comprehensive audit of all ~100 doc pages against the actual code, fixing:
Reference docs:
- HERMES_API_TIMEOUT default 900 -> 1800 (env-vars)
- TERMINAL_DOCKER_IMAGE default python:3.11 -> nikolaik/python-nodejs (env-vars)
- compression.summary_model default shown as gemini -> actually empty string (env-vars)
- Add missing GOOGLE_API_KEY, GEMINI_API_KEY, GEMINI_BASE_URL env vars (env-vars)
- Add missing /branch (/fork) slash command (slash-commands)
- Fix hermes-cli tool count 39 -> 38 (toolsets-reference)
- Fix hermes-api-server drop list to include text_to_speech (toolsets-reference)
- Fix total tool count 47 -> 48, standalone 14 -> 15 (tools-reference)
User guide:
- web_extract.timeout default 30 -> 360 (configuration)
- Remove display.theme_mode (not implemented in code) (configuration)
- Remove display.background_process_notifications (not in defaults) (configuration)
- Browser inactivity timeout 300/5min -> 120/2min (browser)
- Screenshot path browser_screenshots -> cache/screenshots (browser)
- batch_runner default model claude-sonnet-4-20250514 -> claude-sonnet-4.6
- Add minimax to TTS provider list (voice-mode)
- Remove credential_pool_strategies from auth.json example (credential-pools)
- Fix Slack token path platforms/slack/ -> root ~/.hermes/ (slack)
- Fix Matrix store path for new installs (matrix)
- Fix WhatsApp session path for new installs (whatsapp)
- Fix HomeAssistant config from gateway.json to config.yaml (homeassistant)
- Fix WeCom gateway start command (wecom)
Developer guide:
- Fix tool/toolset counts in architecture overview
- Update line counts: main.py ~5500, setup.py ~3100, run.py ~7500, mcp_tool ~2200
- Replace nonexistent agent/memory_store.py with memory_manager.py + memory_provider.py
- Update _discover_tools() list: remove honcho_tools, add skill_manager_tool
- Add session_search and delegate_task to intercepted tools list (agent-loop)
- Fix budget warning: two-tier system (70% caution, 90% warning) (agent-loop)
- Fix gateway auth order (per-platform first, global last) (gateway-internals)
- Fix email_adapter.py -> email.py, add webhook.py + api_server.py (gateway-internals)
- Add 7 missing providers to provider-runtime list
Other:
- Add Docker --cap-add entries to security doc
- Fix Python version 3.10+ -> 3.11+ (contributing)
- Fix AGENTS.md discovery claim (not hierarchical walk) (tips)
- Fix cron 'add' -> canonical 'create' (cron-internals)
- Add pre_api_request/post_api_request hooks to plugin guide
- Add Google/Gemini provider to providers page
- Clarify OPENAI_BASE_URL deprecation (providers)
2026-04-07 10:17:44 -07:00
~/.hermes/slack_tokens.json
docs: comprehensive documentation audit — fix 9 HIGH, 20+ MEDIUM gaps (#4087)
Reference docs fixes:
- cli-commands.md: remove non-existent --provider alibaba, add hermes
profile/completion/plugins/mcp to top-level table, add --profile/-p
global flag, add --source chat option
- slash-commands.md: add /yolo and /commands, fix /q alias conflict
(resolves to /queue not /quit), add missing aliases (/bg, /set-home,
/reload_mcp, /gateway)
- toolsets-reference.md: fix hermes-api-server (not same as hermes-cli,
omits clarify/send_message/text_to_speech)
- profile-commands.md: fix show name required not optional, --clone-from
not --from, add --remove/--name to alias, fix alias path, fix export/
import arg types, remove non-existent fish completion
- tools-reference.md: add EXA_API_KEY to web tools requires_env
- mcp-config-reference.md: add auth key for OAuth, tool name sanitization
- environment-variables.md: add EXA_API_KEY, update provider values
- plugins.md: remove non-existent ctx.register_command(), add
ctx.inject_message()
Feature docs additions:
- security.md: add /yolo mode, approval modes (manual/smart/off),
configurable timeout, expanded dangerous patterns table
- cron.md: add wrap_response config, [SILENT] suppression
- mcp.md: add dynamic tool discovery, MCP sampling support
- cli.md: add Ctrl+Z suspend, busy_input_mode, tool_preview_length
- docker.md: add skills/credential file mounting
Messaging platform docs:
- telegram.md: add webhook mode, DoH fallback IPs
- slack.md: add multi-workspace OAuth support
- discord.md: add DISCORD_IGNORE_NO_MENTION
- matrix.md: add MSC3245 native voice messages
- feishu.md: expand from 129 to 365 lines (encrypt key, verification
token, group policy, card actions, media, rate limiting, markdown,
troubleshooting)
- wecom.md: expand from 86 to 264 lines (per-group allowlists, media,
AES decryption, stream replies, reconnection, troubleshooting)
Configuration docs:
- quickstart.md: add DeepSeek, Copilot, Copilot ACP providers
- configuration.md: add DeepSeek provider, Exa web backend, terminal
env_passthrough/images, browser.command_timeout, compression params,
discord config, security/tirith config, timezone, auxiliary models
21 files changed, ~1000 lines added
2026-03-30 17:15:21 -07:00
```
This file is a JSON object mapping team IDs to token entries:
```json
{
"T01ABC2DEF3": {
"token": "xoxb-workspace-token-here",
"team_name": "My Workspace"
}
}
```
Tokens from this file are merged with any tokens specified via `SLACK_BOT_TOKEN` . Duplicate tokens are automatically deduplicated.
### How it works
- The **first token ** in the list is the primary token, used for the Socket Mode connection (AsyncApp).
- Each token is authenticated via `auth.test` on startup. The gateway maps each `team_id` to its own `WebClient` and `bot_user_id` .
- When a message arrives, Hermes uses the correct workspace-specific client to respond.
- The primary `bot_user_id` (from the first token) is used for backward compatibility with features that expect a single bot identity.
---
2026-03-05 05:24:55 -08:00
## Voice Messages
2026-03-08 19:51:17 -07:00
Hermes supports voice on Slack:
2026-03-14 19:29:01 -07:00
- **Incoming:** Voice/audio messages are automatically transcribed using the configured STT provider: local `faster-whisper` , Groq Whisper (`GROQ_API_KEY` ), or OpenAI Whisper (`VOICE_TOOLS_OPENAI_KEY` )
2026-03-08 19:51:17 -07:00
- **Outgoing:** TTS responses are sent as audio file attachments
---
## Troubleshooting
| Problem | Solution |
|---------|----------|
| Bot doesn't respond to DMs | Verify `message.im` is in your event subscriptions and the app is reinstalled |
2026-03-09 14:00:11 -07:00
| Bot works in DMs but not in channels | **Most common issue. ** Add `message.channels` and `message.groups` to event subscriptions, reinstall the app, and invite the bot to the channel with `/invite @Hermes Agent` |
| Bot doesn't respond to @mentions in channels | 1) Check `message.channels` event is subscribed. 2) Bot must be invited to the channel. 3) Ensure `channels:history` scope is added. 4) Reinstall the app after scope/event changes |
| Bot ignores messages in private channels | Add both the `message.groups` event subscription and `groups:history` scope, then reinstall the app and `/invite` the bot |
2026-03-28 14:23:19 -07:00
| "Sending messages to this app has been turned off" in DMs | Enable the **Messages Tab ** in App Home settings (see Step 5) |
2026-03-08 19:51:17 -07:00
| "not_authed" or "invalid_auth" errors | Regenerate your Bot Token and App Token, update `.env` |
| Bot responds but can't post in a channel | Invite the bot to the channel with `/invite @Hermes Agent` |
| "missing_scope" error | Add the required scope in OAuth & Permissions, then **reinstall ** the app |
| Socket disconnects frequently | Check your network; Bolt auto-reconnects but unstable connections cause lag |
2026-03-09 14:00:11 -07:00
| Changed scopes/events but nothing changed | You **must reinstall ** the app to your workspace after any scope or event subscription change |
### Quick Checklist
If the bot isn't working in channels, verify **all ** of the following:
1. ✅ `message.channels` event is subscribed (for public channels)
2. ✅ `message.groups` event is subscribed (for private channels)
3. ✅ `app_mention` event is subscribed
4. ✅ `channels:history` scope is added (for public channels)
5. ✅ `groups:history` scope is added (for private channels)
6. ✅ App was **reinstalled ** after adding scopes/events
7. ✅ Bot was **invited ** to the channel (`/invite @Hermes Agent` )
8. ✅ You are * * @mentioning ** the bot in your message
2026-03-08 19:51:17 -07:00
---
2026-03-05 05:24:55 -08:00
## Security
:::warning
2026-03-08 19:51:17 -07:00
**Always set `SLACK_ALLOWED_USERS` ** with the Member IDs of authorized users. Without this setting,
the gateway will **deny all messages ** by default as a safety measure. Never share your bot tokens —
treat them like passwords.
2026-03-05 05:24:55 -08:00
:::
2026-03-08 19:51:17 -07:00
- Tokens should be stored in `~/.hermes/.env` (file permissions `600` )
- Rotate tokens periodically via the Slack app settings
- Audit who has access to your Hermes config directory
- Socket Mode means no public endpoint is exposed — one less attack surface