← Back

Hermes Mobile

Open Source · 2026

An unofficial, open-source iOS client for Hermes, Nous Research's self-hosted agent. Streaming chat with rendered markdown, expandable tool-call cards, QR device pairing with revocable per-device tokens, scheduled tasks, memory, and photo input — all over your own Tailscale network. No cloud relay, no accounts, no telemetry.

Hermes Mobile — light modeHermes Mobile — dark mode

Why It Exists

Hermes runs on your own hardware and ships with a browser dashboard — great at a desk, useless on the move. An agent that can run cron jobs, hold long-term memory, and work for minutes at a time deserves a client you carry with you. Hermes Mobile puts your agent in your pocket: start a conversation from the couch, check on a scheduled job from the train, send it a photo from anywhere your tailnet reaches.

How It Works

The system has two parts: a server plugin that extends Hermes, and an Expo React Native app that connects to it.

The plugin (hermes-mobile-plugin) adds one command: hermes mobile pair. It prints a QR code carrying a one-time payload; the app scans it and exchanges it for a per-device rotating refresh token. Every device is individually listed and revocable — hermes mobile revoke <device> and that phone is out, no shared secrets to rotate.

The app (hermes-mobile-app) connects over your private Tailscale network. Sessions stream over WebSockets with automatic reconnection, tool calls render as live cards with status and durations, and in-app approval prompts let you allow or deny what the agent wants to run — from a phone on 5G, with the gateway sitting on a Mac at home that exposes nothing to the internet.

In Practice

This is what it looks like when the agent actually works for you. From my phone: "Any courts available tomorrow?" Hermes drives its browser and terminal skills against the local club's booking site, notices its session went stale, re-authenticates on its own, and comes back with a table of open slots. "7pm court 6 please" — booked, with a confirmation number. Every tool call it ran along the way is right there in the chat, expandable.

Hermes checking tennis court availability from the phoneHermes booking Court 6 and returning a confirmation number

Privacy First

The gateway binds only to its Tailscale interface. If you're not on the tailnet, the server doesn't exist — there are no open ports, no public endpoints, no third-party backend. Authentication happens twice: once at the network layer through Tailscale's WireGuard identity, and again at the application layer with the device's rotating token. Your prompts, your agent's memory, and your session history never leave your network.

Built in Autonomous Loops

This project was as much an experiment in how to build as in what to build. The whole thing — spec, server plugin, app, App Store-grade polish — went from idea to working-on-cellular in a few days, built almost entirely by coding agents running in structured loops.

The roadmap features (session search and rename, cron job management, memory, in-app tool approvals, photo input) were built by a fleet of agents working in parallel git worktrees. The trick that made it work was contract-first: before any feature agent wrote a line, a read-only agent extracted the actual wire contracts from the Hermes source — request and response shapes with file-and-line evidence, each capability explicitly marked supported, partial, or not found. The build agents then coded against verified contracts instead of plausible guesses. Each slice landed as its own branch with its own tests, and the integrations worked against the real gateway on the first run far more often than they had any right to.

Reviewed by the Agent It Serves

The best moment of the project: I asked my running Hermes agent (on Qwen3.7 Max) to review the codebase of its own future client. It came back with a structured ten-point review — WebSocket auto-reconnect, deferring session creation until the first message, accessibility labels, an error boundary, pagination, and more.

What happened next is the part I'd argue matters most for agent-built software: none of it was implemented blindly. Every finding was verified against the codebase first. About seven survived and shipped. Three were rejected with evidence — the suggested memoization was already handled by the React Compiler, the proposed ATS exception used a mechanism that doesn't exist (exception domains can't express an IP range), and the suggested platform check was the opposite of current Expo guidance. Even the good findings needed real engineering: the reviewer's reconnect snippet would have failed against the app's single-use, 30-second WebSocket tickets, so the shipped implementation mints a fresh ticket on every attempt.

One agent wrote the code, another agent reviewed it, and the review was treated the way good human review should be — verified, partially adopted, partially pushed back on. The first thing I asked in the finished app, paired over 5G through Tailscale, was "Are we paired?" Hermes checked its own device table and confirmed.

Open Source

Both repos are open source — read every line, audit every request, fork it for your own setup. This is a community project, not affiliated with or endorsed by Nous Research.