Where To Flock is a collaborative day-trip planner where generative UI replaces fixed forms. Two people plan a shared day in NYC — each person claims sections of the itinerary and works through AI-selected decision components in their own sidebar. Claude chooses the right widget for each decision in real time based on the domain, the person's preferences, and their prior answers.
┌─────────────────────────────────────────────────────┐
│ WHERE TO FLOCK · NYC Day │
├──────────────┬─────────────────────────┬────────────┤
│ │ │ │
│ ABBY │ SHARED ITINERARY │ MIKE │
│ SIDEBAR │ │ SIDEBAR │
│ │ ┌─────────────────┐ │ │
│ (genUI │ │ 9am Breakfast │ │ (genUI │
│ lives │ ├─────────────────┤ │ lives │
│ here) │ │ 10am Morning │ │ here) │
│ │ ├─────────────────┤ │ │
│ │ │ 12pm Lunch │ │ │
│ │ ├─────────────────┤ │ │
│ │ │ 1:30 Afternoon │ │ │
│ │ ├─────────────────┤ │ │
│ │ │ 6pm Dinner │ │ │
│ │ └─────────────────┘ │ │
│ │ │ │
└──────────────┴─────────────────────────┴────────────┘
The itinerary starts with all blocks unclaimed (grey). Each person drags blocks to claim them, or assigns them to AI.
Claude generates 2–3 decision steps per claimed block, selecting from a pre-built component catalog:
| Component | What it does |
|---|---|
mood_board |
Image grid for vibe decisions ("What does lunch feel like?") |
this_or_that |
Rapid binary preference pairs |
vibe_slider |
Spectrum decisions (casual ↔ fancy) |
vibe_slider_2d |
Two-axis decisions (chill/active × local/tourist) |
comparison_cards |
2–4 specific options with expandable detail |
comparison_table |
Feature-based option comparison |
quick_confirm |
Simple yes/no on a suggestion |
domain_claim |
Drag blocks between people and AI |
When two decisions interact (e.g., dinner location vs. afternoon activity location), Claude surfaces the conflict on the shared itinerary with a conflict_card that both people can interact with.
The itinerary fills in with full venue details, transition times, and a styled final_plan_card for each block — colors and layout reflecting the overall vibe of the day.
| Person | Role |
|---|---|
| Abby | Claude layer — system prompts, decision flow, component selection logic, final plan generation |
| Mike | Flutter infra — widget catalog, Firebase sync, layout, image search |
The project includes an "autodrive" script in kDemoMode to showcase the parallel interaction model:
- Claim (10s) — Mike (Person B) claims "Morning Activity" in the right sidebar.
- Claude Responds (10s) — Mike gets a
mood_boardcomponent to select a park or museum. - Mike Decides (10s) — Mike selects "Central Park"; the itinerary updates to "In Progress".
- Simultaneous Turn (30s) — Claude drives both sidebars at once:
- Abby (Person A) gets a
quick_confirmto approve the Central Park suggestion. - Mike (Person B) gets
comparison_cardsto choose a lunch spot.
- Abby (Person A) gets a
- Finalize (20s) — Once Mike picks lunch, the entire day is finalized.
- Success State (40s) — The itinerary transforms into a high-fidelity "Your Day" view with
final_plan_cardstyling and transition details.
| Layer | Technology |
|---|---|
| UI | Flutter Web |
| State | Riverpod (Local Mock + Firestore) |
| AI | Claude (structured JSON output) |
| Mode | kDemoMode (default) for zero-config demo |
# 1. Install dependencies
flutter pub get
# 2. Run on Chrome (ensure kDemoMode = true in lib/main.dart)
flutter run -d chrome