Stop “waiting for approval”: fix permission prompts in Claude Code, Codex, and OpenCode (without going full YOLO)

A practical way to identify whether you’re blocked on a real approval, a config mismatch, or a UI/connection issue — and how to keep sessions moving safely.

Based on
CLI
0.1.0
Preview ref
f36aa45

The most expensive way to lose time with Claude Code, Codex, or OpenCode isn’t a crash.

It’s this:

You start a session, it’s working, you step away… and when you come back it says some version of:

  • “waiting for approval”
  • “needs permission”
  • “waiting for input”

If you’re sitting at your terminal, it’s usually a 5‑second choice.

From your phone (or after you’ve forgotten what it was doing), it’s easy to either:

  • approve something you didn’t mean to approve, or
  • do nothing for an hour because you didn’t notice

I wrote this guide for the middle ground I actually want:

keep sessions moving without turning approvals into “full YOLO”.

TL;DR

  1. First decide what kind of “approval” you’re dealing with:
    • a real permission prompt (expected)
    • a config not applying issue (common)
    • a UI/connection issue (also common)
  2. If you’re using Codex, sanity-check your approval config layering and project trust.
  3. If you’re on a phone, the safest workflow is: open the session in a UI that shows the request in context before you approve.
  4. Happier is one option that helps because approvals/permission requests are durable (Inbox) and notification taps deep-link to the correct session/server.

The problem (in plain language)

Approvals are a safety boundary.

The pain isn’t “approvals exist.” The pain is when approvals become:

  • invisible (you didn’t notice)
  • ambiguous (you’re not sure what you’re approving)
  • inconsistent (you changed config, but it still asks)

And those three problems get worse on a phone.

What I tried first (and where I bounced off)

  • Turn everything off (YOLO / “never ask”): fast, but I don’t trust myself with it when I’m tired.
  • Stay at the terminal until it’s done: safe, but it defeats the point of running longer sessions.
  • SSH from my phone: works, but approvals are the worst thing to review in a tiny terminal.

Happier is one of the options I use when I want approvals to be explicit and reviewable from my phone.

If you’re new to Happier (what it is, and where to get it)

If you haven’t seen Happier before: it’s an open-source companion app (mobile/web/desktop) for sessions like Claude Code, Codex, and OpenCode.

The workflow is: keep the session running on a machine you trust, and use Happier from your phone to review approvals in context.

Get set up:

Step 1: classify the “approval”

Case A: it’s a real permission prompt

This is the healthy case: the session wants to do something with side effects.

If you’re using Happier, permission modes exist specifically to control how often you’re asked:

  • Default
  • Read-only
  • Safe YOLO (auto-allow reads; prompt before writes)
  • YOLO (skip as much as the provider allows)

Not every provider supports every mode; Happier shows the effective policy.

Case B: your config is not applying (Codex is the common example)

Codex has a real config layering model.

If you changed something and nothing happened, the usual culprits are:

  • you edited the wrong config file location
  • the setting is being overridden by a higher-precedence layer
  • the project config isn’t being loaded because the project isn’t trusted
  • your org policy is enforcing constraints

In Codex’s docs, this shows up as:

  • user config at ~/.codex/config.toml
  • project-level config and “trust” gating
  • knobs like approval_policy and sandbox_mode

A big tell: if you see people posting configs that say “never ask” and it still asks, you’re not crazy — there are environment-specific bugs that look exactly like that.

Case C: the UI is fine but you’re disconnected

Sometimes the session is waiting, but you’re looking at a stale stream.

If the machine slept or you switched networks, you can end up in a state where:

  • the session is blocked
  • but you don’t see the prompt

In that case, your “fix” is reconnection + opening the right session route.

Step 2: choose a workflow that matches the risk

A rule I use:

  • If I’m about to approve something with real side effects (writes/installs), I want to see:
    • what it’s doing
    • where it’s doing it
    • what changed recently

That’s why a phone-friendly UI matters.

The Happier workflow (when you want approvals to be explicit)

Happier treats “things that need your attention” as real data:

  • a global Inbox
  • approval requests
  • permission requests
  • user-action requests (like “Exit Plan Mode”)

This matters because it survives navigation. It’s not a modal you missed.

On mobile, notification routing is also strict:

  • it deep-links to the correct session
  • and it avoids auto-approving on unknown servers

Troubleshooting

I set approval_policy = "never" and it still asks

Treat this as one of:

  • trust/config layering mismatch
  • environment-specific client bug

Try:

  • confirm which config layer is being loaded
  • test the same session in a different environment (WSL/VM)
  • update the tool (these issues often get fixed quietly)

I’m not seeing prompts on my phone

This is usually:

  • notification routing/server profile mismatch, or
  • you’re not opening the session that actually has the prompt

Use a single “attention list” surface (Inbox) rather than scanning multiple sessions.

mobilepermissionsapprovalsclaudecodexopencodetroubleshooting
Last updated: 2026-04-03