SnapCook

What happens when one developer works with AI — not as a toy, but as a method


800+ commits  ·  335+ pull requests  ·  1 developer

Recipes are trapped in dead formats


  • A TikTok screenshot in your camera roll you'll never find again
  • A blog post behind a paywall, buried under 2,000 words nobody asked for
  • Grandma's handwritten card, fading in a drawer
  • A link your friend sent at 23:47 that you meant to save

SnapCook: Snap a photo of any recipe. AI extracts it into structured data.
Save it, scale it, cook it, share it.

What We Actually Built

Not a monolith. Not a toy. A proper system with proper boundaries.


┌─────────────────────────────────────────────────────────┐
│  Flutter Mobile App (iOS / Android)                     │
│  28 screens · 7 DDD bounded contexts · 4 languages      │
└──────────────────────────┬──────────────────────────────┘
                           │
            ┌──────────────┼──────────────────┐
            │              │                  │
       ┌────▼─────┐  ┌────▼───────┐  ┌───────▼──────┐
       │  Recipe   │  │   Image    │  │   Payment    │
       │ Extractor │  │ Generator  │  │   Service    │
       │ (FastAPI) │  │ (FastAPI)  │  │  (FastAPI)   │
       └────┬──────┘  └────┬───────┘  └───────┬──────┘
            │              │                   │
       ┌────▼──────────────▼───────────────────▼───────┐
       │  PocketBase (auth, database, files, realtime)  │
       └────────────────────┬──────────────────────────┘
                            │
       ┌────────────────────▼──────────────────────────┐
       │  SvelteKit Web (marketing, shared recipes,     │
       │  auth, OG images, download prompts)            │
       └────────────────────────────────────────────────┘
       ┌────────────────────────────────────────────────┐
       │  Admin Dashboard (SvelteKit + Three.js)         │
       └────────────────────────────────────────────────┘
        

The Timeline — Not Days, But Chapters


Period What happened Commits
Early days Flutter app, React web, PocketBase, core extraction, first 200 PRs ~500
Late Feb Pricing overhaul, Pro gating, SvelteKit migration begins, Kitchen Circles 43
Early Mar Killed credit-based Pro (unlimited instead), iOS pipeline, full i18n 37
Mid Mar Admin dashboard, App Store prep, Apple IAP, security audit, React app deleted 71
Late Mar Meal planner, grocery lists, pantry, home screen redesign, image generator service 104
Early Apr DDD refactor, TDD infrastructure, content moderation, smart shopping, security hardening 61

5 documented releases. Each one would be a reasonable quarter for a small team.

How the Work Actually Happens

It's not "prompt engineering." It's software engineering with a different tool.


The human decides The AI executes
"We need Kitchen Circles, not the old Hosting tab" Writes 3 PB migrations, circle UI, member management, providers
"The pricing model should be unlimited for Pro" Updates Flutter constants, backend metering, SvelteKit pricing, 4 languages
"This architecture won't scale — refactor to DDD" Moves 200+ files, updates every import, creates barrel files, adds READMEs
"We need a security audit before launch" Finds 20+ vulnerabilities across the full stack, proposes fixes
"Fix the security audit findings" Implements fixes across Flutter, FastAPI, SvelteKit, PocketBase
You're building it the way an architect builds a house. You don't lay every brick yourself, but you're responsible for every wall.

No Desktop. No IDE. Just a Phone.

Almost the entire app was built on claude.ai/code — from a mobile browser.


Morning commuteReview overnight PRs, approve and merge
Cooking dinnerStirring a pot with one hand, adding a new feature with the other
Watching The VoiceDebug a failing image generation pipeline during commercial breaks
Going to bedQueue up 6 issues, ask Claude to plan and fix them. Wake up to PRs ready for review.
No terminal. No local environment. No git on my machine.
The entire development workflow lives in a browser tab on my phone.

A Concrete Example — The Pricing Pivot

Three pricing models in two weeks


V1 Late Feb: Credit-based. Free: 3/month. Pro: 50/month. Bundles: $0.99–$5.99.

V2 Early Mar: Unlimited Pro. Credits only for free users. Bundle prices raised.

V3 Mid Mar: Bundles removed from UI entirely. Pure subscription play.

Each pivot touched:

  • Flutter app (constants, UI, metering service, IAP)
  • Backend (payment service, metering logic, webhook handling)
  • SvelteKit (pricing page, translations, FAQ)
  • PocketBase (user fields, usage logging) + copy in 4 languages
The cost of changing your mind dropped to nearly zero. That changes how you make product decisions.

The Numbers


800+ commits
335+ pull requests, each reviewed
50k+ lines of Dart in the mobile app
28 screens across the mobile app
18 database collections, 37 migrations
3 backend microservices, 25+ API endpoints
4 languages (NO, EN, SV, DA)
2,700+ translated strings across 4 languages
52 test files with factories, mocks, and CI
1 developer

What Didn't Work

AI-assisted development isn't magic. Some things were still hard.


  • Apple IAP took multiple rounds of rejection and fixing. The AI doesn't know what Apple's review team will flag next week.
  • The AI sometimes builds what you asked for, not what you meant. You still have to review 335 PRs.
  • Generated code can be subtly wrong in ways that pass tests but fail in production — a smoothie categorized as a breakfast bowl, an image validator that accepted a Buddha statue as food photography.
  • The DDD refactor should have happened earlier. The AI made it cheap, but the need for it was a planning failure, not a tools failure.
  • Security can't be an afterthought. We did a full audit and found 20+ issues. Most were in AI-generated code. The audit was also AI-assisted. Defence in depth, applied to your own process.

The Viral Loop — Where Product Meets Code


Snap a recipe photo
AI extracts it (Gemini 2.5 Flash, $0.000375 per snap)
Save to your cookbook
Share a link
Friend opens it on web (SvelteKit SSR, no login needed)
"Save to My Cookbook" → signs up → downloads the app
The web doesn't compete with the app. It sells the app.

Demo

The full user journey


  1. Snap — photograph a recipe from a cookbook
  2. Extract — watch AI parse it into structured data
  3. Cook — step-by-step cook mode
  4. Plan — add it to this week's meal plan
  5. Shop — generate a grocery list
  6. Share — send the link, open on web, see the OG preview

What This Means


1. The cost of ambition just dropped

Features you'd cut from scope because of time are now feasible. Four languages, a design system, gamification, an admin dashboard — we built all of it. Not because we're fast, but because the marginal cost of "one more feature" changed.

2. Architecture is the new prompt

The AI follows the patterns it sees. If your codebase has clear structure, bounded contexts, and consistent conventions, the AI produces better code. Invest in architecture and you get compound returns on every feature after.

3. The bottleneck moved

It's no longer "can we implement this?" It's "should we implement this?" Product judgement, design taste, and knowing when to say no — those are the scarce skills now.

800+ commits. 335+ pull requests. One person.

Not to prove a point.

To build something useful, at a pace that used to require a team.


Steffen Vetrhus  ·  snapcook.it

SnapCook