Building BooDo in 3 weeks

← lab

Building BooDo in 3 weeks

React Native, Expo, FastAPI backend, Claude API for the nudge system. What went fast was the UI. What didn't was understanding how couples actually share tasks. That's what shipped.

BooDo shipped from idea to working app in three weeks. Not because I’m fast, but because I cut the right corners and the wrong ones too.

Here’s what went fast, what took forever, and what I learned about building for couples.

The Idea

Task apps for couples don’t work. They assume both people will check them regularly, process what they see, and follow through. That’s three points of failure before anything useful happens.

Most couples have one person who manages tasks (usually the one with ADHD who hyperfocuses on systems) and another who just wants to know what needs doing. Build for that reality, not the fantasy of equal engagement.

BooDo is designed for asymmetric use: one person organizes, the other participates when nudged.

Week 1: UI and Data Flow

React Native + Expo was the obvious choice. I know it, it works, and I can ship to both platforms without platform-specific development.

The UI came together fast:

  • Rose/navy colorway (ADHD-friendly, lower contrast than stark white)
  • Nunito font throughout
  • Shared task lists with streak tracking
  • “Nudge your partner” button

FastAPI backend with PostgreSQL. User accounts, task CRUD, couple linking, nudge history. Standard stuff.

The data model was simple:

class Task(BaseModel):
    id: str
    title: str
    couple_id: str
    assigned_to: str | None
    created_by: str
    due_date: datetime | None
    completed: bool
    streak_count: int

class Nudge(BaseModel):
    id: str
    task_id: str
    from_user: str
    to_user: str
    message: str
    nudge_type: str  # "gentle", "reminder", "urgent"

What went wrong: I built for individuals first, then tried to add “couple” features. Should have started with couple-centric data from day one.

Week 2: The Nudge System

This is where BooDo gets interesting. The nudge system uses Claude API to generate contextual messages based on task history, timing, and couple dynamics.

def generate_nudge(task, from_user, to_user, nudge_history):
    prompt = f"""
    Generate a nudge message for {to_user} about the task "{task.title}".
    
    Context:
    - Task due: {task.due_date}
    - Created by: {from_user}
    - Previous nudges: {len(nudge_history)} in the last week
    - Relationship: domestic partners
    
    Tone: {get_nudge_tone(nudge_history)}
    Max 50 characters.
    """
    
    response = claude_api.messages.create(
        model="claude-3-haiku-20240307",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.content[0].text

The tone escalates based on nudge frequency:

  • First nudge: gentle (“dishes when you get a chance ❤️”)
  • Multiple nudges: direct (“dishes still need doing”)
  • Overdue + multiple: urgent (“DISHES. PLEASE.”)

What worked: Claude nails the tone. It understands context and relationship dynamics better than a rule-based system.

What didn’t: The character limit is arbitrary. Some nudges need more context, some need less. Fixed length feels robotic.

Week 3: Real-World Testing

This is where everything broke.

Problem 1: Task ownership is weird. I built “assigned to” as a binary choice, but couples negotiate tasks fluidly. “I’ll do dishes tonight, you get them tomorrow” isn’t captured by static assignment.

Problem 2: Streak tracking backfires. Breaking a streak feels like failure. Couples already have enough sources of guilt.

Problem 3: Nudges can be passive-aggressive weapons. Even with Claude generating “nice” messages, the nudge button becomes a way to avoid direct communication.

The fix: I added “task handoffs” and changed streaks to “completion momentum.” Instead of “you broke a 5-day streak,” it shows “5 tasks done this week.” Positive framing.

The Authentication Nightmare

Two-person apps have weird auth patterns. Do you sign up as a couple? Do individuals sign up and then link? What happens if someone’s already in another couple?

I went with: individual signup, then couple invite codes. Simple, but the UX is clunky. You install the app, create an account, then wait for your partner to do the same, then one person generates a code, the other enters it.

Better approach: Magic link couple creation. One person signs up, invites their partner via SMS/email, partner clicks link and auto-creates account with couple linkage. Smoother onboarding.

ADHD-Specific Design Decisions

No red colors. Red means “urgent” or “overdue” in most apps. For ADHD brains, red means anxiety and avoidance. BooDo uses amber and soft orange for attention, never red.

Completion sounds. Checking off a task plays a subtle ding. Dopamine hit for completion, important for ADHD motivation patterns.

No overwhelming dashboards. The home screen shows three things: tasks for today, partner’s recent completions, nudge button. Everything else is secondary.

Smart defaults. Due dates default to “this weekend” for household tasks, “today” for time-sensitive ones. Couples rarely plan tasks more than a few days out.

Claude Integration Gotchas

Rate limiting. The nudge system calls Claude API on every nudge button press. I hit rate limits fast during testing. Added request queuing and caching for similar prompts.

Hallucination. Claude sometimes generated nudges that referenced tasks or context that didn’t exist. Added strict prompt templates and response validation.

Cost. Haiku is cheap, but nudges add up. 50-100 API calls per couple per week. At scale that’s expensive. Planning to move common nudge patterns to templates with Claude for edge cases only.

What I’d Do Differently

Start with couples, not individuals. The data model, auth flow, and UX all suffered from retrofitting couple functionality onto individual task management.

Test with real couples earlier. I built based on my own experience, which doesn’t generalize. Different couples have different task-sharing patterns.

Simpler MVP. The nudge system is the core differentiator, but I spent too much time on features that don’t matter (task categories, recurring tasks, etc.).

Better onboarding. The couple linking flow is still awkward. This makes or breaks adoption.

Current Status

BooDo works. The core loop (create task → nudge partner → complete task) is solid. The UI is clean. The Claude integration adds personality.

But it’s not quite ready to ship. Two blockers:

  1. Security audit. Push notifications need proper token management. Currently using development certs.
  2. Real couple testing. I need 5-10 couples using it for two weeks to catch the edge cases.

After that, ship to App Store at $4.99/month per couple. Simple pricing, covers Claude API costs, sustainable at small scale.

The Real Lesson

The technical build was the easy part. React Native, FastAPI, Claude integration—all solved problems with clear documentation.

The hard part was understanding how couples actually share responsibilities. Most task apps are built by individuals for individuals. Building for relationships requires different assumptions about motivation, communication, and conflict resolution.

You can’t solve relationship problems with better software. But you can build software that works with relationship dynamics instead of against them.

That’s what BooDo tries to do.