Hermes (hermes-agent · site · MIT) is the engine's optional assistant gateway — the h lane. It is NOT a coding CLI: it bridges chat apps (Slack, WhatsApp, Telegram, Discord, Signal, Email, …) to an agent running on your machine, so you can reach the engine from wherever the conversation already is. Slack is databayt's wired channel; WhatsApp (Abdout's personal number) is wired for the jobs lane since 2026-10-05.
Hermes replaced OpenClaw as the gateway lane. If a machine previously ran OpenClaw, Hermes imports its persona, memories, skills, and platform configs in one command:
hermes claw migrate --dry-run # preview
hermes claw migrate # import from OpenClawInstall
The onboarding wizard installs Hermes when the Hermes (gateway) lane is selected (default: all lanes). Manually:
# macOS / Linux / WSL2
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash# Windows (PowerShell)
iex (irm https://hermes-agent.nousresearch.com/install.ps1)Installs to ~/.hermes (Windows: %LOCALAPPDATA%\hermes), CLI binary hermes, launcher alias h (written into the managed # BEGIN databayt agents block). First-time model/provider setup: hermes setup.
Gateway — wire the channels
The gateway is a single background process that runs all configured platform adapters at once. Setup is interactive by design — onboarding never runs it headless:
hermes gateway setup # interactive wizard — select Slack when prompted
hermes gateway run # run in foreground (this terminal)
hermes gateway install # install as a user service (persists across reboots)
hermes gateway start # start the installed service
hermes gateway status # is it up?Diagnostics: hermes doctor.
Slack wiring (databayt's channel)
Hermes connects to Slack over Socket Mode (WebSocket) — your machine needs no public endpoint.
1. Create the Slack app from the Hermes manifest:
hermes slack manifest --write # writes ~/.hermes/slack-manifest.jsonThen at api.slack.com/apps → Create New App → From an app manifest → pick the databayt-sh workspace → paste the manifest JSON → create. The manifest carries the required scopes (chat:write, app_mentions:read, channels:history, groups:history, im:*, files:*, …) — without channels:history the bot cannot see channel messages.
2. Collect both tokens and put them in ~/.hermes/.env:
SLACK_BOT_TOKEN=xoxb-... # OAuth & Permissions → Bot User OAuth Token
SLACK_APP_TOKEN=xapp-... # Basic Information → App-Level Tokens (connections:write)3. Allowlist yourself (required — Hermes ignores everyone else):
SLACK_ALLOWED_USERS=U01ABC2DEF3 # your Slack Member ID (profile → ⋮ → Copy member ID)4. Optional — proactive notifications. A home channel lets Hermes send (not just reply): scheduled results, background-task completions, broadcasts:
SLACK_HOME_CHANNEL=C01234567890 # channel details → bottom → Channel IDInvite the bot to any channel it should live in: /invite @Hermes Agent. Then:
hermes gateway setup # select Slack
hermes gateway install # persist as a user serviceHermes-Slack vs Slack-MCP — two different pipes. The Slack MCP (
~/.claude/mcp.json→mcp.slack.com) lets Claude post to Slack as a tool (/slack send …). The Hermes gateway lets you talk to an agent on your machine from Slack, and lets that agent push proactive notifications back. They coexist; neither replaces the other.
WhatsApp wiring (personal number, the jobs lane)
Two different WhatsApp pipes exist, and only one fits a person's applications:
| Pipe | What it is | Use |
|---|---|---|
Baileys bridge (hermes whatsapp, WHATSAPP_MODE=self-chat) | Links Abdout's own WhatsApp as a device, like WhatsApp Web | Wired. Job applications to employers and one-line briefs to himself |
Cloud API (hermes whatsapp-cloud) | Meta Business API: text only, and outside a 24h window it needs an approved template | Not used. That's why the funnel's school messages are sent by a human |
Linking. hermes whatsapp refuses to run without a real terminal, so ! hermes whatsapp in Claude Code fails. Use pnpm jobs:whatsapp-pair in kun instead. It runs the same bridge in --pair-only --pair-json mode and opens localhost:8790 with a QR that refreshes itself. On the phone, scan it from the Mac screen: Settings → Linked devices → Link a device. A disconnected (515) right after the scan means success.
# ~/.hermes/.env after linking
WHATSAPP_MODE=self-chat
WHATSAPP_ALLOWED_USERS=249919071294 # only Abdout can command the agent; employers' replies are ignored
WHATSAPP_ENABLED=true
launchctl kickstart -k gui/$(id -u)/ai.hermes.gateway # restart; gateway_state.json → whatsapp "connected"Sending works without an LLM, like Slack: hermes send --to whatsapp:+250788123456 "text". An attachment rides as MEDIA:/path/cv.pdf caption. The jobs loop sends at most whatsappCap (5) cold applications a day. A personal number that messages many strangers gets banned, so the cap stays small.
Jobs lane commands (no model)
Hermes' model login is dead and the engine is subscription-only, so the gateway works the jobs lane through quick commands: type: exec entries that run a fixed shell command and reply with its output. There's no LLM and no arguments, and each must finish in 30s. Type them in your WhatsApp self-chat ("Message yourself") or a Slack DM to the bot:
| Command | Does |
|---|---|
/jobs | Status: last 7 days sent (email · form · WhatsApp), today, queued, held and why |
/jobsqueue | What goes out next. To veto, move the card to Hold on the board |
/jobsreplies | Real replies in the last 14 days (acknowledgements excluded) |
/jobspause · /jobsresume | Flip the loop's kill switch (jobs/.send-off) |
Install or refresh with pnpm jobs:hermes in kun (scripts/jobs/hermes-setup.sh). It rewrites only the quick_commands block of ~/.hermes/config.yaml, so comments survive and a dated .bak is kept. Then it restarts the gateway. Going the other way, the loop pushes a brief to the same chat only when an application is accepted: 🎯 Interview or 🏆 OFFER. Other replies stay on Slack and the board. Configure it with briefWhatsApp in scripts/jobs/config.ts; JOBS_BRIEF=off silences it. The CRM board stays the record. Commands only read it or flip the kill switch.
Daily use
| Action | How |
|---|---|
| Talk to Hermes in the terminal | h |
| Gateway up? | hermes gateway status |
| Adapter states (from CLI) | /platforms inside h |
| Diagnose | hermes doctor |
| Change model/provider | hermes model |
| Refresh Slack slash commands | hermes slack manifest --write, then reinstall the app |
Kun site integration (social egress)
The kun site's Social Hub talks to a Hermes endpoint via env vars (see .env.example): HERMES_API_URL, HERMES_API_KEY, and the client-visible NEXT_PUBLIC_HERMES_API_URL. The egress contract is evolving with hermes-agent — the honest boundary stays the same as it was under OpenClaw: Claude writes the copy; Hermes only relays it. See Social.
Telegram is not routed through Hermes. The brand-channel posting lane (
telegramin the Social Hub) calls the official Bot API directly from the site (TELEGRAM_BOT_TOKEN/TELEGRAM_CHANNEL_ID) — a plain HTTPS call that works from Vercel with no local gateway. A future Hermes Telegram adapter is the other pipe: chatting with your machine's agent from Telegram. Same distinction as Hermes-Slack vs Slack-MCP above.
Troubleshooting
| Symptom | Fix |
|---|---|
h / hermes not found | Restart the shell; the installer adds Hermes to PATH — or re-run the install one-liner |
| Bot doesn't see channel messages | The #1 setup issue is missing event subscriptions (message.channels / message.groups), not just the channels:history / groups:history scopes — re-create from the manifest (it carries both) and reinstall the app to the workspace |
| DMs blocked | Enable the Messages Tab in the Slack app's App Home settings |
| Messages silently ignored | Your Member ID isn't in SLACK_ALLOWED_USERS, or the channel isn't in SLACK_ALLOWED_CHANNELS |
| Scope/event changes not taking effect | Reinstall the app to the workspace (Slack requires it) |
'hermes whatsapp' requires an interactive terminal | Expected from Claude Code. Use pnpm jobs:whatsapp-pair (kun) |
WhatsApp disconnected 408 during linking | QR expired; the page shows the next one, scan again |
WhatsApp not in gateway_state.json platforms | WHATSAPP_ENABLED=true missing, or the gateway wasn't restarted (launchctl kickstart -k …) |
Bridge node_modules missing | npm install in ~/.hermes/hermes-agent/scripts/whatsapp-bridge (the pair script does it) |
| Gateway dies on reboot | You ran hermes gateway run (foreground) — use hermes gateway install for a persistent user service, then hermes gateway start |