Janarayson

I stopped opening Sketch and Figma

Design7 min read

For the MoneyMama app, we set the look and feel in Claude Design and let code do the iterating after that. Every change to a screen now starts as an HTML mockup in the browser, usually with a few options to pick from.

For most of my career, designing a screen meant opening Sketch, and later Figma. When we weren’t sure which way to go, I’d draw every option we could think of, which really wastes a lot of time.

This year we built the MoneyMama app, and I haven’t opened either for it.

I’ve found that once you’ve established the look and feel of the whole app, you can use code to iterate between designs quickly. And with Claude, asking for variations and iterations is super easy.

Getting the look right first

The app needed a lot of screens at once: onboarding, the chat with Mama, the Money tab, settings, analytics, Mama’s chat cards and the tools tab. In July we designed all of them in Claude Design.

A few of the decisions were about how Mama looks outside WhatsApp. Her messages had always sat in WhatsApp’s green bubbles. In the app we dropped the green, and when Mama speaks outside the chat, it’s her face overlapping a plain white card.

We locked each set of screens once we were happy with it, though locked didn’t mean finished. Onboarding was locked in late July, then redone and extended in early August.

The onboarding section of the Claude Design file, marked LOCKED, with notes on when it was locked and redone, and three phone screens: picking a language, the welcome with Mama's face, and the first intro slide
The onboarding screens in Claude Design, marked locked.

From Claude Design, everything went to Claude Code as a handoff bundle: the HTML, the colours, type, spacing and shadows as CSS tokens, and a README that walks through every screen. The README also says what happens when the bundle and the code disagree. On how something works, the code wins. On how it looks, the bundle wins.

I didn’t want to review a diff

Once the app was being built, the screens changed every day, and I was making those changes with Claude Code.

A change to a screen shows up as a code diff, and I didn’t want to judge a design by reading one. So in August I made it a rule: before Claude Code touches a screen, it shows me a mockup in HTML, the screen as it is next to the screen as it would be, built with the app’s real tokens and real copy.

The mockups live in a folder that git ignores, so none of them end up in the codebase. There were more than forty of them by the end of August.

Most of them are pages of options. I ask for variations, and Claude Code draws them side by side, lettered, each with a note on what it changes and what it gives up. Usually it marks the one it would pick. I open the page in the browser and choose.

The pill at the top of the Analytics and Money tabs took two rounds. Its icon sat inside a tinted circle, and the first round only tried different colours for the circle. The second round dropped the circle: text only, a coral dot, a filled glyph, a sticker. L, a solid coral glyph, was in the app the same day.

Round 2 of the header pill: options J, text only; K, text and a coral dot; L, a filled coral glyph, marked my pick; M, a filled ink glyph; N, a sticker glyph; each showing Analytics and Money pills with a note underneath
Round two for the header pill. L is what shipped.

Previously, we would have had to draw both rounds in Figma, every option by hand.

Voice notes had a bug where stopping a recording sent it straight away, so an accidental tap could send an empty clip. The mockup for the fix was one I could click through, with the mouse standing in for a finger, and it had three flows: stop and then review, treat a pause as the review, or hold to record like WhatsApp. We went with the first, so nothing sends until you tap send.

The voice note mockup: a chat with Mama and a composer you can click through, tabs for three flows, A stop then review, C pause is the review, B WhatsApp hold, and notes on flow A's steps and trade-offs
The voice note mockup, with three flows to click through.

Fixing things in the mockup first

A few mockups started from something already broken in the app. Because they use the app’s real fonts, numbers and strings, we could work out why in the mockup and measure the fix before changing any code.

The donut on the Analytics tab shows the month’s total in the middle, and at five figures the total was sitting on the ring. The mockup put the current donut next to two bigger ones, tried three totals in each and measured the room on either side. At the current size, RM4,567.90 had 6px to spare and RM456,789.00 ran 6px over. We went with the bigger ring, scaled up in proportion, which opened the hole from 114px to 142.5px.

Three columns of the spending breakdown donut, the current size and two larger options, each repeated with totals of RM 4,567.90, RM 45,678.90 and RM 456,789.00, with the clearance of each total measured underneath
Three donut sizes against three totals, with the clearance measured.

The Analytics tab was also clipping on the cover screen of a Galaxy Z Fold 5, which is 344dp wide. The mockup showed each part of the tab at that width, before and after, with a note on why it broke. A card there has 276dp for its content, 46dp less than on an iPhone 15, and six parts of the tab had been sized for the iPhone. The six-month bar chart, for one, needed 302dp and had 276. Each fix only kicks in when the space runs out, so the tab looks the same on bigger phones.

Analytics on the Z Fold 5 cover screen at 344dp: before and after frames for the income hero with six-month bars, where the bars need 302dp but 276 are available, the spend hero's head row, and the income versus expenses head, each with notes on why it breaks and the fix
The Analytics tab at the Fold's 344dp, before and after, with a note on why each part breaks.

Chinese took five mockups in one afternoon. Our Chinese screens looked flat. The app never loaded a Chinese font, so every character fell back to the phone’s own face at a single weight, and bold headings, buttons and body text all came out the same.

The first mockup suggested keeping the phone’s face and asking for its weights by name, which on an iPhone means PingFang SC and adds nothing to the app’s size. The next one looked at Hargapedia, the app I worked on before this, which uses a rounded Chinese font. It set our real Chinese strings in that and three other fonts, each next to Inter, which carries our English text and our numbers. A note underneath explained why the rounded font works in Hargapedia: its English text is rounded too, and Inter isn’t.

Four Chinese fonts, Tensentype JiaLi Yuan, Yuanti SC, PingFang SC and Hiragino Sans GB, each setting the same MoneyMama strings with Inter for the English words and an RM 1,286.40 figure, followed by a note on why Hargapedia's rounded Chinese doesn't pair with Inter
The same Chinese strings in four fonts, each paired with Inter.

Other mockups compared the licences and file sizes of the free Chinese fonts. MiSans was out, because its licence doesn’t allow the font to be cut down to just the characters we need, so we’d have shipped about 8MB per weight. We set Chinese in HarmonyOS Sans SC, cut down to the 6,763 characters in the GB2312 standard. Three weights come to about 5MB, and the headings are bold again.

Where it’s ended up

Each of these went from mockup to app on the same day. I don’t draw the options any more. Claude Code draws them with the app’s own tokens, and I pick one.