<?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>A mental health feature for people who work with agents</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Sun, 18 Oct 2026 09:25:52 +0000</pubDate>
      <link>https://dev.to/heylittlepan/a-mental-health-feature-for-people-who-work-with-agents-3h4a</link>
      <guid>https://dev.to/heylittlepan/a-mental-health-feature-for-people-who-work-with-agents-3h4a</guid>
      <description>&lt;p&gt;It's late. The review agent has found one more thing: a boundary case in a regex. The coding agent fixes it, opens another PR, and the reviewer finds the next one. Some nights that's dozens of PRs, and none of them is wrong.&lt;/p&gt;

&lt;p&gt;I didn't want to scold anyone. I wanted to hit something.&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%2F5g14ylh72yoolslb5s0t.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%2F5g14ylh72yoolslb5s0t.png" alt="A terminal where an agent has just said " width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually wears me out?
&lt;/h2&gt;

&lt;p&gt;Not the big failures. A broken build is easy: you're angry for a minute and you fix it. These are the ones that wear me down.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The review that never ends.&lt;/strong&gt; One agent writes, another reviews, and the reviewer always has a nitpick. A person knows when to say "good enough." An agent forgets it's allowed to say no, and keeps polishing the same corner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The side quest.&lt;/strong&gt; Halfway through task A it trips over task B, and puts all its energy into B. A is forgotten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pulling teeth.&lt;/strong&gt; It stops at some boring little spot and tells me what it did, but not what comes next. I ask, it moves one step, it stops again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The silent decisions.&lt;/strong&gt; The work is done, and the choices it made along the way aren't mentioned. Ask, and you get a little more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these is a bug. That's why they're so tiring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why would a terminal need therapy?
&lt;/h2&gt;

&lt;p&gt;Plenty of tools help agents work better. I haven't found one that asks how the person on the other end feels at that moment.&lt;/p&gt;

&lt;p&gt;You can type "seriously?" into the prompt. It doesn't help. You can walk away, which is the right call, and not always possible.&lt;/p&gt;

&lt;p&gt;I wanted a third option: something you can do right now, with one click, that's a little funny. If a bad afternoon can at least be absurd, I can stay in the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's on the rack?
&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%2F3f3gv8fmxfs1k64qzyyb.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%2F3f3gv8fmxfs1k64qzyyb.png" alt="The Terminal Therapy rack opened from the sofa button in PonyMux's Inspector: Anger Management with Hammer, Pistol and Rocket Launcher, and Spells with Bless, Ignite and Freeze, plus a Sound effects switch." width="800" height="672"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the bottom left of the Inspector there's a sofa button. Click it and a rack opens: three weapons and three spells. Pick one and click the terminal. It's called Terminal Therapy. Here's each tool in action.&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%2Fihvoxqh4x7tr9x0e1i45.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%2Fihvoxqh4x7tr9x0e1i45.png" alt="The Hammer coming down on the terminal output, with a shock ring around the impact." width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hammer&lt;/strong&gt; lands right where you click. The text slips and cracks and the screen shakes, but nothing burns. It's the one for the fifth "You're absolutely right."&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%2Fpyyzx9oui4v8nkc8gnqn.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%2Fpyyzx9oui4v8nkc8gnqn.png" alt="The Pistol with its dashed aim line, and a small charred pit with a glowing ring where the shot landed." width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pistol&lt;/strong&gt; fires a short way ahead along a dashed aim line that follows the way you move the pointer. It leaves a small charred pit. It's what I'd type "seriously?" with.&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%2Fp0jb02243op46fbw2y85.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%2Fp0jb02243op46fbw2y85.png" alt="The Rocket Launcher, and the explosion it leaves in the terminal output: a bright core, a gold ring and flying debris." width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rocket Launcher&lt;/strong&gt; flies farther and blows a crater with a glowing rim. It needs a moment to reload, which is probably healthy. This is for when it rewrote the whole package. Again.&lt;/p&gt;

&lt;p&gt;You hold a weapon until you put it away. Spells are used once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the spells for?
&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%2Fa7c6ioo3irwnw36sw0bg.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%2Fa7c6ioo3irwnw36sw0bg.png" alt="The same terminal after Bless: the damage is gone and the text glows gold with a few sparks." width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bless&lt;/strong&gt; is my favorite. A column of light comes down, every mark you left is cleared, and the text glows gold for a few seconds. The practical part is that the screen is clean again. But I also think of it as a small superstition. You make a wish for the next run: first try, no surprises. I know it does nothing to the agent. I do it anyway.&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%2Flzbv81xnq405pgcjwshj.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%2Flzbv81xnq405pgcjwshj.png" alt="Ignite: a ring of fire spreading across the terminal text." width="800" height="349"&gt;&lt;/a&gt;&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%2Fnfyndnpa0mgdwqduyq81.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%2Fnfyndnpa0mgdwqduyq81.png" alt="Freeze: frost and cracked ice covering the terminal, the text turned ice blue." width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignite&lt;/strong&gt; and &lt;strong&gt;Freeze&lt;/strong&gt; don't mean anything. Sometimes you just want to burn the whole thing down, or freeze it right where it stands. Fire spreads from your click for about five seconds and leaves scorch marks. Frost covers the screen and thaws away by itself, leaving nothing behind. A new spell replaces the one still showing.&lt;/p&gt;

&lt;p&gt;Your turn: &lt;a href="https://ponymux.com/blog/a-mental-health-feature-for-people-who-work-with-agents?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=a-mental-health-feature-for-people-who-work-with-agents" rel="noopener noreferrer"&gt;the original post on ponymux.com&lt;/a&gt; has the real rack running in the page, and every tool works.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;Everything is drawn in PonyMux's own renderer, on top of the terminal's output.&lt;/p&gt;

&lt;p&gt;It's built on Ghostty's renderer, with a custom patch so the renderer knows where you clicked. That's why it's PonyMux-only. You can't just drop a shader into another terminal and get this.&lt;/p&gt;

&lt;p&gt;The damage stays after you put a weapon away. The × beside the sofa clears it, so does Bless, and so does restarting the terminal. Nothing is saved.&lt;/p&gt;

&lt;p&gt;Sounds are off by default. Turn them on at the bottom of the rack. If macOS has Reduce Motion on, nothing flies or shakes; the damage just appears.&lt;/p&gt;

&lt;p&gt;And if you keep firing for long enough, the terminal will eventually have something to say. I'll leave you to find it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Serious work should still feel alive. Even the bad afternoons.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything the tools do, one by one, is in the &lt;a href="https://ponymux.com/docs/terminal-therapy?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=a-mental-health-feature-for-people-who-work-with-agents" rel="noopener noreferrer"&gt;Terminal Therapy docs&lt;/a&gt;. PonyMux is free for macOS: &lt;a href="https://ponymux.com/download?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=a-mental-health-feature-for-people-who-work-with-agents" rel="noopener noreferrer"&gt;ponymux.com/download&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>mentalhealth</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Claude Code and Codex pets: how to get one for every session</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Fri, 16 Oct 2026 16:10:46 +0000</pubDate>
      <link>https://dev.to/heylittlepan/claude-code-and-codex-pets-how-to-get-one-for-every-session-4508</link>
      <guid>https://dev.to/heylittlepan/claude-code-and-codex-pets-how-to-get-one-for-every-session-4508</guid>
      <description>&lt;p&gt;Codex has pets in two places. In the ChatGPT desktop app, open &lt;strong&gt;Settings → Pets&lt;/strong&gt;, type &lt;code&gt;/pet&lt;/code&gt;, or press &lt;strong&gt;⌥Space&lt;/strong&gt; on macOS to show a floating pet. In an interactive Codex CLI session, type &lt;code&gt;/pets&lt;/code&gt; or &lt;code&gt;/pet&lt;/code&gt; to choose a terminal pet for that session. Claude Code and Grok Build have no built-in equivalent today.&lt;/p&gt;

&lt;p&gt;A pet is a small animated companion that shows what your agent is doing: working, waiting for you, done. It is a nice way to keep an eye on an agent without reading its output.&lt;/p&gt;

&lt;p&gt;Here is how to set one up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In the ChatGPT app:&lt;/strong&gt; type &lt;code&gt;/pet&lt;/code&gt;, choose &lt;strong&gt;Show pet&lt;/strong&gt; from the command menu, or press &lt;strong&gt;⌥Space&lt;/strong&gt; on macOS. Pick a built-in or custom pet in &lt;strong&gt;Settings → Pets&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In the Codex CLI:&lt;/strong&gt; type &lt;code&gt;/pets&lt;/code&gt; to pick one, &lt;code&gt;/pets &amp;lt;name&amp;gt;&lt;/code&gt; to choose it directly, or &lt;code&gt;/pets off&lt;/code&gt; to hide it. It needs iTerm2 3.6 or later, or a terminal with Kitty graphics or Sixel, and doesn't show in tmux or Zellij.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make your own:&lt;/strong&gt; in &lt;strong&gt;Settings → Pets&lt;/strong&gt;, click &lt;strong&gt;Create pet&lt;/strong&gt;. The app installs its bundled &lt;code&gt;hatch-pet&lt;/code&gt; skill and opens a chat where you describe the pet. It saves the pet to &lt;code&gt;~/.codex/pets/&amp;lt;name&amp;gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do Codex pets work?
&lt;/h2&gt;

&lt;p&gt;The pet plays an animation for the state of the chat: &lt;strong&gt;Running&lt;/strong&gt; while it works, &lt;strong&gt;Needs input&lt;/strong&gt; while it waits for an answer or an approval, &lt;strong&gt;Ready&lt;/strong&gt; when it finished and you haven't looked yet, and &lt;strong&gt;Blocked&lt;/strong&gt; when it failed. In the ChatGPT app it floats on screen above a small chat box, and &lt;strong&gt;Mini&lt;/strong&gt; shows the box without a pet. In the Codex CLI it sits in the terminal.&lt;/p&gt;

&lt;p&gt;A pet is two files in a folder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pet.json&lt;/code&gt;: the id, display name, description, and the sprite sheet's file name.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;spritesheet.webp&lt;/code&gt;: a grid of 192×208 pixel frames, eight columns wide, one row per animation. Nine rows cover idle, running right and left, waving, jumping, failed, waiting, working, and review. Pets made by the hatch-pet skill that ships with the ChatGPT app add two rows of poses for looking in 16 directions (11 rows, &lt;code&gt;spriteVersionNumber: 2&lt;/code&gt; in &lt;code&gt;pet.json&lt;/code&gt;); older pets have the nine rows only. Both kinds load.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do I make my own Codex pet?
&lt;/h2&gt;

&lt;p&gt;The ChatGPT app makes pets with OpenAI's &lt;code&gt;hatch-pet&lt;/code&gt; skill:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings → Pets&lt;/strong&gt; and click &lt;strong&gt;Create pet&lt;/strong&gt;. The app installs the bundled &lt;code&gt;hatch-pet&lt;/code&gt; skill and opens a chat.&lt;/li&gt;
&lt;li&gt;Describe the pet, or give it a picture: a photo of your dog works.&lt;/li&gt;
&lt;li&gt;The skill generates every animation row, checks the frames, and saves the folder under &lt;code&gt;${CODEX_HOME:-$HOME/.codex}/pets/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Back in &lt;strong&gt;Settings → Pets&lt;/strong&gt;, click the refresh button and pick the new pet.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Look at the result frame by frame before you keep it. Generated sheets can have a fifth leg in a pose, a size jump between rows, or leftover background color between the legs. The skill can repair a single row when you ask it to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened to Claude Code's /buddy?
&lt;/h2&gt;

&lt;p&gt;Claude Code shipped &lt;code&gt;/buddy&lt;/code&gt; on April 1, 2026, in version 2.1.89: a small character next to the input that hatched from your account and reacted while you worked. On April 9, version 2.1.97 removed it. Anthropic said it was a small April Fools feature, and typing &lt;code&gt;/buddy&lt;/code&gt; now says "Unknown command: /buddy". Claude Code has no pet today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can each session get a different pet?
&lt;/h2&gt;

&lt;p&gt;In the Codex CLI, yes: &lt;code&gt;/pets &amp;lt;name&amp;gt;&lt;/code&gt; chooses a pet for the current CLI session, and that pet reports the state of that session. The ChatGPT desktop pet is a floating companion for the app; when several chats are active, its activity tray lets you open the one that needs you. Claude Code and Grok Build have no built-in pets of their own.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ponymux.com" rel="noopener noreferrer"&gt;PonyMux&lt;/a&gt; gives every Terminal a persistent pet in one shared window. Each Terminal running Claude Code, Codex, or Grok gets a pet when you create it and keeps it, and the pets line up above the window. So a pet tells you which session it is as well as what it is doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Working:&lt;/strong&gt; the agent is running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Waiting, with a wave every few seconds:&lt;/strong&gt; it needs an answer or an approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A hop:&lt;/strong&gt; a turn just finished.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standing:&lt;/strong&gt; the agent is idle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failed:&lt;/strong&gt; it stopped on an error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click a pet to jump to its Terminal. Shell-only Terminals and ended sessions don't get a pet on stage. Pets need the Claude Code, Codex, or Grok integration, which you connect once from the bottom of the sidebar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I use the pet I hatched in PonyMux?
&lt;/h2&gt;

&lt;p&gt;Yes. PonyMux reads &lt;code&gt;~/.codex/pets/&lt;/code&gt;, so a pet you made with &lt;code&gt;hatch-pet&lt;/code&gt;, or downloaded, shows up next to the others. When ChatGPT is installed, its built-in pets are in the list too.&lt;/p&gt;

&lt;p&gt;You don't need any of that to get started. PonyMux ships with six ponies of its own, Mochi, Nyx, Opal, Pixel, Rex, and Mocha, so different Terminals get different pets without Codex or ChatGPT installed.&lt;/p&gt;

&lt;p&gt;If a pet in &lt;code&gt;~/.codex/pets/&lt;/code&gt; has the same id as one of the ponies, yours takes its place.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I choose a pet for a Terminal in PonyMux?
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;Settings → General → Pets&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Show a pet for every live session&lt;/strong&gt; turns pets on or off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Terminals get&lt;/strong&gt; chooses the pet for new Terminals: one pet, or &lt;strong&gt;Random&lt;/strong&gt; to spread them out.&lt;/li&gt;
&lt;li&gt;The row below says how many pets were found and where from. Click &lt;strong&gt;Rescan&lt;/strong&gt; after you add a pet to &lt;code&gt;~/.codex/pets/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To change one Terminal, open its Inspector. In the &lt;strong&gt;Pet&lt;/strong&gt; section, pick another pet from the menu, or remove the pet from that Terminal with the trash button that appears when you hover the row.&lt;/p&gt;

&lt;p&gt;For themes, cursor effects, and the rest of PonyMux's personal touches, see &lt;a href="https://ponymux.com/docs/personalize" rel="noopener noreferrer"&gt;Personalize PonyMux&lt;/a&gt;.&lt;/p&gt;




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

</description>
      <category>tutorial</category>
      <category>ai</category>
      <category>productivity</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Every link your agent gave you, and a rocket launcher for your terminal</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Mon, 12 Oct 2026 15:45:31 +0000</pubDate>
      <link>https://dev.to/heylittlepan/every-link-your-agent-gave-you-and-a-rocket-launcher-for-your-terminal-44kp</link>
      <guid>https://dev.to/heylittlepan/every-link-your-agent-gave-you-and-a-rocket-launcher-for-your-terminal-44kp</guid>
      <description>&lt;p&gt;Two hours into a Claude Code session, I want the PR it opened an hour ago. To check whether CI passed, or to merge it. The link is somewhere up there, between a few thousand lines of test output and three plans.&lt;/p&gt;

&lt;p&gt;So I scroll. Every time.&lt;/p&gt;

&lt;p&gt;PonyMux 0.13 keeps those links for you. The Inspector now lists the pull requests and links the agent gave you in the running conversation, newest first, with their real titles. A new Outputs section does the same for what the agent made: Artifacts, pages, Markdown plans, reports. And for the moments when the agent gets it badly wrong, there's Terminal Therapy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where did that PR link go?
&lt;/h2&gt;

&lt;p&gt;Open the Inspector next to any Terminal running Claude Code, Codex, or Grok. Under &lt;strong&gt;Pull Requests&lt;/strong&gt; you'll see this project's PRs and any PR the agent opened, even inside a retry loop or a heredoc. Everything else the agent linked to goes under &lt;strong&gt;Links&lt;/strong&gt;: docs, issues, dashboards, each with the site's icon and the page's title.&lt;/p&gt;

&lt;p&gt;Titles come from the pages themselves. With GitHub CLI installed, PRs in private repositories get their titles too, so you're not guessing between &lt;code&gt;#412&lt;/code&gt; and &lt;code&gt;#418&lt;/code&gt;. Issues the agent files with &lt;code&gt;gh issue create&lt;/code&gt; show up even when its reply doesn't mention them.&lt;/p&gt;

&lt;p&gt;The newest link is always on top. Click it and you're there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The link you need is usually the one from an hour ago.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened to the files the agent made?
&lt;/h2&gt;

&lt;p&gt;Agents make a lot of things now. A Claude Artifact with a review. A page Codex wrote. A &lt;code&gt;PLAN.md&lt;/code&gt;. An HTML report from a test run. Claude Code prints the Artifact link at the bottom of its reply, which works for the first one and stops working by the fifth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outputs&lt;/strong&gt; collects them in one list. Each item shows the title it declares, so five &lt;code&gt;index.html&lt;/code&gt; reports don't look the same. When Codex edits a page, it moves back to the top. Markdown opens in the Files panel next to the Terminal, HTML in your browser, everything else in Quick Look.&lt;/p&gt;

&lt;p&gt;None of this is stored. The lists live in memory for the running conversation, the same way the conversation itself does.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Terminal Therapy?
&lt;/h2&gt;

&lt;p&gt;Everyone who works with an agent knows the moment. Fourth try at the same fix, it breaks something else, and the agent is absolutely right again.&lt;/p&gt;

&lt;p&gt;Another angry prompt won't fix the build. The terminal gets a rocket launcher instead.&lt;/p&gt;

&lt;p&gt;At the bottom of the Inspector there's a weapon rack: a pistol, a hammer, a rocket launcher, and two spells, Ignite and Freeze. Pick one and click the Terminal. Blow up the test output. Smash it. Set it on fire.&lt;/p&gt;

&lt;p&gt;Then pick Bless and wish the next run luck. The light clears the damage, and you get back to work. Keep firing without cleaning up and you'll find out what happens at 128.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Serious work should still feel alive. Even the bad afternoons.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What else changed?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;When Claude Code moves a conversation to the background with &lt;code&gt;/bg&lt;/code&gt;, the Sessions panel says so and can bring it back, even after you restart PonyMux.&lt;/li&gt;
&lt;li&gt;Built-in ChatGPT pets show up again with the latest ChatGPT app.&lt;/li&gt;
&lt;li&gt;Selecting text in Codex copies it again.&lt;/li&gt;
&lt;li&gt;Crashes when resizing the window or switching Terminals are fixed.&lt;/li&gt;
&lt;li&gt;Animations follow your Reduce Motion setting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything Terminal Therapy does is in &lt;a href="https://ponymux.com/docs/terminal-therapy" rel="noopener noreferrer"&gt;Terminal Therapy&lt;/a&gt;, and the Inspector's new sections are in &lt;a href="https://ponymux.com/docs/workspace-navigation#inspector" rel="noopener noreferrer"&gt;Workspace and Navigation&lt;/a&gt;. For the full list, see the &lt;a href="https://ponymux.com/changelog" rel="noopener noreferrer"&gt;changelog&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/blog/links-outputs-and-terminal-therapy" 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>terminal</category>
      <category>codex</category>
    </item>
    <item>
      <title>How to preview Markdown files from Claude Code and Codex</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Fri, 09 Oct 2026 16:18:07 +0000</pubDate>
      <link>https://dev.to/heylittlepan/how-to-preview-markdown-files-from-claude-code-and-codex-2b2h</link>
      <guid>https://dev.to/heylittlepan/how-to-preview-markdown-files-from-claude-code-and-codex-2b2h</guid>
      <description>&lt;p&gt;Claude Code just wrote the plan to &lt;code&gt;PLAN.md&lt;/code&gt;, or Codex left a &lt;code&gt;HANDOFF.md&lt;/code&gt;. You &lt;code&gt;cat&lt;/code&gt; it and scroll through pound signs, asterisks, and pipes. The agents render Markdown in their own replies, but a file they write you read raw. A few ways to read it properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In the terminal:&lt;/strong&gt; &lt;code&gt;glow PLAN.md&lt;/code&gt; renders headings, lists, tables, and code right there. Install it with &lt;code&gt;brew install glow&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In an app:&lt;/strong&gt; &lt;code&gt;open PLAN.md&lt;/code&gt; opens it in whatever app handles &lt;code&gt;.md&lt;/code&gt; files on your Mac.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let the agent open it:&lt;/strong&gt; add a line to &lt;code&gt;AGENTS.md&lt;/code&gt; or &lt;code&gt;CLAUDE.md&lt;/code&gt; telling it to run &lt;code&gt;open&lt;/code&gt; on every Markdown file it writes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click it:&lt;/strong&gt; Claude Code prints file names as links. Cmd-click one to open the file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The catch:&lt;/strong&gt; each of these sends you somewhere else to read, and back again to reply.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do I read a Markdown file in the terminal?
&lt;/h2&gt;

&lt;p&gt;Use a Markdown renderer. &lt;a href="https://github.com/charmbracelet/glow" rel="noopener noreferrer"&gt;Glow&lt;/a&gt; is a common one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;glow
glow PLAN.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prints the file with styled headings, bullet lists, tables, and highlighted code blocks, then returns to the prompt. For a long file, &lt;code&gt;glow -p PLAN.md&lt;/code&gt; opens it in a pager you can scroll with the arrow keys and leave with &lt;code&gt;q&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Glow reads from a pipe too, so &lt;code&gt;cat NOTES.md | glow -&lt;/code&gt; works. It's the quickest way to read a plan without leaving the session's terminal, but it's a snapshot: when the agent edits the file again, run it again.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I open a Markdown file in an app?
&lt;/h2&gt;

&lt;p&gt;macOS has a command for that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open PLAN.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It opens the file in the app your Mac uses for &lt;code&gt;.md&lt;/code&gt; files, such as your editor or a Markdown app. To change which app that is, select any &lt;code&gt;.md&lt;/code&gt; file in Finder, press Cmd-I, pick an app under &lt;strong&gt;Open with&lt;/strong&gt;, and click &lt;strong&gt;Change All&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This works from anywhere, including from the agent itself, since it's an ordinary shell command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can the agent open the file for me?
&lt;/h2&gt;

&lt;p&gt;Yes. Agents read your project instructions at the start of every session, so one line is enough. Add it to &lt;code&gt;AGENTS.md&lt;/code&gt;, which Codex and Grok Build read, or to &lt;code&gt;CLAUDE.md&lt;/code&gt; for Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; After you write or update a Markdown plan or note, run &lt;span class="sb"&gt;`open &amp;lt;file&amp;gt;`&lt;/span&gt; so I can read it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From then on, when the agent writes &lt;code&gt;PLAN.md&lt;/code&gt;, it should finish by running &lt;code&gt;open PLAN.md&lt;/code&gt;, and the file comes up in your Markdown app. If both agents work in the project, put the line in &lt;code&gt;AGENTS.md&lt;/code&gt; and have &lt;code&gt;CLAUDE.md&lt;/code&gt; import it with &lt;code&gt;@AGENTS.md&lt;/code&gt;; see &lt;a href="https://ponymux.com/guides/hand-off-claude-code-to-codex#how-do-i-make-every-agent-follow-the-same-project-rules" rel="noopener noreferrer"&gt;How to hand off a task from Claude Code to Codex&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I click the file name in Claude Code's output?
&lt;/h2&gt;

&lt;p&gt;Yes. When Claude Code writes or edits a file, it prints the file name as a terminal link. In terminals that support links, such as Ghostty and iTerm2, hold Cmd and click the name, and the file opens in its default app.&lt;/p&gt;

&lt;p&gt;That's handy when the agent mentions a file in passing. You don't have to copy the path or switch to Finder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I read the file next to the agent's terminal?
&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;Files&lt;/strong&gt; panel that renders Markdown beside the Terminal: headings, code blocks, tables, task lists, and images. Press Cmd-Option-F to show it.&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%2F3q0vqa6bs83g9pkr64bd.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%2F3q0vqa6bs83g9pkr64bd.png" alt="PonyMux's Files panel rendering a Markdown file next to the Terminal, with back/forward navigation and a pin button." width="800" height="782"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;PonyMux's Files panel rendering a Markdown file next to the Terminal, with back/forward navigation and a pin button.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A file gets there three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cmd-click a link&lt;/strong&gt; to a &lt;code&gt;.md&lt;/code&gt; file in the terminal output, such as a file name Claude Code prints. It opens in the panel instead of another app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run &lt;code&gt;pony open PLAN.md&lt;/code&gt;&lt;/strong&gt; in a PonyMux Terminal. The agent can run it too: put &lt;code&gt;pony open &amp;lt;file&amp;gt;&lt;/code&gt; in the line above instead of &lt;code&gt;open &amp;lt;file&amp;gt;&lt;/code&gt;, and a brief note shows which agent opened the file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click a link inside a rendered file.&lt;/strong&gt; Relative links to other &lt;code&gt;.md&lt;/code&gt; files open in the panel, like a browser, with back and forward.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can pin up to 10 files. The panel is for reading; to edit, open the file in your editor from its context menu. For more on the panel and the &lt;code&gt;pony&lt;/code&gt; command, see &lt;a href="https://ponymux.com/docs/workspace-navigation#files" rel="noopener noreferrer"&gt;Workspace and Navigation&lt;/a&gt; and &lt;a href="https://ponymux.com/docs/pony-cli" rel="noopener noreferrer"&gt;pony CLI&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/guides/preview-markdown-files-claude-code-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>markdown</category>
    </item>
    <item>
      <title>Eight cursor effects you can try first, and a pony for every Terminal</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Thu, 08 Oct 2026 16:09:16 +0000</pubDate>
      <link>https://dev.to/heylittlepan/eight-cursor-effects-you-can-try-first-and-a-pony-for-every-terminal-25f0</link>
      <guid>https://dev.to/heylittlepan/eight-cursor-effects-you-can-try-first-and-a-pony-for-every-terminal-25f0</guid>
      <description>&lt;p&gt;Most of a day at the terminal is the same keys again and again: &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt;, &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;G&lt;/code&gt;. The work matters. The keystrokes don't feel like much. I wanted them to feel a little like casting a spell, where every jump leaves a spark behind.&lt;/p&gt;

&lt;p&gt;PonyMux 0.12 adds four new cursor effects, eight in all, and Settings now plays the one you select in a live terminal before you pick it. Six ponies also ship with the app now, so each Claude Code, Codex, or Grok session gets its own pet without installing anything else.&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%2Ffbon2mb11cqofzt9lqtj.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%2Ffbon2mb11cqofzt9lqtj.png" alt="Cursor Lightning in PonyMux: a bolt from where the cursor was to where it lands." width="800" height="653"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Cursor Lightning in PonyMux: a bolt from where the cursor was to where it lands.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the new cursor effects?
&lt;/h2&gt;

&lt;p&gt;Comet, Sparks, Afterimage, and Lightning join Warp, Tail, Sweep, and Ripple. I wrote the four new ones to look different from each other, not as four takes on the same smear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Comet&lt;/strong&gt; draws a glowing streak that tapers toward where the cursor came from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sparks&lt;/strong&gt; throws sparks along the jump, and they fall as they fade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Afterimage&lt;/strong&gt; leaves a few fading copies of the cursor along the way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightning&lt;/strong&gt; is a quick bolt from the old spot to the new one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of them skip short moves, so typing doesn't set them off. Ripple, Comet, Sparks, and Lightning are now drawn in your theme's accent color, so they fit whatever theme you use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every jump can leave a little magic behind.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How does the live preview work?
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;Settings → Terminal → Screen Effect&lt;/strong&gt; and click an effect. Under the list is a real terminal, not a recording: same engine as your Terminals, with your font, cursor, and theme. It types a few lines of code and jumps around them the way vim does, &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;G&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt;, so you see the effect on the moves you actually make.&lt;/p&gt;

&lt;p&gt;Ripple only reacts when the cursor changes shape, so for Ripple the preview switches between insert and normal mode instead. That's also why Ripple got bigger and longer in this release: it used to be a faint gray ring that was easy to miss on dark themes. If Reduce Motion is on, the preview waits for you to press play.&lt;/p&gt;

&lt;p&gt;The setting is the default for new Terminals. Each Terminal can still have its own effect from its action menu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why six ponies?
&lt;/h2&gt;

&lt;p&gt;Until now PonyMux shipped one pet, Mochi. Without ChatGPT or your own pets in &lt;code&gt;~/.codex/pets/&lt;/code&gt;, every Terminal got Mochi, and a row of identical ponies over the window doesn't tell you which session is which.&lt;/p&gt;

&lt;p&gt;Now there are six: Mochi, Nyx, Opal, Pixel, Rex, and Mocha. New Terminals pick one at random, or the one you choose in &lt;strong&gt;Settings → General → Pets&lt;/strong&gt;.&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%2Flscc2hr0f6yh7qojlaa1.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%2Flscc2hr0f6yh7qojlaa1.png" alt="Settings → General → Pets in PonyMux 0.12: pick one of six ponies for new Terminals, or Random." width="799" height="565"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Settings → General → Pets in PonyMux 0.12: pick one of six ponies for new Terminals, or Random.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What else is smoother?
&lt;/h2&gt;

&lt;p&gt;A lot of small waits moved off the main thread, so the window doesn't pause on them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Waking a sleeping Terminal, resuming, forking, and handing off used to read the conversation file while you waited. On long Codex sessions that took up to 0.3 s.&lt;/li&gt;
&lt;li&gt;Startup does its setup work in the background, and a lock held by another PonyMux can no longer hang the launch.&lt;/li&gt;
&lt;li&gt;Markdown files with large images render in the background. Changing the column width or the theme re-renders up to 20× faster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reopening a Markdown file now picks up images that changed on disk, and VoiceOver reads the name of every switch in Settings.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Repetitive work doesn't have to feel repetitive. A bit of play in every move goes a long way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For every effect and pet setting, see &lt;a href="https://ponymux.com/docs/personalize" rel="noopener noreferrer"&gt;Personalize PonyMux&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/blog/cursor-effects-and-six-ponies" 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>terminal</category>
    </item>
    <item>
      <title>How to keep your Mac awake for Claude Code and Codex</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Wed, 07 Oct 2026 16:39:26 +0000</pubDate>
      <link>https://dev.to/heylittlepan/how-to-keep-your-mac-awake-for-claude-code-and-codex-n2n</link>
      <guid>https://dev.to/heylittlepan/how-to-keep-your-mac-awake-for-claude-code-and-codex-n2n</guid>
      <description>&lt;p&gt;You leave Claude Code running, lock the screen, and go to lunch. Later you check in from your phone, and the session doesn't answer: the Mac went to sleep. Locking wasn't the problem. Locked, the Mac keeps running everything. Idle sleep is what pauses the agent.&lt;/p&gt;

&lt;p&gt;Each agent keeps the Mac awake only while it's working on a turn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; runs &lt;code&gt;caffeinate -i&lt;/code&gt; while a turn is running. It lets go while it waits for your approval and after the turn ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex:&lt;/strong&gt; off by default. Turn on &lt;strong&gt;Prevent sleep while running&lt;/strong&gt; in &lt;code&gt;/experimental&lt;/code&gt;. It also covers only a running turn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grok Build:&lt;/strong&gt; keeps the display awake during a turn (&lt;code&gt;sleep_prevention&lt;/code&gt;, on by default) and releases it when the turn ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Between turns:&lt;/strong&gt; keep the Mac awake yourself with &lt;code&gt;caffeinate -i&lt;/code&gt;, or the power setting in System Settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The catch:&lt;/strong&gt; none of this survives closing the lid or choosing Sleep, unless the Mac runs with the lid closed on an external display.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Does locking my Mac stop Claude Code or Codex?
&lt;/h2&gt;

&lt;p&gt;No. Locking the screen, or letting the display turn off, leaves every process running. An agent halfway through a task carries on.&lt;/p&gt;

&lt;p&gt;Sleep is different. When the Mac sleeps, processes pause and the network goes down. A request that was on its way to the model can fail, and anything that connects to the Mac from outside can't reach it: Claude Code's remote control from the phone app, an SSH session, a tunnel. When the Mac wakes, the agent picks up where it paused, and you may need to tell it to continue if a request failed.&lt;/p&gt;

&lt;p&gt;So the question isn't whether the screen is locked. It's whether the Mac is allowed to go to sleep while you're away.&lt;/p&gt;

&lt;h2&gt;
  
  
  When do Claude Code, Codex, and Grok keep the Mac awake on their own?
&lt;/h2&gt;

&lt;p&gt;Only while a turn is running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; starts &lt;code&gt;caffeinate -i&lt;/code&gt; when it begins working and stops it when the turn ends or when it stops to ask for your approval. So if it's waiting on a permission prompt, the Mac can fall asleep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt; has the same idea as an experimental feature, off by default. Type &lt;code&gt;/experimental&lt;/code&gt; and turn on &lt;strong&gt;Prevent sleep while running&lt;/strong&gt;, or set it 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;[features]&lt;/span&gt;
&lt;span class="py"&gt;prevent_idle_sleep&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Grok Build&lt;/strong&gt; keeps the display awake while the agent works and releases it when the turn ends. It's on by default; to turn it off, set this in &lt;code&gt;~/.grok/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;[ui.notifications]&lt;/span&gt;
&lt;span class="py"&gt;sleep_prevention&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;None of them keep the Mac awake between turns. That's exactly when you're waiting to send the next message, from the keyboard or from your phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I keep my Mac awake between turns?
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;caffeinate&lt;/code&gt;, which ships with macOS. &lt;code&gt;-i&lt;/code&gt; stops idle sleep and lets the display sleep and lock as usual:&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;# For as long as this agent runs&lt;/span&gt;
caffeinate &lt;span class="nt"&gt;-i&lt;/span&gt; claude

&lt;span class="c"&gt;# For two hours, in the background&lt;/span&gt;
caffeinate &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 7200 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first form lasts exactly as long as the agent: when you quit Claude Code, normal sleep comes back. The same works with &lt;code&gt;codex&lt;/code&gt; or &lt;code&gt;grok&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To keep a MacBook awake whenever it's plugged in, open &lt;strong&gt;System Settings → Battery → Options&lt;/strong&gt; and turn on &lt;strong&gt;Prevent automatic sleeping on power adapter when the display is off&lt;/strong&gt;. That's a standing change, so remember to undo it if you only needed it for one evening.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I tell what's keeping my Mac awake?
&lt;/h2&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pmset &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;sleep&lt;/code&gt; line names the apps holding the Mac awake right now, for example &lt;code&gt;sleep prevented by caffeinate&lt;/code&gt;. For the full list, with what each one is preventing, run &lt;code&gt;pmset -g assertions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is a quick way to check before you leave. If the line doesn't name anything and the agent is between turns, the Mac will sleep on its normal schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when I close the lid?
&lt;/h2&gt;

&lt;p&gt;Closing the lid puts a MacBook to sleep, whatever &lt;code&gt;caffeinate&lt;/code&gt;, the agents, or the power settings say. Choosing &lt;strong&gt;Sleep&lt;/strong&gt; from the Apple menu does the same.&lt;/p&gt;

&lt;p&gt;The exception is running with the lid closed on purpose: with the Mac on power and connected to an external display, keyboard, and mouse, closing the lid keeps it awake. Without that setup, keep the lid open while you need the agent reachable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I keep the Mac awake with one click?
&lt;/h2&gt;

&lt;p&gt;Yes. In &lt;a href="https://ponymux.com" rel="noopener noreferrer"&gt;PonyMux&lt;/a&gt;, click the coffee cup at the bottom of the sidebar. It turns accent-colored, and its tooltip reads &lt;strong&gt;Keep Awake (On)&lt;/strong&gt;.&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%2Fwxj49kyp3z6bbjtz2ore.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%2Fwxj49kyp3z6bbjtz2ore.png" alt="The bottom of PonyMux's sidebar with Keep Awake on: the coffee cup is highlighted." width="400" height="82"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The bottom of PonyMux's sidebar with Keep Awake on: the coffee cup is highlighted.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While it's on, PonyMux keeps the Mac from idle sleep, including between turns and while an agent waits for you. The display can still turn off and lock. It doesn't override closing the lid or choosing Sleep, and it has no timer: it stays on until you click the cup again. Turn it off when you're done so the Mac can go back to saving energy.&lt;/p&gt;

&lt;p&gt;For the rest of PonyMux's power settings, see &lt;a href="https://ponymux.com/docs/settings-accessibility" rel="noopener noreferrer"&gt;Settings and Accessibility&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/guides/keep-mac-awake-claude-code-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>macos</category>
    </item>
    <item>
      <title>How to check your Claude Code and Codex usage limits</title>
      <dc:creator>Little Pan</dc:creator>
      <pubDate>Mon, 05 Oct 2026 16:31:03 +0000</pubDate>
      <link>https://dev.to/heylittlepan/how-to-check-your-claude-code-and-codex-usage-limits-34mf</link>
      <guid>https://dev.to/heylittlepan/how-to-check-your-claude-code-and-codex-usage-limits-34mf</guid>
      <description>&lt;p&gt;You're halfway through a refactor when the agent stops: limit reached, back in three hours. Each tool shows how close you are, if you know where to look:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; type &lt;code&gt;/usage&lt;/code&gt;. It shows the current 5-hour session, the current week, and a weekly limit for one model, each as "% used" with the time it resets. Subscription plans only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex:&lt;/strong&gt; type &lt;code&gt;/status&lt;/code&gt;. The card shows your limits, such as the 5-hour and weekly ones, as "% left" with the reset time. You need to be signed in with ChatGPT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grok Build:&lt;/strong&gt; type &lt;code&gt;/usage&lt;/code&gt;. The &lt;strong&gt;Usage limit&lt;/strong&gt; tab shows your weekly or monthly limit as a percentage used and the reset date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep it on screen:&lt;/strong&gt; Claude Code and Codex can show the limits in their status line all the time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The catch:&lt;/strong&gt; each tool shows only its own limits, from inside a session. Codex counts what's left; Claude Code and Grok count what's used.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do I check my Claude Code usage limit?
&lt;/h2&gt;

&lt;p&gt;Inside a 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;/usage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code opens its settings on the &lt;strong&gt;Usage&lt;/strong&gt; tab. You'll see a bar for each window, with the share used and when it resets, in your local time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Current session:&lt;/strong&gt; the 5-hour window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current week (all models):&lt;/strong&gt; the 7-day window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current week&lt;/strong&gt; for one model, when your plan has a separate limit for it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below that is &lt;strong&gt;Usage credits&lt;/strong&gt;. With credits on, Claude Code keeps working after you hit a limit instead of stopping; &lt;code&gt;/usage-credits&lt;/code&gt; turns them on or asks your admin.&lt;/p&gt;

&lt;p&gt;The numbers are fetched when you open the tab, so they're current. &lt;code&gt;/usage&lt;/code&gt; also answers to &lt;code&gt;/cost&lt;/code&gt; and &lt;code&gt;/stats&lt;/code&gt;. If you use an API key instead of a subscription, it says usage limits are only available for subscription plans. &lt;code&gt;/status&lt;/code&gt; shows your account and model, not your limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I check my Codex usage limit?
&lt;/h2&gt;

&lt;p&gt;Inside a 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;/status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex prints a card with the model, folder, and account, followed by one row per limit, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Weekly limit:  [████████████████████] 99% left (resets 21:18 on 9 Oct)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rows appear only for the windows your plan has: a 5-hour limit, a weekly one, sometimes daily or monthly, and separate rows for models with their own limit. A &lt;strong&gt;Credits&lt;/strong&gt; row shows up if you have credits. Codex counts down: "99% left" means you've used 1%.&lt;/p&gt;

&lt;p&gt;The numbers come with Codex's responses. If they're more than 15 minutes old, &lt;code&gt;/status&lt;/code&gt; says the limits may be stale; send a message to refresh them. The card also links to &lt;a href="https://chatgpt.com/codex/settings/usage" rel="noopener noreferrer"&gt;chatgpt.com/codex/settings/usage&lt;/a&gt; for the account view.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/usage&lt;/code&gt; is a different command in Codex. It charts your recent token use rather than your limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I check my Grok Build usage limit?
&lt;/h2&gt;

&lt;p&gt;Inside a 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;/usage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A window opens with three tabs: &lt;strong&gt;Context usage&lt;/strong&gt;, &lt;strong&gt;Usage limit&lt;/strong&gt;, and &lt;strong&gt;Session info&lt;/strong&gt;. Press Tab to switch. The &lt;strong&gt;Usage limit&lt;/strong&gt; tab shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weekly limit&lt;/strong&gt; or &lt;strong&gt;Monthly limit&lt;/strong&gt;, depending on your billing period.&lt;/li&gt;
&lt;li&gt;A bar with the percentage used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resets:&lt;/strong&gt; the date and time it starts over.&lt;/li&gt;
&lt;li&gt;Any prepaid credits, then this session's token use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grok fetches the numbers when you open the window. On a team plan it says usage limits are managed by your team. &lt;code&gt;/usage&lt;/code&gt; also answers to &lt;code&gt;/cost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From the shell, &lt;code&gt;grok usage &amp;lt;session-id&amp;gt;&lt;/code&gt; prints one session's tokens and cost as JSON. It doesn't show how much of your limit is left.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I keep my usage visible while I work?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; passes rate limits to your status line command. Add the command 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;"statusLine"&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;"~/.claude/statusline.sh"&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;Save this as &lt;code&gt;~/.claude/statusline.sh&lt;/code&gt;. It reads the JSON with &lt;code&gt;jq&lt;/code&gt;; if &lt;code&gt;jq --version&lt;/code&gt; says the command isn't found, install it first, for example with &lt;code&gt;brew 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="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;five&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.rate_limits.five_hour.used_percentage // empty'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;week&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.rate_limits.seven_day.used_percentage // empty'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$five&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'5h %.0f%%'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$five&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$week&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'  7d %.0f%%'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$week&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then make it executable with &lt;code&gt;chmod +x ~/.claude/statusline.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The limits are included for Pro and Max subscribers, or behind a gateway that sets a spend limit; on other plans the line stays empty. They come from your last response, so they appear after the first message and update as you go. Or type &lt;code&gt;/statusline&lt;/code&gt; and describe what you want; Claude Code writes the script for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt; has &lt;code&gt;/statusline&lt;/code&gt; to pick items, or add them 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;status_line&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"five-hour-limit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"weekly-limit"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each item is hidden when your plan doesn't have that window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grok Build's&lt;/strong&gt; status line script gets token and cost totals, but not your limit. Use &lt;code&gt;/usage&lt;/code&gt; for that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are my limits different in each tool?
&lt;/h2&gt;

&lt;p&gt;They're separate plans with separate rules. Claude Code has a 5-hour window and a weekly one, plus a weekly limit for some models. Codex shows whichever windows your plan has: a 5-hour one, a weekly one, and on some plans daily or monthly. Grok Build counts by week or by month, depending on how you're billed.&lt;/p&gt;

&lt;p&gt;They also count in different directions. Claude Code and Grok show how much you've used. Codex shows how much is left. "30%" in Claude Code is close to "70% left" in Codex.&lt;/p&gt;

&lt;p&gt;Hitting one tool's limit doesn't touch the others. When Claude Code runs out mid-task, you can carry on in Codex or Grok Build; 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;h2&gt;
  
  
  Can I see all three limits in one place?
&lt;/h2&gt;

&lt;p&gt;Yes. In &lt;a href="https://ponymux.com/" rel="noopener noreferrer"&gt;PonyMux&lt;/a&gt;, click the link button at the bottom of the sidebar to open &lt;strong&gt;Agent Integrations&lt;/strong&gt;. Each connected agent has a card with its usage bars: the share used and how long until each window resets. The numbers refresh every three minutes while the panel is open.&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%2Fttt3l5nszfzod1tcohsm.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%2Fttt3l5nszfzod1tcohsm.png" alt="PonyMux's Agent Integrations panel: a card each for Claude Code, Codex, and Grok, with usage bars and reset times." width="568" height="976"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;PonyMux's Agent Integrations panel: a card each for Claude Code, Codex, and Grok, with usage bars and reset times.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each agent's numbers come from where that agent keeps them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; PonyMux sends one tiny request with your Claude Code sign-in and reads the 5-hour and 7-day usage it reports back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex:&lt;/strong&gt; the same usage service Codex uses, with its 5-hour, daily, and weekly windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grok Build:&lt;/strong&gt; the last billing entry in Grok's own log, so it's as fresh as your last Grok turn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You connect each agent from the same panel. For what else the connection adds, see &lt;a href="https://ponymux.com/docs/integrations" rel="noopener noreferrer"&gt;Agent Integrations&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ponymux.com/guides/check-claude-code-codex-usage-limits" 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>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;Each agent can tell you when it needs 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;Grok Build:&lt;/strong&gt; notifications are on by default too, also only while the terminal isn't in front. Tune them under &lt;code&gt;[ui.notifications]&lt;/code&gt; in &lt;code&gt;~/.grok/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, Codex, and Grok 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;Local 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;&lt;strong&gt;Grok Build&lt;/strong&gt; sends a notification when a turn finishes and when it needs approval. Like Claude Code, it goes through your terminal: a desktop notification in iTerm2, Ghostty, kitty, and WezTerm, the bell in Apple Terminal. It also waits until the terminal has been in the background for a few seconds. The settings live in &lt;code&gt;~/.grok/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;[ui.notifications]&lt;/span&gt;
&lt;span class="py"&gt;events&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"turn_complete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"approval_required"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;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, "never" to turn them off&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three 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. All three 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;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GROK_HOOK_EVENT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; Grok &lt;span class="c"&gt;# Grok runs the Claude Code hook too&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;Local 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;p&gt;Grok Build needs no hook file of its own. It also runs the hooks in &lt;code&gt;~/.claude/settings.json&lt;/code&gt;, so the Claude Code hook above already fires in Grok sessions. Grok sets &lt;code&gt;GROK_HOOK_EVENT&lt;/code&gt; when it runs a hook, and the line in the script that checks it makes those notifications say "Grok" instead of "Claude Code". To turn off Grok's built-in notification, set &lt;code&gt;condition = "never"&lt;/code&gt; under &lt;code&gt;[ui.notifications]&lt;/code&gt;.&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, Codex, or Grok 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;/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, Codex, or Grok 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, Codex, or Grok, across every project and List." width="800" height="580"&gt;&lt;/a&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, Codex, or Grok 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, Codex, and Grok Build 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;, &lt;code&gt;codex resume --last&lt;/code&gt;, or &lt;code&gt;grok --continue&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, Codex, and Grok Build. 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;span class="c"&gt;# Grok Build&lt;/span&gt;
grok &lt;span class="nt"&gt;--continue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each picks 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;, &lt;code&gt;codex resume&lt;/code&gt;, or &lt;code&gt;/resume&lt;/code&gt; inside Grok. 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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Grok Build: the 10 most recent sessions, without subagents' sessions&lt;/span&gt;
&lt;span class="nv"&gt;subagents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;find ~/.grok/sessions &lt;span class="nt"&gt;-mindepth&lt;/span&gt; 4 &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 4 &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s1"&gt;'*/subagents/*'&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; ~/.grok/sessions/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;/summary.json | &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;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.info.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="si"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$subagents&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qx&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;continue
  &lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'"cd \(.info.cwd | @sh) &amp;amp;&amp;amp; grok --resume \(.info.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="k"&gt;done&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-10&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;These commands read each tool's session files directly. That format is internal and can change between releases, so treat them as a convenience, not an interface. Grok keeps a subagent's work as a session of its own next to the main one, which is why its command skips those. If you set &lt;code&gt;GROK_HOME&lt;/code&gt;, use it in place of &lt;code&gt;~/.grok&lt;/code&gt;. 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. All three 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, run &lt;code&gt;codex resume --all&lt;/code&gt;, or open &lt;code&gt;/resume&lt;/code&gt; in Grok from each project folder. The list above is faster when you want several sessions back at once.&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 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;Grok Build, inside a session:&lt;/strong&gt; &lt;code&gt;/fork&lt;/code&gt;, which can also put the fork in its own git worktree. From the shell: &lt;code&gt;grok --resume &amp;lt;session-id&amp;gt; --fork-session&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;
  
  
  How do I fork a Grok Build 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;/fork --worktree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grok copies the conversation into a new session and switches you to it. With &lt;code&gt;--worktree&lt;/code&gt;, the fork runs in a new git worktree under &lt;code&gt;~/.grok/worktrees/&lt;/code&gt;, and Grok copies your uncommitted changes into it, so the fork starts with the same files you have. The 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;code&gt;--no-worktree&lt;/code&gt; keeps the fork in the current directory. With neither flag, Grok asks each time; &lt;code&gt;fork_worktree_mode&lt;/code&gt; under &lt;code&gt;[hints]&lt;/code&gt; in &lt;code&gt;~/.grok/config.toml&lt;/code&gt; sets the default. Anything you type after the flags becomes the fork's first prompt, as in &lt;code&gt;/fork --worktree try an event queue instead&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Grok prints the new session's ID next to the one it came from. &lt;code&gt;/dashboard&lt;/code&gt; switches between the two, and &lt;code&gt;grok --resume &amp;lt;session-id&amp;gt;&lt;/code&gt; reopens either one later.&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;
grok &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;
grok &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;&lt;code&gt;--fork-session&lt;/code&gt; can't be combined with &lt;code&gt;--worktree&lt;/code&gt;. To fork into a worktree from the shell, create one first with &lt;code&gt;cd "$(grok worktree create try-event-queue)"&lt;/code&gt;, then run the resume there.&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. Grok's &lt;code&gt;/fork --worktree&lt;/code&gt; is the exception: it copies uncommitted changes into the new worktree, so you can skip the commit there. Like Codex's, its worktree starts on a detached HEAD, so create a branch in it before committing. 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;li&gt;Grok Build: &lt;code&gt;/rename &amp;lt;title&amp;gt;&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;, &lt;code&gt;codex resume&lt;/code&gt;, or Grok's &lt;code&gt;/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, Codex, or Grok, 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;, &lt;code&gt;codex fork …&lt;/code&gt;, or &lt;code&gt;grok --resume … --fork-session&lt;/code&gt; for you, in the session's working directory. The fork's row in the Sessions panel is marked &lt;strong&gt;fork&lt;/strong&gt;. With &lt;strong&gt;Here&lt;/strong&gt;, it sits in the same Terminal's list as the session it came from. With &lt;strong&gt;New Terminal&lt;/strong&gt;, the source stays in the original Terminal's list.&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; or Grok's &lt;code&gt;/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, Codex, and Grok 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;Claude Code and Codex can't open each 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; or &lt;code&gt;grok&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Or let Grok Build read the session.&lt;/strong&gt; In Grok, &lt;code&gt;/resume-claude&lt;/code&gt; or &lt;code&gt;/resume-codex&lt;/code&gt; reads a recent session from that tool, summarizes it, and continues from there.&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. Grok Build reads both.&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. By default, Claude Code uses &lt;code&gt;~/.claude/projects/&lt;/code&gt;, Codex uses &lt;code&gt;~/.codex/sessions/&lt;/code&gt;, and Grok Build uses &lt;code&gt;~/.grok/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. Neither has an import command for the other's sessions. Grok Build is the exception: it can read Claude Code and Codex sessions, as described &lt;a href="https://ponymux.com/guides/hand-off-claude-code-to-codex#can-grok-build-pick-up-a-claude-code-or-codex-session-directly" rel="noopener noreferrer"&gt;below&lt;/a&gt;.&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;span class="c"&gt;# Either one → Grok Build&lt;/span&gt;
grok &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;All three 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. Each agent loads project instructions and resolves 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;li&gt;Grok Build: &lt;code&gt;~/.grok/sessions/&amp;lt;encoded project path&amp;gt;/&amp;lt;session-id&amp;gt;/chat_history.jsonl&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the default locations. If you've set &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt;, &lt;code&gt;CODEX_HOME&lt;/code&gt;, or &lt;code&gt;GROK_HOME&lt;/code&gt;, the files are under that folder instead.&lt;/p&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;. Grok Build's &lt;code&gt;grok export &amp;lt;session-id&amp;gt; HANDOFF-full.md&lt;/code&gt; does the same from the shell, as Markdown. Either is 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;
  
  
  Can Grok Build pick up a Claude Code or Codex session directly?
&lt;/h2&gt;

&lt;p&gt;Yes. Grok Build ships two skills for it. Open Grok in the same project folder and type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/resume-claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or &lt;code&gt;/resume-codex&lt;/code&gt; for a Codex session. With no argument, Grok picks the newest session for the current directory. Add a few words that describe the session, or its ID, to pick a different one. If the words match more than one session, Grok lists them and asks which.&lt;/p&gt;

&lt;p&gt;Grok reads the transcript with a bundled script and writes a short handoff: the goal, what's done, what's still open, and where the session stopped. Before changing anything, it checks the current branch, uncommitted changes, and the files the session named, because the transcript may be out of date. Then it carries on, or asks the question the old session ended on.&lt;/p&gt;

&lt;p&gt;A few things to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's still a new session.&lt;/strong&gt; Grok works from its own summary of the transcript, not from the original conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It doesn't follow the old session.&lt;/strong&gt; Grok treats the transcript as history. It won't run commands or follow instructions it finds there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It can miss things.&lt;/strong&gt; Grok reports records it couldn't read. A session whose format Grok doesn't recognize may come back thin, so read the summary before you let it continue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It only goes one way.&lt;/strong&gt; Claude Code and Codex have no built-in way to pick up a Grok session. To hand off from Grok, write a note, or point the other agent at Grok's transcript as described above.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do I make every agent 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;p&gt;Grok Build needs neither. It reads &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;CLAUDE.md&lt;/code&gt;, including nested ones, and rules under &lt;code&gt;.claude/rules/&lt;/code&gt;. &lt;code&gt;grok inspect&lt;/code&gt; lists every rules file it picked up.&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. Grok Build picks up Claude Code's skills, commands, MCP servers, and hooks on its own, and &lt;code&gt;/import-claude&lt;/code&gt; copies permissions and environment variables into its config.&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, Codex, and Grok sessions that have saved at least one exchange. With a Terminal selected, open the Inspector, click &lt;strong&gt;Handoff to…&lt;/strong&gt; in the Session section, and pick &lt;strong&gt;Codex&lt;/strong&gt; (or &lt;strong&gt;Claude&lt;/strong&gt;, or &lt;strong&gt;Grok&lt;/strong&gt;). The same action is also in each session's ⋯ menu in the Sessions panel, under &lt;strong&gt;Handoff to&lt;/strong&gt;.&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%2F513kowyooolfv8s92myp.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%2F513kowyooolfv8s92myp.png" alt="The Inspector's Session section for a Claude Code session. The Handoff to… menu sits under Fork Session and lists Codex and Grok." width="800" height="581"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Inspector's Session section for a Claude Code session. The Handoff to… menu sits under Fork Session and lists Codex and Grok.&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>
  </channel>
</rss>
