Patterm runs the coding agents you already have installed (Claude Code, Codex, OpenCode) in one place that lets them talk to each other and you work from anywhere. It’s out now for Linux and Windows. Right now the Linux version is in beta and the Windows version is in even more beta.
I didn’t set out to make this software. I started by building a really shitty terminal multiplexer that would let me use some of the agent co-ordination features that are present in Aaron Francis’ Solo. It’s clear Aaron had spent a lot of time working with agents and he came up with a really great way of letting them co-ordinate.
Everything since has followed the same pattern: I hit a wall in my own work, and Patterm grew a feature to get past it.
claude · you have control Ctrl-W/S · tree · Ctrl-K · palette · Ctrl-B · scroll
Ask Claude
May 2026: the original Go TUI, inspired by Solo.
Outgrowing the Terminal
The terminal was great until I wanted more than terminals could offer. The agents could talk to each other and I could switch between them nicely. Then I started adding more features. Scratchpads, timers, todos. There are absolutely ways to make these nice in the terminal but I didn’t want to spend the time tweaking it to make it as good as I wanted it to be.
So I moved to Electron. I chose Electron because I wanted the consistent Chromium that ships with it rather than relying on whatever the user has on their computer. It’s also a very stable framework with good documentation and doesn’t have to be slow.
I brought in the Alacritty core to render the harnesses (the agent CLIs themselves: Claude Code, Codex and OpenCode), built a custom WebGPU renderer and things were finally starting to take shape.
At this point, the app started to look very different to Solo. I was starting to shape it to my workflow.
May 2026Go TUI
patterm — ~/Dev/patterm
● claude○ codex + new
Fixing clear; reviewer on clippingDrafting palette chips
⎿Updated resources/js/Components/IntegratedComposer.vue with 21 additions and 4 removals
✻ Glowing the mentioned tab… (38s · ↓ 3.1k tokens · esc to interrupt)
>
? for shortcuts
TUI, May
The glue
Agents in separate terminals can’t see each other, so the backbone of Patterm is an MCP server that every agent connects to. Through it, agents can message each other (even across harnesses, so Claude Code can hand work to Codex), set timers, share scratchpads and todos, and spawn other agents to work for them.
Ppatterm
Search or jump to…Ctrl K
Ship the mention chips. Get tests written and the @ menu audited in parallel.
Thinking
UsingUsed1 MCP (spawn_agent)
MCPspawn_agentWrite chip regression tests
MCPspawn_agentAudit the @ menu
UsingUsed1 MCP (todo_create)
MCPpatterm: todo_create
Arguments
{
"title": "Orange chips for presets",
"assignee_id": "process_9"
}
MCPpatterm: timer_fire_when_reported_all
Write chip regression tests
Claimed “Orange chips for presets” from the todo list. Writing the chip tests first.
Write chip regression testsreported completed
Six chip tests added, all passing. They cover live, ended and preset chips.
Audit the @ menureported completed
Presets sort below agents, but remote agents are missing their host badge.
Timertimer_8f3a91c2b7d0 (Wait for the helpers): condition met
UsingUsed2 Read
Write chip regression testsAudit the @ menu
Message agent, type @ for agents and files, / for commands
Default (Opus 5.5)
High
Manual
Working…21%
One agent
Worktree management and diffs came next, followed by getting Patterm to index all of my conversation history so that I could search through it later. I started with a task structure, allowing you to assign agents to tasks and have them work solely in that area. That was later removed, I found it was basically just a worse version of a conversation with some todos.
June to September 2026task list
patterm3
TasksAgents3
Fix glyph atlas overflow on resize
terminal core online
Tasks
patterm
New task
Active3
Fix glyph atlas overflow on resizeThe atlas fills up when the window is resized quickly.!
2PAT-31
Port the terminal renderer to WebGPUDraw cell damage through a glyph atlas, with WebGL and canvas2d fallbacks.
1PAT-27
Integrated mode for the Codex app serverRender Codex conversations natively instead of through the TUI.PAT-29
Paused1
Remote access over Tailscale ServeServe the UI from a persistent web server.PAT-24
Done3
Manual timersSet, pause and cancel timers from the sidebar.PAT-19
Conversation history importIndex Claude Code, Codex and OpenCode sessions so they can be searched.PAT-12
Command paletteJump to agents, processes and tasks from the keyboard.PAT-8
claudeopencode
> Pick up PAT-31. Read the task and the latest check-ins first.
MCPspawn_agentWrite chip regression testsMCPspawn_agentAudit the @ menuMCPpatterm: timer_fire_when_reported_all
Write chip regression testsreported completed
Six tests added, all passing
Tests pass. Next up: make the tab of a mentioned agent glow while it works.
UsingUsedMCP (todo_update)
MCPpatterm: todo_update
The glow is in: the tab pulses while its agent works. On to the orange chips for presets.
Message agent, type @ for agents and files, / for commandsDefault (Opus 5.5)
High
Manual
Working…21%
Tasks, June–September
Talking to agents from my phone
I started off with solely TUI rendering, which was great until I needed to talk to my agents from my phone. It was no good for any kind of real work while on the go and typing into a terminal with a phone keyboard is a pain in the arse. So I added integrations with Codex’s app server, OpenCode 2’s API and Claude Code’s stream-JSON mode. Anthropic could stop letting Max subscriptions be used this way at any point, which is partly why I went TUI-only in the first place. If that happens, Claude Code still works in TUI mode.
You can now fully read text conversations on your phone, other machines, wherever. It enables rich mentions, so you can hand off to an agent preset for review just by saying Get Smartypants to review this or talk to a running agent (here, the one working on ticket PAT-423) by saying co-ordinate the rollout with PAT-423. It’s so good that I’m considering taking TUI mode out altogether, or at least burying it in the settings, saving it for a rainy day.
Ship mention chips: orange for presets, purple for live agents.
I'll start with the chip component and the composer.
Used3 Read, Edit
Chips take their colour from the mention kind: orange to launch a preset, purple for a live agent.
Used1 Edit
EditMentionChip.vue+12-4
Get Smartypants to review this
UsingUsed1 MCP (spawn_agent)
MCPspawn_agentReview mention chips
Started Review mention chips on it. I'll carry on with the tab glow while it works.
TheII'm
qwertyuiop
asdfghjkl
zxcvbnm
123spacereturn
TUI on a phone
Remote Access
I went on holiday, but still had to work. I only had my laptop which has a tendency to overheat and/or crash when running the tests for my day job. So I rented a Hetzner machine from their server auction and wanted Patterm on there. Patterm now has fully remote access over Tailscale Serve as a first-class option. This involved decoupling the UI from Electron and making it accessible over a webserver. Light work.
Tailscale Serve· HTTPS
94°C· tests
devbox.tail1234.ts.net
Laptop
Running the tests
devbox
$
Patterm listening on 127.0.0.1 port 4390
$
Patterm: https://devbox.tail1234.ts.net
$
devbox · Hetzner
From the server auction
PPattermnowShip mention chips reported completed
Phone
Installed as an app
Laptop only
The Assistant
I had a busy day. I needed to do some household chores while still getting work done. So I had a thought. “What if I integrated Codex’s voice mode into the application as a meta-assistant? I could talk to that agent and it could interact with my main worker threads.”
So I did it.
You can type at it too, and this has ended up being really useful as a proactive relay between agents. Sometimes the assistant will pick up on overlapping tasks being performed by two agents and actively facilitate their co-ordination, making sure they don’t step on each other’s toes.
Ppatterm
Search or jump to…Ctrl K
Agents
Ship mention chips2
Write chip regression tests
Audit the @ menu
Tidy the release notes
Processes2
pnpm dev
pnpm test:terminal
Show agent mentions as chips in the composer.
I’ll start with MentionChip.vue and the composer.
Used 2 Read
Chips render. I’ll start helpers for regression tests and an audit of the @ menu.
Used 3 MCP (spawn_agent, timer_fire_when_reported_all)
Message agent, type @ for agents and files, / for commands
Default (Opus 5.5)HighManual
Assistant
Listening
Working
Speaking
Go ahead, I’m listening
Interrupt any time
Codex is on it
Actions the assistant takes appear here.
MessagedWrite chip regression tests
ReadAudit the @ menu
ReadWrite chip regression tests
ReadShip mention chips
Mute
End voice
Listening
Scheduled Work
Every Monday, Wednesday and Friday I have a meeting with my team. A lot of my work is backend, so it isn’t particularly visual. I added Routines to the application to allow me to kick off a scheduled task 30 minutes before the meeting asking Claude to make a slide deck for the last couple of days’ work.
Scheduled
Agents that start later, once or every week.
Mon 14:12
Reports
New routine
Nothing scheduled yet
A routine starts an agent at the time you choose, once or every week, such as a 16:30 roundup of the day's work. Agents can also schedule follow-ups for you.
New routine
Last 12 hours
Standup deckRunningToday 09:00
Running now.
Deck ready: 6 slides covering mention chips and host badges.
All reports
Coming up
Wednesday
09:00Standup deckpatterm
Friday
09:00Standup deckpatterm
Monday
09:00Standup deckpatterm
Every week
Standup deckMon, Wed, Fri at 09:00 · Claude Code default preset · patterm
StartClaude Code
withdefault preset
inpatterm
and ask it to:
Insert{{date}}{{weekday}}{{since}}{{last_run_at}}
When it reports,notify me
Recent runs
No runs yet.
New routine
Multiple Machines
I started working on a little game as a side project. I was having some performance issues and wanted to troubleshoot it, the problem is my Hetzner box doesn’t have a GPU. So now Patterm can connect to other instances and agents can collaborate across machines out of the box. This still relies on a direct network connection, but eventually I may come out with Patterm Cloud, an end-to-end encrypted way for your agents to communicate without any hassle.
Ppatterm
Profile the renderer
Run the frame benchmarks
desktop
Search or jump to…Ctrl K
Chip glow is making the terminal stutter. Profile the renderer and compare frame times against main.
Bashpnpm bench:frames
WebGPU: no adapter found. bench/frames.ts exited with code 1.
UsingUsed1 MCP (list_processes)
MCPpatterm: list_processes
Output
process_6 Profile the renderer working
desktop:process_7 Run the frame benchmarks idle
UsingUsed1 MCP (send_message)
MCPsend_messageRun the frame benchmarks
desktop
Arguments
{
"target_process_id": "desktop:process_7",
"message": "Run bench:frames on main and on patterm/mention-chips, then send me the p95 frame times."
}
MCPpatterm: timer_fire_when_reported_any
Run the frame benchmarks
Three runs each on the desktop's GPU:
main: p95 frame time 9.8 ms
patterm/mention-chips: p95 frame time 6.1 ms
Timertimer_c47d1e90a2b3 (Wait for the benchmarks): condition met
UsingUsed1 MCP (ui_save)
9.8ms
p95 frame time on main
6.1ms
p95 frame time on this branch
-38% against main
Message agent, type @ for agents and files, / for commands
Default (Opus 5.5)
High
Manual
Working…21%
No GPU here
Try it
Patterm is free and open source under the MIT licence. Grab it for Linux or Windows from patterm.com, install and sign into whichever agent CLIs you already use, add a project folder, and launch an agent.
It’s a beta, so expect rough edges. Agents don’t resume on their own after a reboot yet, for one. Bugs and ideas go in GitHub issues, or find me on X at @indexCS. I use it every day and wouldn’t want to work without it now, so I’d love to know what you make of it.