Hermes Agent

Nous Research's self-improving AI agent, with its web dashboard and messaging gateway

Hermes Agent on Cubeship

Hermes Agent is Nous Research's open-source AI agent: it runs tools, a terminal and a browser on the machine it lives on, keeps memories and skills between sessions, and talks to you from its web dashboard or from Telegram, Discord, Slack and other chat platforms.

This template installs it on a Cubeship instance, with its dashboard on a domain and everything it keeps in a volume.

What it creates

  • hermes — Hermes Agent v2026.9.11, built on the instance from the Dockerfile in this repository. The dashboard answers on the domain you choose; config, API keys, sessions, memories, skills and logs are kept in a volume at /opt/data.

It needs Cubeship 0.7.0 or newer, and an admin to install it: the app is built on the instance, and only admins build.

Why it is built

The published image, nousresearch/hermes-agent, starts an interactive chat when given no command, and exits when there is no terminal. Cubeship runs an image's own command, so the Dockerfile here is that image with one line changed: gateway run. The gateway runs supervised, keeps the container up, and brings the dashboard with it.

What you are asked

InputWhat to give
Where the dashboard answersA domain you control, pointed at your instance.
The username you sign in withAnything; admin unless you change it.
The password you sign in withNothing — the instance generates it and shows it once. Keep a copy.
The key sign-in sessions are signed withNothing — the instance generates it.

No model provider key is asked for. Enter one in the dashboard instead: it is written to the volume, and a key the template set would be an empty variable on the app whenever you left it blank.

After installing

  1. Open the domain and sign in with the username and the generated password.
  2. Under API Keys, add a key for a model provider — OPENROUTER_API_KEY, ANTHROPIC_API_KEY, or another listed there — and choose a model under Config.
  3. Talk to it under Chat. If a chat platform you configure does not answer, redeploy the app so the gateway reads the new settings.
  4. To reach it from a chat platform, add that platform's bot token under Channels and the user IDs allowed to use it. Anyone who can message the bot can run commands on the instance.

Its dashboard is on the internet

The dashboard holds your API keys and can run anything Hermes can, and the password is all that stands in front of it. Hermes documents its username/password sign-in as meant for a trusted network, not the public internet. Use a long password, keep the domain to yourself, and consider its OAuth or OIDC sign-in (HERMES_DASHBOARD_OAUTH_CLIENT_ID, or HERMES_DASHBOARD_OIDC_ISSUER with HERMES_DASHBOARD_OIDC_CLIENT_ID) for anything shared.

The gateway's OpenAI-compatible API server is off. Turning it on (API_SERVER_ENABLED, API_SERVER_HOST=0.0.0.0 and API_SERVER_KEY) makes it reachable only inside the instance, on port 8642: the domain goes to the dashboard.

What Hermes can reach

Hermes runs its terminal commands inside its own container, as an unprivileged user. It has no Docker socket, so its Docker terminal backend does not work here, and it can reach whatever else the container can: the internet, and other apps on the instance at their internal addresses.

Updating Hermes

The Hermes version is the FROM line of the Dockerfile, at the ref the template builds. The dashboard's update button cannot update a container in place; a new release of this template can.

The volume

The app runs as one copy on the machine its volume is on, and a deploy stops it for a few seconds: chat platforms reconnect, and a task running at that moment is cut off. Back the volume up from the app's settings: your API keys and the agent's memory are in it.

Resources

The app is limited to 2 CPUs and 4 GiB of memory; the browser tool is the hungry part. Raise limits in template.yaml if you need more.

What this creates

hermes

https://github.com/cubeshipd/cubeship-hermes-agent-template

/opt/data

Volume of hermes

template.yaml
# yaml-language-server: $schema=https://cubeship.dev/schema/template/v1.json
version: 1
# The first release that gives a volume to the user its image runs as.
minCubeship: "0.7.0"
project: hermes

inputs:
  - key: domain
    type: domain
    label: Where the dashboard answers
  - key: username
    type: text
    label: The username you sign in with
    default: admin
  - key: password
    type: secret
    label: The password you sign in with
    generate: 24
  - key: sessionSecret
    type: secret
    label: The key sign-in sessions are signed with
    generate: 48

apps:
  - key: agent
    name: hermes
    # The published image starts an interactive chat when given no command
    # and exits without a terminal. The Dockerfile in this repository is that
    # image with `gateway run` as its command.
    repo: https://github.com/cubeshipd/cubeship-hermes-agent-template
    ref: v1.0.0
    build: dockerfile
    # The dashboard. The gateway's API server stays off.
    port: 9119
    # The one dashboard route that answers without signing in.
    health: /api/status
    domains:
      - host: ${input.domain}
    volumes:
      - path: /opt/data
    limits: { cpu: 2, memory: 4Gi }
    env:
      HERMES_DASHBOARD: "1"
      HERMES_DASHBOARD_BASIC_AUTH_USERNAME: ${input.username}
      HERMES_DASHBOARD_BASIC_AUTH_PASSWORD: ${input.password}
      # Without it every restart signs everybody out.
      HERMES_DASHBOARD_BASIC_AUTH_SECRET: ${input.sessionSecret}