An open-source, mobile-first Android app for your Hermes agents. Fire off tasks by voice or text, watch your self-hosted agent work in real time, control its scheduled jobs, and get progress on your lock screen β all from your phone.
π Enjoying Hermes Dispatch? β Support development on Ko-fi β β donations fund new features and keep the project alive.
β¬οΈ Latest release APK β grab hermes-dispatch-oss.apk from the latest stable release and install it (you'll need to allow "install from unknown sources").
Stable: https://github.com/adebnar/hermes-dispatch-android/releases/latest/download/hermes-dispatch-oss.apk Beta (pre-release, from
development): grabhermes-dispatch-oss-beta.apkfrom the newest pre-release on the releases page. The beta is a separate app ("Hermes Dispatch Beta", idβ¦β.beta) that installs alongside the stable one, so you can try new builds without losing your setup.
The oss build is Google-library-free (F-Droid-friendly) and uses ntfy/UnifiedPush for background notifications.
| Tasks | Inbox | Scheduled | Chat | Settings |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Screenshots use synthetic demo data.
- π Tasks dashboard β a quick-action bar (voice / image / document / clipboard), an All Β· Scheduled Β· Completed segmented filter, and animated run-state icons (running / done / failed). History with live status, search, swipe to archive (with Undo), open for the full conversation, rename, or long-press a sent message to edit & resend.
- π£οΈπ·π Multi-modal task creation β voice (on-device or server STT) in a sheet with a live amplitude waveform; camera / gallery images; document attach (PDF / CSV / text β uploaded to your Hermes so the agent can read it); and clipboard quick-paste.
- β° Scheduled β recurring (cron) jobs your agent classifies, shown in plain English ("Every weekday at 9:00 AM") with a next-run countdown, inline animated pause / resume, run-now, delete, and inline editing of name, prompt, and schedule.
- π΄ Live execution β stream the agent's text + tool-use as it happens, with a collapsible agent-activity pane, mid-run approvals and clarifications, and haptic cues on send / completion.
- π₯ Inbox β cron jobs that "deliver to this desktop" show up as clean result cards (just the agent's output, rendered). Swipe to archive, pin/delete (app-only β the files on disk are never touched), unread dots, and a per-job bell plus a global "alert on failures" so only what you care about buzzes. Subscribe a job to alerts straight from the Scheduled tab too, and pick a custom alert sound in Settings.
- π Lock-screen progress with the app closed, via UnifiedPush/ntfy β no Google services required. Optional end-to-end encryption so the relay only sees ciphertext.
- π Bug reporting (opt-in) β capture the app's own logs into a redacted diagnostic report (secrets/keys/tokens stripped), review it, and share as a file.
- π₯ Profiles β switch between your Hermes profiles (e.g. work/personal); runs, tasks, and the Inbox scope to the selected one.
- π€ Settings β model picker (sets the profile's model, applied to new tasks), editable connection (Bridge URL / token), an optional server-side transcription toggle, custom alert sound, and an About panel showing the app, gateway (Hermes), and bridge versions.
- π Rich result cards β Sheets/Docs/Drive links the agent returns render as tappable cards; tasks are grouped by recency.
Android app ββREST + SSEβββΊ hermes-dispatch-bridge ββREST + WSβββΊ hermes-agent dashboard βββΊ MCP tools, cron, skills
β² UnifiedPush (ntfy) βββ push βββ (server-held runs, cron classify, fan-out)
The app talks to a small self-hosted bridge β hermes-dispatch-bridge β that runs next to your Hermes agent. The bridge fronts the hermes-agent dashboard, holds runs server-side (so they keep going when your phone sleeps), classifies cron tasks, and pushes progress. The app authenticates to the bridge with a single bridge token.
You need three things running, then you install the app. Steps are split into π§ what a human does and π€ what you can ask your Hermes agent to build for you.
- Have Hermes installed and its dashboard running
(the gateway web UI, default port 9119). Confirm it loads at
http://127.0.0.1:9119. - Configure at least one model provider and the MCPs you want (Gmail, Sheets, web searchβ¦).
Follow hermes-dispatch-bridge β Setup. In short:
git clone https://github.com/adebnar/hermes-dispatch-bridge && cd hermes-dispatch-bridge
uv venv --python 3.12 && uv pip install -e .
cp .env.example .env # then edit .env (see below)
uv run uvicorn app.main:app --host 0.0.0.0 --port 8099Your .env needs:
-
HERMES_URL=http://127.0.0.1:9119β your dashboard. -
HERMES_TOKEN=β leave empty; for a local dashboard the bridge auto-reads the token. -
BRIDGE_TOKEN=<a strong random secret>β this is what you'll type into the app. Generate it yourself (don't have an assistant create or store it):python3 -c "import secrets;print(secrets.token_urlsafe(32))" -
π€ ask Hermes (no secrets): "Install a launchd/systemd service so hermes-dispatch-bridge runs on boot with HERMES_URL=http://127.0.0.1:9119 β leave my
.envand BRIDGE_TOKEN to me."
The phone needs the bridge's URL and token.
Recommended β HTTPS via Tailscale Serve (valid cert, validated by the phone automatically):
# in the bridge repo:
./scripts/enable-https.sh # or: tailscale serve --bg 8099This gives a URL like https://your-machine.your-tailnet.ts.net β use that as the bridge URL.
(Requires "HTTPS Certificates" enabled for your tailnet in the Tailscale admin console.)
Plain HTTP alternative (no Serve) β the bridge listens on port 8099:
tailscale ip -4 # encrypted transport β http://100.x.y.z:8099
ipconfig getifaddr en0 # macOS LAN β http://192.168.x.y:8099
hostname -I # Linux LAN (first address)
β οΈ Use an HTTPS bridge URL (Tailscale Serve). The app validates it against the system trust store with no extra setup. Plainhttp://is accepted only because this build ships anetwork_security_configthat permits cleartext on your private network (Tailscale/LAN). If you change that β build with cleartext disabled, or expose the bridge beyond your private network β the bridge must be HTTPS.
Get the bridge token (the BRIDGE_TOKEN you set in step 2):
grep BRIDGE_TOKEN ~/path/to/hermes-dispatch-bridge/.envInstall the ntfy Android app (it's the UnifiedPush distributor). That's it β Hermes Dispatch auto-registers your device with the bridge, which then pushes run progress to your lock screen. To self-host ntfy instead of the public server, see the bridge README.
- Install the latest release APK.
- Open it and on the pairing screen enter:
- Bridge URL β your HTTPS Tailscale Serve URL, e.g.
https://your-machine.your-tailnet.ts.net(orhttp://100.x.y.z:8099if you're using the plain-HTTP private-network path above). - Bridge token β your
BRIDGE_TOKEN - Profile (optional) β leave blank, or pick one later in Settings.
- Bridge URL β your HTTPS Tailscale Serve URL, e.g.
- Tap Connect. You're in β create a task with the οΌ button or a suggestion.
./gradlew testOssDebugUnitTest # JVM unit tests
./gradlew assembleOssDebug # debug APK (oss, Google-free)
./gradlew assembleOssRelease # release APK (needs keystore.properties β see below)
./gradlew assemblePlayDebug # play flavor (adds runtime-configurable FCM)For a signed release, create keystore.properties in the repo root (git-ignored):
storeFile=release.keystore
storePassword=β¦
keyAlias=β¦
keyPassword=β¦and a matching keystore (keytool -genkeypair -keystore release.keystore -alias β¦ -keyalg RSA -keysize 2048 -validity 10000). Without it, release builds are unsigned.
| Phase | Scope | State |
|---|---|---|
| 1 | Pairing + read-only Tasks/Scheduled + cron control | β |
| 2 | Live chat + SSE streaming (split chat/actions) + pinned artifacts | β |
| 3 | Voice capture (on-device STT) + MCP/tools surfacing | β |
| 4 | Background push (UnifiedPush/ntfy) + lock-screen "live update" | β |
| 5 | Settings + profile switcher, suggested tasks, pull-to-refresh | β |
| 6 | Model picker, mid-run approvals/clarify, image previews, branded theme | β |
| 7 | In-app editing: rename tasks, edit & resend, edit schedules, edit connection | β |
| 8 | Inbox (local cron deliverables) + alerts, rich result cards, task grouping, server-side STT, E2EE push, persistent push registry | β |
| 9 | Inbox v2: result-only cards, swipe-archive / pin / delete (app-only), unread + failure alerts, opt-in redacted bug reports | β |
| 10 | Cron-side alert toggle (Scheduled tab) + custom alert sound (per-channel) | β |
| 11 | Active-profile shown on Tasks/Inbox/Scheduled; system notification-settings shortcut | β |
| 12 | Cron created under the active profile; session search + server-side archive; model switch | β |
| 13 | iOS-parity UI polish: quick-action bar + segmented filter + animated status, voice waveform sheet, document attach, clipboard, human-readable cron, About panel, motion + haptics | β |
Deferred (additive later): F-Droid / Play Store listings, making the repos public.
Note on model switching: the picker sets the profile's model (applied to new tasks). The Hermes gateway exposes its per-session
/modelonly over its TUI, not the programmatic API the bridge uses, so an in-progress conversation keeps the model it started with.
mainβ stable. Tagged releases (vX.Y.Z) build thereleasevariant β app idco.hermesdispatch.app, label "Hermes Dispatch", assethermes-dispatch-oss.apk.developmentβ active work on the AGP 9 / Kotlin 2.3 / Hilt 2.59 toolchain (now also onmain). Builds thebetavariant β app idco.hermesdispatch.app.beta, label "Hermes Dispatch Beta", versionNameβ¦β-beta, assethermes-dispatch-oss-beta.apk, published as a pre-release (vX.Y.Z-beta.N). The distinct app id means beta installs side-by-side with stable.- Promotion: merging
developmentβmainand releasing thereleasevariant drops the.betasuffix/label automatically β same code, no beta-specific changes to undo β so it ships as the main app.
Toolchain note:
developmenttargets the absolute-latest where upstream allows. Kotlin 2.4 (no KSP release yet) and compileSdk 37 / Compose 2026.x / latest AndroidX (theandroid-37platform isn't published to the SDK manager yet) are held back until those land;developmentwill bump to them then.
See CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md, and the API contract in docs/API-CONTRACT.md. PRs target development.
If Hermes Dispatch is useful to you, please consider supporting development:
β Buy me a coffee on Ko-fi β
Every contribution helps fund new features and ongoing maintenance. Thank you! π
GPL-3.0 Β© Andrew Debnar. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License v3.




