From 93e1b732b831cfc79e4563684d4aba56b8d52960 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 9 Jun 2026 21:53:34 +0000 Subject: [PATCH] Add hermes-webui app (v0.51.345) Browser UI for Hermes Agent; pairs with Hermes Agent Mobile iOS app via password auth on port 8787. https://claude.ai/code/session_01Xwf5nZf6d1npMerNteodq2 --- apps/hermes-webui/config.json | 44 ++++++++++++++++++++++ apps/hermes-webui/docker-compose.json | 21 +++++++++++ apps/hermes-webui/metadata/description.md | 27 +++++++++++++ apps/hermes-webui/metadata/logo.jpg | Bin 0 -> 13957 bytes 4 files changed, 92 insertions(+) create mode 100644 apps/hermes-webui/config.json create mode 100644 apps/hermes-webui/docker-compose.json create mode 100644 apps/hermes-webui/metadata/description.md create mode 100644 apps/hermes-webui/metadata/logo.jpg diff --git a/apps/hermes-webui/config.json b/apps/hermes-webui/config.json new file mode 100644 index 0000000..9bdce16 --- /dev/null +++ b/apps/hermes-webui/config.json @@ -0,0 +1,44 @@ +{ + "$schema": "../app-info-schema.json", + "name": "Hermes WebUI", + "id": "hermes-webui", + "available": true, + "short_desc": "Browser interface for Hermes Agent", + "author": "nesquena", + "port": 8787, + "categories": [ + "ai", + "utilities" + ], + "description": "Hermes WebUI is a lightweight, dark-themed web interface for Hermes Agent. It provides near-complete parity with the CLI experience via a three-panel layout with session management, chat, and workspace file browsing. Use it in any browser, or pair it with the Hermes Agent Mobile iOS app by setting a password.", + "tipi_version": 1, + "version": "0.51.345", + "source": "https://github.com/nesquena/hermes-webui", + "website": "https://github.com/nesquena/hermes-webui", + "exposable": true, + "supported_architectures": [ + "arm64", + "amd64" + ], + "created_at": 1780963200000, + "updated_at": 1780963200000, + "dynamic_config": true, + "form_fields": [ + { + "type": "password", + "label": "Password", + "hint": "Password for web UI access. Required when using Hermes Agent Mobile (iOS app).", + "required": false, + "env_variable": "HERMES_WEBUI_PASSWORD", + "default": "" + }, + { + "type": "text", + "label": "Default Model", + "hint": "Optional model override (e.g. claude-sonnet-4-6). Leave blank to use the agent's configured default.", + "required": false, + "env_variable": "HERMES_WEBUI_DEFAULT_MODEL", + "default": "" + } + ] +} diff --git a/apps/hermes-webui/docker-compose.json b/apps/hermes-webui/docker-compose.json new file mode 100644 index 0000000..f5681bf --- /dev/null +++ b/apps/hermes-webui/docker-compose.json @@ -0,0 +1,21 @@ +{ + "schemaVersion": 2, + "services": [ + { + "name": "hermes-webui", + "image": "ghcr.io/nesquena/hermes-webui:0.51.345", + "isMain": true, + "internalPort": "8787", + "environment": [ + { "key": "HERMES_WEBUI_HOST", "value": "0.0.0.0" }, + { "key": "HERMES_WEBUI_PORT", "value": "8787" }, + { "key": "HERMES_WEBUI_STATE_DIR", "value": "/data" }, + { "key": "HERMES_WEBUI_PASSWORD", "value": "${HERMES_WEBUI_PASSWORD}" }, + { "key": "HERMES_WEBUI_DEFAULT_MODEL", "value": "${HERMES_WEBUI_DEFAULT_MODEL}" } + ], + "volumes": [ + { "hostPath": "${APP_DATA_DIR}/data", "containerPath": "/data" } + ] + } + ] +} diff --git a/apps/hermes-webui/metadata/description.md b/apps/hermes-webui/metadata/description.md new file mode 100644 index 0000000..d4e537e --- /dev/null +++ b/apps/hermes-webui/metadata/description.md @@ -0,0 +1,27 @@ +# Hermes WebUI + +A lightweight browser interface for [Hermes Agent](https://github.com/nesquena/hermes), providing a three-panel layout with session management, chat, and workspace file browsing. + +## Features + +- Dark-themed web UI with near-complete CLI parity +- Session management and workspace file browser +- Compatible with **Hermes Agent Mobile** (iOS app) — set a password to enable +- Supports a default model override per deployment + +## Configuration + +| Field | Description | +|---|---| +| **Password** | Protects the UI with HTTP authentication. Required when connecting from Hermes Agent Mobile. | +| **Default Model** | Override the agent's default model (e.g. `claude-sonnet-4-6`). Leave blank to use the agent's own default. | + +## Usage with Hermes Agent Mobile (iOS) + +1. Set a **Password** in the app settings above. +2. In the iOS app, point it at `http://:8787` with the password you set. + +## Notes + +- State and sessions are persisted to the app data directory. +- If you are running Hermes Agent separately, ensure both containers can reach each other on your network. diff --git a/apps/hermes-webui/metadata/logo.jpg b/apps/hermes-webui/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf1ed132a4c5014a56bc1dff3b32391434c8948d GIT binary patch literal 13957 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 literal 0 HcmV?d00001