Hermes-Relay: Android App and CLI for Hermes Agent

Connects Hermes Agent to Android devices and desktop machines via a native app and CLI.

Automation & Workflowsintermediate12 min read
Author
Codename-11
Stars
78
Language
Kotlin
License
MIT
Upstream updated
2026-07-25
Hermes-Relay: Android App and CLI for Hermes Agent

Hermes-Relay is a companion for the Hermes Agent platform consisting of a native Android app and a single-binary CLI. The Android app provides streaming chat, voice, and management features, while the CLI enables agent access to files, terminal, search, and screenshots. Once wired up, an agent can be reached from a phone or any paired machine for chat, voice control, device management, and remote tool execution.

What It Does

  • Streaming chat, rides vanilla Hermes, preferring the dashboard gateway (/api/ws, live thinking) when signed in to Manage and falling back to API-server SSE otherwise, with live markdown, tool-call cards, session history, a searchable command palette, file attachments, quote-in-reply, conversation share, and send-while-streaming queuing.
  • Manage your agent, the full Hermes dashboard, native: switch models from your provider catalog, manage keys (write-only, masked, rate-limited reveal), create and edit profiles including SOUL.md, and browse/install/update skills. One dashboard sign-in covers it all.
  • Hands-free voice, talk on a vanilla install: speech rides your server's configured providers, unlocked by the same Manage sign-in. Relay-paired setups add per-profile voice and an opt-in provider-native Realtime Agent with background task handoff.
  • Works away from home, add a Tailscale or public URL and the app roams automatically (LAN at home, fallback elsewhere). An unreachable server gets a diagnosis, not just a red dot.
  • Multi-Connection + profiles, pair multiple Hermes servers (home + work, dev + prod) and switch in one tap; overlay a profile's model + SOUL.md per chat.
  • Phone control (bridge), with Relay paired, the agent reads the screen and acts: tap, type, swipe, scroll, screenshots, clipboard, media keys, batched macros. Guarded by per-app blocklist (banking/2FA blocked by default), destructive-verb confirmation, idle auto-disable, and a full activity log.
  • Notification companion, opt-in access so the agent can triage, summarize, and route incoming notifications.
  • Security & pairing, QR pairing, Android Keystore session storage (StrongBox-preferred), TOFU cert pinning, per-channel time-bound grants, user-chosen session TTL.
  • Stats for Nerds, local-only analytics: TTFT, token usage, stream health, peak-time charts.

Sideload builds add direct SMS, contact search, one-tap dialing, and location awareness, handy for fully hands-free intents like "text Sam I'll be 10 minutes late." See Release tracks.

The Hermes-Relay CLI (alpha) lets the agent call tools on your machine over the same WSS relay, read_file, write_file, terminal, search_files, screenshot, clipboard, open_in_editor, and more, behind a one-time consent gate, interactive diff approval for patches, and a --no-tools kill-switch. Self-contained CLI binaries ship for Windows x64, Linux x64, and macOS x64/arm64, no Node required. Windows also has an optional native, menu-only systray. Assets are unsigned during the experimental phase, so SmartScreen / Gatekeeper warnings are expected.

Setup

Diagram: Setup

1. Install the Android app

  • Google Play (easiest, auto-updates), install from Google Play. Chat, voice, Manage, terminal/TUI, media, notifications, and relay sessions.
  • APK (full phone-control feature set), download the file ending in -sideload-release.apk from the newest android-v* release on GitHub Releases and open it (allow your browser to install unknown apps the first time). Integrity verification, signing fingerprint, and per-build details are in the Sideload guide.

Sideload builds check GitHub for updates and show a one-tap banner when you're behind; Play builds update through the Store. See Release tracks for the capability matrix.

2. Have the Hermes Dashboard running

The normal Android connection uses the upstream Hermes Dashboard/Gateway for chat, sign-in, sessions, Manage, and voice. Installing Hermes and choosing a provider is vanilla Hermes setup:

hermes setup --portal   # install / log in / pick a provider, skip if already done
hermes dashboard       # start the standard Dashboard/Gateway surface

Make the dashboard reachable from your phone over a trusted LAN, Tailscale, or an HTTPS reverse proxy. The full walkthrough covers Windows, remote access, and dashboard authentication. You do not need to enable the separate API server or invent an API key for the standard path.

3. Connect and talk

Open the app, choose Connect to Hermes, and enter or discover the dashboard address (conventionally http://<host>:9119). Sign in through the dashboard's configured provider when prompted. The app probes the available upstream capabilities and finishes with a connection summary.

The separate API server can be discovered automatically or added later under Advanced as a chat fallback or for a headless compatibility setup. Its API key is requested only when that optional endpoint is configured. Existing API-first setup QRs remain importable.

The wizard probes everything and finishes with a capability card:

LineWhat it means
ChatDashboard/Gateway ready, you can talk
ManageModels, keys, skills, and profiles are available from the phone
VoiceSpeech ready via your server (or one Manage sign-in away)
API fallbackOptional API route available/unavailable
RelayOptional extensions, fine to leave unpaired

One dashboard sign-in unlocks Chat, Manage, sessions, and standard voice. That's the whole Vanilla Hermes setup.

Going places? Add the Dashboard's Tailscale address, for example http://100.x.y.z:9119 or a separately published https://host.ts.net URL, under Settings → Connections → Routes. Android tests it as a Dashboard route; no API server or API key is required. The app uses LAN at home and switches routes automatically when you leave. See Remote access.

4. Optional: install Relay for power tools

Install the Relay plugin on the server only when you want Terminal, Bridge phone control, relay sessions, media routes, or the realtime voice engine:

hermes plugins install Codename-11/hermes-relay/plugin --enable
hermes relay doctor
hermes relay start --no-ssl
hermes pair

Use the legacy installer instead if you also want the systemd user service, shell shims, and the full clone/update workflow:

curl -fsSL https://raw.githubusercontent.com/Codename-11/hermes-relay/main/install.sh | bash

The plugin-manager install owns the plugin code, dashboard tab, CLI commands, and agent tools. hermes relay compat status/install/remove manages only the optional legacy API compatibility hook when an older Hermes build needs it. Scan the QR from the phone's Connections screen, or use hermes pair --register-code ABCD12 with the manual code from Android Settings → Connections → Advanced.

  • Plugin-manager uninstall: hermes relay compat remove --all if you installed the optional hook, then hermes plugins remove hermes-relay.
  • Legacy installer update: hermes-relay-update (idempotent), or re-run the install one-liner.
  • Legacy installer uninstall: bash ~/.hermes/hermes-relay/uninstall.sh, removes the service, shims, clone, external skill path, editable package, and compat hook. It never touches shared Hermes state. Flags: --dry-run, --keep-clone, --remove-secret.
  • Dashboard plugin: installs with the same symlink, restart the gateway and a Relay tab (paired devices, bridge activity, media tokens) appears in the web UI.

Full server setup, TLS, and systemd details: docs/relay-server.md.

5. Install the Hermes-Relay CLI (optional)

irm https://raw.githubusercontent.com/Codename-11/hermes-relay/main/desktop/scripts/install.ps1 | iex
hermes-relay pair --remote ws://<host>:8767   # once
hermes-relay daemon start                      # background tool router, agent reaches you anytime
hermes-relay update                            # self-update via GitHub Releases

It pairs against the same relay and credential store as the Android app, pair once from either, both work. Tagged on the desktop-v* release track, with historical releases still visible under cli-v*.

On Windows, the default installer adds the optional right-click-only systray: no dashboard or app window, just TUI launch, User/Administrator-aware daemon controls, pairing, local grant review, audit, diagnostics, logs, desktop-use status/cancellation, sign-in startup, and emergency stop.

Configuration Reference

The sources do not document individual configuration options beyond the commands and flags shown in the Setup section. The following table summarizes the key commands and their purposes:

Command / FlagPurposeDefault / Notes
hermes setup --portalInstall, log in, or pick a providerSkip if already done
hermes dashboardStart the standard Dashboard/Gateway surfaceRequired for Android connection
hermes plugins install Codename-11/hermes-relay/plugin --enableInstall the Relay plugin via plugin managerPreferred method
hermes relay doctorVerify Relay plugin installationRun after install
hermes relay start --no-sslStart the relay server without TLSFor development; use TLS in production
hermes pairInitiate QR pairingRun on server after relay start
hermes pair --register-code ABCD12Pair using a manual codeUse when QR scan is not possible
hermes relay compat status/install/removeManage legacy API compatibility hookOnly needed for older Hermes builds
hermes relay compat remove --allRemove all compatibility hooksBefore uninstalling plugin
hermes plugins remove hermes-relayUninstall the Relay pluginAfter removing compat hooks
hermes-relay-updateUpdate legacy installerIdempotent
bash ~/.hermes/hermes-relay/uninstall.shUninstall legacy installerFlags: --dry-run, --keep-clone, --remove-secret
hermes-relay pair --remote ws://<host>:8767Pair CLI with relay serverRun once per machine
hermes-relay daemon startStart CLI background tool routerAgent can reach you anytime
hermes-relay updateSelf-update CLI via GitHub Releases
--no-toolsKill-switch for CLI toolsDisables all tool calls

How It Works

Phone        (HTTP/WSS) --> Hermes Dashboard  (:9119)   [chat gateway, manage, vanilla voice]
Phone        (HTTP/SSE) --> Hermes API Server (:8642)   [chat fallback, sessions, runs]
Phone        (WSS/HTTP) --> Relay             (:8767)   [terminal, bridge, media, relay voice, sessions]
CLI          (WSS)      --> Relay             (:8767)   [machine tools, tui, terminal]

Chat prefers the Hermes dashboard gateway when Manage auth is ready, then falls back to the upstream API server SSE path with the API key. Manage and Vanilla Hermes voice ride the Hermes dashboard with its own one-time sign-in, so a vanilla install needs no plugin for either. The optional relay on :8767 adds the power surfaces: terminal, bridge phone control, media handoff, machine tools, and relay-side voice, which is preferred automatically when paired. One QR can configure API, dashboard, and relay routes without merging their auth models.

The Android app uses Kotlin 2.0, Jetpack Compose, Material 3, and OkHttp. The Hermes-Relay CLI is written in TypeScript and compiled to a native binary with Bun, requiring Node >=21 for source development but zero runtime dependencies. The server/plugin is written in Python 3.11+ using aiohttp. Serialization on Android uses kotlinx.serialization. Build tools are AGP 9, Gradle 8.13, JVM toolchain 17 for Android, and tsc + bun build --compile for the CLI. CI/CD is handled by GitHub Actions with separate pipelines for Android, plugin, and desktop builds. The minimum SDK is 26 (Android 8.0) with a target SDK of 35.

Requirements and Limitations

  • Android: Android 8.0+ (SDK 26) is required.
  • Server: A current upstream hermes-agent with the Dashboard/Gateway enabled is required. Python 3.11+ is needed on the server for the Relay plugin.
  • API server and Relay are optional. A vanilla hermes-agent install is enough for chat, management, and voice. The Relay plugin is only needed for terminal, phone control, or CLI tools.
  • CLI is alpha. Self-contained binaries ship for Windows x64, Linux x64, and macOS x64/arm64. Assets are unsigned during the experimental phase, so SmartScreen / Gatekeeper warnings are expected.
  • Sideload builds add direct SMS, contact search, one-tap dialing, and location awareness, but these features are not available in the Google Play version.
  • Phone control (bridge) is guarded by a per-app blocklist (banking/2FA blocked by default), destructive-verb confirmation, idle auto-disable, and a full activity log.
  • The legacy installer is an alternative to the plugin-manager install and provides systemd user service, shell shims, and the full clone/update workflow. It is not required for most users.
  • The compatibility hook (hermes relay compat) is only needed for older Hermes builds that do not support the plugin manager.

Troubleshooting

The sources do not document specific failure modes or troubleshooting steps beyond the verification commands. The following verification steps are provided:

  • Server verification: Run hermes-status on the server to check the relay status.
  • CLI verification: Run hermes-relay doctor to check the CLI installation and pairing status.
  • AI-agent setup recipe: If an AI assistant manages your server, paste the following block into its chat to fetch the canonical setup recipe and walk through install, pairing, and troubleshooting:
You are helping me install and maintain Hermes-Relay (https://github.com/Codename-11/hermes-relay), a native Android client + a CLI + a Python plugin for the Hermes AI agent platform.

Read the canonical setup recipe before acting:
  https://raw.githubusercontent.com/Codename-11/hermes-relay/main/skills/devops/hermes-relay-self-setup/SKILL.md

Then guide me through:
- Verifying hermes-agent is already installed (it's a prerequisite, Hermes-Relay is a plugin, not standalone)
- Running the server-plugin install one-liner: `curl -fsSL https://raw.githubusercontent.com/Codename-11/hermes-relay/main/install.sh | bash`
- Connecting my phone by Vanilla Hermes API URL/key first, then optionally pairing Relay via `hermes pair` or `/hermes-relay-pair` for power tools; OR pairing my laptop via the Hermes-Relay CLI (`irm https://raw.githubusercontent.com/Codename-11/hermes-relay/main/desktop/scripts/install.ps1 | iex` on Windows, then `hermes-relay pair --remote ws://<host>:8767`)
- Verifying with `hermes-status` (server) or `hermes-relay doctor` (CLI)

Always confirm before running shell commands. Never restart hermes-gateway without asking. If any step fails, consult the Troubleshooting section in the SKILL.md and ask me for the exact error.

Already installed? The same recipe is auto-loaded as a Hermes skill, invoke /hermes-relay-self-setup from any chat for re-setup or "is everything wired correctly?" checks.

If the Android app cannot connect, ensure the Hermes Dashboard is running and reachable from the phone over a trusted LAN, Tailscale, or HTTPS reverse proxy. The app probes available upstream capabilities and shows a connection summary. If the relay is not paired, the app will show "Relay: Optional extensions, fine to leave unpaired" in the capability card.

For CLI issues, ensure the relay server is running (hermes relay start --no-ssl or with TLS) and that the CLI is paired with the correct remote address (hermes-relay pair --remote ws://<host>:8767). The CLI must be running as a daemon (hermes-relay daemon start) for the agent to reach the machine.

If the legacy installer fails, check that the one-liner URL is correct and that the system has curl and bash available. The uninstall script is at ~/.hermes/hermes-relay/uninstall.sh and supports --dry-run, --keep-clone, and --remove-secret flags.

For development, the relay server can be started from a clone with python -m plugin.relay --no-ssl or via Docker:

docker build -t hermes-relay relay_server/ && docker run -d --network host --name hermes-relay hermes-relay

Live-edit the plugin against a local Hermes by symlinking:

ln -s "$PWD/plugin" ~/.hermes/plugins/hermes-relay

Then restart hermes and run hermes pair to verify. The 35 android_* and 25 desktop_* tools register regardless of hermes-agent version.

Development

# Android: open the repo root in Android Studio, wait for Gradle sync, Run (Shift+F10).
scripts/dev.bat build      # Build debug APK
scripts/dev.bat release    # Build signed release APK
scripts/dev.bat bundle     # Build release AAB for Google Play
scripts/dev.bat run        # Build + install + launch + logcat
scripts/dev.bat test       # Run unit tests
scripts/dev.bat version    # Show current version
scripts/dev.bat relay      # Start the relay server (dev, no TLS)

Repository structure

hermes-relay/
├── app/                       # Android app (Kotlin + Jetpack Compose)
├── desktop/                   # Hermes-Relay CLI thin-client (TS + Bun-compiled binary)
├── relay_server/              # WSS server (Python + aiohttp; thin shim → plugin/relay)
├── plugin/                    # Hermes agent plugin
│   ├── relay/                 #   - canonical relay (server.py, channels/, media, voice, machine tools)
│   ├── tools/                 #   - android_* bridge + desktop_* tool handlers
│   └── pair.py                #   - QR pairing CLI + multi-endpoint payload builder
├── skills/devops/             # Hermes agent skills (pairing, self-setup, CLI setup recipes)
├── user-docs/                 # VitePress documentation site
├── docs/                      # Spec, decisions, security
├── scripts/                   # Dev helper scripts
├── .github/workflows/         # CI + release pipelines (ci-android / ci-plugin / ci-desktop)
└── gradle/                    # Wrapper (8.13) + version catalog

License

MIT, Copyright (c) 2026 Axiom-Labs. Built with the help of Humans and AI Agents.

Sources & References

This page was researched from 2 independent sources, combined and verified for completeness.

Newsletter

The #1 AI Newsletter

The most important ai updates, guides, and fixes — one weekly email.

No spam, unsubscribe anytime. Privacy policy

Other Hermes Agent integrations