Sift
Recipe pages bury four ingredients under ads and somebody's life story, and the screen goes dark while your hands are covered in something. I designed and shipped the fix solo in seven days. Every screen came out of Figma, microinteractions and animations included, some code is mine, and Claude vibe coded the rest to App Store standards.
- Role
- Everything. Product, design system, brand, code with Claude, App Store
- Team
- One person, with Claude Code as the instrument
- When
- August to September 2026, 7 days to 1.0, then three releases in ten days
- Tools
- Figma, Claude Code, Next.js, Capacitor, Xcode


What shipped
Sift is an iPhone app that pulls the recipe out of a hostile web page and keeps the screen awake while you cook. It's free on the App Store and runs in a browser at siftapp.me. Everything below is the real product running, not a prototype.
One person made this. The product decisions, the design system, the parser, the Safari and share extensions in the binary, and the store submission are all mine. Claude Code wrote most of the code. The process log behind this page runs to 332KB.
The recipe finds you
Turn on the Safari extension and a bar appears when a page has a recipe on it. One tap lands the ingredients and steps on a clean card, with a link back to whoever wrote it.
Cook Mode
Type sized for a phone propped at arm's length, about 1.7 times what rivals use. Steps check off as you pass them. The screen stays awake until you leave, and when a step says bake for 35 minutes, that's a named timer that keeps counting with the app closed.
Quit the app, keep your cook
Leave mid-cook, force-quit, whatever. A bar above the tabs offers to pick up exactly where you were, timer still counting.
Search that filters the junk
Results come from across the web, filtered on the same structured-data signal the extension reads, so category pages and listicles fall out before you ever see them.
Scale without arithmetic
Half a batch to 10×, applied to the quantities and nothing else. When you're out of buttermilk, substitutions come with the ratio and what changes.
Why it needed to exist
Sift started as a take-home for another company's interview process. The brief asked for something real, built with AI, about a problem from your own life. I cook from my phone propped on the counter, and every recipe page is somebody's essay with a video that follows you down the page.
The bigger problem is the screen. Hands covered in chicken, display asleep every thirty seconds. I used to set the phone to never sleep and forget to put it back. Dead battery by dinner. That round trip shows up in no rival's feature list, and it became the reason the app exists.


Where the scope came from
Two facts got verified before any design happened. The Screen Wake Lock API has shipped in Safari since iOS 16.4, so holding the screen awake is a web capability. And recipe sites publish schema.org structured data to get Google's rich recipe cards, so the recipe is already sitting in the page as data. Extraction is a parse.
Parsing runs four levels down, and the last level is you pasting the text in yourself, so every page lands on the same editable card. There is no unsupported-site error anywhere in Sift, because that message is the moment people delete these apps. Of everything in the product, that's the call I'd defend hardest.
The rest of the scope came off Mobbin, which documents exactly one rival, ReciMe. Its 214 screens and 64 flows have no cook mode anywhere in them. Its flow list is dominated by account and paywall screens, so Sift launched with no account and no onboarding. And its three separate import paths confirmed capture has to degrade. One path that falls through four tiers beat three doors the user has to diagnose.
The first commit landed at the exercise's three-hour cap with capture, the reader, and Cook Mode working on the web. Thirty-one more commits landed over the next three days.
The critique that killed the first design
Version one went from nothing to on-screen in a day. Warm cream paper, a rust accent, serif titles, every control a 999px pill. On an actual phone it looked cheap.
Cream plus rust is the artisan-bakery palette that generated design reaches for constantly, and a display serif on titles reads as an editorial blog. The pill is worse, the strongest consumer-casual signal a control can carry. None of those faults were brightness, so the fix stayed light.



The replacement is cold monochrome with one rule you can check in a screenshot. Color appears exactly once per screen, on the one thing you can act on. The serif survives only inside the recipe itself, because the recipe is a document and the app around it is furniture. And the committed move survived untouched. Cook Mode type stays sized for two feet away.



The palette held from there. The typeface got one more turn. Two weeks in, the interface font started reading as AI-default too, and 1.2.0 reset the whole product in Bricolage Grotesque. Most screens on this page wear it.
What testing changed
No lab, no moderated sessions, and pretending otherwise would show. Sift got tested two ways, instrumented audits and real hands on real dinners. Both changed the product.
The audits were the formal half. A pass against Nielsen's ten heuristics on the running build logged 23 findings, 12 fixed and 11 still open and written down. A scripted contrast sweep caught 7 pairings that looked fine to the eye and failed WCAG, one at 1.14 to 1, and that check exits non-zero on any regression so it can gate a build.
“i opened a mac and cheese recipe in chrome and mise did not auto detect it”My own bug report. The extension had never loaded, and Sift was still called Mise.
“and it just continues trying to open and never does”My wife, on a search hang I never reproduced. Hardening bounded the worst case to 19 seconds, where before it was forever.
She found the worst bug too. Ten minutes on a couch beat every automated check I had running. She tapped Take Photo on the profile screen, two taps from the home screen, and the app died over a missing permission string. Three more changes shipped straight out of using it.
Checked steps persist so you keep your place mid-cook. Cooking the same recipe again started with every box already ticked. One button, shown only when it applies.
I force-quit the app mid-brisket and lost the cook. That loss is why the resume bar exists.
A stray touch shouldn't end a two-hour rest, so stopping a timer takes two deliberate taps.


Measuring instead of asking
Ask a model whether search results look good and you get a yes. Have it hit the live API and count, and 'keto recipe' returned zero usable recipes out of twenty. Filtering on the structured-data signal fixed it. Dish queries now keep 15 of 20, and roundup pages score as lists before anyone sees them.
The overnight sprints ran the same way. Implementation agents worked in parallel worktrees while verification agents diffed the built app against its claims, and one overnight run's verify lane caught a Live Activity sitting silently dead in the built bundle.
What outlasted the app
The multiplier work went into my own tooling. The project-interview framework and the design-research skill written for Sift got promoted to my global setup, so every project since starts with them, this portfolio included. Same for the contrast gate, and for the habit that produced this page, a process log appended as work happened with the wrong turns kept in.
Proving it worked
Sift launched free, with no ads and no account required, seven days after the first commit. Week one closed with six App Store ratings, all five stars, roughly fifteen users, and no top-50 rank for any category term. It's nine ratings now, still 5.0. Recipes live on the device and searches stay anonymous, so behavioral data is thin by design.
The evening Sift went live I read the store listings of twelve rivals, their claims and their one-to-three-star reviews. Every one of them waits for you to bring it a link. None claims a Safari extension. That reset the listing overnight. Compete on capture, where nobody else is standing.
What did move was the listing. I renamed the app to 'Sift: Recipe Keeper & Saver' off AppFigures keyword data and rewrote the subtitle to the one claim no rival can copy, 'Auto-saves recipes from Safari.'


What did not make it
A three-tier paywall got built and wired to Stripe, then killed twice. The first version would have been an automatic rejection under App Store guideline 3.1.1, caught before it went up. The second died on judgment. Pricing a product before knowing what people use is guessing, and a wall with no door behind it is worse than no wall. The tiers sit behind a flag, switched off, until StoreKit.
iPad support got cut from 1.0 to make the deadline and came back in 1.0.1. By 1.3.0 it had its own screenshot set, shot from the app's real two-column layout.