Codex Desktop: add project management for registering projects and moving threads between projects
Feature request
Codex Desktop should provide first-class project management capabilities, especially:
- Register/add an existing local folder as a saved project from the sidebar or command palette.
- Move an existing thread from one project to another.
- Change a thread's project binding after creation.
- Expose the same capability through the app-server / thread management API so agents can create threads under the correct project reliably.
Current behavior
At the moment, a thread can only be created under a project if that folder already exists in the Desktop saved project list.
If a local folder is not yet registered as a saved project, background thread creation fails with Unknown projectId. The workaround is to create a thread under a parent workspace and tell the agent to cd into the desired subfolder, but the thread still appears under the wrong project in the Desktop sidebar.
There also appears to be no safe way to move that thread into the correct project afterward. The available thread tools support creating, renaming, sending messages, pinning, and archiving threads, but not changing the project binding.
Why this matters
For project-heavy workflows, especially legal/patent/client work, each matter is organized as its own local folder. Users often create the folder first and then need Codex to create a visible project thread for that exact folder.
If the thread is placed under the parent workspace instead:
- the sidebar becomes confusing;
- later retrieval is harder;
- project-specific context/rules may not be obvious;
- handoffs between threads become unreliable;
- users are tempted to edit internal SQLite/JSON state, which is risky and should not be necessary.
Requested behavior
Please add a supported UI and API flow for project management:
Add existing folder as projectMove thread to projectChange thread projectList saved projects- optionally
Create project from local path
Ideally, the app-server API could support something like:
{
"method": "project/create",
"params": {
"path": "E:\\...\\ProjectFolder"
}
}
and/or:
{
"method": "thread/project/set",
"params": {
"threadId": "...",
"projectId": "E:\\...\\ProjectFolder"
}
}
Example scenario
A user has a saved parent workspace:
E:\...\YAYI\2026\工作区
Inside it, a new project folder is created:
E:\...\YAYI\2026\工作区\中国-实用新型-检索-未分配案号-未获申请号-B22防水灯座灯头
Trying to create a thread directly under the new folder fails because it is not yet a saved project. Creating the thread under the parent workspace works, but the thread appears in the wrong sidebar group and cannot be moved.
Environment
- Codex Desktop on Windows
- Local project folders
- Project-heavy workflow with many nested client/matter folders
Related
This is related to #13836 but narrower: project registration and moving existing threads between projects.
8 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I am upvoting this one specifically on allowing to add standalone chats to projects.
For the thread-moving/relinking part, there is already a workable skill-level solution here:
https://github.com/EyrieCommander/codex-skills/tree/main/skills/thread-workspace-relink
That handles the “existing thread is attached to the wrong workspace/project path” case by safely relinking the local thread workspace state.
However, a different Codex-side gap remains for agent-driven thread delegation. When an agent tries to create a new follow-up thread in a specific saved project,
create_threadcan reject the target with:But in the session where this happened, the agent had
create_thread,read_thread, andsend_message_to_thread, while nolist_projectstool was exposed. Retrying with the visible project name failed the same way. The only available fallback was creating a projectless thread, which landed outside the intended workspace/sidebar grouping.So the narrower Codex fix is: if
create_threadrequires opaque saved project IDs, agents need a supported way to discover or address them. Any of these would make the flow work:list_projectswhenever project-scopedcreate_threadis exposed;projectIdto accept the current project, current workspace, or an absolute workspace path;I ran into this exact limitation in the Codex Desktop app on Windows. Existing threads cannot be moved from one project to another without losing their conversation history.
The desired flow is a supported “Move thread to project” action that preserves the full thread history, attachments/artifacts, working state, and context. Renaming threads, recreating them from summaries, or archiving the originals is not an adequate substitute. This would make long-lived project organization much more practical.
Adding a macOS remote-project variant of the same agent-driven delegation failure.
Environment:
26.616.811500.142.0Darwin 25.5.0 arm64 armObserved failure in the broken session:
create_threadavailable and needed to call it withtarget: { type: "project", projectId, environment: { type: "local" } }.create_threadrequired the opaque savedprojectId.list_projectstool was exposed in that session.list_threadsonly exposed thread-levelhostIdandcwd; it did not include the savedprojectId,projectKind, or saved-project label.Contrasting current-session evidence:
codex_app.list_projectsis exposed.projectId,projectKind: "remote", label, path,hostId, andhostDisplayName.The smallest fix that would make this reliable is to always expose
list_projectswhenever project-scopedcreate_threadis exposed.Other workable fixes:
projectIdto accept the current project, current cwd, or an absolute saved-project path;projectId,projectKind, label, and host display metadata inlist_threads;create_threadrequires saved-project ids but no project discovery tool is available.Suggested regression test: a manifest/tooling test should fail if a session exposes project-scoped
create_threadwithout also exposing a supported project-discovery path such aslist_projects. For remote projects, the test should verify that the discovery response includes enough metadata to select the intended host/path without reading internal Desktop storage.+1 on allowing
create_threadto create a thread in new project. Somehow I think this used to work for meAdditional Windows Desktop evidence from a real project-intake workflow:
list_projectsmay not include the new folder yet. If an agent uses the parent workspace or an Inbox project as a fallback, putting the desired folder path in the prompt does not change the binding:read_thread.cwdremains the parent/Inbox path and the thread is grouped there.The desired zero-click flow is:
thread.cwd == project pathbefore reporting success.Please provide a supported API/UI path for this, ideally one of:
project/registerorproject/createfor an existing local folder;create_threadaccepting a local folder path and registering/awaiting it atomically;thread/project/setto repair an accidental parent-workspace binding.A regression test should verify that a newly initialized folder can receive a project-bound thread without manual sidebar clicks, and that the resulting thread is displayed under that folder rather than the parent workspace.
I ran into the same limitation in a common "start broad, specialize later" workflow:
Starting a new task loses the value of keeping the original transcript, decisions, and context together. Keeping the task under the parent project makes project organization misleading.
A supported Move task to project flow should therefore handle both project binding and working-directory binding:
This scenario can arise naturally whenever exploratory work becomes project-specific after the task has already started; it is not limited to incorrectly created tasks.
Related sidebar organization request: #33304 proposes nested local projects so child projects do not all become top-level sidebar entries. Together, the two capabilities would make it practical to refine both a task's project assignment and the project hierarchy as work evolves.