Phone view for Hermes Desktop on Windows. Read the Bot Chat of each Hermes bot, switch bots, and send text from a phone over a private network (Tailscale).
It is a small local server. It does not change Hermes itself and it does not write to the Hermes databases.
- Read: shows the newest 120 messages of each bot's Bot Chat, read from
state.db(read-only). - Switch: clicks the bot's button in the Hermes Desktop sidebar via Windows UI Automation.
- Write: pastes the text into the Hermes Desktop window and presses Enter. Only allowed for the bot that is currently active in the desktop.
The Hermes Desktop app stays the only writer to the sessions.
Every Hermes profile with desktop sessions is one bot:
- the default profile is
hermes - a named profile
xisx - label = the id in Title Case (
elite-coder→ "Elite Coder") - sidebar button =
@<id>
To override any of this, use bots in config.json:
"bots": {
"elite-coder": { "label": "Coder", "ui_name": "@elite-coder" }
}HERMES_HOME is respected. Default: %LOCALAPPDATA%\hermes.
The phone page and the tray menu are in English by default. Set "lang": "de" in config.json for German.
- Windows 10/11 with PowerShell
- Hermes Desktop, open and not minimized
- Python 3 (standard library only)
- Tailscale on the PC and on the phone
-
Clone the repo, e.g. to
C:\Temp\hermes-mobile. -
Run the setup once:
python server.py --initThis writes
config.jsonwith the PC's Tailscale IP (tailscale ip -4), createstoken.txt, and prints the phone URL. Without Tailscale, pass the IP yourself:python server.py --init --host <private-ip>. -
Start the tray app (or double-click
hermes-mobile.exe):hermes-mobile.exeThe tray icon shows the status: green = server and desktop window ok, yellow = server ok but no desktop window, red = server stopped. Menu: restart, reconnect (re-checks the Tailscale IP), copy URL, open log, autostart at login, quit, and the version.
Without the exe:
python server.pyruns the server only, without tray icon. -
On the phone, open the URL from step 2:
http://<ip>:8765/?t=<token>
- The server binds only to the IP in
config.json. Use a private address (Tailscale), never0.0.0.0. - The token is in the URL. Browser history and proxy logs can keep it. Treat the URL like a password.
- Anyone with the token and access to your network can send text into your desktop session.
token.txt,active.txt,outbox.txtandserver.logare git-ignored on purpose.
- The Hermes Desktop window must be open and not minimized. If another window is active, the server brings the desktop to the front.
- The PC must not be locked.
- Text goes through the clipboard, which overwrites its current content.
- The switch relies on the sidebar button labels (
@handle) and the window titleHermes. A desktop update that changes them breaks switching. Setdesktop_windowinconfig.jsonif your window has another title. - Typing into the desktop is a UI workaround, not a Hermes API.
- Only the Bot Chat of each bot is shown and writable.
- The page refreshes every 4 seconds. There is no streaming.
- Windows only.
python -m unittest discover -s tests -v
Covers message handling, language strings, page rendering, the HTTP API (auth, messages, upload) and path safety. The desktop automation (UI Automation, keystrokes) is not covered by tests: it needs a live Hermes Desktop window.
server.py- the server (standard library only)tray.py- tray app: status, restart, reconnect, version, autostartbuild.py- buildshermes-mobile.exe, bumps the patch version each timeversion.py- current versionconfig.json- created by--init, not tracked
