<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Little Pan</title>
    <description>The latest articles on DEV Community by Little Pan (@heylittlepan).</description>
    <link>https://dev.to/heylittlepan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4121685%2F0c847734-92b2-489a-b132-058610188820.jpg</url>
      <title>DEV Community: Little Pan</title>
      <link>https://dev.to/heylittlepan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/heylittlepan"/>
    <language>en</language>
    <item>
      <title>Why Grok was the next agent PonyMux supported</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Fri, 02 Oct 2026 10:02:31 +0000</pubDate>
      <link>https://dev.to/heylittlepan/why-grok-was-the-next-agent-ponymux-supported-apd</link>
      <guid>https://dev.to/heylittlepan/why-grok-was-the-next-agent-ponymux-supported-apd</guid>
      <description>&lt;p&gt;Grok Build isn't the coding agent most people run. Plenty of agents have more users. It still got PonyMux support next, for one reason: it can search X.&lt;/p&gt;

&lt;p&gt;PonyMux 0.11.3 supports the Grok Build CLI, the &lt;code&gt;grok&lt;/code&gt; command, the same way it supports Claude Code and Codex. Each Terminal running Grok shows its live status. Approvals mark it &lt;strong&gt;Waiting for you&lt;/strong&gt;. Its conversations show up in search, and you can resume, fork, or hand them off to another agent. The Inspector shows its model and context, and the usage card shows where you are in your billing period.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Grok, and why now?
&lt;/h2&gt;

&lt;p&gt;A lot of what I want to know about my tools never makes it into the docs. A library ships a breaking change and the first reports are on X. An API starts returning odd errors and someone has already posted the workaround. A new model comes out and the useful takes are in replies, not in blog posts.&lt;/p&gt;

&lt;p&gt;Grok Build has an X search tool built in. It can look that up in the middle of a task, next to reading files and running commands. Claude Code and Codex can search the web, but neither ships a way to search X.&lt;/p&gt;

&lt;p&gt;That made Grok the agent I actually wanted in my Terminal list, not just the next one on a list sorted by users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not the biggest agent. The one that can read X.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What works with Grok in PonyMux?
&lt;/h2&gt;

&lt;p&gt;Everything that already worked for Claude Code and Codex:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Status&lt;/strong&gt; on the Terminal row: Running, Waiting for you, Unread, Standing by, Will come back, Error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approvals&lt;/strong&gt; that mark the Terminal as Waiting for you and clear as soon as you answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt; across your Grok conversations with &lt;code&gt;⌘K&lt;/code&gt;, including the feedback you type when you reject a tool call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resume and fork&lt;/strong&gt; from the Inspector or the Sessions panel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handoff&lt;/strong&gt; to Claude Code or Codex, and from them to Grok.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Inspector&lt;/strong&gt;, with model, reasoning effort, and context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usage&lt;/strong&gt; on the Grok card in Agent Integrations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subagents count too. When a Grok subagent asks for approval, the main session's Terminal shows it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does PonyMux know Grok is waiting for you?
&lt;/h2&gt;

&lt;p&gt;Grok sends a hook event when it asks for approval, but nothing when you answer. Without that second event, the Terminal would stay on Waiting for you after you'd already said yes.&lt;/p&gt;

&lt;p&gt;So PonyMux reads the key you press in Grok's approval menu. Pick an option with a number key or Return, and the status changes right away.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3lacnqo8t8mcbfrbdvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3lacnqo8t8mcbfrbdvj.png" alt="Grok in PonyMux: Grok waiting on an approval. The Terminal shows Waiting for you until you pick an option." width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the Inspector show for a Grok session?
&lt;/h2&gt;

&lt;p&gt;Grok writes more about the session than the other two agents do, so the Inspector shows more. Next to the model and reasoning effort, the context line reads as used out of total, like &lt;code&gt;23k / 256k in context&lt;/code&gt;. For Claude Code it's only the tokens in use, and Codex sessions show no count.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flv6sbw2ifeezuxkgarg8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flv6sbw2ifeezuxkgarg8.png" alt="Inspector — Grok: The Inspector for a Grok session: model, reasoning effort, and context used out of the window." width="520" height="760"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Session section has the same actions as the other agents: Resume, Fork Session, and a &lt;strong&gt;Handoff to…&lt;/strong&gt; menu that lists the other two agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I hand a session from Claude Code to Grok?
&lt;/h2&gt;

&lt;p&gt;Yes. Handoff works between all three agents, in any direction. Pick &lt;strong&gt;Handoff to…&lt;/strong&gt; in the Inspector and choose the agent. PonyMux writes a handoff file with the session's summary and last five exchanges, then starts the other agent in the same folder with a prompt to read it. The original session stays as it was, so you can still resume it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where does the Grok usage number come from?
&lt;/h2&gt;

&lt;p&gt;The Grok card in Agent Integrations shows one bar for your current billing period, labeled &lt;code&gt;7d&lt;/code&gt; or &lt;code&gt;30d&lt;/code&gt;. PonyMux reads the numbers Grok last wrote to its own log, so they're as fresh as your last Grok turn. It doesn't read your Grok credentials.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbeyd9i8ncyxyvydfeju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbeyd9i8ncyxyvydfeju.png" alt="Agent Integrations: Agent Integrations with cards for Claude Code, Codex, and Grok." width="488" height="892"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I set it up?
&lt;/h2&gt;

&lt;p&gt;Install Grok Build from &lt;a href="https://x.ai/cli" rel="noopener noreferrer"&gt;x.ai/cli&lt;/a&gt;, then select the link button at the bottom of the PonyMux sidebar and click &lt;strong&gt;Connect&lt;/strong&gt; on the Grok card. PonyMux asks before it writes anything, and for Grok it adds a single file, &lt;code&gt;~/.grok/hooks/ponymux.json&lt;/code&gt;, without touching your other hooks. Start a new &lt;code&gt;grok&lt;/code&gt; session in a PonyMux Terminal and its status shows up on the row.&lt;/p&gt;

&lt;p&gt;For the details on each provider, see &lt;a href="https://ponymux.com/docs/integrations?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=grok-build-cli-in-ponymux" rel="noopener noreferrer"&gt;Agent integrations&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>grok</category>
      <category>claudecode</category>
      <category>ai</category>
      <category>devtools</category>
    </item>
    <item>
      <title>How to know which Claude Code or Codex agent needs you</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Tue, 29 Sep 2026 12:18:23 +0000</pubDate>
      <link>https://dev.to/heylittlepan/how-to-know-which-claude-code-or-codex-agent-needs-you-23lb</link>
      <guid>https://dev.to/heylittlepan/how-to-know-which-claude-code-or-codex-agent-needs-you-23lb</guid>
      <description>&lt;p&gt;You start three agents and go read something. Twenty minutes later one of them has been waiting ten minutes for approval to run &lt;code&gt;npm install&lt;/code&gt;. Another finished long ago. The third is still working. You find out by clicking through every tab.&lt;/p&gt;

&lt;p&gt;Both agents can tell you when they need you. The defaults just need a little help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; notifications come from your terminal. Pick the channel in &lt;code&gt;/config&lt;/code&gt;, or add a &lt;code&gt;Notification&lt;/code&gt; hook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex:&lt;/strong&gt; desktop notifications are on by default, but only while the terminal isn't in front. Tune them under &lt;code&gt;[tui]&lt;/code&gt; in &lt;code&gt;~/.codex/config.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name the project:&lt;/strong&gt; a short hook script puts the folder name in the notification title, so you know which agent it is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The catch:&lt;/strong&gt; a notification tells you something happened. It doesn't take you back to the right tab.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When do Claude Code and Codex notify you?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; sends a notification when it needs permission to use a tool, and when it has finished and you've been idle for a minute. It sends it through your terminal. In iTerm2, Ghostty, and kitty that's a desktop notification. In Apple Terminal it's the bell. Change the channel with &lt;code&gt;/config&lt;/code&gt; inside a session. The &lt;strong&gt;Notifications&lt;/strong&gt; setting offers the terminal-specific options, the bell, or off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt; sends a desktop notification when a turn finishes and when it asks for approval to run a command or edit files. By default it only does this while the terminal is in the background, which is usually what you want. The settings live in &lt;code&gt;~/.codex/config.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[tui]&lt;/span&gt;
&lt;span class="py"&gt;notifications&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;                 &lt;span class="c"&gt;# or a list, such as ["approval-requested"]&lt;/span&gt;
&lt;span class="py"&gt;notification_condition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"unfocused"&lt;/span&gt; &lt;span class="c"&gt;# "always" to notify even when the terminal is in front&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both work well with one agent. With four, "Claude Code needs your permission" doesn't say which of the four.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I see which project a notification is about?
&lt;/h2&gt;

&lt;p&gt;Use a hook. Both agents can run a command on these events and pass it a JSON description that includes the working directory. This script turns that into a notification titled with the agent and folder name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;# ~/bin/agent-notify.sh — usage: agent-notify.sh "Claude Code"&lt;/span&gt;
jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;--arg&lt;/span&gt; agent &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'
  (.message // (if .hook_event_name == "PermissionRequest" then "Needs your approval" else "Finished its turn" end)) as $body
  | "display notification \($body | @json) with title \("\($agent) · \(.cwd | split("/") | last)" | @json)"
'&lt;/span&gt; | osascript &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it and run &lt;code&gt;chmod +x ~/bin/agent-notify.sh&lt;/code&gt;. It needs &lt;code&gt;jq&lt;/code&gt;, which ships with macOS 15 and later.&lt;/p&gt;

&lt;p&gt;For Claude Code, add a &lt;code&gt;Notification&lt;/code&gt; hook to &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Notification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"permission_prompt|idle_prompt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~/bin/agent-notify.sh 'Claude Code'"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Codex, add &lt;code&gt;Stop&lt;/code&gt; and &lt;code&gt;PermissionRequest&lt;/code&gt; hooks to &lt;code&gt;~/.codex/hooks.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Stop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~/bin/agent-notify.sh Codex"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PermissionRequest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~/bin/agent-notify.sh Codex"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex asks you to review new hooks the next time it starts, and &lt;code&gt;/hooks&lt;/code&gt; inside a session shows what's installed. The script prints nothing, so it doesn't change whether a permission request is approved. Now a notification reads "Claude Code · api: Claude needs your permission to use Bash", and you know where to go. If you now get two notifications for the same event, turn the built-in one off: &lt;strong&gt;Notifications&lt;/strong&gt; in Claude Code's &lt;code&gt;/config&lt;/code&gt;, or &lt;code&gt;notifications = false&lt;/code&gt; under &lt;code&gt;[tui]&lt;/code&gt; for Codex.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does a notification still leave me hunting for the tab?
&lt;/h2&gt;

&lt;p&gt;Because it comes from the agent, not from the window it runs in. Clicking a &lt;code&gt;display notification&lt;/code&gt; banner opens Script Editor. Clicking the terminal's own notification brings the terminal forward, but not necessarily the right tab. With several agents per window, you still scan tabs for the one with the prompt.&lt;/p&gt;

&lt;p&gt;A hook can't fix this, and neither can the terminal settings. What's missing is a place that tracks each agent's state next to the terminal it runs in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I see every agent's status at a glance?
&lt;/h2&gt;

&lt;p&gt;That's what &lt;a href="https://ponymux.com" rel="noopener noreferrer"&gt;PonyMux&lt;/a&gt; does. Each Terminal running Claude Code or Codex shows the agent's state on its row in the Terminal list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Waiting for you:&lt;/strong&gt; approval or an answer is needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Running:&lt;/strong&gt; the agent is working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unread:&lt;/strong&gt; it finished something you haven't looked at yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standing by:&lt;/strong&gt; ready for the next prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Will come back:&lt;/strong&gt; the agent is idle, but background work or a subagent it started is still running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error:&lt;/strong&gt; it stopped because something went wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffohqob3zz2o81stpkz18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffohqob3zz2o81stpkz18.png" alt="Agent status on each Terminal row: running, waiting for you, standing by, unread, and will come back." width="800" height="373"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Agent status on each Terminal row: running, waiting for you, standing by, unread, and will come back.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When any Terminal in the list has a status, a badge at the bottom of the list shows the count. Click it to jump to the next one, and click again to cycle through the rest. The list order doesn't change.&lt;/p&gt;

&lt;p&gt;To see only the agents, select &lt;strong&gt;Agents&lt;/strong&gt; in the sidebar. It lists every Terminal where Claude Code or Codex is running right now, plus the ones whose agent was still active when you last quit PonyMux, so four agents spread across different projects and Lists show up in one place. Running agents come first, then the ones left from your last quit, each group in your usual Terminal order. It isn't a folder you manage: Terminals join and leave it as their agents start and stop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcxiw7wk6mcm60kj5sjon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcxiw7wk6mcm60kj5sjon.png" alt="The Agents collection in the sidebar lists the Terminals running Claude Code or Codex, across every project and List." width="800" height="580"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Agents collection in the sidebar lists the Terminals running Claude Code or Codex, across every project and List.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;PonyMux also sends its own notifications for finished turns, permission requests, input requests, and errors, and you can set each kind to Off, Silent, or Sound in &lt;strong&gt;Settings → General&lt;/strong&gt;. Clicking a notification opens PonyMux on the Terminal it's about, which is the step a hook can't do. Agent status needs the Claude Code or Codex integration, which you connect once from the bottom of the sidebar.&lt;/p&gt;

&lt;p&gt;For every status and notification setting, see &lt;a href="https://ponymux.com/docs/agent-status" rel="noopener noreferrer"&gt;Agent Status and Notifications&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/guides/know-which-agent-needs-you" rel="noopener noreferrer"&gt;ponymux.com&lt;/a&gt;, where the demos are interactive.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>codex</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to pick up Claude Code and Codex sessions after a restart</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Tue, 29 Sep 2026 12:15:24 +0000</pubDate>
      <link>https://dev.to/heylittlepan/how-to-pick-up-claude-code-and-codex-sessions-after-a-restart-3356</link>
      <guid>https://dev.to/heylittlepan/how-to-pick-up-claude-code-and-codex-sessions-after-a-restart-3356</guid>
      <description>&lt;p&gt;On Friday you had four agents going: one on the API, one on the docs, a Codex session running tests, and one you'd parked halfway through a refactor. Over the weekend macOS installed an update and restarted. On Monday the tabs are gone, and you don't remember which session was in which folder.&lt;/p&gt;

&lt;p&gt;The conversations aren't lost. What stopped is the processes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What's saved:&lt;/strong&gt; every message up to the moment the agent stopped. Claude Code and Codex write the transcript as they go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What isn't:&lt;/strong&gt; a reply that was still being written, and the running process itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring one back:&lt;/strong&gt; in the project folder, run &lt;code&gt;claude --continue&lt;/code&gt; or &lt;code&gt;codex resume --last&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring several back:&lt;/strong&gt; list your most recent sessions with their folders, pick the ones you were using, and resume each. There's a command below that prints them for you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What happens to a running agent when I close the terminal or restart?
&lt;/h2&gt;

&lt;p&gt;Closing a terminal window, quitting the terminal app, logging out, and restarting all end the processes inside, including Claude Code and Codex. Whatever the agent had already written to its transcript stays on disk. A turn that was halfway through is cut off.&lt;/p&gt;

&lt;p&gt;Sleep is different. When the Mac sleeps, processes pause and pick up where they were when it wakes. A request that was in flight to the model can fail while the network is down. If the agent reports an error after wake, tell it to continue.&lt;/p&gt;

&lt;p&gt;Some terminal apps reopen your windows after a restart, with the same folders and scrollback. That looks like the session is back, but it's a fresh shell. The agent isn't running in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I resume the last session in a project?
&lt;/h2&gt;

&lt;p&gt;Open a terminal in the project folder and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Claude Code&lt;/span&gt;
claude &lt;span class="nt"&gt;--continue&lt;/span&gt;

&lt;span class="c"&gt;# Codex&lt;/span&gt;
codex resume &lt;span class="nt"&gt;--last&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both pick the most recent session from the current directory. If you ran more than one session in that folder, use the picker instead: &lt;code&gt;claude --resume&lt;/code&gt; or &lt;code&gt;codex resume&lt;/code&gt;. The folder matters. Run the same command from your home directory and you get a different session, or none.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I bring several sessions back at once?
&lt;/h2&gt;

&lt;p&gt;When several agents were running in different folders, you need each session's folder and ID. The transcripts don't record whether a session was still running, but the ones you were using before the restart are usually the most recently written. These commands print one ready-to-run line per recent session, most recently active first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Claude Code: the 10 most recent sessions&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; ~/.claude/projects/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.jsonl | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt; | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; f&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'select(.cwd) | "cd \(.cwd | @sh) &amp;amp;&amp;amp; claude --resume \(.sessionId)"'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Codex: the 10 most recent sessions&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; ~/.codex/sessions/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.jsonl | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt; | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; f&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'select(.type == "session_meta") | "cd \(.payload.cwd | @sh) &amp;amp;&amp;amp; codex resume \(.payload.id)"'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each line looks like &lt;code&gt;cd '/Users/you/code/api' &amp;amp;&amp;amp; claude --resume 8e539d93-…&lt;/code&gt;. Pick the ones you were working on, open a tab per session, and paste its line. A session that sat idle for a long time can fall below newer ones, so raise &lt;code&gt;head -10&lt;/code&gt; if one is missing. Skip lines whose folder no longer exists, such as a worktree you've since removed.&lt;/p&gt;

&lt;p&gt;Both commands read each tool's transcript files directly. That format is internal and can change between releases, so treat these as a convenience, not an interface. If you turned on Codex's experimental compression, older sessions are &lt;code&gt;.jsonl.zst&lt;/code&gt; files and won't show up in the list. Both commands need &lt;code&gt;jq&lt;/code&gt;, which ships with macOS 15 and later. The pickers work too: press &lt;code&gt;Ctrl+A&lt;/code&gt; in &lt;code&gt;claude --resume&lt;/code&gt; to see every project, or run &lt;code&gt;codex resume --all&lt;/code&gt;. The list above is faster when you want several sessions back at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I keep an agent running while I'm away?
&lt;/h2&gt;

&lt;p&gt;Two different problems, two different tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Mac going to sleep.&lt;/strong&gt; An idle Mac sleeps, and the agent pauses with it. &lt;code&gt;caffeinate&lt;/code&gt; keeps the system awake for as long as the command inside it runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;caffeinate &lt;span class="nt"&gt;-i&lt;/span&gt; claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-i&lt;/code&gt; prevents idle sleep. It doesn't stop sleep when you close the lid or choose Sleep yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The terminal closing.&lt;/strong&gt; A terminal multiplexer such as tmux keeps processes running after the window closes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; api      &lt;span class="c"&gt;# start a session, then run claude or codex inside it&lt;/span&gt;
tmux attach &lt;span class="nt"&gt;-t&lt;/span&gt; api   &lt;span class="c"&gt;# later, from any terminal window&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;tmux survives closing the terminal and quitting the terminal app. It doesn't survive a restart or a logout. After a restart you're back to resuming sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I skip looking up folders and session IDs?
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://ponymux.com" rel="noopener noreferrer"&gt;PonyMux&lt;/a&gt;, each Terminal is a saved record: its name, folder, List, and the sessions that ran in it. Quitting PonyMux or restarting the Mac ends the processes, but the Terminals stay where you left them. They come back &lt;strong&gt;sleeping&lt;/strong&gt;, marked with a zzz badge.&lt;/p&gt;

&lt;p&gt;Select a sleeping Terminal that had an agent conversation, and PonyMux shows the last exchange from that session, so you can see where it stopped. With automatic resume on, a short countdown starts. When it runs out, PonyMux resumes that exact session in the Terminal's folder. You can resume right away, pause the countdown, or choose &lt;strong&gt;Shell Only&lt;/strong&gt; for a plain shell instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd3361cwkee6v33kt9ijw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd3361cwkee6v33kt9ijw.png" alt="A sleeping Terminal after a restart. The last exchange is on screen, and Resume counts down before it reopens the session." width="800" height="501"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A sleeping Terminal after a restart. The last exchange is on screen, and Resume counts down before it reopens the session.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That replaces the list-and-paste step above: each Terminal already knows its folder and session, so bringing four agents back is four clicks. Automatic resume can be turned off in &lt;strong&gt;Settings → General&lt;/strong&gt;. If the transcript is gone, for example after Claude Code's 30-day cleanup, the Terminal says so and offers a shell instead.&lt;/p&gt;

&lt;p&gt;For the idle-sleep problem, the coffee-cup &lt;strong&gt;Keep Awake&lt;/strong&gt; button at the bottom of the sidebar prevents idle sleep and App Nap while it's on. Like &lt;code&gt;caffeinate -i&lt;/code&gt;, it doesn't override closing the lid.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8v06j5md17ih9ckroni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8v06j5md17ih9ckroni.png" alt="The Keep Awake button in the PonyMux sidebar footer." width="400" height="82"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Keep Awake button in the PonyMux sidebar footer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For how sleeping and waking work, see &lt;a href="https://ponymux.com/docs/terminal-lifecycle" rel="noopener noreferrer"&gt;Terminal Lifecycle&lt;/a&gt;. To find an older session by what was said in it, see &lt;a href="https://ponymux.com/guides/claude-code-conversation-history" rel="noopener noreferrer"&gt;Claude Code conversation history&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/guides/resume-claude-code-codex-after-restart" rel="noopener noreferrer"&gt;ponymux.com&lt;/a&gt;, where the demos are interactive.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>codex</category>
      <category>macos</category>
    </item>
    <item>
      <title>How to fork a Claude Code or Codex session to try another approach</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Tue, 29 Sep 2026 12:08:26 +0000</pubDate>
      <link>https://dev.to/heylittlepan/how-to-fork-a-claude-code-or-codex-session-to-try-another-approach-33e3</link>
      <guid>https://dev.to/heylittlepan/how-to-fork-a-claude-code-or-codex-session-to-try-another-approach-33e3</guid>
      <description>&lt;p&gt;The agent has a plan, and it's halfway through. You want to see what the other approach looks like, the one you talked it out of an hour ago. If you ask in the same session, you pollute the context it has built up. If you start a new session, you lose that context.&lt;/p&gt;

&lt;p&gt;A fork gives you both. It copies the conversation so far into a new session, and the original stays exactly where it was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code, inside a session:&lt;/strong&gt; &lt;code&gt;/branch&lt;/code&gt;. You're moved into the copy, and the original can be resumed later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code, from the shell:&lt;/strong&gt; &lt;code&gt;claude --resume &amp;lt;session-id&amp;gt; --fork-session&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex, inside a session:&lt;/strong&gt; &lt;code&gt;/fork&lt;/code&gt;. From the shell: &lt;code&gt;codex fork &amp;lt;session-id&amp;gt;&lt;/code&gt;, or &lt;code&gt;codex fork --last&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The catch:&lt;/strong&gt; a fork copies the conversation, not your files. Two sessions editing the same checkout will step on each other. Give the fork its own git worktree.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When should I fork instead of just continuing?
&lt;/h2&gt;

&lt;p&gt;Fork when you want to keep the current thread intact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trying a different approach.&lt;/strong&gt; The fork explores the alternative. If it doesn't work out, the original session still has the plan it was following, untouched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparing two approaches.&lt;/strong&gt; Fork, then let each session build its version in its own worktree. Compare the diffs, not the arguments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asking a side question.&lt;/strong&gt; A tangent that isn't worth keeping in the main context: how some library works, or a quick review of one file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you just want to undo the last few steps, you don't need a fork. Claude Code's &lt;code&gt;/rewind&lt;/code&gt; (also &lt;code&gt;/checkpoint&lt;/code&gt;) restores the conversation, the code, or both to an earlier message.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I fork a Claude Code session?
&lt;/h2&gt;

&lt;p&gt;Inside a running session, type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/branch try-event-queue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code copies the conversation into a new session and switches you into it. The name is optional. The fork's title ends in "(Branch)", so it's easy to tell apart in &lt;code&gt;/resume&lt;/code&gt;. The confirmation message includes the command to get back to the original, &lt;code&gt;claude -r &amp;lt;original-session-id&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From the shell, add &lt;code&gt;--fork-session&lt;/code&gt; to a resume:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Fork the most recent session in this directory&lt;/span&gt;
claude &lt;span class="nt"&gt;--continue&lt;/span&gt; &lt;span class="nt"&gt;--fork-session&lt;/span&gt;

&lt;span class="c"&gt;# Fork a specific session&lt;/span&gt;
claude &lt;span class="nt"&gt;--resume&lt;/span&gt; &amp;lt;session-id&amp;gt; &lt;span class="nt"&gt;--fork-session&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without &lt;code&gt;--fork-session&lt;/code&gt;, both commands reopen the original session and keep adding to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I fork a Codex session?
&lt;/h2&gt;

&lt;p&gt;Inside a running session, type &lt;code&gt;/fork&lt;/code&gt;. From the shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pick a session to fork from a list&lt;/span&gt;
codex fork

&lt;span class="c"&gt;# Fork the most recent session in this directory&lt;/span&gt;
codex fork &lt;span class="nt"&gt;--last&lt;/span&gt;

&lt;span class="c"&gt;# Fork a specific session&lt;/span&gt;
codex fork &amp;lt;session-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Like &lt;code&gt;codex resume&lt;/code&gt;, the picker and &lt;code&gt;--last&lt;/code&gt; only look at sessions from the current directory. Add &lt;code&gt;--all&lt;/code&gt; to see every directory.&lt;/p&gt;

&lt;p&gt;Codex has two more ways to branch. Press &lt;code&gt;Esc&lt;/code&gt; twice to step back through your earlier prompts, pick one, and press &lt;code&gt;Enter&lt;/code&gt;. Codex forks the conversation just before that prompt and puts the prompt back in the composer for you to edit. The original session keeps the full history. For a quick tangent, &lt;code&gt;/side&lt;/code&gt; starts a side conversation in a temporary fork.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does forking a session copy my code?
&lt;/h2&gt;

&lt;p&gt;No. A fork copies the conversation. Both sessions still work in the same directory, on the same files. If the original agent is editing &lt;code&gt;src/queue.ts&lt;/code&gt; while the fork rewrites it, you get a mess that neither of them planned.&lt;/p&gt;

&lt;p&gt;Give the fork its own git worktree. A new worktree starts from your last commit, not from the files on disk, so uncommitted edits and new files don't come along. If the agent has been working for a while, commit first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"wip: before fork"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can squash or amend that commit later. Without it, the fork remembers changes that its worktree doesn't have. If you've used &lt;code&gt;claude --worktree&lt;/code&gt; in this repo before, add &lt;code&gt;.claude/worktrees/&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt; first, or &lt;code&gt;git add -A&lt;/code&gt; will pick up those worktree folders too.&lt;/p&gt;

&lt;p&gt;Then fork into a worktree. Both CLIs can create one for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Claude Code: fork into a new worktree under .claude/worktrees/try-event-queue&lt;/span&gt;
claude &lt;span class="nt"&gt;--worktree&lt;/span&gt; try-event-queue &lt;span class="nt"&gt;--resume&lt;/span&gt; &amp;lt;session-id&amp;gt; &lt;span class="nt"&gt;--fork-session&lt;/span&gt;

&lt;span class="c"&gt;# Codex: fork into a new worktree under ~/.codex/worktrees&lt;/span&gt;
codex fork &lt;span class="nt"&gt;--worktree&lt;/span&gt; &amp;lt;session-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code puts its worktree on a new branch named &lt;code&gt;worktree-&amp;lt;name&amp;gt;&lt;/code&gt;. Codex needs an explicit session ID here, since &lt;code&gt;--last&lt;/code&gt; doesn't work with &lt;code&gt;--worktree&lt;/code&gt;, and its worktree starts on a detached HEAD, so create a branch there (&lt;code&gt;git switch -c try-event-queue&lt;/code&gt;) before you commit anything you want to keep.&lt;/p&gt;

&lt;p&gt;Or create the worktree yourself and fork from inside it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree add ../myapp-event-queue &lt;span class="nt"&gt;-b&lt;/span&gt; try-event-queue
&lt;span class="nb"&gt;cd&lt;/span&gt; ../myapp-event-queue
claude &lt;span class="nt"&gt;--resume&lt;/span&gt; &amp;lt;session-id&amp;gt; &lt;span class="nt"&gt;--fork-session&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fork still has the whole conversation, even though it now runs in a different directory. When one approach wins, merge its branch and remove the other worktree by path, for example &lt;code&gt;git worktree remove ../myapp-event-queue&lt;/code&gt;. &lt;code&gt;git worktree list&lt;/code&gt; shows the paths, including the ones Claude Code and Codex created.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I keep track of which session is which?
&lt;/h2&gt;

&lt;p&gt;Forks look alike in a session list, since they start from the same conversation. Name them when you create them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: &lt;code&gt;/branch &amp;lt;name&amp;gt;&lt;/code&gt;, or &lt;code&gt;/rename&lt;/code&gt; inside any session.&lt;/li&gt;
&lt;li&gt;Codex: &lt;code&gt;/rename&lt;/code&gt; inside the session.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A name that says what the fork is trying, such as "event queue" or "keep polling", makes the right session easy to find in &lt;code&gt;claude --resume&lt;/code&gt; or &lt;code&gt;codex resume&lt;/code&gt; a day later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I fork without typing session IDs?
&lt;/h2&gt;

&lt;p&gt;Yes. In &lt;a href="https://ponymux.com" rel="noopener noreferrer"&gt;PonyMux&lt;/a&gt;, select a Terminal that's running Claude Code or Codex, open the Inspector, and click &lt;strong&gt;Fork Session&lt;/strong&gt; in the Session section. The same action is in each session's ⋯ menu in the Sessions panel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fotqizy87oda4biq127sn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fotqizy87oda4biq127sn.png" alt="The Inspector's Session section for a Claude Code session. Fork Session is right above Handoff." width="800" height="501"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Inspector's Session section for a Claude Code session. Fork Session is right above Handoff.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;PonyMux asks where to put the fork:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Here&lt;/strong&gt; ends whatever is running in the current Terminal and starts the fork in its place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Terminal&lt;/strong&gt; opens the fork next to the original, in the same list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It runs &lt;code&gt;claude --resume … --fork-session&lt;/code&gt; or &lt;code&gt;codex fork …&lt;/code&gt; for you, in the session's working directory. A Terminal that holds a fork shows an &lt;strong&gt;Origin&lt;/strong&gt; section in the Inspector, with &lt;strong&gt;Go to Source Session&lt;/strong&gt; to jump back to the conversation it came from.&lt;/p&gt;

&lt;p&gt;PonyMux doesn't create a worktree for the fork, and it always starts the fork in the original session's working directory. If the two sessions will edit files, commit first as described above, create the worktree yourself, open a Terminal in it, and run &lt;code&gt;claude --resume &amp;lt;session-id&amp;gt; --fork-session&lt;/code&gt; there, or use &lt;code&gt;codex fork --worktree&lt;/code&gt;. A session needs at least one saved exchange before it can be forked.&lt;/p&gt;

&lt;p&gt;You also don't need to remember which session was which. Each PonyMux Terminal keeps a timeline of every Claude Code and Codex session that has run in it. Open the Sessions panel to see them, with their titles, recaps, and when each was last used. Click &lt;strong&gt;Resume&lt;/strong&gt; on any row to go back to that exact session, not just the most recent one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi4a4c4hb6jrfxue1sve4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi4a4c4hb6jrfxue1sve4.png" alt="The Sessions panel lists every conversation that has run in this Terminal. Resume reopens the one you pick." width="800" height="263"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Sessions panel lists every conversation that has run in this Terminal. Resume reopens the one you pick.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Resume needs the agent's transcript to still be on disk. Claude Code deletes transcripts after 30 days by default; see &lt;a href="https://ponymux.com/guides/claude-code-conversation-history" rel="noopener noreferrer"&gt;Claude Code conversation history&lt;/a&gt; for how to keep them longer.&lt;/p&gt;

&lt;p&gt;For the details of Resume, Fork, and Handoff, see the &lt;a href="https://ponymux.com/docs/sessions" rel="noopener noreferrer"&gt;Sessions docs&lt;/a&gt;. To move a task to the other agent instead of copying it, see &lt;a href="https://ponymux.com/guides/hand-off-claude-code-to-codex" rel="noopener noreferrer"&gt;How to hand off a task from Claude Code to Codex&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/guides/fork-claude-code-codex-session" rel="noopener noreferrer"&gt;ponymux.com&lt;/a&gt;, where the demos are interactive.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>codex</category>
      <category>git</category>
    </item>
    <item>
      <title>How to hand off a task from Claude Code to Codex (and back)</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Tue, 29 Sep 2026 12:04:25 +0000</pubDate>
      <link>https://dev.to/heylittlepan/how-to-hand-off-a-task-from-claude-code-to-codex-and-back-54ne</link>
      <guid>https://dev.to/heylittlepan/how-to-hand-off-a-task-from-claude-code-to-codex-and-back-54ne</guid>
      <description>&lt;p&gt;Claude Code and Codex are good at different parts of the same task. A split that works well: Claude Code writes the code, then Codex runs the smoke test. Codex has a Computer Use plugin that can open the built app on your Mac, click through it, and report what broke. For that to work, Codex has to know what was just built and what to check, without you explaining the whole task again.&lt;/p&gt;

&lt;p&gt;The same goes for other reasons to switch: a usage limit halfway through a refactor, or a second opinion on a design.&lt;/p&gt;

&lt;p&gt;Neither tool can open the other's conversations. What you can move is the context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write a handoff note.&lt;/strong&gt; Ask the current agent to put the goal, what's done, what's left, and the decisions so far into &lt;code&gt;HANDOFF.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start the other agent from it.&lt;/strong&gt; In the same directory, run &lt;code&gt;codex "Read HANDOFF.md and continue the work described there."&lt;/code&gt;, or the same with &lt;code&gt;claude&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share project instructions.&lt;/strong&gt; Claude Code reads &lt;code&gt;CLAUDE.md&lt;/code&gt; and Codex reads &lt;code&gt;AGENTS.md&lt;/code&gt;. Put &lt;code&gt;@AGENTS.md&lt;/code&gt; in &lt;code&gt;CLAUDE.md&lt;/code&gt; so both see the same rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The catch:&lt;/strong&gt; the new agent starts a new session. It knows what the note says, not everything the first agent saw.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why can't Codex just open my Claude Code conversation?
&lt;/h2&gt;

&lt;p&gt;Each tool writes its own transcript format to its own folder. Claude Code uses &lt;code&gt;~/.claude/projects/&lt;/code&gt;, and Codex uses &lt;code&gt;~/.codex/sessions/&lt;/code&gt;. &lt;code&gt;claude --resume&lt;/code&gt; only lists Claude Code sessions, and &lt;code&gt;codex resume&lt;/code&gt; only lists Codex sessions. There is no import command in either direction.&lt;/p&gt;

&lt;p&gt;So a handoff is never a transfer of the conversation. It's a new session that starts with enough context to keep going. The quality of the handoff comes down to what you put in front of the next agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the next agent need to know?
&lt;/h2&gt;

&lt;p&gt;Less than the whole transcript, and more than the last message. A useful handoff answers five questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What's the goal, in one or two sentences?&lt;/li&gt;
&lt;li&gt;What's done, and how was it checked?&lt;/li&gt;
&lt;li&gt;What's left, in order?&lt;/li&gt;
&lt;li&gt;Which decisions were made, and why? These are the ones the next agent would otherwise undo.&lt;/li&gt;
&lt;li&gt;Which files matter, and what's still uncommitted?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The files themselves don't need to be in the note. Both agents work on the same directory, so the next one can read the code. What it can't read is your reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I write a handoff note?
&lt;/h2&gt;

&lt;p&gt;Ask the agent that has the context to write it. It saw the dead ends and knows why things are the way they are. Paste this into the current session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write a handoff note to HANDOFF.md for another coding agent that will continue this work.
Include: the goal, what is done and how it was verified, what is left in order,
decisions we made and why, the files that matter, and anything uncommitted.
Be specific. Skip anything the next agent can read from the code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a smoke-test handoff, ask for the testing details too: how to build and launch the app, which flows changed, and what "working" looks like for each one. Then start Codex with a prompt that says what to do with the note, such as &lt;code&gt;codex "Read HANDOFF.md and smoke-test the changes it describes."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Read the note before you hand it off. It's short, and it's the only thing the next agent knows about the conversation, so fix anything that's wrong or missing.&lt;/p&gt;

&lt;p&gt;Commit &lt;code&gt;HANDOFF.md&lt;/code&gt; or add it to &lt;code&gt;.gitignore&lt;/code&gt;. Either is fine, as long as it doesn't slip into an unrelated commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I start Codex or Claude Code from the note?
&lt;/h2&gt;

&lt;p&gt;Open a terminal in the same directory and pass the note as the first prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Claude Code → Codex&lt;/span&gt;
codex &lt;span class="s2"&gt;"Read HANDOFF.md and continue the work described there."&lt;/span&gt;

&lt;span class="c"&gt;# Codex → Claude Code&lt;/span&gt;
claude &lt;span class="s2"&gt;"Read HANDOFF.md and continue the work described there."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both CLIs take an initial prompt as an argument and start an interactive session with it. The new agent reads the note, looks at the files it names, and carries on. Watch the first few steps. If it starts redoing something the note says is finished, the note needs another line.&lt;/p&gt;

&lt;p&gt;Stay in the same working directory. Both agents load project instructions and resolve paths from there, and a different checkout means different files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can the next agent read the full transcript instead?
&lt;/h2&gt;

&lt;p&gt;It can, and sometimes that's useful for one detail the note left out. Tell it where the file is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: &lt;code&gt;~/.claude/projects/&amp;lt;project&amp;gt;/&amp;lt;session-id&amp;gt;.jsonl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Codex: &lt;code&gt;~/.codex/sessions/YYYY/MM/DD/rollout-&amp;lt;timestamp&amp;gt;-&amp;lt;id&amp;gt;.jsonl&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't make it the main handoff. Transcripts are mostly tool output and metadata, they get large quickly, and the format is internal to each tool. A long session can fill much of the next agent's context before it does any work.&lt;/p&gt;

&lt;p&gt;Claude Code's &lt;code&gt;/export&lt;/code&gt; writes the current conversation as plain text. Pass a filename and it saves there, with the extension changed to &lt;code&gt;.txt&lt;/code&gt;. That's easier for another agent to read than the JSONL, but it's still the whole conversation, not a summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I make both agents follow the same project rules?
&lt;/h2&gt;

&lt;p&gt;Keep one file and point the other tool at it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: import &lt;code&gt;AGENTS.md&lt;/code&gt; from &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/strong&gt; Claude Code supports &lt;code&gt;@path&lt;/code&gt; imports in &lt;code&gt;CLAUDE.md&lt;/code&gt;. A &lt;code&gt;CLAUDE.md&lt;/code&gt; that contains only this line makes Claude Code read your &lt;code&gt;AGENTS.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;@AGENTS.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option 2: let Codex read &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/strong&gt; If your rules already live in &lt;code&gt;CLAUDE.md&lt;/code&gt;, add this to &lt;code&gt;~/.codex/config.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;project_doc_fallback_filenames&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"CLAUDE.md"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex then uses &lt;code&gt;CLAUDE.md&lt;/code&gt; in any directory that has no &lt;code&gt;AGENTS.md&lt;/code&gt;. Without this setting, Codex doesn't see &lt;code&gt;CLAUDE.md&lt;/code&gt; at startup.&lt;/p&gt;

&lt;h2&gt;
  
  
  What doesn't carry over in a handoff?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The conversation.&lt;/strong&gt; The next agent has the note, not the transcript. Anything it needs has to be in the note or in the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions and approvals.&lt;/strong&gt; Each tool has its own settings. What you allowed in Claude Code isn't allowed in Codex.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools and integrations.&lt;/strong&gt; MCP servers, skills, hooks, and custom commands are configured per tool. Set them up on both sides if the task depends on them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The original session.&lt;/strong&gt; It stays where it was. You can still resume it in its own tool, and you can hand off back later with a new note.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Can I hand off without writing the note myself?
&lt;/h2&gt;

&lt;p&gt;Yes. &lt;a href="https://ponymux.com" rel="noopener noreferrer"&gt;PonyMux&lt;/a&gt; has a &lt;strong&gt;Handoff&lt;/strong&gt; action on Claude Code and Codex sessions that have saved at least one exchange. With a Terminal selected, open the Inspector and click &lt;strong&gt;Handoff to Codex&lt;/strong&gt; (or &lt;strong&gt;Handoff to Claude&lt;/strong&gt;) in the Session section. The same action is also in each session's ⋯ menu in the Sessions panel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxc88g9aclmkb93shicaq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxc88g9aclmkb93shicaq.png" alt="The Inspector's Session section for a Claude Code session. Handoff to Codex sits under Fork Session." width="800" height="501"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Inspector's Session section for a Claude Code session. Handoff to Codex sits under Fork Session.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;PonyMux reads the session's transcript and writes a Markdown handoff file with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the session title and working directory&lt;/li&gt;
&lt;li&gt;a summary, when the session has one&lt;/li&gt;
&lt;li&gt;the last five exchanges, with a one-line note for each command, file read, or edit&lt;/li&gt;
&lt;li&gt;the path to the full transcript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It then starts the other agent in the session's working directory with a prompt to read that file. You choose where: &lt;strong&gt;Here&lt;/strong&gt; ends whatever is running in the current Terminal and starts the new agent in its place. &lt;strong&gt;New Terminal&lt;/strong&gt; opens one next to it in the same list and leaves the current one alone. The source session isn't changed, so you can still resume it.&lt;/p&gt;

&lt;p&gt;It saves the copy-paste, not the judgment. The file holds recent turns, not a note written for the next agent, so for a long task it's still worth asking the agent for a proper handoff note first. Codex sessions saved in compressed &lt;code&gt;.jsonl.zst&lt;/code&gt; form can't be handed off yet.&lt;/p&gt;

&lt;p&gt;For the details of Resume, Fork, and Handoff, see the &lt;a href="https://ponymux.com/docs/sessions" rel="noopener noreferrer"&gt;Sessions docs&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/guides/hand-off-claude-code-to-codex" rel="noopener noreferrer"&gt;ponymux.com&lt;/a&gt;, where the demos are interactive.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>codex</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Claude Code conversation history: where it lives, how to search it, how to get it back</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Tue, 29 Sep 2026 11:21:53 +0000</pubDate>
      <link>https://dev.to/heylittlepan/claude-code-conversation-history-where-it-lives-how-to-search-it-how-to-get-it-back-4lc8</link>
      <guid>https://dev.to/heylittlepan/claude-code-conversation-history-where-it-lives-how-to-search-it-how-to-get-it-back-4lc8</guid>
      <description>&lt;p&gt;You closed the terminal. The conversation where you and the agent worked out the migration plan is gone from the screen, and now you need it back.&lt;/p&gt;

&lt;p&gt;It isn't gone. Claude Code writes every conversation to your disk as it happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Where it lives:&lt;/strong&gt; &lt;code&gt;~/.claude/projects/&amp;lt;project&amp;gt;/&amp;lt;session-id&amp;gt;.jsonl&lt;/code&gt;, one folder per working directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reopen the last one here:&lt;/strong&gt; &lt;code&gt;claude --continue&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick an older one:&lt;/strong&gt; &lt;code&gt;claude --resume&lt;/code&gt;, or &lt;code&gt;/resume&lt;/code&gt; inside a running session. Press &lt;code&gt;Ctrl+A&lt;/code&gt; in the picker to see every project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search what was said:&lt;/strong&gt; the transcripts are JSONL, so &lt;code&gt;jq&lt;/code&gt; plus &lt;code&gt;awk&lt;/code&gt; works. There's a command below.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The catch:&lt;/strong&gt; Claude Code deletes transcripts older than 30 days by default. Raise &lt;code&gt;cleanupPeriodDays&lt;/code&gt; in &lt;code&gt;~/.claude/settings.json&lt;/code&gt; if you want to keep them longer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Codex and Grok Build work the same way with different paths and commands. Each has its own section below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where does Claude Code store conversation history?
&lt;/h2&gt;

&lt;p&gt;Each conversation is a file at &lt;code&gt;~/.claude/projects/&amp;lt;project&amp;gt;/&amp;lt;session-id&amp;gt;.jsonl&lt;/code&gt;. The &lt;code&gt;&amp;lt;project&amp;gt;&lt;/code&gt; folder name is your working directory with every non-alphanumeric character turned into &lt;code&gt;-&lt;/code&gt;, so a session started in &lt;code&gt;/Users/you/code/api&lt;/code&gt; lands in &lt;code&gt;~/.claude/projects/-Users-you-code-api/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each line in the file is one JSON object: a message you sent, a reply, a tool call, or some metadata. The format is internal to Claude Code and changes between releases, so treat it as something to read, not something to build on. For a readable copy of the current conversation, run &lt;code&gt;/export&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There's one more file worth knowing about: &lt;code&gt;~/.claude/history.jsonl&lt;/code&gt;. It holds every prompt you've typed, with the project and time. It's what the up arrow and &lt;code&gt;Ctrl+R&lt;/code&gt; read from, and the 30-day cleanup doesn't touch it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I reopen a closed Claude Code conversation?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Use it when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude --continue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want the most recent conversation in this directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude --resume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want to pick from a list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude --resume &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You named the session with &lt;code&gt;claude -n&lt;/code&gt; or &lt;code&gt;/rename&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude --resume &amp;lt;session-id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You have the ID. Works from any directory as of v2.1.223&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/resume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You're already in a session and want to switch&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The picker shows sessions from the current directory first. Press &lt;code&gt;Ctrl+A&lt;/code&gt; to widen it to every project on this machine, &lt;code&gt;Space&lt;/code&gt; to preview a session before opening it, and start typing to filter the list. &lt;code&gt;Ctrl+R&lt;/code&gt; renames the highlighted session, which makes it easier to find next time.&lt;/p&gt;

&lt;p&gt;If you pick a session from another project, Claude Code copies a &lt;code&gt;cd&lt;/code&gt; and resume command to your clipboard instead of opening it in the wrong directory.&lt;/p&gt;

&lt;p&gt;After a restart, when several sessions in different folders need to come back at once, see &lt;a href="https://ponymux.com/guides/resume-claude-code-codex-after-restart" rel="noopener noreferrer"&gt;How to pick up Claude Code and Codex sessions after a restart&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I search inside past Claude Code conversations?
&lt;/h2&gt;

&lt;p&gt;The picker works when you remember roughly which session it was. When all you remember is something that was said, search the files. This prints the date, who said it, and the start of each matching message. It needs &lt;code&gt;jq&lt;/code&gt;, which comes with macOS 15 and later. On older macOS, run &lt;code&gt;brew install jq&lt;/code&gt;; on Debian or Ubuntu, &lt;code&gt;sudo apt install jq&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"migration"&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; ~/.claude/projects/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.jsonl&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
    select(.type == "user" or .type == "assistant")
    | (.message.content
       | if type == "string" then .
         else map(select(.type == "text") | .text) | join(" ")
         end) as $text
    | "\(.timestamp[0:10])  \(.type): \t\($text | split("\n") | join(" "))"
  '&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nv"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'
    { i = index($0, "\t") }
    index(tolower(substr($0, i + 1)), tolower(ENVIRON["q"])) {
      print substr($0, 1, i - 1) substr($0, i + 1)
    }
  '&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-c1-160&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s2"&gt;"s|^|&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; .jsonl&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;  |"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first column is the session ID, so &lt;code&gt;claude --resume &amp;lt;session-id&amp;gt;&lt;/code&gt; takes you straight back. &lt;code&gt;jq&lt;/code&gt; turns each message into one line of plain text, and &lt;code&gt;awk&lt;/code&gt; looks for your query in that text only, ignoring case. The date and role columns aren't searched, so &lt;code&gt;q="user"&lt;/code&gt; finds messages that mention "user", not every message you sent. The &lt;code&gt;awk&lt;/code&gt; on macOS also ignores case for accented letters. On Debian and Ubuntu, the default &lt;code&gt;awk&lt;/code&gt; is &lt;code&gt;mawk&lt;/code&gt;, which ignores case only for ASCII letters, so type accented words the way they were written. Searching the raw files directly returns whole lines full of tool output and metadata, and misses queries with quotes or backslashes because JSON escapes them.&lt;/p&gt;

&lt;p&gt;If the transcript is already gone, you can still search your own prompts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.display'&lt;/span&gt; ~/.claude/history.jsonl | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-Fi&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"migration"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why did my Claude Code history disappear?
&lt;/h2&gt;

&lt;p&gt;Claude Code deletes transcripts, and a few related files, once they're older than &lt;code&gt;cleanupPeriodDays&lt;/code&gt;. The default is 30 days. The minimum is 1, and &lt;code&gt;0&lt;/code&gt; is rejected as invalid.&lt;/p&gt;

&lt;p&gt;To keep conversations longer, set it in &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cleanupPeriodDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It only protects conversations that haven't been deleted yet. Once a transcript is swept, Claude Code has no copy of it. A backup of your home folder, such as Time Machine, is the only way to get it back.&lt;/p&gt;

&lt;p&gt;Two other things look like lost history but aren't. The picker only shows the current directory until you press &lt;code&gt;Ctrl+A&lt;/code&gt;. And sessions started with &lt;code&gt;claude -p&lt;/code&gt; or the Agent SDK are left out of the picker; you can still open one with &lt;code&gt;claude --resume &amp;lt;session-id&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where is Codex CLI conversation history, and how do I search it?
&lt;/h2&gt;

&lt;p&gt;Codex stores each session as &lt;code&gt;~/.codex/sessions/YYYY/MM/DD/rollout-&amp;lt;timestamp&amp;gt;-&amp;lt;id&amp;gt;.jsonl&lt;/code&gt;. Sessions you archive with &lt;code&gt;codex archive&lt;/code&gt; move to &lt;code&gt;~/.codex/archived_sessions/&lt;/code&gt;, and &lt;code&gt;codex unarchive&lt;/code&gt; brings them back. Your prompts are also in &lt;code&gt;~/.codex/history.jsonl&lt;/code&gt;. Codex doesn't delete old sessions on a schedule.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Use it when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;codex resume --last&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want the most recent session in this directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;codex resume --last --all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want the most recent session from any directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;codex resume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want to pick from a list of sessions in this directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;codex resume --all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want the list across every directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;codex resume &amp;lt;id-or-name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You know which one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;codex fork&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want a copy to try another approach&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This searches messages in both folders. Codex logs grow large, so it takes longer than the Claude Code search; on about 7 GB of sessions it runs in roughly a minute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"migration"&lt;/span&gt;
find ~/.codex/sessions ~/.codex/archived_sessions &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.jsonl'&lt;/span&gt; | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; f&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
    select(.type == "response_item" and .payload.type == "message")
    | select(.payload.role == "user" or .payload.role == "assistant")
    | (.payload.content | map(.text // empty) | join(" ")) as $text
    | "\(.timestamp[0:10])  \(.payload.role): \t\($text | split("\n") | join(" "))"
  '&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nv"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$q&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'
    { i = index($0, "\t") }
    index(tolower(substr($0, i + 1)), tolower(ENVIRON["q"])) {
      print substr($0, 1, i - 1) substr($0, i + 1)
    }
  '&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-c1-160&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s2"&gt;"s|^|&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; .jsonl&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;  |"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex also saves context it adds for the agent as user messages, such as your &lt;code&gt;AGENTS.md&lt;/code&gt; and environment details. A word that appears in your &lt;code&gt;AGENTS.md&lt;/code&gt; can therefore match once in every session. Claude Code does the same with background task notifications. Skip those rows when you read the results.&lt;/p&gt;

&lt;p&gt;Codex has an experimental option that compresses sessions older than a week into &lt;code&gt;.jsonl.zst&lt;/code&gt;. It's off by default. If you turned it on, read those files with &lt;code&gt;zstd -dc &amp;lt;file&amp;gt;&lt;/code&gt; before piping them to &lt;code&gt;jq&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where is Grok Build conversation history, and how do I search it?
&lt;/h2&gt;

&lt;p&gt;Grok Build keeps each session in its own folder at &lt;code&gt;~/.grok/sessions/&amp;lt;folder&amp;gt;/&amp;lt;session-id&amp;gt;/&lt;/code&gt;. The folder name is your working directory, URL-encoded, so &lt;code&gt;/Users/you/code/api&lt;/code&gt; becomes &lt;code&gt;%2FUsers%2Fyou%2Fcode%2Fapi&lt;/code&gt;. Inside a session, &lt;code&gt;updates.jsonl&lt;/code&gt; is the conversation log and &lt;code&gt;summary.json&lt;/code&gt; holds the generated title and timestamps. If you set &lt;code&gt;GROK_HOME&lt;/code&gt;, sessions live under that folder instead of &lt;code&gt;~/.grok&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Use it when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;grok --resume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want the most recent session in this directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;grok --resume &amp;lt;id-or-title&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You know which one. Titles match without regard to case, so &lt;code&gt;/rename&lt;/code&gt; a session you'll want again&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/resume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You're already in Grok and want to pick from this directory's sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;grok sessions list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want the IDs, dates, and titles of this directory's sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Grok has search built in, in two places. In the &lt;code&gt;/resume&lt;/code&gt; picker, start typing: it filters by title and also searches what was said, with content matches under &lt;strong&gt;Extended search results&lt;/strong&gt;. From the shell, &lt;code&gt;grok sessions search "migration"&lt;/code&gt; matches titles and first prompts only, and only for the current directory.&lt;/p&gt;

&lt;p&gt;Grok doesn't delete old sessions on a schedule. A session stays until you remove it with &lt;code&gt;/delete&lt;/code&gt; or &lt;code&gt;grok sessions delete&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I search Claude Code, Codex, and Grok history without leaving the terminal?
&lt;/h2&gt;

&lt;p&gt;Yes, if the search lives where you already run the agents. The commands above work, and I used them for a while. What I kept wanting was to search while I was already in the terminal, and to jump from a result straight back into the session.&lt;/p&gt;

&lt;p&gt;That's what transcript search in &lt;a href="https://ponymux.com" rel="noopener noreferrer"&gt;PonyMux&lt;/a&gt; does. Press &lt;code&gt;⌘K&lt;/code&gt;, type what you remember, and the &lt;strong&gt;Transcripts&lt;/strong&gt; filter shows matching messages from Claude Code, Codex, and Grok together, with your search terms highlighted. Pick a result and resume that exact session, not just the latest one in that directory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhuv8aqcxjjqxajdojfqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhuv8aqcxjjqxajdojfqs.png" alt="Searching 'polish' — Terminal results and transcript matches appear together, with the matched conversation highlighted on the right." width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It searches what's on your disk, so the same limits apply. A transcript that Claude Code's cleanup already deleted can't be found, and raising &lt;code&gt;cleanupPeriodDays&lt;/code&gt; is still worth doing.&lt;/p&gt;

&lt;p&gt;For scopes, ranking, and managing the index, see the &lt;a href="https://ponymux.com/docs/search" rel="noopener noreferrer"&gt;Search docs&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/guides/claude-code-conversation-history" rel="noopener noreferrer"&gt;ponymux.com&lt;/a&gt;, where the demos are interactive.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>codex</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Search Your Claude Code Conversation History</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Tue, 22 Sep 2026 01:22:54 +0000</pubDate>
      <link>https://dev.to/heylittlepan/how-to-search-your-claude-code-conversation-history-3l8m</link>
      <guid>https://dev.to/heylittlepan/how-to-search-your-claude-code-conversation-history-3l8m</guid>
      <description>&lt;p&gt;You talked through an approach with your agent a few days ago. The agent explained the tradeoffs, you picked a direction, and it wrote the code. Now you need that reasoning again — maybe for a code review, maybe because you're hitting an edge case the original conversation anticipated.&lt;/p&gt;

&lt;p&gt;You know it's somewhere. Claude Code saves every conversation as JSONL under &lt;code&gt;~/.claude/projects/&lt;/code&gt;. Codex groups them by date under &lt;code&gt;~/.codex/sessions/&lt;/code&gt;. The full record is on your disk — your prompts, the agent's reasoning, every tool call. The problem isn't storage. It's retrieval.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can do today
&lt;/h2&gt;

&lt;p&gt;Claude Code's &lt;code&gt;--resume&lt;/code&gt; flag opens a session picker. You can scroll through recent sessions and select one to continue. It works when you remember roughly when the conversation happened and can recognize it in a list.&lt;/p&gt;

&lt;p&gt;It doesn't search content. If you're looking for "that conversation where we discussed the migration" and it happened across three sessions over two days, &lt;code&gt;--resume&lt;/code&gt; won't find it by topic.&lt;/p&gt;

&lt;p&gt;The common workaround is grep:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"migration"&lt;/span&gt; ~/.claude/projects/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works, technically. It also returns raw JSONL with tool-call metadata, system prompts, base64-encoded images, and content blocks nested several levels deep. Finding the actual conversation inside that output is its own project.&lt;/p&gt;

&lt;p&gt;There are third-party tools that index these files — CLI searchers, desktop apps, VS Code extensions. They're useful, but they all live outside the terminal where the conversations happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The conversations are on your disk. The search isn't.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What if search lived where you work?
&lt;/h2&gt;

&lt;p&gt;PonyMux 0.10 added full-text search across your Claude Code and Codex conversation history, built into the same &lt;code&gt;Cmd+K&lt;/code&gt; search you already use to find Terminals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjxe1o3ch5158hdg3khci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjxe1o3ch5158hdg3khci.png" alt="Search: Searching 'polish' — Terminal metadata results and transcript matches appear together, with the matched conversation highlighted on the right." width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Press &lt;code&gt;Cmd+K&lt;/code&gt;, type a keyword, and results appear in two layers. The first layer matches Terminal names and metadata — the same search from 0.9. The second layer searches conversation content: every prompt you've typed, every response the agent gave, every tool it used. Both layers share one search bar and one set of scope pills.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Transcripts&lt;/strong&gt; pill filters to just conversation matches. Each result shows the session title, a matched snippet, the agent type, and when it was last active. Select one and the right side shows the matched messages with your search terms highlighted.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the index works
&lt;/h2&gt;

&lt;p&gt;The first time you launch 0.10, PonyMux builds a full-text index from your transcript files. It takes around 10–30 seconds depending on how many conversations you have. After that, new conversations are picked up within seconds via filesystem events.&lt;/p&gt;

&lt;p&gt;The index uses FTS5 with trigram tokenization, which means it handles substring matches and CJK text without special configuration. A search for "migrat" finds "migration", "migrating", and "migrate". Chinese and Japanese terms match the same way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyle9fawam84twir1bzwr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyle9fawam84twir1bzwr.png" alt="Settings — Advanced: Transcript Index in Settings → Advanced. The status row shows how many sessions and messages are indexed." width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The index is a separate SQLite database (&lt;code&gt;search.db&lt;/code&gt;). It doesn't touch your metadata or your Terminals — you can rebuild it, pause it, or turn it off entirely from Settings → Advanced without affecting anything else.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your agents have been keeping a complete record of every conversation. Now you can actually use it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What changes about ended Terminals
&lt;/h2&gt;

&lt;p&gt;This one is a side effect that turned out to matter more than I expected.&lt;/p&gt;

&lt;p&gt;Before 0.10, selecting a sleeping Terminal showed a static screen capture — a frozen frame of whatever the terminal surface looked like when the process exited. It told you what was on screen, but not what the agent was thinking or what you'd asked it to do.&lt;/p&gt;

&lt;p&gt;Now it shows the last conversation. The actual messages — your prompt, the agent's response, the tools it called — rendered directly in the Terminal area. You can read the exchange, decide whether to resume, and choose Resume or Shell Only.&lt;/p&gt;

&lt;p&gt;The difference sounds small until you use it. A screenshot of a terminal says "the cursor was here." A conversation says "here's what we were working on and here's where we stopped."&lt;/p&gt;

&lt;h2&gt;
  
  
  Resume finds the right session
&lt;/h2&gt;

&lt;p&gt;One more thing that fell out of transcript search: when you find a Terminal through search and hit Resume, PonyMux targets the matched session, not the most recent one. If search found a conversation from three days ago, that's what resumes.&lt;/p&gt;

&lt;p&gt;A banner at the top shows the session name and date so you're never guessing which conversation you're about to continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The state of agent conversation search
&lt;/h2&gt;

&lt;p&gt;This is still early. Claude Code deletes transcripts older than 30 days by default, so the search window has a built-in limit. Codex compresses older files to &lt;code&gt;.zst&lt;/code&gt;, which PonyMux can't index. And the index itself is local — there's no cloud sync or cross-machine search.&lt;/p&gt;

&lt;p&gt;But for the conversations that are on your disk right now, having them searchable from the same place you run your agents changes the daily workflow more than I expected. I stopped grep-ing JSONL files on day two.&lt;/p&gt;

&lt;p&gt;For the full details — scopes, ranking, index management — see the &lt;a href="https://ponymux.com/docs/search" rel="noopener noreferrer"&gt;Search docs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Finding the right terminal in a room full of agents</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Mon, 21 Sep 2026 01:25:08 +0000</pubDate>
      <link>https://dev.to/heylittlepan/finding-the-right-terminal-in-a-room-full-of-agents-5986</link>
      <guid>https://dev.to/heylittlepan/finding-the-right-terminal-in-a-room-full-of-agents-5986</guid>
      <description>&lt;p&gt;I don't lose terminals when they're running. I lose them when I come back.&lt;/p&gt;

&lt;p&gt;An hour ago I had five agents working on different things. Now I'm staring at a sidebar of names, trying to remember which one was refactoring the middleware and which one was writing tests. The agent that needs my approval is somewhere in there. So is the one I forgot about entirely.&lt;/p&gt;

&lt;p&gt;PonyMux 0.9.0 is mostly about that moment. The moment you return. It adds &lt;code&gt;⌘K&lt;/code&gt; search to find the right Terminal by keyword, wake summaries that show what a sleeping Terminal was doing before you resume it, and cross-provider handoff to continue a conversation from Claude Code in Codex or vice versa.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does search actually find?
&lt;/h2&gt;

&lt;p&gt;Press &lt;code&gt;⌘K&lt;/code&gt; and the sidebar switches to a search view. Type a word — or several — and PonyMux filters your Terminals by name, prompt, recap, and the agent's last reply. Every word has to match somewhere across those fields.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fof3pz199oigtfhho55ut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fof3pz199oigtfhho55ut.png" alt="Search: Type 'polish' and every Terminal whose current session mentions it appears — with the match highlighted." width="750" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The scoping is deliberate. Three pills at the top — All, Terminals, Archive — let you narrow where you're looking. Trashed Terminals don't appear. And only the latest session per Terminal is searched, not the full history.&lt;/p&gt;

&lt;p&gt;That last part is a conscious tradeoff. Searching every historical session would return more results, but most of them would be stale. When I'm trying to find something, I almost always mean "the thing that's happening now," not "something an agent said three days ago." If I need the history, the Sessions panel is still there.&lt;/p&gt;

&lt;p&gt;Results are ranked by where the match lands — title first, then prompt, then recap — and boosted by recency.&lt;/p&gt;

&lt;p&gt;The result rows show matched text in context: title with highlights, a snippet from the matched field, the provider, the list path, and how long ago the session was active. Enough to recognize the right one without opening it first.&lt;/p&gt;

&lt;p&gt;Press Escape and you're back where you were. No state changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was that terminal doing again?
&lt;/h2&gt;

&lt;p&gt;Before 0.9.0, waking a sleeping Terminal was a small leap of faith. You'd see the last captured screen — a frozen frame of wherever the agent left off — and either resume immediately or type to start fresh.&lt;/p&gt;

&lt;p&gt;Now the empty area shows a short summary before you commit: the agent name, what it was working on, and when it was last active. If the transcript is still on disk, PonyMux can tell you what will resume before you press anything.&lt;/p&gt;

&lt;p&gt;If the transcript is gone — deleted, compressed, or moved — the Terminal says so and offers Shell Only instead of pretending everything is fine.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The point isn't automation. It's not having to wake something up just to find out what it was.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A related change: agents that were running when you quit PonyMux now appear in the Agents sidebar after restart. Previously, quitting cleared the Agents list and you had to scroll through All Terminals to find them. Now they're where you left them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I continue this in a different agent?
&lt;/h2&gt;

&lt;p&gt;Sometimes the right move is to switch providers. You started a task in Claude Code, realized it needs a different model, and want to pick it up in Codex. Or the other way around.&lt;/p&gt;

&lt;p&gt;Handoff does that. From the Sessions panel or the Inspector, select Handoff and PonyMux extracts the recent conversation — up to five turns, tool summaries, and a recap if one exists — into a Markdown file, then launches the target CLI with that file as context.&lt;/p&gt;

&lt;p&gt;The source session is untouched. You can still Resume it in its original provider. Handoff creates a new session, not a migration.&lt;/p&gt;

&lt;p&gt;It's intentionally lightweight. The handoff file is readable Markdown, not a binary blob or an API call. The target agent gets enough context to pick up the thread. It doesn't get the full transcript — that stays with the source provider — but it gets the shape of the conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else shipped
&lt;/h2&gt;

&lt;p&gt;A few smaller things in 0.9.0 that don't need their own section:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quieter updates.&lt;/strong&gt; Sparkle no longer interrupts with a modal dialog. A sidebar button appears when a new version is ready.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Help menu.&lt;/strong&gt; Documentation links, a feedback entry point, and a What's New item that links to the &lt;a href="https://ponymux.com/changelog/" rel="noopener noreferrer"&gt;changelog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The theme
&lt;/h2&gt;

&lt;p&gt;These features don't share a category. Search is navigation, wake summary is lifecycle, handoff is session management. But they share a user moment: you were away, and now you need to find your place again.&lt;/p&gt;

&lt;p&gt;That moment gets more frequent as agents get better. The better they are at working independently, the more time you spend away from them, and the harder it is to come back. The terminal that helps you return — not just the terminal that helps you start — is the one that scales with more agents.&lt;/p&gt;

&lt;p&gt;For details on search, see the &lt;a href="https://ponymux.com/docs/organize#search" rel="noopener noreferrer"&gt;Search section in the docs&lt;/a&gt;. For session operations, see &lt;a href="https://ponymux.com/docs/sessions" rel="noopener noreferrer"&gt;Sessions&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>ai</category>
      <category>devtools</category>
    </item>
    <item>
      <title>A markdown viewer, not a file browser</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Sat, 12 Sep 2026 15:42:02 +0000</pubDate>
      <link>https://dev.to/heylittlepan/a-markdown-viewer-not-a-file-browser-3o7n</link>
      <guid>https://dev.to/heylittlepan/a-markdown-viewer-not-a-file-browser-3o7n</guid>
      <description>&lt;p&gt;Agents write a lot of markdown. Plans, architecture decisions, handoff notes, CLAUDE.md. Most of the time I end up &lt;code&gt;cat&lt;/code&gt;-ing these files or switching to VS Code just to glance at one. The file never needed editing. I just needed to read it.&lt;/p&gt;

&lt;p&gt;So PonyMux added a markdown viewer to the Side Panel — read-only, scoped to &lt;code&gt;.md&lt;/code&gt; files, rendered through the terminal itself. Not a file browser. Not a step toward becoming an editor. A place to glance at the documents that coordinate work between you and your agents, without leaving the terminal.&lt;/p&gt;

&lt;p&gt;The distinction matters more than it sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not a file browser?
&lt;/h2&gt;

&lt;p&gt;The obvious feature request is a file tree. Several terminal products are heading that way — sidebar file explorers, inline previews, built-in editors. It's a natural direction. It's also a step toward becoming VS Code.&lt;/p&gt;

&lt;p&gt;That's the tension. Every feature like that makes a terminal more capable and more complicated. At some point you're not improving the terminal anymore. You're building a second development environment inside it.&lt;/p&gt;

&lt;p&gt;PonyMux has a principle called &lt;a href="https://ponymux.com/docs/philosophy#stay-small" rel="noopener noreferrer"&gt;Stay small&lt;/a&gt;: a feature belongs here when it makes terminal sessions easier to find, understand, continue, or enjoy. Otherwise, it probably belongs somewhere else.&lt;/p&gt;

&lt;p&gt;A file browser didn't pass that test. But there's a more interesting question underneath it: do you actually need to browse source code in your terminal mux?&lt;/p&gt;

&lt;p&gt;Agents are increasingly the ones reading and writing code. They navigate files, they make changes, they run tests. What &lt;em&gt;humans&lt;/em&gt; need to see more often are the documents that sit above the code — the plan the agent is following, the decision log it should respect, the README it just updated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Markdown is the handshake format between you and your agent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the file type worth supporting well. Not all files. This one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the viewer actually do?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fawylycvn3xn5m609gzes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fawylycvn3xn5m609gzes.png" alt="Files Panel: A Markdown file rendered in the Files panel, with back/forward navigation and pinned files." width="800" height="771"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a read-only Markdown renderer that lives in the Side Panel, next to Sessions. Press &lt;code&gt;⌥⌘F&lt;/code&gt; or click the toolbar button. It renders &lt;code&gt;.md&lt;/code&gt; files with styled headings, code blocks, tables, task lists, and inline images.&lt;/p&gt;

&lt;p&gt;There are three ways to open a file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Click a &lt;code&gt;file://&lt;/code&gt; link&lt;/strong&gt; in terminal output — if it points to a &lt;code&gt;.md&lt;/code&gt; file, PonyMux opens it in the viewer instead of Finder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;pony open &amp;lt;path&amp;gt;&lt;/code&gt;&lt;/strong&gt; from a script or agent — pushes the file into the panel programmatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The file picker&lt;/strong&gt; in the panel itself — standard open dialog, filtered to &lt;code&gt;.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Editing stays in your editor. This is for reading and confirming. The context menu has "Open with Default App" and "Reveal in Finder" for when you need to go deeper.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agents are doing more of the writing. What you need more of is a place to read.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Can agents open files for you?
&lt;/h2&gt;

&lt;p&gt;This is the part I'm most interested in. The viewer isn't just something you open manually — agents can push files into it.&lt;/p&gt;

&lt;p&gt;When an agent finishes writing a plan, it can run &lt;code&gt;pony open plan.md&lt;/code&gt; and the file appears in your Side Panel. A small toast shows who sent it — "Opened by Claude Code" or "Opened by Codex" — so you know why the panel popped up.&lt;/p&gt;

&lt;p&gt;The same thing happens with &lt;code&gt;file://&lt;/code&gt; links. If an agent prints a path to a markdown file in its output and you click it, the viewer catches it. No Finder window. No editor launch. Just the rendered file, right there beside the terminal.&lt;/p&gt;

&lt;p&gt;This flips the usual direction. Instead of you going to find the file, the file comes to you. The agent produces a document, and it shows up where you're already looking.&lt;/p&gt;

&lt;p&gt;It's a small workflow change. But after using it for a few days, going back to &lt;code&gt;cat DECISIONS.md&lt;/code&gt; feels like a step backwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it stay light?
&lt;/h2&gt;

&lt;p&gt;The viewer borrows a few ideas from a browser without trying to become one.&lt;/p&gt;

&lt;p&gt;Back and forward navigation works within the panel. Click a relative &lt;code&gt;.md&lt;/code&gt; link inside a rendered file and it navigates in place — no new window, no stack of tabs. The chevrons in the header track where you've been.&lt;/p&gt;

&lt;p&gt;You can pin up to ten files for quick access. Pinned files and recent files show up in the empty state when nothing is open. Each terminal maintains its own browsing history, so switching terminals swaps the context.&lt;/p&gt;

&lt;p&gt;The history is deliberately ephemeral. Quit PonyMux and it clears. The viewer doesn't track what you've read across sessions or build a project model out of your file visits. It's browsing state, not persistent data.&lt;/p&gt;

&lt;p&gt;One detail I like: the viewer renders through the terminal's own surface. Same font, same theme, same copy behavior. If you change your terminal theme, the viewer changes with it. It doesn't look like a different app was embedded beside your terminal — because it wasn't. File watching keeps it current: edit the file in your editor, the viewer refreshes automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Just enough, not everything
&lt;/h2&gt;

&lt;p&gt;There's a version of this feature that supports every file type, has syntax highlighting for source code, and lets you edit inline. That version would be genuinely useful. It would also mean PonyMux is now competing with the editor you already have.&lt;/p&gt;

&lt;p&gt;I'd rather keep the boundary. Agents are getting better at reading and writing code. The part where humans still need to look carefully is the coordination layer — the plans, the decisions, the context documents that tell the agent what to do and tell you what it did.&lt;/p&gt;

&lt;p&gt;A read-only markdown viewer is a small, specific answer to that. It doesn't try to replace your editor. It doesn't try to show you everything. It shows you the one format that matters most for the way agents and humans work together right now.&lt;/p&gt;

&lt;p&gt;For the full details — keyboard shortcuts, pinning, and how &lt;code&gt;pony open&lt;/code&gt; works from scripts — see the &lt;a href="https://ponymux.com/docs/workspace-navigation#files" rel="noopener noreferrer"&gt;Files section in the docs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>coding</category>
      <category>agents</category>
      <category>markdown</category>
    </item>
    <item>
      <title>One icon, three signals</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Sat, 12 Sep 2026 05:13:05 +0000</pubDate>
      <link>https://dev.to/heylittlepan/one-icon-three-signals-59ad</link>
      <guid>https://dev.to/heylittlepan/one-icon-three-signals-59ad</guid>
      <description>&lt;p&gt;Everyone's been talking about the iPhone Duo. The hinge, the cover screen, the price. But the detail that stuck with me was much smaller than all of that.&lt;/p&gt;

&lt;p&gt;In the corner of the cover screen, the three status bar icons that have lived side by side for almost twenty years—Wi-Fi, cellular, battery—got folded into one small circle. Outer ring for battery. Wi-Fi fan in the center. Four dots at the bottom for signal strength.&lt;/p&gt;

&lt;p&gt;The first wave of reactions was mostly "that's clever," and it is. But then the designers started arguing about whether it was actually &lt;em&gt;readable&lt;/em&gt;. That's where it got interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it works
&lt;/h2&gt;

&lt;p&gt;The reason the combined icon doesn't look like a mess is that the three signals use three different kinds of shape. Battery is a continuous arc. Wi-Fi is a symbol. Cellular is a row of dots. Arc, symbol, dots—they look fundamentally different from each other, so your eye can pick them apart even when they're sharing the same space.&lt;/p&gt;

&lt;p&gt;Apple didn't just make three icons smaller and cram them together. They found three visual channels that don't interfere, and layered them. The unfold animation makes this explicit: the circle splits apart, each piece stretches back into its original shape, and you can see exactly what was packed together. As someone put it: "the way the animation explains the design."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The trick isn't making things smaller. It's finding the channels that don't collide.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;The criticism that followed is worth taking seriously. A battery silhouette with a fill level is self-explanatory—you see the charge. A notched arc is a gauge you have to learn. Same with cellular: "three out of four bars" reads instantly, "three out of four dots" less so.&lt;/p&gt;

&lt;p&gt;Then there's the failure state. When all three signals are low, the arcs thin out, the dots get sparse, and the whole thing collapses into one vague shape. With separate icons you can see at a glance which one is in trouble. With the combined icon you have to look closer.&lt;/p&gt;

&lt;p&gt;But here's the part most coverage skipped: the combined icon only appears on the 5.4-inch cover screen. Unfold the phone, and iOS 27 reverts to the classic three. Control Center shows them separately too. Apple isn't proposing a new universal language—they're acknowledging a specific constraint, and accepting the tradeoff &lt;em&gt;there&lt;/em&gt; while keeping the old solution everywhere else.&lt;/p&gt;

&lt;p&gt;That's actually the most interesting design decision in the whole thing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The best design decision here wasn't the combined icon. It was choosing not to use it on the bigger screen.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A small related story
&lt;/h2&gt;

&lt;p&gt;I've been thinking about all of this because I ran into a version of the same problem while building &lt;a href="https://ponymux.com" rel="noopener noreferrer"&gt;PonyMux&lt;/a&gt;. Much smaller scale, totally different product, but the question was the same.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj2fopzni9e1ocodljau4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj2fopzni9e1ocodljau4.png" alt="Agent Status: PonyMux translates agent events into a small set of status indicators—visible in every row, scannable at a glance." width="576" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PonyMux has a sidebar with a list of terminal sessions. Each row needs to tell you three things: an emoji the user picked to label the session (like 🚀 or ✓), the runtime status (running, waiting, error), and whether the session is hibernating.&lt;/p&gt;

&lt;p&gt;The first version had all three, but in three different places. The emoji sat on the left. The status spinner sat on the trailing edge. And "zzz" for hibernation was inline in the subtitle, right after the process name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fntdl3buqmpdedia9c8jx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fntdl3buqmpdedia9c8jx.png" alt="PonyMux terminal row — early version with emoji on the left, zzz inline in the subtitle, and a status spinner on the trailing edge" width="616" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first consolidation: the emoji got a proper circular home on the left side, and the status indicator moved from the trailing edge into a corner badge on that same circle. The row went from three locations to two. But zzz was still sitting in the subtitle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvxema0hp5f98fsiy26gk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvxema0hp5f98fsiy26gk.png" alt="PonyMux terminal row — emoji moves into a circular medallion, status indicator becomes a corner badge, but zzz remains in the subtitle" width="604" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then zzz moved into the same corner badge spot. This worked because a sleeping session has no active status—the badge is always free when zzz needs it. They take turns. Never collide.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcssfm4q94qor4t305me6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcssfm4q94qor4t305me6.png" alt="PonyMux terminal row — zzz moves into the same corner badge position, three signals now share one 24-pixel circle" width="608" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three things, one 24-pixel circle. Each step was just asking: does this really need its own spot? And each time the answer was no, the row got quieter without losing anything.&lt;/p&gt;

&lt;p&gt;The reason this was easier than Apple's problem: the emoji is self-explanatory (the user chose it), and the corner badge dimensions are mutually exclusive—no "bad day" scenario where everything degrades at once. Different constraints, lower stakes. But the underlying question was the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  One more thought
&lt;/h2&gt;

&lt;p&gt;The iOS 27 icon is a good design. The criticism of it is also good criticism. That's not a contradiction—it's just how real tradeoffs work.&lt;/p&gt;

&lt;p&gt;Combining signals into one shape isn't always better than keeping them apart. It depends on the space, the signals, and the ways they can fail. On the cover screen, Apple decided the density was worth it. On the unfolded display, they decided it wasn't.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Density doesn't come from compression. It comes from discovering that your signals were never competing for the same visual channel in the first place.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Arc reads as quantity. Symbol reads as identity. Dots read as count. Three different questions your eye answers in three different ways—that's why they can share a circle. That's the part worth remembering: not the specific solution, but knowing how to look for channels that were already complementary.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ponymux.com/blog/one-icon-three-signals" rel="noopener noreferrer"&gt;ponymux.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>ios</category>
      <category>ux</category>
      <category>ui</category>
    </item>
  </channel>
</rss>
