Hero Board UX Plan — 2026-07-20

Operational usability + visualization improvements for /admin/board (web/src/pages/admin/AdminBoardPage.tsx, 3,172 lines). Read-only analysis; every idea below is grounded in the actual code and notes whether it reuses data the board already fetches or needs new API work.


✅ APPROVED — Justin, 2026-07-20: "I love the plan, I want to do all of it," plus two design directives that govern every phase

  1. "Actions" dropdown per sticky (space preservation). Anything that CHANGES an event consolidates into a single Actions button on the card with a dropdown to pick what you're editing (prize, sponsor, beneficiary, image, draw config, …) — replacing the row of 5+ ghost buttons. "Show QR code" joins the dropdown too (Justin, 2026-07-20 follow-up) — opening the QR in a modal/popover instead of rendering an 88px block on every card, which alone reclaims most of the card height. Use this consolidation pattern anywhere we need to preserve space on the board. Justin on the split of edit-vs-view items: "I'll trust what you go with — lean toward the most useful and the cleanest approach." Quality bar, verbatim: "Don't half ass anything here, let's get this thing looking beautiful."
  2. The sticky IS the editing surface (feel). Justin wants to feel like he's editing EVERYTHING right on the sticky and to move back and forth fluidly between sticky and edit mode. Concretely: the sticky ↔ full-edit round-trip must stay instant and lossless (the Close-to-focus loop from op-admin-edit-flow — sticky → full edit → Close → board scrolled + pulsing that same sticky — is the backbone; deep-link ?focus= preserved), tight edits happen from the card via the Actions dropdown without losing board context, and compact cards must never make an edit feel farther away than it is today.

Rollout consequence: all three phases are greenlit; the Actions dropdown moves UP into the Phase 1/compact-card work rather than waiting for Phase 2. Ops queue AFTER op-admin-edit-flow-2026-07-20 + op-admin-notes-panel-2026-07-20 (same files).


(a) The board today — 1-paragraph summary

The board is a 3-column pipeline (Inquiry → Event → Closeout, ?archived=1 adds Archive) that classifies parties + inquiries by classifyToColumn (web/src/lib/lifecycles.ts), fetched in full via queryPipelineEntities (web/src/api/admin.ts:1181/admin/query/party + /admin/query/inquiry, limit 200, complete entities incl. tags, details, connectors, _caps). It does a LOT well: drag-and-drop transitions with optimistic update + revert, per-card quick actions (+Prize/+Sponsor/Beneficiary/Image/Preview), herodraw Run Draw + Winners/Top-raisers steppers persisted on details.settings, completeness checklist dots, closeout checklists backed by note-tasks, QR codes, ?focus=<id> gold-pulse deep links with copy-link buttons, and sidebar Tasks/Lessons-Learned views. The pain points visible in the code: money is invisibleparty.tags.total_raised is already in memory on every card but never rendered; cards are enormous (QR at 88px, 5+ ghost buttons, steppers, email, UUID-prefix owner, checklist — so 4 live events + inquiries means heavy scrolling and no at-a-glance scan); no summary strip (you can't see total live $, closing-soon, or draw-pending without opening things); no dates/countdown despite tags.end_time / details.settings.draw_date being fetched; no category theming despite $accentHeropicks/$accentHerodraw/$accentHerofund tokens existing (web/src/tamagui.config.ts:264-266); duplicate cards for the same event (converted inquiry + active party both land in Event column — the ?focus comment at line ~1824 admits this confuses even the team); plus several dead/rough affordances (pipeline-mode checkboxes select things but the bulk bar only renders when !pipelineMode at line ~2922; Reassign asks for a raw user UUID; owner renders as assigned_to.slice(0,8)…; the Image checklist reads details.banner_url top-level while real branding lives at details.branding.banner_url).


(b) Ranked idea list

Legend: S ≈ hours (one dev-mission slice), M ≈ a day-ish, L ≈ multi-day / needs API design. "Cheap" = uses data queryPipelineEntities already returns; "API" = needs new/changed backend.

1. Money on every party card + board summary strip — S, cheap ⭐ highest impact

2. Days-to-close / countdown chip — S, cheap

3. Attention/health badges + attention-first sort within columns — S/M, mostly cheap

4. Category theming — HeroPicks teal / HeroDraw gold / HeroFund deep teal — S, cheap

5. Compact cards by default + expand for the command center — M, cheap ⭐ biggest visual win

6. Merge/dedupe the converted-inquiry + party twin cards — S/M, cheap

7. Ops table view toggle ("Board / Table") — M, cheap

8. Pipeline-mode filters + working bulk bar — S, cheap

9. Reassign & owner display humanized — S, small reuse

10. Mobile: default-open Event section + summary strip — S, cheap

11. Compliance visibility — S (manual) → M/L (automated)

12. Freshness: last-refreshed stamp + auto-refresh — S, cheap

13. Keyboard/speed affordances — S, cheap (nice-to-have)

14. Bigger bets (Phase 3 seeds)


(c) Phased rollout (each phase = one op-planner mission scope)

Phase 1 — "Board at a glance" (high impact, low effort; all client-side, one mission)

Scope for op-planner: AdminBoardPage information density + summary layer; no new API endpoints; no entity-schema changes.

  1. Summary strip (total live $, active events, pending inquiries, closing soon, draws pending) — idea #1.
  2. $ raised (cents→USD) prominent on party cards — #1.
  3. Countdown/closes chip on all party cards (generalize existing closeIso) — #2.
  4. Attention badges from already-fetched fields (closing-soon, stalled, no-image, no-processor) + attention-first, then $-desc sort within columns — #3 (defer no-challenge/draw-record to Phase 2/3).
  5. Category accent border + chip via classifyFundraiser + existing accent tokens (herodraw vs rest) — #4.
  6. Fix Image-checklist path (details.branding.*) — #3 bundled fix.
  7. Mobile: Event accordion open by default + summary strip — #10.
  8. Last-refreshed stamp — #12 (skip polling if time-boxed). Test surface: chromium render of /admin/board (desktop + 390px), assert strip totals equal sum of card amounts, badge presence on a seeded closing-soon/stale party, accent colors per category. (Board ops must follow the op-video standard.)

Phase 2 — "Work the board" (medium)

Scope: interaction correctness + findability; ≤1 extra batched query per load; still no schema changes.

  1. Compact card default + expand toggle (?dense=1, localStorage) — #5.
  2. Dedupe converted-inquiry/party twins with "from inquiry" chip + escape hatch — #6.
  3. Pipeline filters (category chips, Mine) + fix-or-remove pipeline bulk selection — #8.
  4. Reassign dropdown + owner/created_by names via fetchAdminSalesUsers map + AvatarCell — #9.
  5. Batched challenge query → "No challenge" badge; batched round query → correct heropicks classification — #3/#4 completions.
  6. Manual compliance flag in checklist + non-blocking warn on activate — #11 phase A.
  7. Keyboard: / search focus — #13.

Phase 3 — "Ops cockpit" (bigger bets)

Scope: new API surface; product decisions from (d) resolved first.

  1. Table/ops view toggle reusing AdminTable + shared derive helpers, sortable by $, close date, attention — #7 (can be pulled into Phase 2 if it's hot).
  2. /admin/board/metrics-summary endpoint + 7-day velocity/sparkline on expanded cards + real draws-pending from draw records — #14.
  3. Automated compliance-check endpoint + automatic badge — #11 phase B.
  4. Party-level goal + progress bars (pending decision) — #14.
  5. Board activity feed rail — #14.
  6. Auto-refresh polling with visibility gating — #12 completion.

Explicit non-goals


(d) Open questions for Justin / Ryan

  1. Compact-by-default or dense-by-default? Phase 2 makes compact the default with expand — OK, or should the current "everything visible" card stay default with compact as the toggle?
  2. QR codes: at-a-glance on every card (current), or fine behind expand/edit page? They're the single biggest card-height cost.
  3. Converted-inquiry cards: safe to auto-hide when the linked party is on the board, or does anyone still work the inquiry sticky post-conversion?
  4. Party-level fundraising goal: do we want details.goal_amount on parties (enables progress bars + "% to goal" in the summary strip)? Today goals only exist per-team.
  5. Compliance: is a manual "compliance checked" checkbox acceptable as step 1, or hold for the automated endpoint? Should activation be blocked (not just warned) without it?
  6. Team Availability panel (lines 228-409, collapsible, scope still pending per its own banner): keep on the board, move to dashboard, or drop?
  7. "Closing soon" threshold: 7 days? 3? Configurable?
  8. Summary-strip money: live (active) only, or include closeout-column totals in a second figure (e.g. "collected this month")?
  9. Table view priority: pull #7 into Phase 2 if it's the daily driver Ryan wants — is a sortable table more valuable than the compact-kanban work?
Hero Picks · internal planning doc · generated from .agents/plans/hero-board-ux-plan-2026-07-20.md