Remote control: permission prompts not rendering on mobile app
Open 💬 18 comments Opened Mar 18, 2026 by GMedlin
Description
When using Claude Code via claude remote-control --name <session> and connecting from the mobile app, interactive permission prompts do not render on the mobile client. The session appears frozen/unresponsive from the mobile side, while the desktop terminal shows the prompt waiting for input.
Affected prompts
EnterPlanModeconfirmationExitPlanModeapprovalAskUserQuestion(unconfirmed — may also be affected)
Steps to reproduce
- Start a named remote control session:
claude remote-control --name test-session - Connect to the session from the mobile app
- Trigger a plan mode entry (e.g., ask Claude to plan a multi-step implementation)
- Observe: the mobile app shows no permission prompt; session appears hung
- Check the desktop terminal: permission prompt is visible and waiting for input
Expected behavior
Permission prompts should render on the mobile app the same way they render on the desktop terminal.
Environment
- Claude Code v2.1.77
- Windows 11 Pro
- Remote control sessions with
--permission-mode bypassPermissions - Mobile app (latest version)
Notes
- Regular text output renders fine on mobile — only interactive permission widgets are affected
- The mobile app has a full UI with plan mode and code mode, so this appears to be a rendering gap for the specific permission confirmation widget, not a general mobile limitation
18 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
Additional finding: bug is specific to
/configRC toggleTested both RC activation methods:
claude remote-control --name <session>) — permission prompts render correctly on mobile/configtoggle — permission prompts do NOT render on mobileThis suggests the bug is in the
/configRC code path specifically, not the mobile RC client in general. The dedicatedclaude remote-controlcommand handles permission widget rendering correctly on mobile; the interactive-session-with-RC-enabled path does not.Workaround: use dedicated
claude remote-control --name <session>sessions instead of the/configRC toggle.Seeing this too
Still reproducible on v2.1.86
Retested today (2026-03-28) using the
/config"Enable Remote Control for all sessions" toggle set totrue. Connected from mobile app.EnterPlanMode— not a permission prompt, so no rendering expected (transitions automatically)ExitPlanModeapproval prompt — did not render on mobile; had to approve from desktop terminalThe dedicated
claude remote-control --name <session>workaround from my earlier comment still works. Bug remains specific to the/configRC code path.Still happening in 2.1.90 with permission prompts.
Additional repro — file write permission prompts also not shown on mobile (Windows 11, v2.1.113)
Hitting this with file write permission prompts (not just plan mode), on Windows 11 with Claude Code v2.1.113.
Scenario:
--agentsessions running on desktop (e.g.[W2 5min agent],[ram-safety-auditor]).claude/plans/BEACH_LEDGER.md)plans/from this project 3. No"What this means in practice:
Both agents were simultaneously hung waiting for permission approval. Only way to unblock them was opening Google Remote Desktop on the same iOS device and manually clicking through each terminal tab to find the pending prompts.
This confirms the issue affects all interactive permission widget types, not just EnterPlanMode/ExitPlanMode. Specifically confirmed affected:
plans/,settings.json, etc.)Request: Please add
area:permissionslabel and note that this affects any interactive blocking permission widget, not just plan mode. The mobile app appears to render agent text output fine but has no mechanism to surface terminal-blocking prompts to the mobile UI.Environment: Windows 11 Pro, Claude Code v2.1.113, Claude iOS app (latest), named
--agentsessions via Remote Control.Same issue here. When using Agent Teams (TeamCreate + tmux teammate mode), if a teammate hits a permission prompt (e.g. editing files under
.claude/), the approval dialog renders only in the terminal UI — it never appears in the mobile remote app.Reproduction:
TeamCreate, spawn teammates viaAgentwithmode: "dontAsk"Edita file under.claude/(which requires approval even inbypassPermissionsmode)Root cause: The permission dialog is a terminal-only UI element that is not recorded in the JSONL conversation data. The mobile remote app renders from conversation data, so it has nothing to display.
Impact: Any workflow using Agent Teams is unusable from mobile. Teammates get stuck waiting for approval indefinitely, with no way for the user to respond from the phone.
Related: #41999, #43187
Follow-up to my v2.1.113 comment — still reproducible on v2.1.120 with Bash compound commands
Same setup (Windows 11, mobile Remote Control via iOS app), now on Claude Code v2.1.120. The bug is unchanged.
New trigger pattern: compound Bash command —
sleep 3 && wmic process where "name='python.exe'" get processid,commandlineBash(wmic:*)andBash(wmic process:*)were both in~/.claude/settings.local.jsonallow list. The compound starting withsleep(which I had not pre-allowed) didn't match either, so the prompt fired on the desktop CLI.Mobile UI: "Running shell command" with the spinner active. No prompt. No actionable widget. Looked exactly like the agent was working.
Reality: agent had been blocked for ~30s waiting for input. Only discovered it by switching to Chrome Remote Desktop, opening the corresponding desktop window, and seeing the prompt sitting there.
This extends the affected-prompt list from my prior comment:
plans/,settings.json) — my v2.1.113 comment.claude/from Agent Team teammates — @hirokimry@hirokimry's root cause analysis (mobile renders from JSONL, permission widgets are terminal-only UI elements) explains why every prompt type is affected.
Asks (re-upping from prior comments):
area:permissionslabelpriority:high— mobile Remote Control is non-functional for any workflow that produces unallowed prompts, which is almost every non-trivial workflowThe pattern across this thread: 6+ users, 8+ months, 9+ Claude Code versions, multiple prompt types, root cause known. The mobile Remote Control surface as currently shipped only supports view-only / status-checking. Until permission widgets render on mobile, anything that pitches mobile RC as "interact with your agent from anywhere" is misleading.
Happening with me too. Hope this gets fixed soon.
The important distinction here is transcript rendering vs blocking prompt rendering.
If the mobile surface is mostly rendering conversation/JSONL state, but the permission widget only exists as terminal-local UI, the remote client has no way to know that the host is waiting on a decision. That turns a recoverable prompt into a silent spinner.
The remote-control protocol probably needs typed prompt events, not just transcript sync: prompt id, source session/pane, tool/action, available choices, current state, and whether the prompt has been resolved locally or remotely. If the prompt cannot be rendered on mobile, the app should at least show
blocked_on_terminal_promptinstead of looking like the agent is still running.Mobile "Approve plan" button sends an unqualified approval that defaults to permission-prompt mode, ignoring
defaultMode: "auto"in settings.json.Repro steps:
defaultMode: "auto"in settings.jsonExpected: Mobile "Approve plan" should respect
defaultModesetting, or offer mode selection equivalent to the desktop's option 1 ("Yes, and use auto mode") / option 2 ("Yes, manually approve edits").Settings already configured (not working):
Additional finding: Tested with
--dangerously-skip-permissions+skipDangerousModePermissionPrompt: true— the bypass permission prompt still appears and still requires manual desktop confirmation. Skip flags insettings.jsonappear to not be applied by the Remote Control daemon at all.Platform: Windows 11, Claude Code mobile app (iOS), Remote Control feature
Seeing the same issue on Ubuntu 24 and Claude App on Android. So this is not platform specific.
Possibly related, but I think a distinct failure mode — flagging for triage clustering rather than as a "+1".
In my case (#64983) the permission prompts do render and work normally; they only become unresponsive around usage-limit-reached, and it happens on both the mobile app and Claude Desktop (Linux, v2.1.159) — not just mobile rendering. There's also a Ctrl+C-in-terminal recovery that sometimes unblocks the session, which points more at a blocked/waiting state than a pure render gap.
Sharing in case the usage-limit trigger and the Ctrl+C recovery help separate "prompt never renders" from "prompt renders but goes unresponsive at the limit."
Adding a Linux-host data point with a precise trigger and the resulting deadlock.
Setup: a
claudesession on a remote Linux host, driven from the iOS app with the laptop fully closed (0 SSH connections — verified). Claude Code 2.1.173.Trigger: the assistant called the
Edittool on a file outside the workspace (its own~/.claude/projects/<project>/memory/<file>.md, while cwd was the project).acceptEditsdid not cover that path, so a permission request was generated — and the mobile app never rendered any approval UI. The turn hung silently.Timeline (session transcript, UTC):
The relay itself was healthy the whole time: the STOP and a follow-up message both reached the host with the laptop offline. So the only failure was the un-surfaced permission prompt → indefinite hang.
Workaround: pre-authorising the out-of-workspace paths in
settings.json(e.g."Edit(//home/<user>/.claude/**)") avoids the prompt entirely and removes the deadlock.Suggestion: a pending approval that the driving client cannot render should at least time out with a clear error instead of hanging the turn silently.
The useful boundary here is not just mobile rendering. It is prompt-state ownership.
A remote client can render transcript text while still missing a blocking prompt if the prompt only exists as terminal-local UI. For approval prompts, the remote-control path probably needs a first-class prompt lifecycle event rather than relying on transcript sync.
The event I would want has:
Then the behavior can be explicit:
blocked_on_other_surfacerather than a spinner.prompt_unavailable.The regression matrix should cover plan prompts, file edit prompts, shell/tool prompts, MCP tool prompts, and delegated child or teammate sessions. Those may look like different bugs, but the failure invariant is the same: a consequential call is waiting on a user decision that the active control surface cannot see.
That would turn "the agent is still running" into an auditable prompt lifecycle: pending, visible where, resolved by whom, or failed closed because no approval surface was available.
Confirming this still reproduces as of v2.1.17x (macOS, iOS app) — and it extends beyond plan-mode widgets to Agent Teams teammate edit-permission prompts, which is worth adding to the "Affected prompts" list.
Repro (Agent Teams):
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 claude), monitoring from the iOS app.Same root symptom as the original report — the interactive permission widget doesn't render on mobile, so the session is indistinguishable from a true hang, while regular text output renders fine. It's especially painful for Agent Teams: a multi-teammate run queues several permission prompts at once, all invisible from mobile, so there's no way to tell a "waiting for approval" state from a real teammate hang without checking the terminal.
Confirming this on Windows 11 — and it affects all interactive widgets, not just permission prompts.
Same root behaviour as reported here: when driving a CLI session from the mobile app via Remote Control, interactive widgets originating from the CLI fail to render on the mobile client. Plain text output streams fine; only the interactive widgets break. The CLI sits waiting for input that the phone can never provide, so the session is effectively dead-locked until I walk back to the PC and answer it locally. This happens on almost every session, which makes Remote Control unusable from mobile for any real work.
It is not limited to permission prompts — the same failure hits every interactive widget I've encountered:
So this looks like a single underlying gap — the mobile client has no rendering path for CLI-originated interactive widgets in general — rather than a per-widget bug. The related reports are currently split across several issues:
Environment
Impact: there is no remote unstick — the only recovery is local Esc at the PC, which defeats the entire purpose of Remote Control on mobile.
This problem is present for multiple months now and it doesn't seem to be that hard to fix. It makes remote control a useless functionality and it's a critical bug as it practically emerges all the time.
The newer Agent Teams and Windows reports make this look broader than mobile permission-prompt rendering.
I would separate two success conditions:
Right now those can diverge. Text can stream correctly while the actual prompt only exists as CLI-local UI, so the user sees activity or a spinner while the host is waiting for input.
The durable object I would want is a blocking prompt record created before renderer-specific display:
Then mobile, desktop, terminal, and teammate panes are renderers of the same prompt state. If a client cannot render a specific widget yet, it can still show that the run is blocked on an unsupported prompt instead of looking idle.
The regression cases I would pin from the newer reports:
That keeps this from becoming a per-widget patch list. The contract is: if a prompt can block progress, every active control surface must know whether it is pending, visible, unsupported, resolved, or failed closed.