Remote project new-thread composer no longer exposes New worktree

Resolved 💬 3 comments Opened Jun 15, 2026 by clamalo Closed Aug 3, 2026
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

What happened?

In Codex Desktop, when I start a new chat for a local project, the composer shows the run-location dropdown with options like:

  • Work locally
  • New worktree
  • Cloud

When I start a new chat for a remote project, that dropdown is no longer present. The composer only shows a branch dropdown. I do not see any way to create a new remote-project thread in a fresh worktree from the new-thread composer.

This is a serious regression for parallel-agent workflows. Without a visible New worktree / New remote worktree option for remote projects, multiple remote threads appear to target the same remote checkout/path, so agents working in parallel can overlap in the same repo.

Why this matters

Worktrees are the isolation mechanism that lets multiple agents work on the same repo concurrently. For remote projects, this is even more important because the user may be connecting to a single SSH host/project path and expect Codex to create separate worktrees per thread.

Right now the apparent choices are:

  1. Start another remote-project thread against the same checkout, risking collisions, or
  2. Manually create a remote worktree and add/open that path as a separate remote project.

That removes the main benefit of thread-level worktree creation.

Expected behavior

The remote-project new-thread composer should expose a way to start in a new worktree, equivalent to local projects. For example:

  • Work in current remote checkout
  • New remote worktree
  • Cloud, if supported/applicable

Starting a remote-project thread with New remote worktree should create a separate worktree on the remote host and bind the new thread to that path.

Actual behavior

For remote projects, the run-location dropdown is hidden and only the branch dropdown remains. I cannot find a visible path to create a remote worktree during thread creation.

Local source-code observations

I looked through the installed Codex app bundle and found code paths that suggest worktree creation is still explicit, not automatic:

  • threads-create-aB-XmjWR.js only creates a pending worktree when target.environment.type === "worktree"; otherwise it calls start-conversation directly with hostId, cwd, and workspaceRoots.
  • pending-worktree-conversation-CgQZkMum.js starts the conversation after the pending worktree is ready, using the created worktree path as cwd/workspaceRoots.
  • local-remote-dropdown-DnABqdXS.js still contains labels/logic for New remote worktree, but the remote-project new-thread surface appears not to mount/show that dropdown.
  • composer-DhWyK5QW.js appears to pass hideRunLocationDropdown in the remote-project new-thread flow, leaving only the branch selector visible.

So it does not look like “every remote thread is automatically a worktree”; it looks like direct remote threads are still possible and the UI no longer exposes the worktree path at creation time.

Related issues

  • Related/open: openai/codex#27736
  • Related/closed: openai/codex#27013

Environment

  • Codex Desktop app
  • Remote project connected over SSH/remote host
  • Observed in the new-chat/new-thread composer for a remote project

View original on GitHub ↗

3 Comments

github-actions[bot] contributor · 2 months ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #27013
  • #27736

Powered by Codex Action

clamalo · 2 months ago

Additional source-level traceback

I dug further through the installed desktop app bundle and found the likely UI gating path that hides the run-location dropdown for remote-project new-thread creation.

In composer-DhWyK5QW.js, the composer computes the footer prop like this:

Xc = O === `home` && !F,
Zc = V || fo === `~` && !Xc || Ke && !Xc || F && !Xc,
Qc = {
  ...,
  hideRunLocationDropdown: Zc,
  ...,
  remoteConfig: {
    currentHostId: pi,
    getProjectPathForHostId: e => jn?.hostId === e ? jn.remotePath : y?.hostId === e ? y.projectPath : null
  }
}

Readable version:

const isHomeException = variant === "home" && !hideRunLocationDropdownOverride;

const shouldHideRunLocationDropdown =
  isSideComposer ||
  (workspaceRootForSubmit === "~" && !isHomeException) ||
  (isProjectlessConversation && !isHomeException) ||
  (hideRunLocationDropdownOverride && !isHomeException);

The important part is that the selected remote project path is supplied separately through remoteConfig, but the dropdown visibility is decided by the generic local/projectless workspace-root state (fo, Ke, F). So the composer can know about a selected remote project for branch/project-path purposes, while still hiding the run-location dropdown because the generic footer logic thinks it is projectless / ~ / explicitly hidden.

Relevant surrounding values from the minified bundle:

Gn = Y_({
  sharedPrefillCwd: Un,
  locationPrefillCwd: Hn,
  localConversationCwd: Re,
  selectedRemoteProjectPath: jn?.remotePath ?? null,
  defaultCwd: b,
  workspaceRoots: Wn,
  activeWorkspaceRoot: On,
  codexHome: Nn,
  canUseProjectlessThreads: xt
});

Kn = Gn === `~`;
Ke = a(C, H) === `projectless`;
fo = li === `worktree` ? so : Gn;

The footer then receives hideRunLocationDropdown: Zc. In the external footer chunk, that becomes hideModeDropdown, and the local/remote/worktree dropdown is rendered with:

<LocalRemoteDropdown
  composerMode={r}
  setComposerMode={a}
  ...
  hideModeDropdown={L}
  allowWorktree={!V && !g}
  ...
/>

Separately, inside local-remote-dropdown-DnABqdXS.js, the effective worktree option gate is:

Me = J && ee && I

Where:

  • J means the current target has a git root
  • ee is the passed allowWorktree prop
  • I appears to be the relevant worktree feature/capability flag

The dropdown already has remote-aware labels:

K ? remoteWorktreeMode : worktreeMode
K ? remoteWorktreeTooltip : worktreeTooltip

So the problem does not appear to be missing remote-worktree UI strings or missing pending-worktree submit code. It looks like the remote-project new-thread composer is failing before that: the run-location dropdown is hidden by Zc, and/or allowWorktree is false in the footer path.

I locally verified this by creating a patched copy of the app and changing only:

- hideRunLocationDropdown: Zc
+ hideRunLocationDropdown: false

and:

- Me = J && ee && I
+ Me = J && I

That is not meant as a proposed production fix, just confirmation that the relevant UI gates are in this area. A proper fix should probably make the Zc/allowWorktree logic aware of selectedRemoteProjectPath / remoteConfig.currentHostId instead of treating the remote-project composer like the generic projectless case.

mike-meow · 2 months ago

This was an issue for me, seems to be fixed in the latest update