Designing with AI: from Figma to shipped code

My core is product definition, design and front end. Claude Code and Codex write most of the code from my specs, so I can take a product from an idea to the App Store. This is the loop I use, with real examples from Blik, my home-services marketplace for Toronto.

01

Spec before code

I follow the BMAD method. A PRD sets the users, flows, rules and what success looks like. An architecture note covers the data model, APIs, Firestore rules and payments. Then the work is cut into small stories, each with acceptance criteria, so every change the agents make is small enough to review properly.

Give providers a fair window to accept a job
  • The chosen provider has 10 minutes before the customer is offered a choice.
  • Nothing is reassigned automatically.
  • A request still unanswered after one hour is released, on the app and the server alike.
02

Onboard the agents like a team

Every repository has a CLAUDE.md or AGENTS.md with the architecture, the conventions and the rules, so both tools start from the same source of truth. Repeated work, like release steps, design-system rules or QA checklists, lives in skills the agents load on demand. Figma and GitHub connect through MCP, so they build from the real designs and code instead of my description of them.

# Blik · project context (excerpt)
Stack: SwiftUI app, Firebase Auth + Firestore,
Cloud Functions, Cloudflare Worker, Stripe Connect.

## Rules
- Never change payment logic without a test.
- Firestore rules ship with every data change.
- One story per change. No deploy without approval.

## Done means
- Builds clean, QA agents pass, tested on device.
03

Read the diff, not the summary

I read every change and step through it in Xcode or VS Code, checking behaviour against the story. On Blik the provider timeout was 90 seconds, which made customers give up while cleaners were mid-job. I changed the rule and kept the app and the server cleanup on the same number.

// Blink/DispatchOrderStore.swift
- private let pendingTimeoutSeconds: TimeInterval = 90
+ private let pendingTimeoutSeconds: TimeInterval = 10 * 60
/// A provider gets ONE HOUR to accept. The server's stale-hold sweep
/// uses the same 60 minutes. Change them together.
+ private let stalePendingExpirySeconds: TimeInterval = 60 * 60
04

Dedicated QA agents

For the parts that can hurt users or money, I set up review agents with one job each. After a change they audit their area and report issues with evidence; I decide what gets fixed.

Payments
Stripe Connect: manual capture, platform fees, payouts, refunds, no double charges.
Booking and dispatch
The state machine from request to accepted, declined or timed out.
Onboarding
Signup to a verified provider who can be paid.
Data
Firestore rules and field mapping across Airtable, the Worker and Functions.
Trust and safety
Verified badges, ratings, report and block.
05

Ship, then measure

I test on my phone and, for payments, in Stripe test mode. After launch, Google Analytics 4 funnels show where people drop off and Microsoft Clarity recordings show why. What I see there becomes the next story.

What I never hand to the agents

Product rules

How long a provider has to accept, what a customer sees, what happens on a refund. The agents implement them; I decide them.

The design

Flows, hierarchy and the interface start in Figma and stay my call when the code drifts.

What ships

Nothing goes out without my review, a test on device and, for payments, Stripe test mode.

Built this way