{
  "manifest_version": "1.0.0",
  "template": {
    "id": "f77e5da8-1c5b-4eb0-b03f-b0f2529d31c9",
    "slug": "hermes-agent-dashboard",
    "name": "Hermes Agent | Official Image, Web Dashboard, Browser Chat, Telegram",
    "description": "Nous Research's self-improving agent: web dashboard, browser chat, Telegram",
    "url": "https://railway.com/deploy/hermes-agent-dashboard",
    "upstream": {
      "image": "nousresearch/hermes-agent:v2026.9.24"
    }
  },
  "services": [
    {
      "name": "Hermes Agent",
      "source": {
        "image": "nousresearch/hermes-agent:v2026.9.24"
      },
      "needs_volume": true,
      "volume_mount_path": "/opt/data",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "Hermes Agent",
      "description": "Port Railway routes the domain and healthcheck to. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "9119"
    },
    {
      "key": "HERMES_DASHBOARD",
      "service": "Hermes Agent",
      "description": "Runs the web dashboard next to the gateway. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "MALLOC_ARENA_MAX",
      "service": "Hermes Agent",
      "description": "Caps glibc malloc arenas for the Python processes: about 100 MB less memory with the Chat tab open, which keeps the service inside 1 GB.",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "HERMES_DASHBOARD_PORT",
      "service": "Hermes Agent",
      "description": "Dashboard port. Do not change.",
      "secret": false,
      "strategy": "default",
      "default": "9119"
    },
    {
      "key": "HERMES_DASHBOARD_BASIC_AUTH_SECRET",
      "service": "Hermes Agent",
      "description": "Signs login sessions so they survive restarts and redeploys. Changing it logs everyone out.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "HERMES_DASHBOARD_BASIC_AUTH_PASSWORD",
      "service": "Hermes Agent",
      "description": "Password for the dashboard login. Generated for you; it guards an agent that can run shell commands, so keep it long.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "HERMES_DASHBOARD_BASIC_AUTH_USERNAME",
      "service": "Hermes Agent",
      "description": "Username for the dashboard login.",
      "secret": false,
      "strategy": "default",
      "default": "admin"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "hermes-agent-dashboard"
      }
    },
    "cli": "railway deploy --template hermes-agent-dashboard",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "f77e5da8-1c5b-4eb0-b03f-b0f2529d31c9",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "9076ce92-7316-47f6-a7e6-cf5fe1a080a3": {
                  "icon": "https://raw.githubusercontent.com/NousResearch/hermes-agent/v2026.9.24/apps/desktop/assets/icon.png",
                  "name": "Hermes Agent",
                  "deploy": {
                    "startCommand": "/opt/hermes/docker/entrypoint-dispatch.sh gateway run",
                    "healthcheckPath": "/api/status",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "nousresearch/hermes-agent:v2026.9.24"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port Railway routes the domain and healthcheck to. Do not change.",
                      "defaultValue": "9119"
                    },
                    "HERMES_DASHBOARD": {
                      "isOptional": false,
                      "description": "Runs the web dashboard next to the gateway. Do not change.",
                      "defaultValue": "1"
                    },
                    "MALLOC_ARENA_MAX": {
                      "isOptional": false,
                      "description": "Caps glibc malloc arenas for the Python processes: about 100 MB less memory with the Chat tab open, which keeps the service inside 1 GB.",
                      "defaultValue": "2"
                    },
                    "OPENROUTER_API_KEY": {
                      "isOptional": true,
                      "description": "Optional. OpenRouter key, the quickest way to reach hundreds of models with one key. Any other provider (Anthropic, OpenAI, Nous Portal, DeepSeek, ...) can be added later on the dashboard's Keys page.",
                      "defaultValue": ""
                    },
                    "TELEGRAM_BOT_TOKEN": {
                      "isOptional": true,
                      "description": "Optional. Bot token from @BotFather to talk to your agent on Telegram.",
                      "defaultValue": ""
                    },
                    "HERMES_DASHBOARD_PORT": {
                      "isOptional": false,
                      "description": "Dashboard port. Do not change.",
                      "defaultValue": "9119"
                    },
                    "TELEGRAM_ALLOWED_USERS": {
                      "isOptional": true,
                      "description": "Optional. Comma-separated numeric Telegram user IDs allowed to use the bot (ask @userinfobot for yours). Unknown users get a pairing code you approve on the dashboard's Pairing page.",
                      "defaultValue": ""
                    },
                    "HERMES_DASHBOARD_BASIC_AUTH_SECRET": {
                      "isOptional": false,
                      "description": "Signs login sessions so they survive restarts and redeploys. Changing it logs everyone out.",
                      "defaultValue": "{{HERMES_DASHBOARD_BASIC_AUTH_SECRET}}"
                    },
                    "HERMES_DASHBOARD_BASIC_AUTH_PASSWORD": {
                      "isOptional": false,
                      "description": "Password for the dashboard login. Generated for you; it guards an agent that can run shell commands, so keep it long.",
                      "defaultValue": "{{HERMES_DASHBOARD_BASIC_AUTH_PASSWORD}}"
                    },
                    "HERMES_DASHBOARD_BASIC_AUTH_USERNAME": {
                      "isOptional": false,
                      "description": "Username for the dashboard login.",
                      "defaultValue": "admin"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {
                      "<hasDomain>:9119": {
                        "port": 9119
                      }
                    }
                  },
                  "volumeMounts": {
                    "90630883-5e1f-4afe-bf9e-3b7ed1e3d509": {
                      "mountPath": "/opt/data"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "Hermes Agent",
      "method": "GET",
      "path": "/api/status",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 1,
    "needs_volume": true
  },
  "generated_at": "2026-09-29T22:14:51.071Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-29T21:32:27.951Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_64ca7359a0f44c15871a",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "healthcheck",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 38,
    "typical_build_seconds": 0,
    "typical_start_seconds": 20,
    "slowest_service": "Hermes Agent"
  }
}
