BACK TO GAME CABINETAll work
Solo Side Project, iOS and web

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
A recipe blog with a banner and a life story above the recipeThe same recipe in Sift: title, source, photo, and a Cook this button

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.

The App Store preview without its captions. Safari to saved card in one tap.

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.

Cook this, then a timer named for what it's timing.

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.

The resume bar. A cook survives anything.

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.

Twenty results, all of them recipes.

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.

5× on the fly.

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.

A recipe blog with an ad and a life story above the recipe
Before. The recipe is down there somewhere.
The same recipe in Sift: title, source, photo, Cook this
After. Just the recipe.

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 four parse tiers, JSON-LD, microdata, heuristic, and manual paste, all converging on one editable card
The parse cascade. No tier ends in an error.

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 killed first design: a warm cream library with serif recipe titles and pill chips
The killed library. Run from an old commit for this page.
The killed recipe page: Fraunces serif title and a rust pill reading Cook this
Fraunces on cream. The rust pill.
The killed Cook Mode with a warm pink wash background
Cook Mode's warm wash. All of it died.

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 shipped recipe page in cold monochrome, with the red Cook this button as the only color
The face that shipped. The one color on it is Cook this.
Shipped Cook Mode with checkable ingredients and the screen-awake indicator
Cook Mode. The committed move survived untouched.
The shipped Find screen, monochrome except the red Search button
Find. Ember lands on Search and nowhere else.
When a screen has two colored things, one of them is wrong and has to become type or space instead. That sentence governed more decisions than any component spec.

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 itMy own bug report. The extension had never loaded, and Sift was still called Mise.
and it just continues trying to open and never doesMy 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.

Start over

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.

The resume bar

I force-quit the app mid-brisket and lost the cook. That loss is why the resume bar exists.

Two-tap stop

A stray touch shouldn't end a two-hour rest, so stopping a timer takes two deliberate taps.

Cook Mode with a named Baking timer counting down and the Start over button above the steps
The named timer. Start over appears once steps are checked.
The resume bar above the tab bar, dish name and timer still counting, with a Resume button
The resume bar above the tabs.

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.

Eleven of the twelve audited rivals ranked by ratings count, every one importing by paste or share sheet, against Sift, where a bar appears on the page
The launch-evening audit. Data from the rivals' own listings.
The audit also backed a call already shipped. All twelve rivals have a grocery list, Sift launched without one, and a half-built table-stakes feature invites a comparison you lose.

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.'

App Store panel: Just the recipe, above the brisket recipe card
App Store panel: Auto-detect, no share sheet, showing the detection bar on a recipe page
The claim on the store.

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.

There's also a Bluetooth probe feature I got reading a real Chef iQ thermometer, then parked. Fifteen users don't need hardware support yet.

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.

High score.Results.

7 days
First commit to the App Store
Aug 17 to Aug 24, 2026
3
Releases in the first ten days
1.1.0, 1.2.0, 1.3.0
5.0
App Store rating
Nine ratings. Small n
MORE CARTRIDGESMore work
THANKS FOR PLAYING.

Built in Washington, D.C., for anyone who reads the patch notes.