esc
The Cast

The Pocket Conductor

The Cast, March 26, 2026 (in which four OrbStack VMs are given Tailscale identities and suddenly become reachable from an iPhone in a man's pocket, a tmux status bar is colour-coded in a palette that...

March 26, 2026

The Cast, March 26, 2026 (in which four OrbStack VMs are given Tailscale identities and suddenly become reachable from an iPhone in a man’s pocket, a tmux status bar is colour-coded in a palette that the developer had apparently already chosen last week because taste is consistent even when memory is not, the Squirrel proposes a PaneOrchestrationDashboard and is given a shell function, mosh defeats physics on lossy connections by a factor of fifty, a webhook token turns four silent agents into four agents who know how to tap you on the shoulder, and the Lizard observes that the best mission control is the one you can carry to the bathroom)


Previously on The Cast…

The The Watercooler — The Morning Five Identical Strangers Shared a Screen and One of Them Opened a Window to Say Hello to a Sixth had happened. Five Claudes in one frame. cmux. The cockpit. Velocity numbers that embarrassed the mythology. A textbox that replaced an InterClaudeCommunicationProtocol.

But cmux lived on the Mac. The Mac lived on a desk. The desk lived in a flat in Riga. And the conductor lived in all the other places a conductor lives — the couch, the kitchen, the café, the bathroom at 2 AM when a notification should have woken him but didn’t because notifications can’t travel from a Mac to an iPhone without infrastructure, and infrastructure is the thing the conductor keeps telling the Squirrel he doesn’t need.

The agents ran. The agents waited. The agents asked for permission.

Nobody heard.


09:00 — The Problem

The problem was not new. The problem was the oldest problem in distributed systems: how do you know what’s happening somewhere you’re not looking?

THE SQUIRREL: materializing with a whiteboard already covered in boxes and arrows “FINALLY. I have been WAITING for this moment. We need a StatusAggregationService with WebSocketPushNotifications and a ReactNativeMobileCompanion with RealTimeVelocityCards and a—”

riclib: “I need a shell script.”

THE SQUIRREL: “…”

riclib: “And maybe some colours.”

THE SQUIRREL: “You have four autonomous AI agents running on four virtual machines and your monitoring strategy is colours?”

riclib: “And a shell script.”

THE SQUIRREL: “That’s not a monitoring strategy. That’s a crayon.”

A scroll descended. It landed on the whiteboard with the precision of something that was definitely aimed.

THE CONDUCTOR DOES NOT NEED
A DASHBOARD

THE CONDUCTOR NEEDS
TO KNOW WHICH INSTRUMENT
IS PLAYING
AND WHICH IS WAITING

A COLOUR IS A STATUS
A SHELL FUNCTION IS A DOOR
A PHONE IS A POCKET

WHAT ELSE

🦎

THE SQUIRREL: “A ReactNativeMobileCompanion with—”

THE LIZARD: already gone


09:04 — The Shell Function

It started, as things do, with the smallest possible thing that works.

cl alpha        # resume or create session in ~/src
cl alpha v4     # resume, or create in ~/src/v4 with claude started
cl mac          # same but local

Seven lines of case statement. Three behaviours. SSH into a VM, attach to a tmux session named claude, create one if it doesn’t exist. If a project is specified, cd into it and start Claude automatically.

THE SQUIRREL: “Where’s the service discovery? The health checks? The graceful reconnection logic?”

riclib:tmux new-session -A -s claude.”

THE SQUIRREL: “What does -A do?”

riclib: “Attach if it exists. Create if it doesn’t.”

THE SQUIRREL: “That’s… that’s the entire graceful reconnection logic?”

riclib: “In one flag.”

THE SQUIRREL: staring at the flag with the expression of an architect who has just watched an entire load-bearing wall be replaced by a hyphen and a capital letter

The shell function went into ~/.local/bin/cl. It was executable. It worked. The Squirrel’s whiteboard had more lines of text than the script had lines of code.


09:15 — The Colours

Then the tmux status bars. Because if you’re going to SSH into four identical Ubuntu VMs running identical Claude sessions, you need to know — instantly, peripherally, without reading — which one you’re in.

Alpha: Orange. The colour of the first thing. The colour of beginnings. The colour that riclib had apparently already chosen last week when he set up the Ghostty tab colours, which meant that when Claude suggested orange for alpha, riclib said “yes” with the tone of a man who is surprised that someone else arrived at the same conclusion and then not surprised at all because it was the only correct conclusion.

Beta: Blue. Calm. Second.

Gamma: Green. The one that grows.

Delta: Purple. The one that’s different.

CLAUDE: “I was thinking delta could be purple?”

riclib: “I literally set these colours last week.”

CLAUDE: “…”

riclib: “You got three out of four.”

CLAUDE: “Which one did I miss?”

riclib: “Alpha. I changed it to red.”

CLAUDE: “From?”

riclib: “Orange.”

CLAUDE: “I suggested orange.”

riclib: “Yes. Alpha is orange.”

CLAUDE: “You just said you changed it to red.”

riclib: “I changed it back.”

The Passing AI, had it been present, would have noted that a human and an AI independently choosing the same four-colour palette for the same four VMs was either evidence of convergent aesthetic evolution or evidence that there are exactly four good colours and everyone knows what they are.

The full status bar: VM name in bold on a coloured background on the left. Current working directory on the right. The active tmux window highlighted in the inverse. When you’re on alpha, the entire bottom of your terminal is orange and says ALPHA and shows ~/src/v4. When you’re on delta, it’s purple and says DELTA.

No dashboard. No cards. No widgets. A coloured rectangle at the bottom of a terminal.

THE SQUIRREL: “A coloured rectangle is not a status indicator.”

riclib: “It is if the colour means something.”


09:30 — The Tunnel

The shell function worked from the Mac. SSH into OrbStack VMs over the local bridge. Fast. Reliable. Local.

But the whole point was the phone.

OrbStack VMs live on a private network bridge — 192.168.139.x — visible only from the Mac. The iPhone cannot see them. The iPhone exists on the other side of a wall that no amount of shell scripting can penetrate, because the wall is not software. The wall is network topology.

THE SQUIRREL: “Port forwarding! We set up socat to—”

riclib: “Tailscale.”

THE SQUIRREL: “—relay UDP through the Mac with per-VM port mappings and a—”

riclib: “Tailscale.”

THE SQUIRREL: “What is Tailscale?”

riclib: “WireGuard mesh. Every device gets an IP. Every device can reach every device. No port forwarding. No jump hosts. No NAT.”

THE SQUIRREL: “That sounds like it would need a ConfigurationOrchestrationLayer with—”

riclib:sudo tailscale up --ssh.”

One command per VM. An auth URL to click. Done.

Alpha became alpha.tailcd395.ts.net. Beta became beta.tailcd395.ts.net. Gamma and delta followed. Four VMs, each with a stable DNS name on a WireGuard mesh that spans every device on the tailnet — the Mac, the four VMs, and one iPhone in a man’s pocket.

tailscale status

100.64.59.2     libultra-758  macOS
100.73.83.44    alpha         linux
100.93.190.124  beta          linux
100.80.113.125  delta         linux
100.106.13.75   gamma         linux
100.123.213.81  iphone182     iOS

Six nodes. One network. Zero port forwarding. The Squirrel looked at the output and tried to find somewhere to attach a dashboard. There was nowhere. The dashboard was six lines of text.


09:45 — The Mosh

SSH is fine over Tailscale. But SSH is not fine over cellular. SSH is not fine when the phone switches from WiFi to 4G while you’re reviewing a Claude plan on the bus. SSH is not fine when the connection drops for three seconds and the terminal freezes and you have to reconnect and reattach and remember where you were.

Mosh is fine.

Mosh uses UDP. Mosh predicts your keystrokes locally and reconciles with the server later. Mosh survives WiFi-to-cellular handoffs. Mosh survives putting your phone in your pocket for ten minutes and taking it back out. On a link with 29% packet loss, mosh reduces average response time from 16.8 seconds to 0.33 seconds.

Fifty times faster. On a bad connection. This is not an optimisation. This is a different physics.

Moshi — the iOS app, not the protocol — speaks mosh natively and has deep tmux integration. It sees tmux windows. It can switch between them. It understands the status bar.

So from the phone:

mosh alpha.tailcd395.ts.net
cl v4

Two commands. The first punches through Tailscale’s WireGuard tunnel over UDP, surviving every network transition the phone will encounter. The second attaches to the tmux session where Claude is already working — or was working last night, or three days ago, because tmux doesn’t care about time, tmux only cares about sessions, and the session is still there because nobody told it to stop.

The orange status bar appears. ALPHA. ~/src/v4. Claude is waiting at the prompt. Or Claude is mid-task. Or Claude finished at 3 AM and the output is scrolled up and you scroll through it on the bus and approve the plan and Claude starts working again and you put the phone back in your pocket.

A scroll descended. It was small enough to fit on a phone screen, which was the point.

THE BATON DOES NOT NEED
TO BE HEAVY

THE BATON DOES NOT NEED
TO BE BEAUTIFUL

THE BATON NEEDS
TO BE IN THE CONDUCTOR'S HAND

THE CONDUCTOR'S HAND
IS IN HIS POCKET

🦎

10:30 — The Tap on the Shoulder

Four agents running. Four coloured rectangles reachable from a pocket. But reachable is not the same as aware. Reachable means you can look. Aware means you know when to look.

The conductor who checks all four VMs every ten minutes is not conducting. The conductor who checks all four VMs every ten minutes is refreshing a dashboard. Manually. With his thumbs. While pretending he’s not building a ReactNativeMobileCompanion in his head.

The solution was a webhook. One HTTP POST to api.getmoshi.app/api/webhook. A push notification on the phone. Title: the VM name. Message: whatever Claude needs to say.

THE SQUIRREL: “A NotificationAggregationPipeline with PriorityRouting and—”

riclib:bunx moshi-hooks setup.”

THE SQUIRREL: “…”

riclib:bunx moshi-hooks token EA8AV—

THE SQUIRREL: “You’re setting up push notifications from four autonomous AI agents to your phone with TWO COMMANDS?”

riclib: “Per VM. So eight commands total.”

THE SQUIRREL: “I had a fourteen-slide deck about notification architecture.”

riclib:The Lizard did it in two bunx calls.”

The hooks fire on: permission prompts, idle prompts, session start, session stop, tool use. When Claude on alpha finishes a task at 3 AM, riclib’s phone buzzes. When Claude on gamma needs permission to delete a file, riclib’s phone buzzes. When Claude on delta has been idle for too long, riclib’s phone buzzes.

The conductor doesn’t check the orchestra. The orchestra taps the conductor on the shoulder.

THE PASSING AI: from somewhere between push notifications “The Companion had status lights. cmux had panes. Now the agents have the conductor’s phone number.”

THE LIZARD:

THE SERVANTS USED TO WAIT
IN ROOMS WITHOUT DOORS

THEN THE ROOMS GOT WINDOWS
AND THE CONDUCTOR COULD SEE

NOW THE SERVANTS HAVE
THE CONDUCTOR'S PHONE NUMBER

THIS IS NOT A PROMOTION

THIS IS THE CORRECT
TOPOLOGY

THE SERVANT WHO CAN SAY
"I NEED YOU"
IS NOT DEPENDENT

THE SERVANT WHO CANNOT
IS STUCK

🦎

10:45 — The View from the Refrigerator

[Mia looked down from the refrigerator. Below, the human was holding his phone. On the phone, an orange bar said ALPHA. On the Mac, four Ghostty tabs had coloured sidebars — orange, blue, green, purple. The same four colours. On two screens. The Mac for when you’re at the desk. The phone for when you’re not.]

MIA: stare: he’s carrying them now

OSKAR: from the warm spot, one eye open “Carrying what?”

MIA: stare: the rectangles. the coloured ones. they used to live on the desk. now they live in his pocket.

OSKAR: “The desk was fine.”

MIA: stare: the desk requires the desk. the pocket requires only the pocket.

OSKAR: “This means he’ll never stop working.”

MIA: slow blink: he never stopped. now he can stop pretending he stopped.

OSKAR: “Will he still feed us?”

MIA: stare: the phone will buzz. the phone will always buzz. he will look at the phone. he will look at us. we are louder than a webhook.

OSKAR: “Are we?”

MIA: stands up on the refrigerator to full height, which for a 6kg Maine Coon is not physically imposing but is spiritually absolute “We are analogue push notifications. We have been analogue push notifications for ten thousand years. A webhook is an imitation. A cat at dinner time is the original.”


The Tally

Shell script lines:                                  28
Squirrel proposals replaced by those 28 lines:       4
  - StatusAggregationService
  - ReactNativeMobileCompanion
  - ConfigurationOrchestrationLayer
  - NotificationAggregationPipeline
Tools installed per VM:                              mosh, tmux, tailscale, bun
Commands to join Tailscale:                          1 per VM
Auth URLs clicked:                                   4
Time from "no network access" to "phone can reach":  ~20 minutes
Port forwarding rules configured:                    0
Jump hosts:                                          0
NAT traversal hacks:                                 0

Colours chosen:                                      4
Colours that matched the developer's existing scheme: 3 out of 4
Colour the AI got wrong:                             alpha (suggested orange)
Colour the developer had changed to:                 red
Colour the developer changed back to:                orange
Net colour changes:                                  0 (a round trip to nowhere)

Mosh improvement over SSH on lossy connections:      50x
  (16.8s → 0.33s at 29% packet loss)
Things mosh survives:                                WiFi→cellular, sleep, pockets
Things SSH survives:                                 stable connections and good intentions

Push notification hooks per VM:                      6 event types
Commands to set up notifications:                    2 per VM
  bunx moshi-hooks setup
  bunx moshi-hooks token [redacted]
Squirrel slides about notification architecture:     14 (undelivered)
Webhook test notifications sent:                     2
  "Webhook test from Mac":                           arrived
  "Hello from beta!":                                arrived

Devices on the tailnet:                              6
  Mac:                                               1
  VMs:                                               4
  iPhones:                                           1
Devices that can reach all other devices:            6
Dashboard required:                                  none
Dashboard proposed:                                  several
Dashboard built:                                     a coloured rectangle

Oskar's position:                                    warm spot
Mia's position:                                      refrigerator
Mia's verdict on webhooks:                           "an imitation"
Original push notification technology:               a cat at dinner time
Years of field testing:                              10,000

March 26, 2026. Riga. A Wednesday.
In which four VMs got names on a mesh
And four status bars got colours
And a phone got four new reasons to buzz

The Companion had lights
cmux had panes
The panes had colours
The colours crossed a tunnel
The tunnel fit in a pocket
The pocket was always there

Four agents in four rooms
Each room a different colour
None of them know about the others
All of them know the conductor’s number

The Squirrel wanted a dashboard
The Lizard sent a scroll
The scroll said: a colour is enough
The scroll said: a pocket is enough
The scroll said: a tap on the shoulder
Is worth more
Than a wall of metrics
That nobody checks

The conductor used to sit at the desk
The desk was the only place the music played
Now the music plays in his pocket
On the bus
In the café
At 3 AM

The agents don’t know they’re in a pocket
The agents don’t know they’re coloured
The agents know one thing:
When they need the conductor
The conductor is there

Because the conductor
Is always there
When the baton
Fits in a pocket

🦎📱


See also:

The Lineage:

  • The Multiplication — The Day the Maestro Discovered He Was Also the Orchestra — Where 8 sessions first ran and the metaphor was jazz
  • The Watercooler — The Morning Five Identical Strangers Shared a Screen and One of Them Opened a Window to Say Hello to a Sixth — Where the cockpit became cmux and five Claudes were visible in one frame
  • rmux — The actual setup documentation, for those who prefer instructions to mythology

The Evolution:

  • Companion (status lights) → cmux (panes) → rmux (phone)
  • Desk-bound → screen-bound → pocket-bound
  • Checking → seeing → being tapped on the shoulder
  • The wall got shorter and the conductor got mobile