zomg install it once, then zomg hermes create as many agent instances as you like, each a normal box with generated credentials and two published services.
Hermes has two network surfaces:
- OpenAI-compatible API gateway:
8642(serviceapi, published ashermes-api) - Desktop remote backend / dashboard:
9119(servicedashboard, published ashermes)
9119; that same published URL serves the Hermes web UI in a browser.
Install the pack
box-base and the pack’s base-init.sh, caches it, and aliases it zpack-hermes. A second install of unchanged content is a cached no-op.
Create an agent
/var/lib/hermes, generated env, then the two supervised services in name order — api starts and passes its /health gate first, then dashboard.
The upstream HERMES_API_KEY and the dashboard basic-auth credentials are generated once per instance — there are no --dashboard-password or --api-key flags. Read them from the computed outputs (secrets are redacted until you ask):
api_base, api_key, model, dashboard_user, and dashboard_password. api_key and dashboard_password are secret — redacted in human output and in the event log, revealed only by --show-secrets or --json.
Reach the published services
Both services are published and gated by default: the ingress sits behind your deployment’s auth, so a signed-in user reaches them and an anonymous request does not. Get the URLs from the instance or the dashboard’s Apps tab (theGET /v1/apps surface):
hermes service on 9119).
Connect with Hermes Desktop or the web UI
Open the dashboard publish URL fromzomg hermes show in a browser and sign in with dashboard_user / dashboard_password to use the web UI.
For the native app, install or open Hermes Desktop from the official Hermes docs, then:
- Open Settings.
- Go to Gateway.
- Set Remote URL to the dashboard publish URL from
zomg hermes show. - Click Sign in.
- Enter
dashboard_useranddashboard_passwordfromzomg hermes outputs --show-secrets. - Save and reconnect.
zomg hermes show — and still sign in from the Gateway panel:
Use the Agent API in-project
Services in the same Zomg project reach the gateway directly by the instance’s in-cluster host — no ingress, no auth hop:Rotate the upstream key
Replace the generatedHERMES_API_KEY with your own upstream key. The key rides stdin, never an argument — verb args are recorded in the attributed event log, and stdin is not:
set-api-key persists the new value via $ZOMG_ENV_OUT, which patches the instance’s Deployment env; under the Recreate strategy that restarts the pod, and the gateway re-reads the key on boot.
Snapshot and fork
Hermes state lives in the/var/lib/hermes data volume, so lifecycle standard verbs capture config, sessions, memory, and dashboard auth:
fork copies the generated env, so my-agent-copy keeps the same HERMES_API_KEY and dashboard credentials as its state. The rest of the lifecycle is the standard verb set — logs, status, stop, start, delete:
Security notes
Both Hermes publishes are gated by default: they sit behind your deployment’s auth, and--public on the publish is the explicit exception. That gate is the primary access control; the dashboard’s username/password is Hermes’ own second factor on top of it. Do not add --public to a dashboard reachable from the open internet unless you intend it — for public exposure, configure Hermes dashboard OAuth or keep the URL behind your deployment auth or a VPN.