Hermes Agent Kanban Multi-Gateway Deployment Guide

Runs multiple Hermes Agent gateways, one per profile, with a single Kanban dispatcher.

Tool Protocolsintermediate6 min readVerified Oct 25, 2026
Hermes Agent Kanban Multi-Gateway Deployment Guide

Hermes Agent supports running multiple gateway processes at the same time, one per profile, and this page explains how to wire that multi-gateway setup into the Kanban task system. Once configured, each gateway opens its own connection to platform APIs and delivers messages for its profile's subscribers, while exactly one gateway owns the Kanban dispatcher so that work is never spawned twice.

What It Does

  • Runs multiple gateway processes concurrently, one per profile: default, writer, admin, coder, and researcher are the profiles named in the official documentation.
  • Lets each gateway open its own connection to platform APIs and deliver messages for its profile's subscribers.
  • Delivers task subscription events, including review feedback. A changes_requested review event is delivered as an actionable review-BLOCK notification.
  • Supports notify+wake subscriptions that wake the exact originating chat, thread, or session so the controller inspects the existing card and current run.
  • Keeps notify passive-only and wake wake-only as distinct subscription modes.
  • Ensures review feedback never creates, unblocks, requeues, or otherwise mutates a task.
  • Enforces a single-dispatcher posture: only one gateway owns the Kanban dispatcher, so multiple gateways do not race to spawn the same work.
  • Delivers notifications in a profile-owned way: each gateway polls only subscriptions for profiles whose platform adapters it hosts.
  • Uses an atomic event claim to prevent duplicate delivery across watcher processes.

According to the official documentation, the split between dispatching and notification delivery is deliberate. Dispatching is single-owner, which is why only one gateway may have kanban.dispatch_in_gateway: true. Notification delivery, by contrast, is profile-owned: each gateway is responsible for the subscriptions belonging to the profiles whose platform adapters it hosts. The atomic event claim is the mechanism that keeps watcher processes from delivering the same event twice.

Setup

The setup is intentionally small. On the dispatch-owning gateway, typically the default profile, no change is needed. On every other profile gateway, add the following to ~/.hermes/config.yaml:

kanban :

  dispatch_in_gateway : false

Alternatively, set the environment variable instead of editing the config file:

HERMES_KANBAN_DISPATCH_IN_GATEWAY=false

That is the entire configuration surface described by the official documentation. The dispatch-owning gateway keeps the default value of true; every other gateway sets it to false.

Step-by-step

  1. Decide which profile will own the dispatcher. The official documentation states this is typically the default profile, described as the "confirmed dispatch-lock owner."
  2. Leave the dispatch-owning gateway untouched. It keeps kanban.dispatch_in_gateway: true, which is the default.
  3. On every other profile gateway (writer, admin, coder, and any others), edit ~/.hermes/config.yaml and set kanban.dispatch_in_gateway to false, or export HERMES_KANBAN_DISPATCH_IN_GATEWAY=false in that gateway's environment.
  4. Start the gateways. Each one opens its own connection to platform APIs and begins delivering messages for its profile's subscribers.
  5. Confirm the posture: exactly one gateway should report dispatch_in_gateway: true, and all others should report false.

Configuration Reference

OptionWhere it livesWhat it doesDefault
kanban.dispatch_in_gateway~/.hermes/config.yamlDetermines whether this gateway owns the Kanban dispatchertrue
HERMES_KANBAN_DISPATCH_IN_GATEWAYEnvironment variableEnvironment-variable equivalent of the config key aboveNot stated in the source

There are no other options documented in the source material. The config key and the environment variable are the two ways to express the same setting, and the documentation presents them as alternatives rather than as settings that must be combined.

How It Works

Diagram: How It Works

The official documentation lays out the division of labor across gateways in a table. The columns are: gateway role, dispatch_in_gateway, whether the gateway opens subscribed board DBs, whether it acts as dispatcher, and whether it acts as notifier.

  • default (confirmed dispatch-lock owner): dispatch_in_gateway is true (the default); it opens subscribed board DBs; it is the dispatcher; and it notifies for owned profiles plus legacy unstamped subscriptions.
  • writer, admin, coder, etc.: dispatch_in_gateway is false; they open subscribed board DBs when the profile has subscriptions; they are not the dispatcher; and they notify for that gateway's owned profiles.

Non-dispatch gateways still deliver messages for their own platform adapters, such as Telegram and Discord. They do not dispatch tasks, and they skip boards that have no subscriptions owned by their profiles.

The reason for the single-owner rule is stated plainly: dispatching is single-owner so multiple gateways do not race to spawn the same work. Notification delivery is profile-owned instead. Each gateway polls only subscriptions for profiles whose platform adapters it hosts, and the atomic event claim prevents duplicate delivery across watcher processes.

Review feedback flow

Task subscriptions also cover review feedback. A changes_requested review event is delivered as an actionable review-BLOCK notification. Subscriptions using notify+wake additionally wake the exact originating chat, thread, or session, so the controller inspects the existing card and current run. The documentation is explicit that notify remains passive-only and wake remains wake-only. Review feedback never creates, unblocks, requeues, or otherwise mutates a task.

Requirements and Limitations

  • The documentation names the profiles it supports: default, writer, admin, coder, and researcher. It uses "etc." when describing non-dispatch gateways, so additional profiles may exist, but only these are named.
  • Exactly one gateway may own the dispatcher. Running more than one gateway with dispatch_in_gateway: true contradicts the documented single-dispatcher posture.
  • The dispatch-owning gateway is described as the "confirmed dispatch-lock owner," which implies a lock is involved in confirming ownership, though the source does not describe the lock mechanism itself.
  • Non-dispatch gateways skip boards that have no subscriptions owned by their profiles. If a profile owns no subscriptions, that gateway will not open those boards.
  • Review feedback is notification-only. It does not create, unblock, requeue, or otherwise mutate a task.
  • notify is passive-only and wake is wake-only. The combined notify+wake mode is what wakes the originating chat, thread, or session.
  • The source does not state version numbers, platform support beyond the named adapters, or pricing, so none are asserted here.

Troubleshooting

The source material does not document specific error messages or failure modes, so no error strings are reproduced here. The one failure mode the documentation addresses directly is the race condition it designs against: if more than one gateway dispatches, multiple gateways could race to spawn the same work. The fix the documentation gives is the single-dispatcher posture itself: keep kanban.dispatch_in_gateway: true on exactly one gateway, typically default, and set it to false on every other profile gateway via ~/.hermes/config.yaml or the HERMES_KANBAN_DISPATCH_IN_GATEWAY=false environment variable.

If notifications appear to be missing on a non-dispatch gateway, check whether that gateway's profile actually owns subscriptions. The documentation states that each gateway polls only subscriptions for profiles whose platform adapters it hosts, and that non-dispatch gateways skip boards with no subscriptions owned by their profiles. A gateway with no owned subscriptions on a board will not poll it.

If the same event appears to be delivered twice, the documentation points to the atomic event claim as the mechanism that prevents duplicate delivery across watcher processes. The source does not describe what to do if that claim fails, so no remedy is invented here.

Sources & References

This page was researched from 1 independent source, combined and verified for completeness.

Newsletter

The #1 AI Newsletter

The most important ai updates, guides, and fixes — one weekly email.

No spam, unsubscribe anytime. Privacy policy

Other Hermes Agent integrations