At about five in the afternoon I typed this into the terminal cockpit I’d finished the night before: “what is the possibility of having this as a GUI? something that really looks awesome!”

That’s the whole brief. No spec, no sketch, one vague sentence with an exclamation mark on it. By half past nine it had a name, a logo, four animated characters, a launcher with an icon, a laptop layout, two native Mac apps and a private network to run on. This is the version of vibe coding people keep promising: describe the thing, get the thing. It really can be like that. It was, for most of the evening. The rest of the evening I spent telling it I couldn’t see anything.

Hearth lasted two minutes

The first mockup came back in about five minutes. Then it went through seven versions in half an hour, because every time I looked at it I wanted something else. Keep the delegation feed but let it collapse. Let the terminal pop out or get taller. Give me a switch for the multiplexer that runs the agents. A project selector, and a way to make a new one. A button at the top that flashes when something needs me. Zoom for the text, per pane, independently. Each one turned up in the next version with the controls actually working in the mockup, which is a dangerous thing to show a man who was only asking hypothetically.

Claude named it Hearth. The reasoning was sound: the team is Anvil and Flint, the whole thing is forge-themed, and the hearth is where everyone gathers. I said “let’s see Crucible.” Crucible it is. A crucible is the pot the metal actually melts in, which felt like a more honest description of what happens to my quota.

Before a line of real code, one rule went into the plan as rule one: closing Crucible never stops the multiplexer. The multiplexer is what holds every agent session. Crucible is a window onto it, nothing more. There is a switch in the header, that switch is the only thing allowed to stop it, and it asks first. Because stopping it kills every pane, including the one Claude was building Crucible from.

Which is why the one thing in the plan that never got tested live is the off switch. The test would kill the tester. There’s a unit test for the guard. I have decided to believe the unit test.

I don’t see it

The build ran in phases, and each one landed in the window on my desk while I watched: a little server feeding the page, real terminals in the browser, the alarm, the selectors, the art, the packaging. Six phases in an hour and a half, all of them committed and pushed, and my contribution to each was roughly the same four words.

“I don’t see it.”

Twice the answer was that my window was still running the old page. The server serves new files the instant they exist, but a browser tab only fetches them when it reloads, so the tabs I was clicking were the inert ones from two phases ago and the project selector was the disabled placeholder. The fix was to make the page reload itself whenever the build changes, and it did, and the very next time I couldn’t see anything it was because I’d closed the window entirely and was staring at a terminal. Claude relaunched it for me, straight into the scratchpad next to that terminal at half width, where the layout stacks and the crew column falls off the bottom of the page. So the characters were there. They were just below the floor.

At no point in any of this was anything wrong with the software. Every single one was the man looking at it.

Keystone needs you

While Grok was off drawing, my desktop started pinging. A notification, a sound, a red button in the header: Keystone needs you. I went to the main pane. Nothing. No question, no prompt, nobody needed anything. It did it again. “I’m getting alerts from you but I can’t see any questions?”

The alarm was working perfectly. It was just listening to the wrong person. Grok’s command line tool runs the same hook configuration Claude Code does, and I’d wired those hooks to post to Crucible’s alarm endpoint. So every time Grok approved one of its own file writes, which it does automatically because that’s what it’s allowed to do, it announced that the lead needed a human. The server assumed any hook it heard came from the lead. It never occurred to me, or to the thing that wrote it, that the cat would be wearing the same collar. It now checks which agent a hook came from and ignores the ones that aren’t Claude, since the multiplexer already reports a teammate as blocked when it genuinely is.

The art run itself went the other way. Grok delivered every character and logo, and I was reviewing them in a browser before the delegate wrapper, the supervisor I wrote and complained about in the last post, gave up on the run at its 25 minute ceiling and logged it as a timeout. Last night nobody was finished when they said they were. Tonight one of them finished and the babysitter said it hadn’t. I’m not sure that’s progress but it is at least variety.

I picked a sitting cat for Flint, asked for more movement, and now the crew animate while they work and hold up a hand when they’re blocked. I would have accepted a static PNG.

The lodger

Packaging had its own small fights. The launcher hung on the first attempt because the browser-launch helper blocks until the window closes, so a script waiting for it to return waits forever. Then the window insisted on opening in the scratchpad, and the launcher had to learn to find it, move it to a real workspace and focus it.

The server now starts at login and stays resident, the window opens on demand, and when Crucible starts Claude in a folder that already has a conversation it picks that conversation back up. So I can close the whole thing, reboot, click the icon in the launcher and be exactly where I was. I quit for the night at seven, pleased.

At eight I came back. The multiplexer’s own sidebar, a list of spaces and agents that Crucible already draws far more prettily in its own columns, was sitting in the main pane like a lodger. I’d hidden it by hand before the reboot. The multiplexer has a setting to start it collapsed, but that setting only takes effect when its server starts, and rule one says I never restart that.

So the Crucible server now watches the main pane, waits until it sees the sidebar drawn, and types the keyboard shortcut to hide it. Then it checks the repaint so it never toggles twice. It presses the button for me. I’m not proud of it. It works.

The wrong direction first

“Can we install this on the laptop, and have this work via ssh?”

Not ten minutes later there was a second window with the laptop’s name in its header and a shell on the laptop answering. Crucible was running on the laptop, tunnelled back to the desktop. Which is when I explained what I’d actually meant: the desktop is the workhorse, the laptop is where I sit. Other direction. Same mechanism, reversed, and the laptop already reached the desktop over Tailscale’s SSH without a password, so no keys to sort out. Verified from the laptop’s own screen two minutes later, this very conversation in the main pane.

The laptop’s screen is smaller, and the page had been laid out for the big monitor. A screenshot, three fixes, a compact layout that collapses the header to one row and narrows the side columns, and the main terminal gained roughly forty percent more height. Then the laptop got the same AI setup as the desktop, Headroom in its bar and all, and I signed into the four accounts. Three of the four verified straight away. Antigravity reported not signed in after I’d just signed in, because checking it over SSH makes it look in a different credential store than the one I’d just written to. Checked the way Crucible actually launches it, it was fine. That’s two nights running this tool has been reported logged out, and this time it wasn’t even its fault.

The crazy pitch

“Okay, now the crazy pitch, can we get native apps for Crucible and Headroom on the Mac?”

Yes. Claude built them on the Mac over SSH with nothing but the command line tools, in Swift, in a few minutes including one type error. Crucible.app is a WebKit window onto the desktop’s server, with the page’s confirm dialogs turned into native sheets and copy and paste wired into the terminals. Headroom.app is a ring in the menu bar showing the fullest of my four weekly allowances, red at ninety percent, with a panel of meters and reset countdowns behind it. Screenshots over SSH aren’t permitted on a Mac, so the build could confirm a window existed and that the server saw its connections. Whether it looked any good was my job. It did.

Both apps were running over SSH tunnels. Then I said “we should use tailscale,” and the tunnel code that had been written at twenty past eight was deleted at ten past nine. The desktop now publishes Crucible on the tailnet with Tailscale’s own certificate, while the server itself still only listens on the loopback address. Every request that arrives that way carries the caller’s Tailscale login, and the server refuses anyone but me. A forged login header was tried and refused. A foreign origin on a terminal socket was tried and refused. The laptop and the Mac reach it from a coffee shop the same way they reach it from the sofa, and nothing is open to the internet. One quirk: the first request to a freshly published machine can sit for over ten seconds while Tailscale issues the certificate. After that it’s instant.

Half past nine

Everything went to GitHub at 21:24. Twenty-nine commits in four and a half hours, from “something that really looks awesome” to a cockpit I can open from a laptop, a Mac, or a coffee shop. I didn’t write a line of it. I typed wishes and looked at the results, and when I couldn’t see the results, that was usually me too.

That’s the sometimes. The easy part was genuinely easy. Nothing about tonight required me to know Swift, or how a browser talks to a terminal, or what Tailscale does with a certificate. What it required was somebody in the chair who’d notice when the alarm was lying, when the supervisor was lying, and when the fault was the man looking at the screen. The code writes itself now. The noticing still doesn’t.

Not done: alarm notifications on the Mac, Headroom starting itself at login, and Codex’s review of the server code, which waits for its weekly quota to reset on Saturday. Former boss, back on the tools, hasn’t been allowed near a file since it hit the ceiling.

And the off switch. I have a cockpit with an animated cat in it, reachable from anywhere on earth, and an off switch I have never once pressed.