No completion notification for remote SSH Projects in Codex Desktop

Open 💬 2 comments Opened May 22, 2026 by haibochen496-sudo

What version of the Codex App are you using (From “About Codex” dialog)?

26.519.31651 (3017)

What subscription do you have?

pro

What platform is your computer?

Darwin 25.5.0 arm64 arm

What issue are you seeing?

In Codex Projects, when the project is developed on an Ubuntu machine through remote SSH, macOS does not receive a notification after a task finishes in the session. If the Project is local, the notification works correctly. Please fix this issue.

What steps can reproduce the bug?

  1. Open Codex Desktop on macOS.
  2. Open a Project that uses remote SSH to connect to an Ubuntu machine.
  3. Start a new session in that remote SSH Project.
  4. Ask Codex to run a short task, for example: "Reply with OK after finishing."
  5. Wait until the task completes.
  6. Observe that no macOS completion notification appears.
  7. Open a local Project in Codex Desktop.
  8. Start a new session and run the same short task.
  9. Observe that the macOS completion notification appears correctly for the local Project.

What is the expected behavior?

_No response_

Additional information

_No response_

View original on GitHub ↗

2 Comments

scosemicolon · 3 months ago

I took a quick look at the app-server side of this because the local-vs-remote split makes this look like a listener/notification propagation issue rather than a generic macOS notification permission problem.

The normal completion path appears to be:

  • EventMsg::TurnComplete is handled in codex-rs/app-server/src/bespoke_event_handling.rs
  • that path calls thread_watch_manager.note_turn_completed(...)
  • then handle_turn_complete(...) emits a ServerNotification::TurnCompleted

The useful diagnostic would be to compare a local project and a remote SSH project at that boundary:

  1. Does the remote SSH run emit EventMsg::TurnComplete from core?
  2. If yes, does the app-server listener for that remote project reach the TurnComplete arm?
  3. If yes, does the desktop client receive ServerNotification::TurnCompleted but skip the native macOS notification because the project/session is remote?

If the first two are true, this is probably a desktop/client-side notification routing condition. If the listener never sees the event, the bug is likely around attaching or preserving the app-server listener for remote SSH project threads.

JiehoonKwak · 3 months ago

I have similar regression. I instrumented the app-server boundary for a failing remote SSH thread and can confirm that the remote app-server does emit turn/completed.

Environment:

  • Codex Desktop: 26.527.31326
  • Remote app-server: 0.135.0
  • Remote config includes:
[desktop]
notifications-turn-mode = "always"

Diagnostic:
I connected directly to the remote host's app-server control socket:

~/.codex/app-server-control/app-server-control.sock

using a separate WebSocket client. The probe sent:

  1. initialize
  2. thread/resume
  3. turn/start

against the same remote SSH thread that does not produce native Desktop notifications.

Result:
The probe received a normal completion notification from the remote app-server:

{
  "method": "turn/completed",
  "params": {
    "threadId": "<remote-thread-id>",
    "turn": {
      "id": "<turn-id>",
      "status": "completed"
    }
  }
}

The remote session JSONL also contained both task_started and task_complete for the same turn.

So the remote core/app-server path appears to work:

EventMsg::TurnComplete
-> handle_turn_complete(...)
-> ServerNotification::TurnCompleted
-> turn/completed

However, Codex Desktop still does not show a native macOS notification for that remote SSH thread.

In local Desktop logs, local threads show the expected notification path:

[desktop-notifications] show turn-complete ...
[desktop-notifications] forward show kind=turn-complete ...
[desktop-notifications] show notification kind=turn-complete ...

For the failing remote SSH thread, those notification log entries are absent. I also saw Desktop-side errors like:

Turn not found for event conversationId=<remote-thread-id> turnId=<turn-id>

This suggests the issue is not macOS notification permissions and not remote app-server completion emission. It looks more likely to be in Codex Desktop's remote thread routing/subscription/state handling, or in the handoff from received remote turn/completed events to the native Desktop notification path.