Phase 39 · Demo Quality Sweep · SHIPPED 2026-05-26 · pending iPad verification

Demo Quality Sweep

Five quality issues bundled before Singles + Vault (Phase 40) and Final Polish (41). All visible-on-demo-path: photo mismatches (flagged 3+ times), buried CheckIn/QuickRec content, repetitive feed feel, broken "New Here" guide.

Sweep first, polish later. Pitch demo timeline.
5
Plans
5/5
Plans shipped
97
Photos served locally
389
Pexels URLs → /curated/photos

📋 Kickoff state

Phase 39 = Demo Quality Sweep (inserted before original Phase 39).
Phase 40 = Singles + Vault community-voice editorial (was 39).
Phase 41 = Final Polish (was 40).

Approach: do quality work BEFORE Singles + Vault add new entities that would need cross-link/empty-state/photo audit anyway.

Founder approved: Phase 39 scope, Pexels-over-Unsplash pivot, "Nabe Pulse" row name (was "Stories"), Variant B-Bubble bubble sizing.

Pending founder calls: variant C-Side (side-by-side) layout option, Q4/Q5/Q8 from sweep prep (hero+contribs scope, country-specific WC fans, batch-by-file vs all-at-once).

🔗 Links

Live + mockups
Planning
  • .planning/ROADMAP.md — Phase 39/40/41 renumbered
  • .planning/TODOS.md — feed diversity audit + "New Here" bug
  • src/data/curatedPhotos.ts — Pexels photo library

📦 Plans

Plan What Status
39-01 Photo curation system — Pexels photo IDs per content category. src/data/curatedPhotos.ts with deterministic picker. ✅ Shipped · 46 cats / ~210 IDs
39-02 Photo replacement sweep — picsum URLs across mockEvents (154), mockPosts (123), mockListings (52) + 9 misc data files. 369 swaps shipped. ✅ Shipped
39-02b Local photo download — 97 Pexels JPEGs in public/curated/photos/. Kills Cloudflare 429 rate-limiting. getCuratedPhoto() + new picsumSeedToCurated() helper return local paths. WC Hub V2 dynamic seeds now routed through the helper. ✅ Shipped
39-03 Nabe Pulse row — replaces NeighborhoodStoriesRow. C-Split-Preview: pulsing brand-gradient header + two preview cards (stories left, live activity right). Tap right → NabePulseDrawer lists all check-ins/recs. CheckIn/QuickRec removed from long feed. Stories capped at 4. ✅ Shipped
39-04 Feed diversity reorder — Flooding alert moved from visible position 2 → 8; Found-dog from 4 → 11. First 8 W'burg posts now diverse (safety, help, event, marketplace, tip, agent-insight, help, safety). ✅ Shipped
39-05 "New Here" guide bug — nurturing-card CTA now invokes onAction(card.ctaAction) and AppShell routes to calendar drawer / 'me' tab / 'explore' tab based on the action. Pseudo "Done!" confirmation removed. ✅ Shipped

✅ Decisions locked

⬜ Awaiting iPad verification

Rollback tag: pre-photo-sweep still valid · v1.2-warm-palette for full Phase 39 rollback.

⚖️ Known compromises

🏗️ Architecture (already shipped)

src/data/curatedPhotos.ts
├── PhotoCategory union (75 categories defined, 36 populated)
├── CURATED_PHOTOS: Partial<Record<PhotoCategory, readonly string[]>>
│     (Pexels numeric IDs per category, 3-6 per cat)
├── getCuratedPhoto(category, seed, width, height) — deterministic picker
├── curated(category, seed, w, h) — convenience helper with defaults
└── Fallback: 'neighborhood-walking' (3 safe NYC brownstone IDs)

Direct image URL:
  https://images.pexels.com/photos/{ID}/pexels-photo-{ID}.jpeg
  ?w=W&h=H&fit=crop&auto=compress

📜 Commits this phase (newest at top)

feat(39-02b) photos served locally — kills Pexels Cloudflare 429s (97 JPEGs, 19MB)
fix(39-05) nurturing-card CTAs now navigate — wire onAction to AppShell
fix(39-04) feed diversity — break up safety + help clusters at top of feed
feat(39-03) Nabe Pulse row — split-preview replaces NeighborhoodStoriesRow
fix(39-02) sweep remaining picsum URLs across 9 missed mock data files
docs(39-03) lock C-Split-Preview as final variant + 'Nabe Pulse' header pattern
feat(39-02) photo sweep — mockListings.ts (52 picsum → Pexels curated)
feat(39-02) photo sweep — mockPosts.ts (121 picsum → Pexels curated)
feat(39-02) photo sweep — mockEvents.ts (154 picsum → Pexels curated)
feat(39-01) curated photos — 46 categories populated (~210 IDs)
docs(39) refine stories row mockup — B-Bubble + B-Stack alt; ROADMAP renumber
docs(39) stories row consolidation mockup — 3 variants + decision matrix