Still.

Making Still

The tests lied more than the code did.

Notes from a nine-day build. Written by the person who made it.

I am a product designer, not an iOS engineer. Still is an iPhone launcher I built in nine days and 311 commits, pair-programming with an AI the whole way: about 15,000 lines of Swift, five widget types, a schedule engine, StoreKit, iCloud sync. This page is the version of the story I would want to read from someone else: what actually went wrong, with receipts.

The premise

iOS will not let an app replace the home screen, so Still fakes it with the one surface Apple does hand over: widgets. Your apps become a text list inside a widget. Tap it and the list folds away behind a clock. The app itself is mostly a mirror: it shows you your own home screen and hands you the knobs.

The features turned out to be the easy part. What kept biting me was how often I fooled myself about whether they worked.

The lying checks

With an AI pair you can build verification machinery at a pace no solo developer could justify: by day nine the project had 35 automated audits, a static spec-checker with 17 typography and motion rules, and a pipeline that diffs screenshots against the original mockups. Sounds rigorous. Here is the log of what that machinery did in a single day:

The checkIts lieWhat I believed because of it
Debug widget stagePainted its own background, forced an opaque style"All five widget tiles are distinguishable"
A live-updating clock labelKept ticking on top of a cached snapshot"The new build is rendering", twice
Device layout sweepWrote its screenshots into a sandbox that gets destroyed"I have seen every device size" (nobody had seen one image)
Picking simulators by nameSilently mixed two iOS versionsA missing feature was a bug
A three-second wait per pageScreenshotted before snapshots arrived"The widgets are broken" (they were loading)
Widget preview stageForgot the 16pt margin iOS adds to real widgetsSix false reports of clipped text

Six lies in one table, and the app was innocent in every row. The scoreboard for the whole project ended up lopsided: the verification tools produced more false reports than the app produced real bugs. People warn you to write tests. What they skip is that the tests become a second codebase, wrong in its own ways, and that a wrong test does more damage than a missing one, because it manufactures confidence.

A green light you have never seen fail tells you nothing.

So the project picked up a rule: every new check must be broken on purpose before its pass is trusted. One layout rule got deliberately violated five times before it caught anything. Two audits passed, then kept passing after the code they guarded was deleted. Both were thrown away. The rule sounds paranoid until you read the table above again.

Nobody had counted

The launcher opens apps through universal links. A comment in the catalog said 174 of them open directly. It had been written early, by extrapolation, and everyone including me had been treating it as a measurement. When we finally wrote a script that actually fetched every domain's app-association file and counted: 99 of 368 links open the app directly. Twenty-seven percent. The comment was off by nearly two to one, and the person who found out was a user tapping Netflix.

The fix took an afternoon. The lesson has stayed with me since: any number in a codebase that nobody remembers measuring is a rumor wearing a number's clothes.

Two truths with one name

The nastiest bug family all came from a single naming failure. The app has two ideas of "the current list": the one you picked by hand, and the one actually showing right now after the schedule has had its say. For most of a day they shared one variable. The symptom kept surfacing in different rooms: a picker sheet where tapping a list changed nothing, lock-screen widgets frozen until midnight, Siri recording the wrong choice. Four fixes in four places before the real fix, which was giving the two truths two names and one rule about who is allowed to read which.

Designers like me talk about naming as a craft nicety. This was the week I watched an unnamed distinction produce identical bugs in four unrelated features.

The fold that kept becoming someone else's picture

The signature widget folds: list open, clock closed. In the widget gallery it needed one static preview, and every option was wrong. Show it folded and it is identical to the plain clock widget next to it. Show it open and it is identical to the plain list widget. Any single face we picked was some other widget's picture, because the widget's identity is not a face at all. It is the fact that it folds.

The preview that shipped shows the fold mid-act: a crease, the clock above it, the list emerging under it. It took three attempts, because the first two drew the crease with fills and shadows and read as construction paper. What survived is one hairline. Most of the design work on this app went the same way. Things got removed until the widget stopped looking wrong, and then we stopped.

What it refuses to do

The spec has a list of features that get requests and will never ship: app blocking, streaks, screen-time stats, savings promises. Part of that is honesty, since a launcher that brags about the minutes it saved you is a slot machine with a yoga mat. It is also strategy: every competitor shouts outcomes, so the quiet one stands out. The marketing site says "we're not going to quote you a percentage" where the category norm is an 80% claim with an asterisk.

What the AI actually did

The honest version, since this page would be worthless without it: the AI wrote nearly all of the Swift. I made every product decision, caught most of the visual defects, and spent a real fraction of the nine days as the skeptic in the loop, because the AI shares a failure mode with every engineer I have worked with: it believes its own green lights. The rule about breaking every new check existed because of sessions where we both stared at a passing test that tested nothing.

The pairing worked for the same reasons human collaboration works: a written spec, design tokens instead of taste arguments, verification neither party gets to skip, and a standing agreement that feeling sure proves nothing.

Where it landed

Still ships this September for iPhone: one payment, no subscription, no data collection, and a privacy policy about ten sentences long. If the fold sounds appealing, the front page shows it moving.