A pixel-art virtual office for Hermes Agent —
every agent session and every delegate_task subagent becomes an animated
pixel character at a desk. Watch tools fire, subagents spawn and finish, and
approval requests flag you visually, live in your browser or in VS Code.
Hermes' answer to "Pixel Agents" for Claude Code.
Companion VS Code extension: hermes-pixel-office-vscode (this plugin works standalone in any browser — the extension is optional).
- One character per Hermes session (CLI, Telegram, Discord, cron, ...) — characters walk in through the door, sit at a desk, and walk out when the session ends
- Gold-collared characters are
delegate_tasksubagents, labeled by goal - Activity animations: typing (
write_file/patch), reading a book (read_file/search_files), browsing (web tools), terminal work (green monitor flicker), delegating (pointing) - Dangerous-command approvals: red "!" speech bubble + "needs input!" + header counter ("N waiting!")
- Optional sound: chime when an agent needs approval or a subagent finishes (♪ toggle in the header, off by default, persists)
- Sessions from ALL Hermes processes on the machine share one office
Visual only: the plugin observes lifecycle hooks — it never blocks, vetoes, or transforms anything, adds zero model-tool footprint, and does not touch the prompt cache.
git clone https://github.com/teknium1/hermes-pixel-office ~/.hermes/plugins/pixel-office
hermes plugins enable pixel-officeStart a new Hermes session (plugins load at process start — an already-running session won't pick it up), make the agent do anything, and open:
http://127.0.0.1:8113
Windows: same commands; the clone path is %USERPROFILE%\.hermes\plugins\pixel-office.
Install the companion extension
and run Hermes: Open Pixel Office from the command palette. Same office,
rendered in a panel, plus a "+ agent" button that opens a terminal running
hermes.
~/.hermes/config.yaml:
plugins:
enabled:
- pixel-office
entries:
pixel-office:
port: 8113 # change if something else owns 8113If you change the port, point the extension setting
hermesPixelOffice.stateUrl at the same port.
python3 demo_feed.pyFires synthetic sessions/subagents/approvals through the real plugin code and serves the office — no Hermes install required (stdlib only).
agents ──lifecycle hooks──▶ events.jsonl ──fold──▶ /state ──poll──▶ canvas office
Hook callbacks (pre/post_tool_call, subagent_start/stop,
on_session_start/end, pre_approval_request/post_approval_response)
append one JSON line each to ~/.hermes/pixel-office/events.jsonl — O(1),
fail-open, microseconds. A daemon thread serves web/index.html (single
canvas page, sprites drawn in code, zero dependencies) and /state, which
folds the log into the current office snapshot. The log auto-trims at 512 KB.
- "office unreachable" in the browser/extension — check
hermes logs --level warning. The plugin logs loudly when it can't bind its port, including a probe verdict telling you whether the squatter is another (healthy) office, a foreign app, or a dead listener such as a stale VS Code port-forward. curl http://127.0.0.1:8113/statehangs instead of refusing — a system proxy or a ghost VS Code port-forward is intercepting localhost. Trycurl --noproxy "*" ...; check VS Code's Ports view and stop stale forwards (they can outlive the remote server they pointed at).- Plugin enabled but nothing happens — plugins load at process start.
Exit and relaunch
hermes;/newinside an old process is not enough. Verify withhermes logs --level info | grep pixel-office(Windows:findstr /i pixel-office) — you should see "registered" at session start. - No
events.jsonlappearing — the same log now carries a WARNING line naming the exact exception if event writes fail.
MIT