A native-feeling Android app for Hermes Agent, running entirely on your phone.
No laptop. No server.
Unofficial community project. Not affiliated with or endorsed by Nous Research.
Hermes Agent is a powerful agent, but it lives in a terminal. Hermes Mobile gives it a proper phone interface: streaming chat, live tool cards, approvals you can answer from the status bar, a canvas for building things together, and notifications that work while the app is closed. Hermes runs in Termux on the same phone, so the whole thing is self-contained.
Approvals and questions show up on the status chip (an Android 16 Live Update; older versions get a normal notification). One tap on the chip, pick an answer, done. The app does not need to be open.
KaTeX equations, sortable tables with "Copy table", tick-able task lists, Obsidian-style callouts, Mermaid diagrams (full screen, pinch to zoom), coloured diffs, long code that collapses, inline SVG and HTML cards.
Ask for an interactive page or a 3D scene and Hermes builds it live in a document beside the chat. HTML runs in a sandbox that is offline unless you allow it. Every change is a version with a diff you can restore.
Pick Hermes under Default apps → Digital assistant app and long-pressing the power button (or the assist gesture) opens it straight in hands-free Live mode. Settings → Voice shows whether it is on.
Search inside every message, pin, archive, link chats to chats. Every memory write is shown as a diff, and there is a screen to see what Hermes remembers. Dark, OLED black or light.
| Voice | Read replies aloud with a player (pause, seek, speed, any installed speech engine), dictation, hands-free Live mode, and Hermes as your phone's assistant |
| Control a turn | Stop or steer a running reply, edit, retry or branch any turn, and /btw to ask a side question without interrupting |
| See the work | Live tool cards (long runs fold into one line), sub-agents, the to-do list, speed and context use per reply, and file checkpoints to undo Hermes's file changes |
| Skills & commands | / autocomplete for every skill and slash command |
| Models & profiles | Switch model and reasoning level per chat; create, clone and edit profiles with their own default model, keys and SOUL.md |
| Notifications | Reply, answer questions and allow commands right from the notification; cron results; a "failed" note when a model call fails |
| Cron & files | Cron jobs (edit, run, results), a file browser and projects |
| Share | "Share to Hermes" from any app; attach photos, camera shots and files; share a chat as Markdown; link chats to each other |
| Offline-friendly | Messages typed offline send on reconnect; the last chat list is cached |
| Shortcuts & big screens | Launcher shortcuts (New chat, Live mode, last chat); a two-column layout on tablets and foldables |
| Setup check | One screen that checks Termux, permissions, the plugin and battery settings, with a fix button for each |
| Battery | No permanent wake lock: the phone sleeps while Hermes is idle |
flowchart LR
subgraph phone["📱 All on your phone"]
direction LR
ui["💬 <b>Hermes Mobile</b><br/>chat screen"]
hermes["🤖 <b>Hermes Agent</b><br/>in Termux → Debian<br/>+ mobile plugin"]
svc["🔔 <b>Island & notifications</b><br/>work with the app closed"]
end
llm[("☁️ Your model provider")]
ui <-->|"chat"| hermes
hermes -->|"status · approvals · replies"| svc
hermes -->|"HTTPS"| llm
classDef appNode fill:#2b2418,stroke:#D9A441,stroke-width:2px,color:#f6e7c9
classDef hermesNode fill:#1d2530,stroke:#6ea8fe,stroke-width:2px,color:#dbe8ff
classDef cloud fill:#1f2a22,stroke:#3DDC84,stroke-width:2px,color:#d6f5e2
class ui,svc appNode
class hermes hermesNode
class llm cloud
style phone fill:transparent,stroke:#888,stroke-dasharray:5 5
Hermes runs in Termux on the phone, and the app talks to it over localhost the same way Hermes Desktop does (it also starts Hermes when it isn't running). A small Hermes plugin sends status, approvals and replies to the app's background service, so the island chip and notifications work even when the app is closed.
No root needed. Hermes Mobile runs on an ordinary phone with a locked bootloader. A rooted phone works too; the only difference is how Shizuku starts (see Rooted or not).
You need an Android phone (arm64, Android 8+) with about 6 GB free, and access to a model, either of:
- A subscription you already have: ChatGPT Plus / Pro (or a Codex plan), Claude Pro / Max, SuperGrok / X Premium+, or a Nous Portal account. You sign in from the app.
- An API key: for example OpenRouter (one key for every model), Anthropic, OpenAI or Gemini (has a free tier).
These apps get installed. Hermes needs all of them to run and to use your phone:
| App | What it is for |
|---|---|
| Termux | Linux on the phone: Hermes runs in Debian inside it |
| Termux:API | Lets Hermes use the phone: battery, location, clipboard, notifications, SMS, camera… |
| Termux:Boot | Starts Hermes again after the phone restarts |
| Shizuku | Gives Hermes the access adb has, without root: screenshots, taps, apps, logs |
| Hermes Mobile | This app |
Get the three Termux apps from F-Droid, all three: the Play Store builds are outdated and can't be mixed with F-Droid ones.
The install takes 15-40 minutes, mostly waiting.
-
Install Termux, Termux:API and Termux:Boot from F-Droid, and open Termux:Boot once. Install Shizuku (Play Store or GitHub).
-
Start Shizuku. Not rooted: open it, tap Start via Wireless debugging and follow its steps (you pair it once: Developer options → Wireless debugging → Pair device with pairing code, then type the code into Shizuku's notification). Rooted: tap Start.
-
Open Termux and paste:
curl -fsSL https://raw.githubusercontent.com/omarqaterge/hermes-mobile-app/main/phone/bootstrap.sh -o hm.sh && bash hm.shTap Allow when Android asks about files, and Allow all the time when Shizuku asks about Termux. Keep Termux open and the screen on until it prints
HMSETUP DONE.HMSETUP TODOlines just above it say what is still missing: fix it and runbash hm.shagain (finished parts are skipped). -
Download hermes-mobile.apk from the latest release, install it and open it.
-
The app opens on Connect Hermes to a model: sign in with your subscription or paste an API key, then pick the model new chats use. You can change all of this later in Settings → Subscriptions & accounts / API keys / Default models.
ChatGPT, Grok and Nous Portal sign in inside the app. Claude opens Termux for its sign-in, because Hermes only allows that one from a terminal: open the link it shows, approve, and paste the code back into Termux.
Also the route for Android 8-10. Turn on USB debugging on the phone (Settings → About phone → tap Build number 7 times, then Developer options → USB debugging), plug it in and run:
# Mac / Linux
curl -fsSL https://raw.githubusercontent.com/omarqaterge/hermes-mobile-app/main/tools/setup-phone.sh -o setup-phone.sh && bash setup-phone.sh# Windows (PowerShell)
irm https://raw.githubusercontent.com/omarqaterge/hermes-mobile-app/main/tools/setup-phone.ps1 | iexIt installs all five apps, gives them their permissions and starts Shizuku over USB. When Shizuku asks whether Termux may use it, tap Allow all the time. At the end it offers to set an API key; press Enter to skip it and connect a subscription or key in the app instead.
Stuck, or rather not do it yourself? Give your AI coding agent (Claude Code, Codex, Cursor…) this prompt. It runs the same script and fixes what goes wrong:
Read https://raw.githubusercontent.com/omarqaterge/hermes-mobile-app/main/AGENT_INSTALL.md and follow it to set up Hermes on my Android phone.
Tested end to end on a clean Android 15 emulator and piece by piece on a real phone, but not yet on a brand-new real phone. If something fails, please open an issue.
Everything is the same except Shizuku, which Android stops whenever the phone restarts:
| Not rooted (most phones) | Rooted | |
|---|---|---|
| First start | Start via Wireless debugging in Shizuku (Android 11+), or the computer route does it over USB | Start in Shizuku |
| After a restart | Android 13+: Shizuku starts itself on Wi-Fi, once you have started it via Wireless debugging one time (the installer gives it the permission for this). Android 11-12: open Shizuku → Start via Wireless debugging. Android 8-10: from a computer, with the command Shizuku shows under Start by connecting to a computer | Shizuku starts itself |
Until Shizuku runs, Hermes can still do everything except see and touch the screen and other apps; it tells you when it needs Shizuku, and the app's Setup check shows it too.
- Set battery to Unrestricted for Hermes Mobile, Termux and Shizuku (Xiaomi/HyperOS: also turn on Autostart), or Android may stop them.
- Keep the Termux notification: Hermes runs inside Termux.
- To update, run the same command again and install the newest APK.
Open Settings → Setup check in the app first: it shows what's missing, with a button for each fix.
| What you see | Fix |
|---|---|
| "Hermes is offline" for more than a minute | In Termux run ~/bin/hermes-services, then tap Reconnect in the app |
[Process completed (signal 9)] in Termux during the install |
Android stopped it. Android 14+: Developer options → Disable child process restrictions (the computer route does this for you). Then run bash hm.sh again |
The install stops with HMSETUP FAIL <step> |
Read the error above it, fix it and run bash hm.sh again; finished parts are skipped. AGENT_INSTALL.md lists the usual causes |
| No status chip, canvas or approvals | Run bash hm.sh again (it re-enables the plugin) |
| Everything stops after a while | Battery is restricted, see After installing |
| Hermes says Shizuku isn't running | The phone restarted: see Rooted or not |
| Hermes can't read your files | Setup check → Hermes can use your files → Allow, then Restart Hermes |
| Termux:API won't install | Termux and Termux:API come from different stores. Install both from F-Droid |
Everything it does, and how it works
Chat: streaming replies with Markdown, LaTeX, Mermaid diagrams (full screen, pinch to zoom), highlighted code (collapse, wrap,
copy, open in canvas), sortable tables, tick-able task lists, coloured diffs, and images, video and audio from Hermes. Reasoning, live
tool cards, sub-agent cards, the to-do list; approvals, questions and secret, sudo and one-time-code prompts; stop and steer a running
turn; edit, retry and branch a turn; / commands and skills; attach photos, camera shots and files; "Share to Hermes" from other apps;
per-chat drafts; messages typed offline are sent on reconnect; turn stats; file checkpoints; share a chat as Markdown.
Voice: read replies aloud (any installed speech engine, voice, speed, pitch), dictation, hands-free Live mode, and Hermes as your phone's assistant.
Canvas: documents you and Hermes share per chat (Markdown, HTML, code, CSV, SVG, Mermaid…) with version history, diffs and restore; HTML runs in an offline sandbox.
Chats: full-text search that jumps to the message, unread dots, rename, pin, archive, delete, swipe and drag to reorder or pin.
Settings: themes (dark, OLED black, light, system), text size, voice, subscription sign-ins (ChatGPT, Claude, Grok, Nous Portal), default model per profile or for all, every API key and every Hermes option. Profiles: create, clone, rename, edit SOUL.md, delete. Screens for skills, memory, cron jobs, files and projects.
In the background: a pinned status notification that becomes an Android 16 Live Update while Hermes works, plus notifications for replies, questions and approvals that you can answer without opening the app, learning, and cron results. There are no messaging-channel (Telegram, Discord…) settings: this app is the only front end.
How it works: Hermes's dashboard runs on the phone at 127.0.0.1:9119 and exposes the tui_gateway JSON-RPC connection that Hermes
Desktop uses. The interface (React, in web/) uses Hermes's own client from apps/shared, copied into web/vendor/hermes-shared and
pinned in .hermes-commit. The Android part (android/) is a thin Java shell around a WebView that does what a web page can't:
notifications, starting Hermes through Termux's RUN_COMMAND, the photo picker and camera, shares, media streaming. The plugin
(hermes-plugin/) sends events to the app and serves the canvas and media; phone/ has the scripts that keep Hermes running.
A few fixes to Hermes itself live in hermes/patches (applied by the installer, offered upstream; see hermes/README.md).
You need Node 20+, JDK 17 and the Android command-line tools
(sdkmanager "platforms;android-36" "build-tools;35.0.0"). No Gradle:
git clone https://github.com/omarqaterge/hermes-mobile-app.git && cd hermes-mobile-app
(cd web && npm ci)
ANDROID_HOME=/path/to/android-sdk JAVA_HOME=/path/to/jdk-17 VERSION_NAME=1.0.0 VERSION_CODE=1 android/build.sh
adb install -r android/build/hermes-mobile.apkThe first build creates a signing key in ~/.android/hermes-mobile.keystore (never commit it). A self-built app can't update the
downloaded one, because the keys differ: uninstall that first.
To work on the interface in a desktop browser: adb forward tcp:9119 tcp:9119, python3 web/devserver.py, open http://127.0.0.1:5180.
cd web && npm test: unit tests.tools/web-e2e/run.sh: the built interface in headless Chromium against a mock Hermes.python3 tools/test_canvas.py,tools/test_media.py,tools/test_chat_search.py,tools/test_battery.py: the plugin and phone scripts.tools/java-check.sh: compiles the Java shell without the Android SDK.tools/test_hermes_patches.sh: the Hermes patches apply to the pinned Hermes build and revert cleanly.python3 tools/e2e.py: end-to-end checks against a real phone.
GitHub Actions runs all of them except the last on every push.
The app uses Hermes's internal protocol, which can change. Copy the phone's Hermes apps/shared/src into web/vendor/hermes-shared,
update .hermes-commit and .hermes-version (the hermes --version build string, e.g. 0.21.5+4582.gb8a8be1), run npm run typecheck in web/ and rebuild. Then bring hermes/patches along: hermes/README.md says how.
The app compares the phone's Hermes build with .hermes-version: if they differ it shows a notice once and a warning in Settings → About.
There is no "update Hermes" button on purpose: Hermes updates ship with an app release, after the app has been adapted to them.
MIT, see LICENSE. web/vendor/hermes-shared is copied from NousResearch/hermes-agent
(MIT, Copyright Nous Research), see THIRD_PARTY.md. "Hermes" and the Hermes Agent name belong to their owners.
Contributions and bug reports are welcome, see CONTRIBUTING.md.






