Remote Control: hook-set sessionTitle never syncs to the RC session name (web/iOS keep hostname auto-names); /rename does sync — per-channel matrix
Preflight Checklist
- [x] I have searched existing issues. Closest: #64304 (Desktop↔mobile two title stores), #55951 (Desktop sidebar ignores hook sessionTitle), #62754 (programmatic display-name via hook/flag), #66981 (RC sessions indistinguishable), #47100/#34365 (RC name derived once from first message), #48092 (title precedence docs incomplete). None of them documents the CLI→web/iOS direction with a per-channel sync matrix, and #47100 assumes first-message derivation happens at all — in my testing it never does for CLI-registered RC sessions.
- [x] This is a single bug report.
- [x] Claude Code v2.1.173 (native, macOS), Max subscription OAuth.
What's wrong
A sessionTitle set by hooks (UserPromptSubmit or SessionStart hookSpecificOutput.sessionTitle) renames the session locally only (TUI header, /resume list). The Remote Control session entry on claude.ai/code and in the iOS app keeps the <hostname>-<word>-<word> auto-name forever. /rename from the same TUI session does sync to web/iOS within seconds — so a sync channel exists, hooks just don't use it.
The remote-control docs name precedence ("explicit name → title from /rename → meaningful message → auto-name") plus "the title updates to reflect your prompt once you send one" implies the session title store is shared. In practice the web/iOS name is written once at RC registration and afterwards only /rename can change it.
Systematic test (v2.1.173, fresh sessions via claude --remote-control in tmux, list observed on claude.ai/code)
| Channel | Reaches web/iOS name? |
|---|---|
| Auto-name at RC registration | ✅ (that's the problem) |
| CLAUDE_REMOTE_CONTROL_SESSION_NAME_PREFIX env | ✅ changes prefix |
| Explicit name: claude --remote-control "My name" | ✅ |
| /rename typed in the TUI | ✅ syncs in ~seconds |
| Hook sessionTitle via UserPromptSubmit (first prompt) | ❌ local only |
| Hook sessionTitle via SessionStart (set before RC registration completes) | ❌ local only, registration still uses auto-name |
| Server-side title from first user message (no hooks active, waited >5 min) | ❌ never updates |
| Clean /exit (does a final title sync happen?) | ❌ entry just disappears from Recents |
| claude --continue re-registration (session has a meaningful local title) | ❌ old server entry returns with its old auto-name; local title ignored |
The SessionStart row is the most surprising one: even a title set at startup — before the session has any history — does not become the RC registration name, while the docs' precedence list suggests a session title should outrank the auto-name.
Steps to reproduce
- Add a
SessionStart(orUserPromptSubmit) hook that emits{"hookSpecificOutput":{"hookEventName":"SessionStart","sessionTitle":"MEANINGFUL TITLE"}}. claude --remote-controlin any directory; confirm the TUI shows "MEANINGFUL TITLE" as the session title.- Open claude.ai/code (or the iOS app) → Recents: the session is listed as
<hostname>-<adjective>-<noun>and never changes, even after prompts. - Type
/rename Somethingin the same session → the web entry updates within seconds.
Expected
Either (a) hook-set sessionTitle uses the same sync path as /rename, or (b) the documented "title updates to reflect your prompt" works for CLI-registered RC sessions. With remoteControlAtStartup: true every interactive session registers before the first prompt, so today all of a user's sessions appear on iOS as <hostname>-shiny-piglet-style names and the only escape is manually typing /rename in every session.
Environment
- Claude Code 2.1.173, native install, macOS (darwin 25.5.0), zsh, tmux 3.6b
- Max subscription (OAuth),
remoteControlAtStartup: true
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗