Guide

Codex notifications on Mac

Updated July 2026 6 min read

Codex fires a signal every time the agent finishes a turn and hands back to you. On macOS you can surface that three ways: the built-in terminal notification (a real desktop banner only in Ghostty, iTerm2, Kitty, Warp, and WezTerm — a bell everywhere else), a DIY notify script that runs in any terminal, or a notch monitor that also clicks you back to the exact terminal, or the right thread if you use the Codex desktop app. Here is how each one works, and when each is enough.

When Codex notifies you

Codex emits a signal at the moment that matters during a long run: when the agent finishes a turn — that is, when it is done processing your submission and waiting on you again. Its built-in terminal notifications can also fire when Codex pauses for an approval. The question is never whether the signal exists, but whether it actually reaches you once you have tabbed away to do something else. The three methods below are just different ways to catch it.

Method 1: the built-in notification

Codex ships with terminal notifications on. But whether one becomes a real macOS banner depends on your terminal. In Ghostty, iTerm2, Kitty, Warp, and WezTerm, Codex posts a desktop notification when a turn finishes. In every other terminal, including Apple Terminal and the VS Code integrated terminal, it falls back to the terminal bell — audible, but no banner. It also fires only while that terminal is unfocused by default.

The setting lives under [tui] in ~/.codex/config.toml. It is on by default; this is how you would set it explicitly, or flip it to false to silence it:

[tui]
notifications = true

You can also scope it to specific moments by passing an array instead of a boolean — for example notifications = ["agent-turn-complete"] for completion only, or add "approval-requested" to include approval pauses.

The catch

The built-in path gives you a bare banner or a bell. It cannot play a custom sound, the banner is not clickable to anywhere useful, and in any terminal outside the five above all you get is the bell. If a long run spans several terminal windows, "which one just finished?" is still a manual hunt.

Method 2: a DIY notify script

For a real notification in any terminal, Codex can run a program every time it finishes a turn. Point the top-level notify key in ~/.codex/config.toml at your script; Codex appends one argument containing a JSON payload that describes the turn:

notify = ["python3", "/Users/you/.codex/notify.py"]

Then a small script turns that payload into a macOS notification. This one uses osascript, which is built into macOS, so there is nothing to install:

#!/usr/bin/env python3
import json
import subprocess
import sys

payload = json.loads(sys.argv[1]) if len(sys.argv) > 1 else {}
if payload.get("type") == "agent-turn-complete":
    message = payload.get("last-assistant-message") or "Turn complete"
    subprocess.run([
        "osascript",
        "-e",
        f'display notification {json.dumps(message)} with title "Codex"',
    ])

The payload Codex passes carries the turn type, the input-messages you sent, and the last-assistant-message the agent ended on — so you can drop the agent's final line straight into the banner, as above.

Gotcha most guides miss

osascript posts through the built-in Script Editor app. If Script Editor does not have notification permission, the command fails silently and macOS never prompts you. Run osascript -e 'display notification "test"' once in Terminal, then open System Settings, Notifications, find Script Editor, and turn on Allow Notifications.

Want a sound too? Add a line that runs afplay /System/Library/Sounds/Glass.aiff. Want a richer, clickable banner? Run brew install terminal-notifier and call terminal-notifier -title "Codex" -message "Turn complete" -sound default instead.

This is genuinely enough if you run one agent in one terminal and just want a ping when it stops. Be honest about the ceiling, though: it fires on every completed turn, and it is still a plain notification. It tells you a turn ended, not which session, and clicking it can at best raise an app, never the exact terminal tab or the right Codex thread. And you own the upkeep, the config, the script, the Script Editor permission, on every Mac you work from.

Method 3: alerts that jump you back

Vibe Island turns your Mac's notch into a live monitor for every Codex session. When a task finishes or Codex needs your input, the notch surfaces it, with a sound if you want one, and one click takes you straight back — to the exact terminal window, tab, or split for a CLI session, or to the matching thread in the Codex desktop app. There is no config file to edit and no permission to grant: it configures itself the first time you launch it.

Vibe Island FileEditWindowHelp
fix auth bug 3
fix auth bug ClaudeiTerm 27m
You: fix the auth bug in middleware
Writing middleware.ts
backend server
CodexTerminal1h
optimize queries
GeminiGhostty5h
Permission Request
Edit src/auth/middleware.ts
12const verify = (token) =>
13-  jwt.verify(token);
13+  if (!token) throw new
14+   AuthError('missing');
15+  return jwt.verify(token,
+3 -1
Claude asks
Which deployment target?
fix auth bug ClaudeiTerm 28m
You: fix the auth bug in middleware
Done — click to jump
backend server
CodexTerminal1h
optimize queries
GeminiGhostty5h
Approved
gemini — optimize-queries
Analyzing the slow queries.
Read(schema.prisma)
└── 1.2 KB
Edit(src/db/queries.ts)
└── Updated (+8 -23)
codex — backend-server
Building the REST endpoints.
Write(src/routes/users.ts)
└── New file (47 lines)
Bash(npm test)
└── 3 passed
claude — fix-auth-bug
Let me look at the auth module.
Searching for 6 patterns… (ctrl+o to expand)
Read 2 files (ctrl+o to expand)
 
Found the issue — token validation skips expiry check.
Terminal
Vibe Island
Every agent. One glance.
Claude Code, Codex, Gemini CLI, and Cursor — all in a single view.

Two things the DIY paths cannot do:

Land you on the exact session. A plain notification cannot route you anywhere. Vibe Island opens the precise terminal tab for a CLI session, or the exact thread for a desktop-app session, so you never have to hunt for where Codex was running.

Watch every terminal and agent at once. The same panel covers 13+ terminals and every agent you run, so you are never guessing which window finished, and one setup replaces a per-terminal, per-machine pile of scripts.

Which method should you use

01

The built-in bell or banner

Best if you run Codex in Ghostty, iTerm2, Kitty, Warp, or WezTerm, work in a single window, and only need to know a turn finished. Zero install, but in any other terminal it is only a bell.

02

A DIY notify script

Best if you are comfortable editing config and want a real notification (or a sound) in a terminal the built-in path only bells. Enough for one agent in one terminal, as long as you do not mind maintaining it.

03

A notch monitor

Best if you run long tasks, juggle more than one terminal or agent, or want one click back to the exact terminal tab or desktop thread. It trades a one-time download for zero ongoing setup, and it is the only option that routes you to the right session.

Common questions

Does Codex notify me when it finishes?

Yes. Codex fires a signal every time the agent finishes a turn — when it is done processing your request and handing back to you. The built-in setting turns that into a desktop banner in a handful of terminals (Ghostty, iTerm2, Kitty, Warp, and WezTerm) and a bell everywhere else; a notify script turns it into a banner in any terminal; and a notch monitor like Vibe Island shows it and clicks you back to the session.

Why am I not getting Codex notifications on my Mac?

Two causes are common. First, the built-in notification only becomes a real desktop banner in Ghostty, iTerm2, Kitty, Warp, and WezTerm; in Apple Terminal, the VS Code integrated terminal, and others it falls back to the terminal bell with no banner. Second, if you wrote a notify script that calls osascript, the banner is posted through the built-in Script Editor app, which fails silently until you grant it notification permission in System Settings. Note too that the built-in notification only fires while that terminal is unfocused by default.

Do notifications work with the Codex desktop app as well as the CLI?

The built-in setting and the notify script are CLI options in your config file, so they apply when you run codex in a terminal. A notch monitor covers both surfaces: it tracks CLI sessions and desktop-app sessions in one panel, and clicking a finished session takes you to the exact terminal tab for a CLI session, or straight to the matching thread in the desktop app.

Can I get a sound with a Codex notification?

Yes. In a notify script, add a command that runs afplay on a system sound, such as afplay /System/Library/Sounds/Glass.aiff, or install terminal-notifier and pass -sound default. The built-in path can only ring the terminal bell. A notch monitor like Vibe Island plays a completion sound with nothing to configure.

One notch for every agent, not just Codex

Notifications are one part of it. Vibe Island watches Codex alongside every other agent you run: Claude Code, ZCode, Gemini CLI, Antigravity CLI, Cursor Agent, Trae, OpenCode, MiMoCode, Factory Droid, Qoder, Qwen, Grok Build, Kimi Code, DeepSeek, Mistral Vibe, Copilot, CodeBuddy, WorkBuddy, Kiro, Hermes, Amp, Pi Agent, Oh My Pi, and Gajae Code. It surfaces completion and status in a single notch, and clicks you back to the exact session every time. See the AI coding session monitor, start with Codex monitoring, or read how it tracks several agents at once.

Vibe Island app icon

Vibe Island · macOS 14+

Never miss a Codex task finishing on your Mac

Download Free Trial

2-day free trial · all features included · no card required