A native desktop pet renderer for Hermes Agent via WebUI
Animated ยท Transparent ยท Always-on-top
Features โข Architecture โข Installation โข Usage โข For Developers
Hermes WebUI Companion brings your petdex pets to life on your desktop. It reads pets directly from your Hermes Agent installation and renders them as an animated, transparent, always-on-top window that reacts to your Hermes sessions via WebUI โ idle, running, waiting for approval, or celebrating a completed session.
- ๐พ Live Pet Rendering โ Your active Hermes pet comes to life on your desktop with CSS sprite animations โ no blink, no flicker, zero canvas.
- ๐ญ State-Aware Animation โ The pet reacts to your Hermes sessions via WebUI: runs during processing, waits for approvals, reviews for clarifications, waves when a session completes.
- ๐ฌ Bubble Notifications โ A sleek overlay window shows session attention items, approvals, and clarify requests.
- ๐ฎ Switch Pets Instantly โ Native right-click context menu (Tauri
popup_menu) lets you switch pets without touching the terminal. - ๐ช Always-on-Top โ Transparent, draggable window that stays above everything else.
- ๐ชถ Optional Sidecar โ When Hermes runs in WSL, a tiny Rust HTTP server (axum) bridges the filesystem boundary. Not needed when Hermes and the renderer share the same host.
- ๐ Auto-Start โ When using WSL, the sidecar runs as a systemd user service and starts automatically with your system.
flowchart LR
WEBUI["๐ง Hermes WebUI<br>:8787"] -->|"session snapshots"| BRIDGE
subgraph COMPANION["๐ฆ Hermes WebUI Companion"]
BRIDGE["Bridge :17787"]
ANIM["Animation Engine"]
PROVIDER["PetDataProvider"]
WINDOW["Desktop Pet<br>+ Bubbles + Menu"]
end
DIRECT["๐ ~/.hermes/<br>direct mode"] -->|"filesystem"| PROVIDER
SIDECAR["๐ Sidecar :17888<br>sidecar mode"] -->|"HTTP"| PROVIDER
BRIDGE --> ANIM
PROVIDER --> ANIM
ANIM --> WINDOW
| Mode | When | How |
|---|---|---|
| Direct | Hermes & renderer on same host | Reads ~/.hermes/ directly via filesystem |
| Sidecar | Hermes in WSL, renderer on host | HTTP to sidecar at :17888 (bridges WSL boundary) |
The renderer auto-detects the mode at startup and stays in it for the session lifetime.
| Component | Required? | What it does |
|---|---|---|
| Renderer | Always | Renders the pet, shows bubbles, handles state |
| Sidecar | WSL / remote only | Bridges ~/.hermes/ from WSL to the host via HTTP |
Everything you need to install and run Hermes WebUI Companion.
- Hermes Agent installed with a petdex pet (
hermes pets install <slug>) - Hermes WebUI running at
localhost:8787โ on the same host (direct mode) or inside WSL (sidecar mode) - Tauri runtime โ WebView2 on Windows, webkit2gtk on Linux, built-in WebKit on macOS
If Hermes runs inside WSL or on a different machine, install the sidecar to bridge the filesystem boundary. Skip this step if Hermes and the renderer share the same host โ direct mode handles that automatically.
# Download the latest sidecar binary and service file
curl -LO https://github.com/latipun7/hermes-webui-companion/releases/latest/download/hermes-webui-companion-sidecar
curl -LO https://github.com/latipun7/hermes-webui-companion/releases/latest/download/hermes-webui-companion-sidecar.service
# Install
chmod +x hermes-webui-companion-sidecar
cp hermes-webui-companion-sidecar ~/.local/bin/
mkdir -p ~/.config/systemd/user/
cp hermes-webui-companion-sidecar.service ~/.config/systemd/user/
systemctl --user enable --now hermes-webui-companion-sidecarDownload the latest binary for your platform from the Releases page:
- Windows:
hermes-webui-companion-gui-x86_64-pc-windows-msvc.exe - macOS:
hermes-webui-companion-gui-x86_64-apple-darwin - Linux:
hermes-webui-companion-gui-x86_64-unknown-linux-gnu
In your Hermes WebUI, make sure the Desktop Companion extension is enabled. It POSTs real-time session snapshots to the bridge server at :17787.
- Watch the pet โ it moves and reacts based on your sessions: idle, running, waiting for approval, reviewing, waving
- Right-click the pet window for Restart, Close, or Switch pet
- Notifications appear as bubble cards above the pet
- Click the bubble to navigate directly to the session in WebUI
- Drag the pet window anywhere on your screen
| Environment Variable | Default | Description |
|---|---|---|
HERMES_HOME |
(auto) | Override Hermes installation path (direct mode) |
HERMES_WEBUI_PORT |
8787 |
WebUI health check port |
HERMES_COMPANION_DEBUG |
โ | Set to 1 for verbose logging |
Debug logging gives you scoped prefixes:
[companion:bridge]โ HTTP bridge activity[companion:cmd]โ Tauri IPC commands[companion:health]โ Service health state[companion:bubble]โ Bubble window visibility
Each GitHub Release ships:
| File | Platform | Description |
|---|---|---|
hermes-webui-companion-sidecar |
Linux | Sidecar binary |
hermes-webui-companion-sidecar.service |
Linux | systemd unit file |
hermes-webui-companion-gui-x86_64-unknown-linux-gnu |
Linux | Renderer binary |
hermes-webui-companion-gui-x86_64-apple-darwin |
macOS | Renderer binary |
hermes-webui-companion-gui-x86_64-pc-windows-msvc.exe |
Windows | Renderer binary |
Everything you need to set up the project locally, build from source, and contribute.
git clone https://github.com/latipun7/hermes-webui-companion.git
cd hermes-webui-companion
mise installAssume you have mise installed already, this installs the Rust toolchain, prek (git hooks), and cocogitto โ all in one command.
sudo apt-get install libwebkit2gtk-4.1-dev libgtk-3-dev \
libayatana-appindicator3-dev librsvg2-devwebui-companion/
โโโ Cargo.toml # Workspace root
โโโ .pre-commit-config.yaml # prek hooks: fmt, clippy, prettier, markdownlint-cli2
โโโ rustfmt.toml # Formatting rules
โโโ mise.toml # Task runner + tool manager
โโโ context.md # Domain glossary (canonical terminology)
โโโ crates/
โ โโโ common/ # Shared types + ConfigReader
โ โโโ sidecar/ # WSL HTTP server (axum)
โ โโโ renderer/ # Desktop app (Tauri v2)
โ โโโ src/ # Rust modules
โ โโโ gui/ # HTML/CSS/JS frontend
โ โโโ tauri.conf.json # Tauri configuration
โโโ docs/
โโโ prd.md # Product requirements
โโโ adr/ # Architecture decisionscargo build --locked --release -p hermes-webui-companion-sidecarcargo tauri build --features guiexport HERMES_COMPANION_DEBUG=1
cargo tauri dev --features guiThis project enforces:
- Rustfmt โ consistent formatting (
mise run fmt) - Clippy โ lint with
-D warnings(mise run check) - Prettier โ code formatting for JS/CSS/JSON/YAML/MD (
mise run prettier) - markdownlint โ consistent markdown (
mise run markdownlint) - Conventional Commits โ enforced by
cog verifycommit-msg hook - Pre-commit hook โ runs fmt, clippy, prettier, markdownlint before every commit (installed by
mise install) - CI โ runs the full
mise run ci-checkgate on every push/PR
| Command | Description |
|---|---|
mise run check |
Check Rust formatting and clippy (read-only) |
mise run test |
Run all tests |
mise run lint |
Fix formatting and linting issues |
mise run fmt |
Format Rust code |
mise run build |
Build release binary |
mise run ci-check |
Full CI gate (prettier, markdownlint, fmt, clippy, tests) |
mise run release |
Auto-bump version + changelog + tag |
mise run changelog |
Generate changelog from commit history |
This project follows Conventional Commits. Commit messages are linted automatically via cocogitto.
# With cocogitto (recommended)
cog commit feat "add awesome feature"
# With git (enforced by commit-msg hook)
git commit -m "feat: add awesome feature"Run the full CI gate locally:
mise run ci-checkThis runs prettier, markdownlint, fmt (check), clippy, and tests โ everything CI will verify.
MIT ยฉ 2026 latipun7
Pets powered by petdex.dev โ 3000+ open-source sprites