Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions blueprints/hermes-agent-on-fly-io.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<img src="/static/images/Hermes_Agent.png" alt="Illustration by Annie Ruygt of the Greek god Hermes mid-flight, depicted on a black-figure pottery bowl framed by olive branches" class="w-full max-w-lg mx-auto">
</figure>

[Hermes](https://github.com/NousResearch/hermes-agent) is an AI agent from Nous Research with a built-in learning loop: it watches its own output, notices when it had to improvise to finish a task, and writes that experience back as a reusable skill it can call next time. The skill library grows with use, so Hermes works best when it runs continuously on a persistent host rather than a short-lived sandbox, which is exactly what a Fly Machine with an attached volume gives you.

Check warning on line 12 in blueprints/hermes-agent-on-fly-io.html.md

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 Avoid the unverifiable claim 'best'. Raw Output: {"message":"Avoid the unverifiable claim 'best'.","location":{"path":"blueprints/hermes-agent-on-fly-io.html.md","range":{"start":{"line":12,"column":324},"end":{"line":12,"column":328}}},"severity":"INFO","code":{"value":"Google.ExcessiveClaims","url":"https://developers.google.com/style/excessive-claims"}}

This guide walks you through running Hermes on a Fly Machine, configuring it, and reaching its web dashboard from your laptop.

Expand Down Expand Up @@ -52,21 +52,25 @@
```
Create a machine config file (called `machine_config.json` in our example):
```json
{
"containers": [
{
"containers": [
{
"name": "hermes",
"image": "nousresearch/hermes-agent:latest",
"cmd": ["gateway", "run"]
}
"name": "hermes",
"image": "nousresearch/hermes-agent:latest",
"cmd": ["gateway", "run"],
"secrets": [
{ "env_var": "EXAMPLE_API_KEY" },
{ "env_var": "EXAMPLE_TOKEN" }
]
}
]
}
```

A few notes:

- **No `[build.dockerfile]`.** Fly pulls the image directly. Deploys take seconds, not minutes.
- ** Hermes images published from `v2026.5.28` onward use `s6-overlay` as the in-container supervisor. s6-overlay's `/init` calls `s6-overlay-suexec` which checks `getpid() == 1` before doing anything else and aborts otherwise. So we use multi-container machines (via the machine_config.json) to get our own namespace.
- **Hermes images published from `v2026.5.28` onward use `s6-overlay` as the in-container supervisor. s6-overlay's `/init` calls `s6-overlay-suexec` which checks `getpid() == 1` before doing anything else and aborts otherwise. So we use multi-container machines (via the machine_config.json) to get our own namespace.
- **No `[[services]]` block.** The gateway talks *outbound* to chat platforms, so you don't need a public port. The dashboard exposes API keys and shouldn't be public; you'll reach it through a Fly proxy tunnel below.
- **4 GB / 2 CPU** is the recommended size when browser tools (Playwright/Chromium) are active. If you don't use browser tools you can drop to `shared-cpu-1x` and 1–2 GB.

Expand Down Expand Up @@ -121,10 +125,13 @@
In one terminal, start the dashboard inside the machine:

```bash
fly ssh console -a <your-hermes-app> -C \
"hermes dashboard --host 0.0.0.0 --no-open"
fly ssh console --pty -a <your-hermes-app> -C \
"HERMES_DASHBOARD_WS_HOST=127.0.0.1 hermes dashboard --host [::] --no-open"
```

Since you're using a tunnel via this setup, your dashboard isn't publicly exposed. But [hermes requires you to setup dashboard auth](https://hermes-agent.nousresearch.com/docs/user-guide/features/web-dashboard) if you're binding to [::].

Check warning on line 132 in blueprints/hermes-agent-on-fly-io.html.md

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 Is 'hermes' a typo? Raw Output: {"message":"Is 'hermes' a typo?","location":{"path":"blueprints/hermes-agent-on-fly-io.html.md","range":{"start":{"line":132,"column":89},"end":{"line":132,"column":95}}},"severity":"INFO","code":{"value":"Fly.Spelling"}}

Setup auth (or use a shim to proxy from localhost, if that's your style).
In a second terminal, open a Fly proxy from your laptop:

```bash
Expand All @@ -137,7 +144,7 @@

## Upgrading

The image is stateless; your data lives on the volume. To pull the latest Hermes:

Check warning on line 147 in blueprints/hermes-agent-on-fly-io.html.md

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 Avoid time-based words like 'latest' in product documentation. Raw Output: {"message":"Avoid time-based words like 'latest' in product documentation.","location":{"path":"blueprints/hermes-agent-on-fly-io.html.md","range":{"start":{"line":147,"column":68},"end":{"line":147,"column":74}}},"severity":"INFO","code":{"value":"Google.Timeless","url":"https://developers.google.com/style/timeless-documentation"}}

```bash
fly deploy -a <your-hermes-app>
Expand Down
Loading