Replacing Codex with Pi
I used to run two coding agents. Claude Code for Claude, and Codex for GPT. As of this week it's Claude Code and pi, and Codex is uninstalled.
Codex came in back in May because I wanted GPT for coding without giving up Claude Code, and by July I had it wired into Claude Code as well, so Claude could ask it to look over a diff or weigh in on a decision. However, I had got used to how Claude Code shows its work. Switching models meant switching interfaces as well, and I felt it every time.
Pi is a small harness for coding agents. It's small enough that I could change it myself, and it logs in with the same ChatGPT subscription Codex uses. So in early September I set it up next to Codex as a trial. Same model and subscription, two harnesses.
Making pi feel like Claude Code
I took the parts of Claude Code I missed most and built them on top of pi. How work in progress is shown, mostly. Routine tool calls get folded away, failures don't.

Routine tool calls fold into one line
A plan shows up in the transcript and waits for my approval.

Plan approval
Delegated work stays visible, so when a subagent is still running the turn doesn't say done, and I can peek at what it's doing without every step landing in the main conversation.

Peeking at a running subagent
That last one is the bit I'd point to if you asked why bother. Before, I'd hand off a task and then guess at whether it had actually finished. Now I can see it.
From Codex I kept the composer and the login. The glyphs and the editor underneath are still pi's own, so it still looks like pi.
By mid September pi didn't need the codex binary for anything, not even to read usage.
The trial
To decide, I replayed six commits I had already shipped. 2 bug fixes with a test to pass, 2 small features, 1 refactor and 1 config change. Each one got the same prompt in a clean clone at the parent commit, once through pi and once through Codex, same model and same effort. Claude Code did three of them as well, as a reference for what good looks like.
First check was whether the tests went green. Then a reviewer agent looked at each pair without knowing which was which and picked the one it would merge.
Pi went green on all 6. On the merge pick it had 2 wins, 2 ties and 2 slight losses. One of those ties started as a loss, but the reviewer had marked pi down for moving a test that the repo's own instructions say to move, so I counted it as a tie.
So quality was about the same. However, pi used 42% fewer credits, made 151 top-level model calls against 252, and asked me 1 question instead of 4.
It was also 28% slower. The extra time was waiting on subagents, 42.6 minutes against 20.3, because pi ran its implementers strictly one after another. I haven't fixed that yet.
Both GPT runs wrote far more tests than the original commits had, 2.8x and 3.5x the added lines, against 1.2x for Claude. Since it happened on both harnesses, that's the model.
Six tasks with one run each isn't a benchmark. It was enough to make the call though.
Removing Codex
Codex went on the 23rd. Its instruction file, its subagent definitions, the bridge that let Claude Code call it, all gone. Claude Code still asks a second model for a review or a second opinion, it just runs pi headless now.
Closing thoughts
Pi is still changing quickly, so some of the behaviour I depend on needs a test and a manual check every upgrade. It's also not perfectly provider neutral. Usage reporting, for one, is different per provider.
Astra 6 is my driver for now, not forever. I'm keeping an eye on open models like DeepSeek, and when one gets good enough I'd like to try it as a reviewer or hand it a small task without relearning a whole new interface.
The setup is in the workflow directory of my dotfiles if you want to take a look. It's my personal setup, so don't expect it to work as a drop-in. Take what's useful.