Case study · Solo build · 2025–26

Banana — a shared to-do app for two.

A focused iOS app for couples and roommates. Designed, built, and shipped solo to the App Store. Apple approved on first submission. Claude Code as the implementation pair.

Snapshot
RoleDesigner · builder · operator
Year2025–26
StackReact Native · Supabase · Claude Haiku
StatusLive on App Store
What shipped
v1.0Approved on first submission
Edge fns4 production functions
SecurityAll advisor findings resolved
Problem

Existing task apps are either too solo (Todoist, Things) or too project-heavy (Asana). Nothing fits the everyday "did you grab milk" rhythm of life with a partner.

What I did

Designed, architected, and built the app end-to-end — UI, backend, AI parsing, push notifications, App Store submission, marketing site — directing Claude Code for implementation.

What shipped

v1.0 live on the App Store. One shared list per pair, AI-assisted task entry, a focused "My Day" mode, gentle reminders, and a free-now-paywall-later pricing thesis.

The problem worth solving.

I was tired of the low-grade negotiation in our household — "did you get the milk?", "did you book the appointment?", "is the laundry in?". Every task manager we tried was either overkill or under-built for two people who actually share a life.

The thesis: a task app for two doesn't need projects, workspaces, or agile boards. It needs one list, gentle nudges, and a way to add tasks faster than typing them out. So I built that.

Try the magic-wand parser.

The fastest way to capture a task is to type it in natural language and let the app structure it. Banana routes the input through a Claude Haiku edge function and returns chips: assignee, date, time, keywords. Try it below — it's a mock running on your device.

Interactive — try typing a task

Try: "Tomorrow at 3pm get groceries for @brent" or "Friday morning pick up dry cleaning".
In the real app, this routes to a rate-limited Claude Haiku edge function (20 parses/user/day, with an Anthropic-side spending cap as a second-tier safety net).

Designed, built, and tested across the whole stack.

Banana isn't a Figma-and-handoff project. Every decision — UI, schema, RLS policy, edge function, App Store metadata — I owned end-to-end. Claude Code was the implementation pair. The calls were mine: what to build, how to structure it, when to ship, when to defer.

Banana home screen — shared task list
Home — shared task list with My Day filter
Banana create task screen with magic wand
Create task — natural-language input + chips
Banana task details with reminder
Task detail — reminders, checklists, notes
Banana create task — assignee selector
Assignees — diff-based updates, read-only for non-owners
Banana history — activity log + archive
History — activity log + 30-day auto-archive
Banana profile — linked accounts and notifications
Profile — linked accounts, notification settings

Five decisions worth surfacing.

Ship free. Defer monetization to v1.1.

The "aha moment" in Banana is sharing — so account-linking is the natural premium gate. I had every screen designed for a $2.99/month paywall, but I deferred the IAP build. The reasoning: the next pricing decision needs real user data, not assumptions about a funnel I haven't measured yet.

Cost-bound the AI feature before launch.

The magic-wand parser was a budget risk for a free-launch app. I designed an atomic consume_parse_token() Postgres function gated by a parse_task_usage table — hard cap 20 parses per user per day, with an Anthropic-side spending limit as a second-tier safety. Cheap AI features die without rails.

Read-only assignee chips for non-owners.

RLS on the backend silently blocked non-owner assignee changes — but the chips were still tappable in the UI, producing confused users and ghost-failure states. I made the chips dim and non-interactive for non-owners with a quiet hint: "Only the owner can change who's assigned." Small fix, real lesson about respecting backend constraints in UI affordances.

Empty state that doesn't feel like marketing.

The first-run welcome originally had a bulleted feature list that read like a landing page inside the app. I stripped it: hero logo, confident headline, one-line subhead, primary CTA, and a soft secondary "Or invite someone to share with →" that surfaces the partner pitch without competing with the primary action.

Brand cohesion across product and marketing.

I extracted the LogoMark SVG used in the app and re-used it as the marketing site's favicon and header logo, replacing a 🍌 emoji placeholder. Same fonts, same color tokens, same spacing scale. Two surfaces, one design system.

What shipped.

  • iOS App Store
    v1.0 live
  • Apple submission
    Approved 1st try
  • Production edge functions
    4
  • Supabase security advisor findings (open)
    0

Marketing site is live at usebanana.app. The app is on the App Store as Banana: Tasks for Two.

How this was built.

Role: Designer, architect, builder, operator. Every call was mine.
Implementation pair: Claude Code. I directed; AI was the keyboard.
Stack: React Native (Expo SDK 54), Supabase (Postgres + Auth + Storage + Edge Functions), Anthropic Claude Haiku 4.5, expo-notifications + pg_cron, Cloudflare Pages, EAS Build.

The honest version: the design judgment, the architecture, the product calls, and the testing rigor are mine. The keystrokes are often Claude's. A lot of what I learned along the way — schema hardening, edge functions, Cloudflare DNS — I learned by directing and reviewing rather than authoring line-by-line. The pattern is real, the work is real, the outcomes are real.