I use the same coding agents in two opposite ways: fast and furious,
where I barely read the code and have made 10,000+ commits in the last
12 months, vs. slow and careful, where every decision is mine. Neither
is right. The real decision is where to set the quality bar for each
project, right now, and when to move it.
I got a good deal on a Codex plan and wanted to try its models inside Claude
Code. A local proxy and six small fish functions later, `claude-astra` starts
Claude Code on GPT-6-Astra. Here's how it's wired, how the agents built it,
and what's still missing.
The main agent, secondary and worker setup I pieced together by hand is now
built into tmux-agents. One command starts the chain, a script starts one for
every project after a reboot, and /resume brings back the conversations.
Move fast with AI, and add proper engineering when real usage shows you
need it. For tmux-agents, that meant letting each agent's name double as
its id, until it couldn't, and then adding real ids and guard rails so
the agents and I don't repeat the mistake.
Built-in sub-agents hand you a summary and the work behind it is gone.
tmux-agents gives every delegated task its own Claude or Codex session in
a tmux pane instead, so you can watch it, step in, and pick its
conversation up later.
With up to ten agents working on one project, the Claude agent I talked to
was also juggling replies, merges and servers, and I kept waiting for my
turn. The fix was one more pane: a main agent whose only job is to talk to
me, while the old one became a coordinator.
Claude, Codex and their sub-agents each got their own git worktree, and my
disk quietly filled up with copies of an 8GB game project. The fix was a
small script that makes agents borrow worktrees from a shared pool instead
of creating new ones.
Moving a resume pipeline onto Maestri, teaching it to enforce its own
two-page limit, and trying local dictation apps all removed the same thing:
the mechanical tax between having an idea and acting on it.
A full technical walkthrough of the router-level setup I run in China:
a GL.iNet Slate 7 running Tailscale as the default route to a Debian
VPS exit node, with policy-based routing sending CN traffic direct
and a DNS split that keeps Chinese and foreign services both fast.
Includes the three gotchas that took the longest to unstick: LAN
forwarding and MASQUERADE on `tailscale0`, PBR-vs-Tailscale
precedence, and the GL.iNet 0x8000 mark leak.
A working refresher on the SwiftUI you actually meet in real codebases in 2026: pre-iOS 17 state management, modern @Observable, async/await as the default, and the everyday patterns for networking, navigation, and error handling.