Chat
The input bar
The chat bar is deliberately minimal — three elements, and one button that changes its job instead of cluttering the bar:
+— tap to attach a file or image. Long-press it to open the full command palette. (There's no separate slash button anymore.)- The pill field — type here. It grows up to five lines, then scrolls.
- One trailing button — it morphs to match what you can do right now:
| The button shows | When | What it does |
|---|---|---|
| Send (arrow) | You've typed something | Sends your message |
| Voice (waveform) | The field is empty | Starts a voice conversation |
| Stop (square) | A reply is streaming and the field is empty | Cancels the current reply |
| Steer (cyan arrow) | You type while a reply is streaming | Nudges the live reply — see Steering |
| Queue (arrow + clock) | You type mid-reply and it can't be steered yet | Holds your message for the next turn |
The bar never widens as it morphs — the trailing slot just cross-fades. A tiny character counter appears as an overline above the bar only as you approach the 4096-character limit (amber, then red at the limit). Haptic feedback fires on send and when a reply finishes.
Sending messages
Type and tap Send (or press Enter on a hardware keyboard). Replies stream in real time. When the assistant is thinking, animated dots pulse inside the reply bubble until the first words arrive.
Steering
You don't have to wait for a reply to finish to redirect it. Start typing while a reply is streaming and the Send button turns into a cyan Steer button:
- If the agent is between tool calls, your text is injected into the running turn — it adjusts course without starting over. A small
↳ steerednote marks where you stepped in. - If the agent is mid-reasoning and can't accept a steer yet, your message is queued for the next turn instead (the button shows a clock badge, and a caption above the bar tells you which happened).
Steering is available on the Gateway transport (the live path used when you're signed in to Manage).
Voice mode
When the field is empty, the trailing button is a waveform — tap it to start a hands-free voice conversation. The sphere expands to fill the screen, listens while you speak, and performs the reply as it streams back. Transcribed utterances appear in your chat history as normal messages.
If voice needs setup on your connection, the button shows a small amber dot (it still works — tapping explains what's needed) rather than looking disabled. Interaction modes (tap, hold, continuous) live in Settings → Voice. Full details and troubleshooting: Voice Mode.
Edit & resend
Made a typo, or want to take the conversation a different direction? Long-press one of your own messages and choose Edit — the conversation rewinds to that point and re-runs from your edited text. Available on the Gateway transport when no reply is currently streaming.
Slash commands
Two ways to discover and run commands:
- Inline autocomplete — type
/in the field for a filtered popup that narrows as you type, showing up to eight matches with descriptions. - Command palette — long-press the
+for a full searchable palette. Browse by category, search by name or description, and tap to insert.
Commands are fetched dynamically from your server wherever possible:
- Session commands —
/new,/retry,/undo,/branch,/compress,/resume, etc. (Hermes gateway built-ins, pulled from the server's catalog) - Configuration —
/model,/personality,/reasoning,/yolo,/verbose,/voice - Info —
/help,/status,/usage,/insights,/commands - Personalities — generated from server config (
config.agent.personalities) - Skills — fetched from native
GET /v1/skills; legacy detail routes remain available only where the optional compatibility layer provides them
Tool execution
When the agent uses tools (terminal commands, web search, file operations), tool calls render based on Settings → Chat → Tool call display:
| Mode | Behavior |
|---|---|
| Off | Routine activity hidden; approvals, failures, media, file changes, risks, and delegations remain visible |
| Compact | Consecutive routine calls share one summary with compact rows on demand |
| Detailed | The same clean summaries disclose full arguments, duration, and results |
A live activity run keeps one summary plus one latest-activity line. Once it settles, the whole run becomes one collapsed summary. Tap the run to inspect its identity-preserving tool rows; in Detailed mode those rows expose arguments, results, timestamps, and duration. Calls requiring attention or delivering the requested result stay independent instead of being buried in a run.
Subagent lanes
When the agent delegates work to subagents, each one renders as its own collapsible lane beneath the reply — a guide rail with that subagent's thinking and tool rows, so a complex multi-agent turn stays readable instead of interleaving into one stream. Lanes auto-collapse as each subagent finishes.
Rich cards & interactive prompts
Alongside tool-progress cards, replies can render rich cards — structured Material cards for link previews, calendar entries, weather, and other skill output.
Some cards are interactive prompts the agent is waiting on: an approval, a clarifying question, a sudo password, or a secret. Answer right in the card — the button row collapses into a confirmation once you choose, and your response is synced into the agent's session memory so later turns can reference it. Sensitive prompts (sudo, secrets) are masked and hold-to-confirm. See Markdown Rendering → Rich Cards for the full visual vocabulary.
Context meter
A thin strip under the chat header tracks how full the conversation's context window is. It stays invisible until you're about halfway, then turns amber around 75% and red near 90%, with a · NN% ctx readout in the header subtitle as you get close to the limit — a quiet heads-up to wrap up or /compress before the model starts dropping the earliest messages.
Chat alerts
If you leave the app during a Gateway turn, Hermes-Relay alerts you when Hermes needs an approval, clarification, elevated-permission response, or secret, and again when the turn finishes. An action-required alert opens the exact conversation and request. Replayed events replace the existing alert, and the alert clears after you respond, the request expires, or the turn resumes.
Notification text never includes the command, question, secret prompt, or environment-variable name. Those details stay inside the authenticated chat surface, including on the lock screen. Toggle this behavior under Settings → Quick Controls → Chat alerts; Android asks for notification permission the first time.
Smooth auto-scroll
While a reply streams, the list follows new tokens, reasoning, and tool cards like a live transcript:
- At the bottom? New content scrolls into view automatically and stays pinned to the latest token, even as the bubble grows with reasoning and tool cards.
- Scrolled up to read history? Auto-follow pauses — you won't be yanked back.
- Want to resume? Scroll back to the bottom, or tap the floating arrow that appears when there's new content below.
Disable it under Settings → Chat → Smooth auto-scroll if you'd rather scroll manually. It's on by default.
Before the first answer text arrives, the conversation lane shows the working animation at full size with Still working… beneath it and no empty chat bubble around either. The status disappears as soon as reply text starts streaming; dropped-stream recovery uses Reconnecting to your answer… instead.
Markdown
Replies render with full markdown support:
- Bold and italic text
inline codeand fenced code blocks with syntax highlighting- Links, lists, blockquotes
- Tables and horizontal rules
Reasoning display
When the agent uses extended thinking, a quiet Thinking… disclosure opens above the reply while reasoning streams, then settles to a collapsed Thought row unless you explicitly chose its state. Toggle reasoning visibility under Settings → Chat → Show reasoning.
Copying messages
Long-press any message bubble to copy its text. Haptic feedback confirms the copy. (For your own messages, long-press also offers Edit & resend.)
Empty state
With no messages, the chat shows a logo, "Start a conversation," and suggestion chips. Tapping a chip populates the input field.
Agent sheet — profile + personality
Tap the agent name in the middle of the top bar to open the agent sheet — a scrollable bottom sheet for Profile selection, Personality selection, and session info + analytics for the current conversation (message count, tokens in/out, avg TTFT).
- Profile — upstream Hermes agent directories auto-discovered on the server. Selecting one overlays its model + SOUL for subsequent turns.
- Personality — system-prompt presets from
config.agent.personalities. The server default is shown first, then all configured alternatives.
Switching either shows a toast. The active personality name appears above assistant bubbles. You can also switch via /personality <name>.
Switching between running chats
When Chat is using the upstream Gateway connection, you can open another chat, profile, new draft, or Thread while Hermes is still working. The previous turn continues on the server instead of being stopped. Reopening that conversation reattaches its live reply, reasoning, tool state, and pending interaction card; if it finished while detached, the saved transcript is loaded instead. Multiple running chats keep separate recovery state across an app restart.
Tapping Stop still interrupts the visible turn. Servers using an SSE fallback cannot multiplex live chats, so switching there stops the current stream before opening the next conversation.
Connection chip
If you've paired more than one Hermes server, a Connection chip appears on the left of the top bar. Tap it to open a switcher listing all your connections with a health indicator. With a single connection, the chip is hidden. See Connections.
Token tracking
Each assistant message shows token usage below the timestamp:
- Input tokens sent
- Output tokens received
- Estimated cost
App context prompt
When enabled (Settings → Chat → App context prompt, on by default), Hermes-Relay tells the agent it's talking to a phone so replies stay mobile-friendly and concise, and can attach optional bridge/permission and safety-rail summaries. On the standard (API-server) connection this rides an invisible system message. The Gateway connection carries no app-context preamble — its protocol has no hidden per-turn slot, and adding one would leave the text in your saved chat history — so there the agent reads phone state on demand via the android_phone_status tool. Privacy-sensitive fields (foreground app, battery) default off and are only added when you opt in.
Persistent connection
By default the connection to Hermes is held open while Hermes-Relay is on screen and for a couple of minutes after you switch away, so a quick return is instant. A running Gateway chat keeps its event connection attached; if that connection drops, the app reconnects while the server continues working. Idle chats pre-warm when reopened so the next message is fast.
While any chat is running, Hermes-Relay automatically uses an ongoing Android notification to keep the app and its connection active until every concurrent turn finishes or is interrupted. If a turn needs approval, clarification, or sensitive input, its separate alert reopens the exact profile and conversation. Expanding that alert shows safe session context, but never the requested command, question, password, secret, or environment-variable name.
If you want the connection to stay fully open even when no chat is running, turn on Settings → Quick Controls → Persistent connection (off by default). It extends the same foreground protection to idle time via an ongoing notification, so messages and live features stay responsive; for relay-paired setups it also keeps device control and notification mirroring reachable. Tap Turn off always-on on the notification, or flip the toggle, to stop the idle retention without interrupting active work. This uses more battery; swiping the app away from recents also ends it. It's the same approach apps like Home Assistant use to stay connected.
Chat alerts and active-turn protection do not require Persistent connection. Enable it only when an idle connection or Relay-powered live features must remain reachable during long background or Doze periods.