Persist side chats as child threads attached to the main thread
What problem would this solve?
Side chats are currently one of the best interaction patterns in Codex for long-running work, but they are intentionally ephemeral. That means useful side-chat context disappears when the session/app is closed or the app is updated.
This is painful because side chats are not just a less-visible form of fork. They are tightly tied to the main thread and are especially useful while the main thread is still actively running. In a long-running turn that may take hours, a user can open a side chat immediately to inspect or ask about the current state without interrupting the main task. By contrast, ordinary forking/new-thread workflows feel heavier and do not preserve the same anchored “side of this main thread” interaction model.
The result is that users who rely on side chats have to choose between:
- keeping the current app/session alive indefinitely to avoid losing side chats, or
- upgrading/restarting and permanently losing side-chat context, or
- using full forks/new threads even when the desired workflow is explicitly a side conversation attached to the main thread.
Current behavior / source-backed understanding
From the current source, /side is explicitly implemented as ephemeral:
/sideis described as “start a side conversation in an ephemeral fork”:codex-rs/tui/src/slash_command.rs.codex-rs/tui/src/app/side.rsdescribes side conversations as ephemeral forks used for quick side questions.side_fork_config()setsfork_config.ephemeral = true.- Side threads are discarded from local app state when switching away/closing.
- The app-server README documents
ephemeral: trueas an in-memory temporary thread/fork whosethread.pathisnull.
Relevant references at the inspected HEAD (10b4080):
- https://github.com/openai/codex/blob/10b4080/codex-rs/tui/src/slash_command.rs#L121
- https://github.com/openai/codex/blob/10b4080/codex-rs/tui/src/app/side.rs#L3-L8
- https://github.com/openai/codex/blob/10b4080/codex-rs/tui/src/app/side.rs#L467
- https://github.com/openai/codex/blob/10b4080/codex-rs/app-server/README.md#L77-L78
- https://github.com/openai/codex/blob/10b4080/codex-rs/app-server/README.md#L135
I also saw related prior discussion where /side being intentionally ephemeral was treated as the current product stance. This issue is therefore a feature request to add a durable side-chat mode/model, not a claim that the current implementation is accidentally ephemeral.
Suggested behavior
Please support persisted side chats as first-class child conversations attached to the main thread.
Ideally:
- Side chats survive app updates, app restarts, and session reloads.
- A main thread shows its associated side chats in context, rather than side chats only existing as temporary renderer/app-server state.
- Side chats preserve the same lightweight UX and parent-thread anchoring that makes
/sideuseful today. - Creating a side chat during an active main-thread turn remains possible.
- Persisted side chats should be distinguishable from full independent forks: they are side branches of a main thread, not separate top-level conversations unless explicitly promoted.
- Users should be able to resume/reopen a side chat from the main thread after a restart/update.
Possible implementation shapes:
- Persist side chats as child threads with
parentThreadId/forkedFromIdmetadata and a rollout path, but keep them grouped under the parent in the UI. - Add a “promote side chat to full fork” affordance for users who want to detach one.
- If full persistence is too heavy by default, offer a setting or per-side-chat action such as “Keep this side chat.”
Why full forks/new threads are not an equivalent replacement
Forks/new threads are useful, but they do not replace side chats ergonomically:
- Side chats are explicitly tied to the main thread, so they preserve mental locality.
- Side chats can be opened while the main task is running, without steering or interrupting the main turn.
- A user may want a lightweight explanation, inspection, or alternate thought path without polluting the main thread.
- For long-running turns, waiting for the main turn to finish before organizing or forking context can be impractical.
Expected outcome
Users should be able to use side chats as durable context attached to a main thread, without losing them on update/restart and without being forced into heavier full-fork workflows.
15 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Agree! +1
My required workflow is not only persisting a single side chat. A parent
thread should be able to own multiple durable side threads.
Each side thread should:
The persistence model should support multiple child side threads even if
the first UI implementation only exposes one at a time. A later MVP could
add
/side new,/side list,/side switch, and/side promote, similarto the proposal in #22307.
When the main thread is forked, its side threads should not be silently
merged into or copied into the new fork. They should remain explicit child
branches unless the user chooses to copy or promote them.
This would also fit naturally into the conversation-tree model discussed
in #12450.
threads also seem confused when you ask about side chats:
the result is usually just copy-pasting the side chat, its session ID, and asking a new thread to mine JSONLs. but very inefficient. lots of "Hello" messages to side chats to test if they're expired or active -- few/zero config TOML settings for controlling side chats:
anyone have advice? i know i'm doing it wrong, but these two constraints have me gravitating towards the dangerous side chats:
so messaging thread for dossier/handoff causes loss of focus, and mining its session logs to reconstruct context in new session is more lossy than side chats.
Adding a real-world Codex Desktop workflow where durable side chats are especially important:
In this workflow, the side chat is not just a disposable question. It is the planning and decision-making context, while the main task is the execution context. Reconstructing that context in a new side chat requires repeating the project state, constraints, and prior decisions, and can cause important constraints to be omitted or later actions to contradict earlier conclusions.
The most important requirement is therefore not only transcript retention, but preservation of the parent/child relationship:
This would make the "side chat for planning, main task for execution" workflow reliable for long-running, complex, multi-stage work.
+1 100%, very well written argument and 100% needed.
I use side chats a bit differently, and it has become one of the most useful parts of Codex for me.
While an agent is working in the main task, I keep the side chat open as a repo-aware project manager and thinking partner. I use it to discuss progress, decide next steps, prepare prompts for other agents, and delegate work without interrupting the main task.
Because it already understands the repository and the surrounding task context, it works extremely well for this. The only real problem is that the conversation is temporary and eventually disappears.
A way to pin or save a side chat, reopen it later from the project, and optionally promote it to a normal task would make this workflow much more reliable. Keeping a reference to the parent task would also be valuable.
Side chats are already very close to being a lightweight supervisor or orchestration layer for people running several agents in parallel. Persistence would make that use case much more practical.
@alexanderxcmo Yeah, this is pretty much how I use it too.
While the main task is working, I use the side chat to talk through what to do next. Once we've worked out the plan, I ask it to turn the discussion into a better prompt for the main task. That way I don't have to keep going back to the main task to discuss things, and its context stays cleaner.
I also remember that side chats used to be able to send the prompt directly to the main task, so I didn't even have to copy and paste it. At some point that stopped working for me, and now I have to move it over manually, which is a shame.
So for me, a side chat isn't just a temporary chat window. It's more like a project-aware planning assistant. Being able to save it, reopen it later, and send messages directly to the main task again would make this workflow much nicer.
Additional product gap: implementation intent should route back to the parent task
I am seeing a related workflow failure in the macOS Codex app.
Workflow
Why this is a problem
The side chat is useful for lightweight planning, clarification, and choosing an approach. But once implementation is requested, the work needs the original task's context, history, workspace, and ownership.
Starting implementation in the side chat unexpectedly splits one intended task into two threads. The result is duplicated or fragmented context, and I have to manually transfer the decision back to the original task. It is especially confusing because the fork was not an explicit user choice.
This is an unintended thread fork. It is not necessarily a Git worktree or a repository clone; those are separate concepts and should only be created when explicitly selected.
Expected behavior
Please add an explicit parent-task dispatch path:
The current behavior makes a planning conversation behave like an accidental implementation branch, which defeats the purpose of using side chat to keep planning separate from the main execution thread.
Environment
+1 from me. I have the exact same workflow.
The persistence request would be stronger if side chats were modeled as durable branches with explicit state inheritance, rather than only persisted transcripts.
A child-thread record needs at least:
The important field is
fork_event_id: it defines exactly which parent state the side chat inherited. Without that boundary, a restored side chat can appear attached to the current parent while actually reasoning from an older snapshot, and neither side can explain the divergence.I would keep three artifacts separate:
That avoids silently merging side-chat conclusions into the main thread. Promotion to a top-level fork changes the manifest; it should not rewrite transcript lineage.
A compact restore flow could then be:
load branch manifest → verify parent/fork event exists → load child delta → mark parent divergence since fork → resumeThis also gives thread tools a reliable lookup surface instead of forcing models to mine JSONL files or send probe messages to discover whether a side chat still exists.
I maintain a small local-first project implementing related provenance primitives—stable project identity, source path/line, content hashes, SQLite state and source-linked context packs: https://github.com/leadingproblemsolver/living-context-engine
It is not a conversation-tree implementation, but the separation between durable records and generated retrieval artifacts may be useful here.
Related: #22707
That request was closed, but if this issue changes side chats into durable child threads with stable IDs and parent relationships, it would remove much of the architectural limitation cited in #22707.
It would be worth considering cross-client visibility as part of the persisted-child-thread model, so an attached side chat could eventually be reopened not only after a Desktop restart but also from Remote Control clients such as ChatGPT on iOS
I hit this as real data loss in Codex Desktop: a substantial side-chat investigation tied to ongoing implementation work disappeared, and there was no persisted thread/session record available to resume or reconstruct it reliably.
Side chats should be treated as normal durable threads with additional lineage metadata—not as disposable UI state. At minimum, each side chat should have:
The parent link is essential: the value of a side chat is that it inherits the parent context while keeping an investigation or planning path separate. Persistence without that relationship would still lose the workflow.
Totally agree!
Ideally, I hope in the Codex APP (GUI), side chats could be shown as notes waiting to be unfolded, inserted to the main thread when they start.
I opened a separate feature request focused on the missing creation flow:
#40941 — Allow users to create subagents directly from the Subagents panel
https://github.com/openai/codex/issues/40941
The distinction is that #26227 focuses on persisting side chats as child threads, while #40941 proposes a visible
+button that lets users start a subagent side chat directly, without first asking the main session to create it.The key workflow is to keep the subagent prompt and intermediate work isolated from the main context, send only a lightweight existence/status notification to the main session, and hand the completed output back for the main session to review or continue with. This avoids bloating or delaying a large primary task while still keeping the work linked.