How it started
Build me a pool-water testing companion app — guided drop test, deterministic dosing calculator, web + iOS, Free/Pro paywall. Solo + AI build.
Built with
Agents — claude-opus-4.7, factory-ai-droid.
Models — claude-opus-4.7.
Harnesses — claude-code, factory.ai.
CLIs — gh, stripe, gcloud, prisma.
Infra — gcp-cloud-run, gcp-cloud-sql, stripe, cloudflare-dns.
Workstreams
★Mission E — GCP deploy scaffolding
Shipped · May 27, 2026
Cloud Run + Cloud SQL connector, standalone Next build, Dockerfile + deploy scripts, DEPLOY.md runbook.
Droid-built, Claude-verified — including the highest-risk artifact (Dockerfile paths matched the real standalone output). Untestable locally without Docker; deferred to first Cloud Build.
Mission D — Login pageShipped · May 27, 2026
Credentials sign-in for returning email users. Droid D1–D3, Claude D4.
Mission C — Cancel UXShipped · May 26, 2026
Subscription cancel-at-period-end + 'Don't cancel' resume, validated live end-to-end.
Mission B — Stripe webhookShipped · May 23, 2026
Checkout + portal + webhook with v22-shape fix for current_period_end.
Mission A — Monetization coreShipped · May 23, 2026
Migration, pricing catalog, pure entitlement logic, 402 paywall gate.
After a Week-1 sprint that landed auth + pools + a calculator, the build re-scoped from “4-week multi-platform” to “web-only Free+Pro with Stripe webhook-authoritative billing.” Five focused missions followed; the monetization loop is now live end-to-end against real Stripe.
The working model: Claude as architect/reviewer, factory.ai droid as implementer, missions handed off via repo MISSION-*.md files. When the droid hangs (the non-TTY shell issue), Claude finishes the mission directly.