Run Hermes Agent inside Zomg and connect the native Hermes Desktop app to it as a remote backend. Hermes ships as a zpack: you 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 (service api, published as hermes-api)
  • Desktop remote backend / dashboard: 9119 (service dashboard, published as hermes)
Hermes Desktop connects to the dashboard backend on 9119; that same published URL serves the Hermes web UI in a browser.

Install the pack

zomg install ./zpacks/hermes        # local checkout
zomg install loopwork/zomg#zpacks/hermes   # or a GitHub subdirectory
Installing builds the Hermes base server-side from 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

zomg hermes create my-agent
Create runs the standard orchestration: a per-instance data volume at /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):
zomg hermes outputs my-agent                  # api_key/dashboard_password = ******** (secret)
zomg hermes outputs my-agent --show-secrets   # reveal the values
zomg hermes outputs my-agent --json           # programmatic retrieval (values included)
The outputs are 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 (the GET /v1/apps surface):
zomg hermes show my-agent           # both publish URLs (hermes-api and hermes)
The Hermes Desktop remote URL is the dashboard publish URL (the hermes service on 9119).

Connect with Hermes Desktop or the web UI

Open the dashboard publish URL from zomg 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:
  1. Open Settings.
  2. Go to Gateway.
  3. Set Remote URL to the dashboard publish URL from zomg hermes show.
  4. Click Sign in.
  5. Enter dashboard_user and dashboard_password from zomg hermes outputs --show-secrets.
  6. Save and reconnect.
You can launch Desktop with the URL preset — use the dashboard publish URL from zomg hermes show — and still sign in from the Gateway panel:
HERMES_DESKTOP_REMOTE_URL=https://my-agent.example.com hermes desktop

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:
curl -fsS \
  -H "Authorization: Bearer $(zomg hermes outputs my-agent --json | jq -r '.outputs.api_key')" \
  http://my-agent:8642/v1/models

Rotate the upstream key

Replace the generated HERMES_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:
zomg hermes set-api-key my-agent < keyfile
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:
zomg hermes snapshot my-agent before-experiment   # checkpoint root + data volume
zomg hermes fork my-agent my-agent-copy           # clone volume; generated secrets copy with state
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:
zomg hermes logs my-agent
zomg hermes stop my-agent
zomg hermes delete my-agent          # removes the box and its data volume
Every verb execution is attributed and secret-redacted in the event log:
zomg events --pack hermes            # who ran what, when — secrets shown as ***

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.