hermes-control-interface
A self-hosted web dashboard for the Hermes AI agent stack. Provides a browser-based terminal, file explorer, session overview, cron management, system metrics, and an agent status panel β all behind a single password gate.
Overview
The Hermes Control Interface is a self-hosted web dashboard designed to manage the Hermes AI agent stack through a centralized graphical interface. It utilizes a Node.js and Express backend with WebSockets to provide real-time system monitoring, multi-agent gateway management, and a browser-based terminal. Users can configure over 80 agent settings, track detailed token analytics across different models, and manage scheduled cron jobs for automated tasks. The platform also includes a revamped chat interface with collapsible tool call cards and a secure file explorer scoped to the agent's directory.
- Multi-agent gateway for starting, stopping, and configuring individual profiles.
- Detailed token analytics tracking costs and usage by model and platform.
- Role-based access control with 28 permissions across 12 functional groups.
Full README from GitHub
Hermes Control Interface
A self-hosted web dashboard for the Hermes AI agent stack. Manage terminals, files, sessions, cron jobs, token analytics, multi-agent gateways, and team access β all behind a password gate.
Stack: Vanilla JS + Vite Β· Node.js Β· Express Β· WebSocket Β· xterm.js Version: 3.3.2
Highlights
Chat Revamped β Collapsible tool call cards with JSON viewer, session sidebar with model tags, banner-free output.
RBAC v2 β 28 permissions across 12 groups. Admin, viewer, or custom roles per user.
Multi-Agent Gateway β Start/stop/configure multiple Hermes profiles. Real-time logs. Systemd service management.
Token Analytics β Track sessions, messages, tokens, cost by model, platform, and time range.
Screenshots
Navigation β 8 Pages
Home Β· Agents Β· Usage Β· Skills Β· Chat Β· Logs Β· Maintenance Β· Files
Dark Mode
| Home | Agents |
|---|---|
![]() |
![]() |
| Chat | Usage & Analytics |
|---|---|
![]() |
![]() |
| Skills Hub | Maintenance |
|---|---|
![]() |
![]() |
| File Explorer | Agent Dashboard |
|---|---|
![]() |
![]() |
| Agent Gateway | Agent Sessions |
|---|---|
![]() |
![]() |
| Agent Config | Agent Memory |
|---|---|
![]() |
![]() |
| Agent Skills | Agent Cron |
|---|---|
![]() |
![]() |
Light Mode
| Home | Agents | Skills Hub |
|---|---|---|
![]() |
![]() |
![]() |
| Gateway | Memory |
|---|---|
![]() |
![]() |
Features
π Authentication
- Single password login (configurable via
HERMES_CONTROL_PASSWORD) - bcrypt password hashing (cost factor 10)
- CSRF tokens on all mutating requests
- Conditional Secure cookie flag (auto-detects HTTPS)
- Rate limiting: 5 failed logins per 15 minutes per IP
- Multi-user support with role-based access control (RBAC)
π Home Dashboard
System overview at a glance:
- System Health: CPU usage, RAM usage, Disk usage, Uptime
- Agent Overview: active model, provider, gateway status, configured API keys, active platforms
- Gateway Status: per-profile running/stopped indicators
- Token Usage (7d): sessions count, messages, total tokens, estimated cost, models used, platforms breakdown, top tools
π€ Agents β Multi-Agent Management
Manage all Hermes profiles from one place:
- List all profiles with status badge (running/stopped) and active model
- Create new profile
- Clone existing profile
- Delete profile
- Set default profile
- Start/Stop/Restart gateway per profile
- Quick gateway log viewer
π¬ Chat β Revamped Interface
The chat interface got a full overhaul in v3.3.0:
Tool Call Cards
- Each tool call displayed as a collapsible card
- Shows tool name, status (running/success/error), and execution time
- Expand to see full JSON input/output
- Collapsed by default for clean output
Session Sidebar
- List of past chat sessions with timestamps
- Resume any session with one click
- New chat button for fresh session
- Shows active model tag
Clean Output
- Banner suppression (
-Qflag) for noise-free responses - Auto-detects both new (
session_id:) and legacy (Session:) session ID formats --continue ""(empty) creates new session- Bare
--continueresumes last session
Session Management
- Rename sessions
- Delete sessions
- Export session transcript
π Usage & Analytics β Token Insights
Full breakdown of LLM usage:
- Time Range: Today, 7d, 30d, 90d filters
- Agent Filter: per-profile or all combined
- Overview Cards: total sessions, messages, tokens, cost, active hours
- Models Table: per-model breakdown β sessions count, total tokens, avg tokens/session
- Platforms Table: per-platform breakdown (CLI, Telegram, WhatsApp, etc.)
- Top Tools: most called tools with call counts and success rates
π οΈ Agent Detail β Per-Agent Management
Six-tab interface for deep agent configuration:
Dashboard Tab
- Agent identity: name, model, provider
- Gateway service status
- Quick token usage summary
- Active platforms
Sessions Tab
- List all sessions for this profile
- Search by keyword
- Rename session
- Delete session
- Export session (JSON format)
- Resume session in CLI (one click)
Gateway Tab
- Start/Stop/Restart gateway service
- Real-time log stream (WebSocket)
- Systemd service management (for non-root users:
hermes-gateway-<profile>) - Gateway configuration panel
Config Tab
- 13 categories, 80+ settings
- Structured form editor with labeled fields
- Raw YAML editor toggle
- Reset to defaults per category
- Apply changes with validation
Memory Tab
- Dynamic memory provider panel
- Provider options: Built-in MEMORY.md, Honcho (self-hosted), External providers
- Honcho status: connected/disconnected
- Memory usage stats
Cron Tab
- List all scheduled jobs for this profile
- Create new cron job with schedule presets (hourly, daily, weekly, custom cron expression)
- Pause/Resume scheduled jobs
- Run job immediately (on-demand)
- Edit/Delete cron jobs
- Next run time display
π¦ Skills Marketplace
Browse and manage installed Hermes skills:
- Grouped by category (devops, mlops, creative, etc.)
- Shows skill name, description snippet, source (builtin/local), trust level
- Search and filter skills
- Install new skills from the Hermes skills registry
- Check for updates
- Uninstall skills
π§ Maintenance β System Administration
Full admin panel:
- Doctor: Run diagnostics β detects common issues, auto-fix where possible
- Dump: Generate debug summary (system info, config, recent logs)
- Update: Update Hermes agent to latest version
- Backup: Download all Hermes data as a zip file
- Import: Restore from backup zip
- HCI Restart: Restart the Control Interface web server from UI (no SSH needed)
- Users (NEW in v3.3.0): Create/edit/delete users, assign roles, manage permissions
- Auth: View provider status (OpenRouter, Nous Portal, etc.), add/remove API keys
- Audit: Timestampped activity log β who did what and when
π File Explorer
Split-view file editor:
- Left panel: Directory tree browser
- Right panel: Text editor with syntax highlighting
- Save: Write changes back to disk
- Secure: Paths scoped to
~/.hermes, traversal attacks prevented - Multiple roots: Configurable via
HERMES_CONTROL_ROOTS
π» Terminal
Real browser-based terminal:
- Full PTY via node-pty + xterm.js over WebSocket
- Touch-friendly controls (βββ£β΅) for mobile
- Fullscreen toggle
- Auto-cleanup flow: Ctrl+C β clear β ready for next command
- Rate limited: 30 commands/minute per IP
π Notifications
- Bell icon with unread count badge (top-right)
- Dropdown panel with notification list
- Dismiss individual or clear all
- Sources: system alerts (disk/RAM/CPU), gateway events, session CRUD, user management
- Persistent: stored in
~/.hermes/hci-notifications.json
π¨ Theme
- Dark mode (default):
#0b201fbackground,#dccbb5foreground,#7c945caccent - Light mode:
#e4ebdfbackground,#0b201fforeground,#2e6fb0accent - Toggle via header button
- Preference persisted in localStorage
- Login page: themed background image with overlay
π Security
- Multi-user RBAC: 28 permissions across 12 groups
- Roles:
admin(full access),viewer(read-only),custom(your choice) - bcrypt password hashing (cost factor 10)
- CSRF tokens on all mutating requests
- Secure cookie flag (auto-detects HTTPS)
- WebSocket origin verification (exact match)
- Input sanitization: strict regex on all user inputs (profiles, sessions, titles, filenames)
- Path traversal prevention in file explorer
- Rate limiting: login (5 failed/15min), terminal exec (30/min)
- XSS protection: all dynamic values escaped in rendered HTML
- Admin gate: critical endpoints (
/api/plugins, etc.) require admin role - Token cleanup: automatic session token cleanup every 15 minutes
- Unhandled exception handlers:
unhandledRejection+uncaughtExceptioncaught and logged
See full security audit: docs/SECURITY_AUDIT.md
Where HCI Can Be Installed
HCI runs as a single Node.js process β any server environment that supports Node.js works.
| Environment | Status | Notes |
|---|---|---|
| Local Linux server | β | Full support |
| VPS (DigitalOcean, Hetzner, AWS EC2, Linode, etc.) | β | Recommended for production |
| macOS | β | Works |
| WSL2 (Windows Subsystem for Linux) | β | Full support |
| Raspberry Pi (arm64) | β | Works |
| Docker / Podman | β οΈ | Works but not officially supported |
| Shared hosting | β | Requires Node.js + WebSocket + PTY support |
| Browser-only (no server) | β | Requires Node.js backend |
Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| Node.js | v18+ | v20 LTS |
| RAM | 512 MB | 1 GB+ |
| Disk | 200 MB | 500 MB+ |
| OS | Linux / macOS / WSL2 | Ubuntu 22.04 LTS |
| Hermes Agent | v3.x | Latest |
| Build tools | python3, make, g++ | For node-pty native module |
Dependencies (installed via npm install):
expressβ HTTP serverwsβ WebSocketnode-ptyβ PTY support (requires build tools)xterm.jsβ Terminal emulator in browserbcryptβ Password hashingcookie-parser,dotenv,js-yaml, etc.
Installation Methods
Manual (Recommended)
# 1. Clone
git clone https://github.com/xaspx/hermes-control-interface.git
cd hermes-control-interface
# 2. Install dependencies
npm install
# 3. Configure
cp .env.example .env
# Edit .env and set:
# HERMES_CONTROL_PASSWORD=your-secure-password
# HERMES_CONTROL_SECRET=$(openssl rand -hex 32)
# 4. Build frontend
npm run build
# 5. Start
npm start
Access at http://localhost:10272 (default PORT).
Systemd Service (Production)
# Use the provided gateway service script as reference
bash scripts/setup-gateway-service.sh
Or create a simple systemd unit:
# /etc/systemd/system/hermes-control.service
[Unit]
Description=Hermes Control Interface
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/path/to/hermes-control-interface
ExecStart=/usr/bin/node server.js
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable hermes-control
sudo systemctl start hermes-control
Environment Variables
| Variable | Required | Description |
|---|---|---|
HERMES_CONTROL_PASSWORD |
Yes | Login password |
HERMES_CONTROL_SECRET |
Yes | CSRF + internal auth secret |
PORT |
No | Server port (default: 10272) |
HERMES_CONTROL_HOME |
No | Hermes home dir (default: ~/.hermes) |
HERMES_CONTROL_ROOTS |
No | File explorer roots (JSON array) |
HERMES_PROJECTS_ROOT |
No | Projects directory |
Reset Password Without Dashboard Access
If you can't log in to the dashboard, reset the password via CLI:
Option 1 β Edit .env directly
# SSH into your server
nano ~/.hermes/.env
# Change HERMES_CONTROL_PASSWORD=your-new-password
# Restart
sudo systemctl restart hermes-control
# or: pkill node; npm start &
Option 2 β Generate bcrypt hash via Node.js
node -e "const bcrypt=require('bcrypt'); bcrypt.hash(require('crypto').randomBytes(24).toString('hex'), 10).then(h=>console.log('HERMES_CONTROL_PASSWORD='+h))"
# Copy the output to .env, then restart
Key point: .env is the source of truth. Dashboard access = server access. If you lose access to both, you must have server/SSH access to reset.
Architecture
src/ # Vite source (ES modules)
βββ index.html # Entry point
βββ js/main.js # App logic (~4800 lines, modular sections)
βββ css/
β βββ theme.css # Color palette (dark/light)
β βββ layout.css # Topbar, modals, dropdowns, sidebar
β βββ components.css # Cards, tables, forms, editor, file explorer
βββ public/
β βββ favicon.svg # Served unhashed
βββ assets/ # SVG icons
dist/ # Vite build output (served by Express)
server.js # Express + WebSocket + PTY + API (~2300 lines)
auth.js # Multi-user auth + RBAC (bcrypt, sessions, permissions)
Development
# Edit source in src/
npx vite build
# Restart (never in foreground β use detached)
kill $(lsof -t -i:10272) 2>/dev/null
nohup node server.js &>/dev/null & disown
API
100+ endpoints covering:
- Auth: login, logout, session management, setup
- Users: CRUD, role assignment, permission management, reset password
- Sessions: list, rename, delete, export, resume
- Profiles: list, create, clone, delete, use, gateway control
- Chat: send message, stream response, tool calls
- Cron: list, create, pause, resume, run, remove
- Config: read, write, YAML parsing, reset
- Memory: provider-specific panels (MEMORY.md, honcho, external)
- Skills: list, parse, search, install, uninstall, check updates
- Files: list, read, write, save (scoped to Hermes home)
- System: health, insights, usage analytics, doctor, dump, update, backup
- Notifications: list, dismiss, clear
- Plugins: admin-only plugin management
- Terminal: exec command via PTY
- Audit: activity log
See docs/API.md for full reference.
Security Audit
Full audit report: docs/SECURITY_AUDIT.md Score: 7.0/10 β Production-ready.
Issues found and fixed in v3.3.0:
- XSS in home cards (
loadHomeCards()) β fixed withescapeHtml() - Missing admin gate on plugins API β fixed
- Terminal exec rate limit β 30 commands/minute per IP
- Token cleanup interval β now runs every 15 minutes
Updating HCI
# 1. Pull latest code
cd /root/projects/hermes-control-interface
git pull origin main
# 2. Install dependencies (if package.json changed)
npm install
# 3. Rebuild frontend
npm run build
# 4. Restart production server
kill $(lsof -t -i :10272) 2>/dev/null
nohup node server.js &>/dev/null & disown
Or use the HCI UI: Maintenance β HCI Restart (restarts from browser).
Non-root users: Replace /root/projects with your user's project directory.
If running via systemd, use sudo systemctl restart hermes-control.
Changelog
v3.3.2 (2026-04-17)
π Bug Fixes:
- HTTP-only deployments: Disable
upgrade-insecure-requestsCSP directive that broke UI on Tailscale/LAN/dev environments - HOST env var: Support
HOSTenv var for non-localhost server binding (Tailscale IP, LAN, specific interface)
π€ Contributors:
- @hifiguy β 2 fixes (HOST env + CSP HTTP fix)
v3.3.0 (2026-04-17)
π¬ Chat Revamp:
- Tool call cards: collapsible cards with JSON viewer, collapsed by default
- Banner suppression:
-Qflag passed to hermes for clean output - Session sidebar: model tag, session list, resume/new chat buttons
- Auto-detect session ID format: new (
session_id: YYYYMMDD_HHMMSS_HEX) and legacy (Session: YYYYMMDD_HHMMSS_HEX) --continue ""(empty) creates fresh session; bare--continueresumes last session
π₯ User Management v2 (RBAC):
- 28 permissions across 12 groups: Sessions, Chat, Logs, Usage, Gateway, Config, Secrets, Skills, Cron, Files, Terminal, Users, System
- Built-in roles:
admin(full access),viewer(read-only), custom role - Create/edit user modal: role presets (Admin/Viewer), grouped permission checklist, reset password button
- Permission gating on 9 previously-unprotected endpoints
π Security:
- Full security audit (docs/SECURITY_AUDIT.md) β score 7.0/10
- XSS fix:
loadHomeCards()now escapes all dynamic values withescapeHtml() - Rate limiter: terminal exec limited to 30 commands/minute per IP (429 on exceeded)
- Token cleanup: proper
setInterval()every 15 minutes (was only on token creation) - Admin-only gate:
GET /api/pluginsnow requires admin role - Full activity audit log: Maintenance β Audit panel
π¦ Skills:
- Check updates: handles "unavailable" source status gracefully (info message, not error)
- Uninstall: uses stdin pipe (
echo y |) instead of unsupported--yesflag
π Bug Fixes:
- Notification dismiss: backend handles both
/api/notifications/:id/dismissand/api/notifications/dismiss - Sidebar: responsive CSS,
flex-shrink:0, mobile breakpoints at 480px - Agent dropdown: follows dark/light theme correctly
- Favicon 404 loop: moved to
public/to prevent Vite hash mismatch - HCI Info panel: version, GitHub link, Twitter @bayendor link in Maintenance
π Docs:
- Security audit report (12 categories)
- Removed outdated script references (install.sh, reset-password.sh)
- Screenshots: 13 dark mode, 6 light mode
v3.2.0 (2026-04-14)
β‘ Performance:
- Insights speed: 60s+ timeout β 0.65s via IPv4 adapter on model_metadata.py
- Timeouts reduced: 10s β 5s (model metadata), 5s β 3s (llama.cpp props)
π Security:
- WebSocket origin: exact match (was substring check)
- Body limit: 10MB β 1MB global, 10MB only on avatar upload
- Temp files:
crypto.randomUUID()(no predictable paths) - Skills install/uninstall:
execHermes()instead of shell interpolation - Username validation: 2-32 chars, alphanumeric/_.- only
β¨ Features:
- Log tabs: Agent, Error, and Gateway logs now working
- Non-root user support: dynamic HCI identity, HOME-aware paths
- Gateway service: auto-detect
hermes-gateway-<profile>for non-root
π Fixes:
- Terminal flow: transcript handling after sendCommand
- XSS: 15+ escaped user-facing error messages
- Auth panel: data loaded async, doesn't block page load
- CPR stripping: removed ANSI escape from terminal
v3.1.0 (2026-04-12)
- Skills Hub + Honcho panel + Gateway connections
- HTTPS support
- Maintenance UI: Backup & Import, HCI Restart buttons
License
MIT
Credits
Built for the Hermes Agent ecosystem.


















