How to Make Orca Codex Threads Appear in the ChatGPT App

Orca and ChatGPT logos connected by a data bridge

Orca was getting a lot of attention, so I gave it a try. It turned out to be genuinely useful for managing worktrees and terminal sessions in one place. Then I hit a deal-breaker: Codex threads created in Orca did not appear in the ChatGPT app. The reverse worked fine. Threads created in ChatGPT were visible when I launched Codex from Orca. For someone who wants the same setup everywhere, that asymmetry was a serious problem.

The cause was simple. Orca was using its own CODEX_HOME. Pointing it to the same directory as the ChatGPT app fixed the issue.

The solution is to set CODEX_HOME to ~/.codex for the Codex process that Orca launches.

env CODEX_HOME="$HOME/.codex" codex

There is one catch: putting this in .zshrc does not work.

The Problem

A Codex thread is represented by roughly two kinds of data:

  • sessions/.../rollout-*.jsonl: the actual conversation and execution events
  • state_5.sqlite: an index containing the thread ID, title, working directory, timestamps, and JSONL path

The ChatGPT app and a regular Codex CLI session use this directory by default:

~/.codex/
├── sessions/
└── state_5.sqlite

At the time, Orca forced Codex to use a separate managed directory:

~/Library/Application Support/orca/codex-runtime-home/home/
├── sessions/
└── state_5.sqlite

That split the thread storage into two independent paths:

Thread started in the ChatGPT app
└── ~/.codex

Thread started in Orca
└── ~/Library/Application Support/orca/codex-runtime-home/home

The ChatGPT app reads ~/.codex, so it could not display threads that existed only in Orca's managed directory. Orca, however, could import existing sessions from ~/.codex. That one-way import explained the odd behavior: ChatGPT threads were visible in Orca, but Orca threads were missing from ChatGPT.

Root Cause

Reading Orca's source revealed the following launch sequence:

  1. Orca prepares its own managed runtime home.
  2. It starts Codex with CODEX_HOME set to that directory.
  3. It reapplies the managed value after the shell starts.

That is why adding the following line to .zshrc is not enough:

export CODEX_HOME="$HOME/.codex"

The shell may load the value, but Orca overwrites it when launching Codex.

Symlinking only the sessions directory is not a complete fix either. The conversation body lives in JSONL files, but the thread list and metadata also live in state_5.sqlite. If the JSONL files and SQLite index point to different stores, a thread may exist on disk without appearing in the app.

The important part is to make Codex use the same CODEX_HOME as the ChatGPT app from the moment the process starts.

The Fix

Open the following setting in Orca:

Settings > Agents > Codex > Command

Replace the default codex command with:

env CODEX_HOME="$HOME/.codex" codex

Do not add this command to .zshrc. It belongs in Orca's Codex Command field as a command override.

New Codex threads started from Orca will now be written to:

~/.codex/sessions/
~/.codex/state_5.sqlite

Because the ChatGPT app reads the same store, those threads appear in its sidebar as well.

Existing Orca Threads Are Not Migrated Automatically

This setting changes where future threads are stored. Threads created before the change remain in Orca's managed store:

~/Library/Application Support/orca/codex-runtime-home/home/sessions/
~/Library/Application Support/orca/codex-runtime-home/home/state_5.sqlite

To make an existing Orca thread visible in ChatGPT, copy or hard-link its JSONL file into ~/.codex/sessions/, then migrate the matching threads row into ~/.codex/state_5.sqlite. Back up both databases first and move only the required row. Replacing the entire database can wipe out threads that already exist in ChatGPT.


Detours and Dead Ends

Why not just set CODEX_HOME in .zshrc?

My first attempt was:

export CODEX_HOME="$HOME/.codex"

It failed because Orca sets CODEX_HOME to its managed runtime home when Codex launches and reapplies that value after shell startup. Changing only the shell configuration is therefore not reliable.

What does “Codex home to import from” do?

This option does not change the home directory used by the Codex process. It performs a one-way import of existing sessions from ~/.codex/sessions into Orca's managed home.

That behavior explains the asymmetry: threads created in ChatGPT were visible in Orca, while threads created in Orca were invisible in ChatGPT.