Codex is not stuck.
It is waiting on you.
Pushary sends a push notification when Codex finishes or needs your permission, and lets you approve from your phone in one tap.
Codex tells your notify script when a turn ends, never when a command is blocked on your approval. Pushary sends that moment to your phone and holds the call until you answer.
One command
npx pushary@latest setupPick Codex when prompted. Enforced approvals need Codex 0.122 or newer.
Why do I get no Codex notification when it is waiting for my approval?
The program you set in Codex's notify config receives exactly one event, agent-turn-complete, so it fires when a turn ends and never when a command is blocked on your approval. Codex's own approval-requested alert, set in the [tui] table, rings the terminal bell or raises a desktop banner, so it stays at your computer and does not reach your phone. Pushary gates through Codex's PreToolUse and PermissionRequest hooks instead, so on Codex 0.122 or newer the pending command goes to your phone and waits for your answer. The hooks cover shell commands and apply_patch edits, which is most of what an agent does, but not every tool path.
Updated
Building an AI product for other people? Let your users approve what your agent does, from their phone. See the Partner plan or the human-in-the-loop API.
Why your notify script stays quiet
The legacy notify handler receives one event, agent-turn-complete. An approval request is not that event, so the moment you need to know about never leaves the machine.
Every way to get Codex notifications
For a finished-turn sound, start with built-in terminal notifications. For a waiting approval, enable approval-requested; a legacy notify script only reports completed turns. For visible sessions at your Mac, use a notch app. For phone access, compare the native remote workflow with Pushary and check whether you need an alert or an answerable decision. The methods below explain the setup and limits.
1. Built-in terminal notifications
FreeA banner or a ding when a turn ends or an approval is waiting
The [tui] table in ~/.codex/config.toml controls Codex's own alerts. List agent-turn-complete for a finished turn and approval-requested for a command waiting on you. With notification_method set to auto, Codex posts a desktop banner in terminals that support OSC 9, such as iTerm2 and Ghostty, and rings the bell everywhere else. Set it to bel if you just want a ding. notification_condition decides when it fires: unfocused only while the window is in the background, always every time. It all stays at your computer, so it cannot reach you once you walk away.
[tui]
notifications = ["agent-turn-complete", "approval-requested"]
notification_method = "bel"
notification_condition = "always"2. A notify script, with ntfy for your phone
FreeRuns your own program when a turn ends
The top-level notify key runs any program you name and passes it one JSON argument with type, thread-id, turn-id, cwd, input-messages and last-assistant-message. Point it at curl and ntfy.sh and your phone gets a push for free. Two limits. It only fires for agent-turn-complete, never for an approval, so a blocked command stays silent. And it is one-way: you still walk back to the terminal to answer.
notify = ["bash", "-lc", "curl -s -d 'Codex finished' ntfy.sh/your-topic"]3. The ChatGPT app, through Codex Remote
Your ChatGPT planFor Codex inside the ChatGPT desktop app
If you run Codex in the ChatGPT desktop app on a Mac or Windows PC, Codex Remote connects it to the ChatGPT app on your phone. You can follow a task, send new instructions, and approve or deny the actions it asks for. OpenAI's setup starts from the desktop app, and both devices have to stay awake and online. The Codex CLI gets there only partly: its reference lists an experimental codex remote-control command, where codex remote-control start runs a local app-server daemon with remote control on and codex remote-control pair prints a short-lived pairing code for the ChatGPT app. It only reaches the session while that daemon keeps running, and the IDE extension is not covered.
4. Pushary: push plus approvals from your phone
$9.99/moFor the Codex CLI, in any terminal
One command installs Codex's PermissionRequest and PreToolUse hooks and connects Codex over MCP. Walk away. Your phone buzzes when a turn ends, and when a command is waiting on you the push shows the command itself. Tap yes or no on the lock screen and Codex carries on. At your desk, the Pushary Mac app shows the same question in the notch. One policy decides which commands need you, so safe ones clear on their own, and every answer lands in an audit trail. Claude Code, Cursor and Gemini CLI go in the same app.
npx pushary@latest setupHow the options compare
| Method | Reaches your phone | Answer from the notification | Price |
|---|---|---|---|
| Built-in terminal notifications | Free | ||
| A notify script, with ntfy for your phone | Free | ||
| The ChatGPT app, through Codex Remote | Your ChatGPT plan | ||
| Pushary: push plus approvals from your phone | $9.99/mo |
Stop watching Codex spin. Start getting notified.
One command. Your phone buzzes when Codex is done.
Start your trial$9.99/mo after a 3-day free trial. Cancel anytime.
Codex notification questions
How do I get notifications when Codex finishes?
Run npx pushary@latest setup and pick Codex. It connects Codex over MCP and installs native hooks, so your phone is notified when a task completes.
Can Codex ask me to approve a command from my phone?
Yes. On Codex 0.122 or newer, Pushary installs hooks that route risky shell and file-edit approvals to your phone. You tap yes or no and Codex continues.
Does this need a specific Codex version?
Enforced approvals need Codex 0.122 or newer. On older versions you still get notifications through the legacy notify handler, without the policy engine.
Is the approval gate airtight?
Treat it as a strong guardrail, not a security boundary. Codex hooks cover shell commands and apply_patch edits, which is most of what an agent does, but not every tool path.
Does Pushary answer Codex's questions, or gate its commands?
Commands, and the line between them is worth being exact about. Pushary gates the approval path, pre_tool_use and permission_request, where a command is held until your answer comes back and no timer is running against you. Codex's separate request_user_input overlay is the one that resolves itself after 60 seconds (openai/codex#28969, open, 199 reactions), and no hook can answer it today: the updatedInput field that would carry a reply is marked reserved in Codex's own hook schema, and a hook that sends it fails closed. If that opens up, this is the first place it lands.
Codex keeps asking about commands I already approved. Why?
Approvals that look like they should persist often do not, and repeated prompts despite auto-approve settings is a long-running open issue (openai/codex#10187). Pushary's policy engine matches on the command itself, so a rule you write once auto-clears the safe calls and only what falls outside it reaches your phone.
How do I make Codex ding when it needs my approval?
Add approval-requested to notifications in the [tui] table of ~/.codex/config.toml and set notification_method to bel. Codex then rings the terminal bell when a command is waiting on you, not only when a turn ends. Set notification_condition to always if you want the ding while the window has focus too. The bell only reaches you at the computer. For the same alert on your phone, with yes and no buttons, run npx pushary@latest setup and pick Codex.
Codex is stuck on Awaiting approval. What should I check?
First, open the original Codex session and check whether a command is waiting for your decision. If the request is visible but you missed the alert, add approval-requested to notifications in the [tui] table of ~/.codex/config.toml; notify only reports completed turns. If no request is visible, inspect the host UI and session status before retrying: a missing or stale approval screen is different from a missed notification. If the host denied the command, follow its stated restriction. Pushary cannot override it. For a supported Pushary approval that did not reach you, run npx pushary@latest doctor and check delivery. A phone answer only resumes the action held by that integration.
What if Codex says Awaiting approval but shows no approval button?
Return to the session that started the action and check for a pending host dialog. Check your Codex version and its current issue tracker if the UI is still missing. Avoid starting the same action again until you know whether it ran. Pushary can deliver supported approval requests; it cannot repair a missing host dialog or turn a denial into permission.
Does the ChatGPT app send Codex notifications to my phone?
For Codex in the ChatGPT desktop app, yes. Codex Remote links it to the ChatGPT app on your phone, where you can follow the task and approve its requests. The Codex CLI is covered only partly. OpenAI's Remote page says mobile setup starts from the desktop app, and the CLI reference lists an experimental codex remote-control command: codex remote-control start runs a local app-server daemon with remote control on, and codex remote-control pair prints a short-lived pairing code for the ChatGPT app. The CLI's notify script only runs your own program when a turn ends. Pushary fills that gap: it hooks the CLI directly, so finished turns and waiting commands both reach your phone.
How much does Pushary cost?
Paid agent plans start with a 3-day trial at $9.99 per month, including 5,000 notifications per month.
Guides
Stay in control
Compare
Also works with