CASE STUDY · BUILD LOG

I designed an app and Claude Code built it. Here is what that was actually like.

richard o'neill · designer who codes with ai · treble games

I'm Richard O'Neill, a designer who codes with AI. I designed Exit·0, a Mac and iPhone app that tells you when Claude Code finishes, breaks or needs you, and built it with Claude Code writing every line. I'm now looking for developers to test it with me.

duration 07:27 to 00:25
commits 79
figma rounds 6
typed by hand 0 lines
THE ITCH

the terminal doesn't tap you on the shoulder

I give Claude Code a job, switch to something else, and come back to find it finished a while ago, or sitting on a permission question the whole time. The terminal doesn't tap you on the shoulder. I wanted something that would: on the desk when I'm there, on my phone when I'm not. My first attempt was in Replit, and I ran out of credits. So I started again as a native app, with Claude Code doing the building.

THE DESIGN

a thing on the desk

I wanted a thing on the desk, not another notification. Exit·0 is a small dark pixel machine with a screen, a list of runs and a floppy drive. A white CRT mascot on the screen has a face for every state. When a run finishes, a floppy comes out labelled with the project folder and how long the run took.

The Exit·0 Mac device, round 4: screen, run list, pads, keys and floppy drive.
fig. 1 · mac device, round 4
happy
working
shocked
angry
dead
sleepy

The copy has written rules: real numbers over adjectives, no fake urgency, name failures plainly. I designed it over six rounds in Figma. Most of what changed between rounds came from using it, not looking at it. Four examples:

four design calls · press a pad to read it

setlist→RUNNING | FINISHED

The Mac's run list and the phone's looked the same but held different things: the Mac listed all work, the phone only what had been pushed to it. Now there is one list, owned by the Mac and mirrored to the phone, with counts.

mobile: pads stack, all open by default.

HOW WE WORKED

one file of rules

The project has a CLAUDE.md file that Claude Code reads at the start of every session. It sets out who does what, plainly:

$ cat CLAUDE.md
Richard is the product manager and designer.
He is not a developer.
1. Explain every decision in plain English, no jargon.
2. Only ask me about product, design or copy.
3. One question at a time.
4. Click-by-click steps when I have to do something.
5. Build in milestone order. Don't start the next until I've tried the last.
6. Never hand Richard a build you haven't built.
$ 

Each milestone, from M0 setup to M5 polish, had a checklist of things I could check myself, like "Quit Exit·0 from its menu, run Claude again: when the run finishes, Exit·0 starts by itself and the banner still appears." Nothing moved on until I'd ticked them off.

L · RICHARD

The Figma rounds, testing each milestone, the clicks only I could do (developer account, push key, permission prompts) and the judgement calls. For example: when Claude hands back but still has background tasks running, Done waits for the real finish, with a ten-minute safety net. That one is logged as mine.

R · CLAUDE CODE

Everything else. The Swift for both apps, the tests, the builds, and a dated log of every decision and why, which is where most of this page comes from. When the idle app was using 8 to 12% of my iMac's CPU, it profiled it, found three causes and got it to about 2.5%.

tape counter79 COMMITS · 16H 58M
rec20 oct 07:2721 oct 00:25
08:0010:0012:0014:0016:0018:0020:0022:0000:00 07:27first commit08:33M009:25M110:28push test14:26M2 device15:20M3 phone15:52M4 lock18:12round 521:20round 600:25last commit
WHAT WENT WRONG

fault

THE TEST PUSH WAS SLOW

cause

The Mac only checked iCloud for requests every 15 minutes.

fix

Checks every 15 s, every 5 s after launch or a change. After 45 s Setup asks "nothing yet. is the mac awake?"

fault

THE PHONE LOST ITS BACKGROUND

cause

A layer of the app painted flat black over the chassis grey. Margins were wrong on bigger phones.

fix

Chassis grey behind every page. Content fills between 16pt gutters.

fault

IT BROKE FOR AN EMPTY SEARCH

cause

Not a bug in the code: the rule was wrong.

fix

Broke needs the run to stop within two minutes of the failure.

WHAT EXISTS NOW
  • A Mac menu bar app: the full device window, plus a compact strip that floats above other windows without taking focus.
  • Claude Code hooks that never slow it down and uninstall leaving the settings file byte for byte as it was.
  • Done, Needs you, Broke and Crashed alerts, each with its own 8-bit sound.
  • Quiet hours, mute and a fails-only mode.
  • An iPhone app with pushes when you're away from the Mac, and a lock screen and Dynamic Island card that counts the run up.
  • Pairing through iCloud: no accounts, no codes to type.
  • A log of failed commands' output, on the Mac.
STILL TO COME
  • The relay server that carries pushes to testers' phones. I'm setting it up now, and it lands before anyone gets a build.
  • Designed Needs you and Crashed animations (both are placeholders), the failure log on the phone, and a signed public download.
lock screen · running
Lock screen card, running: treblegames, 12m 04s, GRINDING.
lock screen · done
Lock screen card, done: treblegames, DONE 4m 12s.
lock screen · broke
Lock screen card, broke: treblegames, IT BROKE in red, pnpm build · exit 1.
dynamic island · needs you
OI.
WHAT I WANT NEXT

tell me what you turned off

I want developers who use Claude Code every day to run Exit·0 for a week, then tell me what they turned off. Not what they liked. What they turned off: muted it, set it to fails only, hid the strip, stopped looking at the phone. That's where the design is wrong.

want to test it with me?

Mac and iPhone, early. For developers who use Claude Code every day. First builds go out once the push relay is live.