ALL MEMOS
Download .docx
Feedback — Chat-first UI pattern (10/10 from Harnoor)
Date: 2026-05-15
Severity: durable preference — apply to every future surface
What Harnoor loved (do this again)
The JARVIS Voice rebuild (v10) and TITAN HQ overhaul both got 10/10. Common pattern:
Visual language
- Cool blue (
#6aa9ff) + Inter font + dark grey cards (#1c1c24 on #0a0a0d)
- NO neon cyan, NO HUD corner brackets, NO retro Iron Man overlays
- Clean grid, generous whitespace, subtle hover transitions
- Mobile-first responsive (single column < 560px)
Interaction model
- Text input is primary. Voice / mic is a bonus that gracefully degrades.
- Big front-and-center ask box. Auto-grow textarea. Enter sends, Shift+Enter newline.
- Quick-ask chips below the input for cold-start (5-7 options max)
- Persistent conversation via localStorage — refresh doesn't lose history
- Replay button on every assistant reply — listen any time, not just live
- Status indicator with color coding (ready / thinking / speaking / error)
Information architecture
- Live KPI tiles at top for command-center surfaces (HQ-style)
— show real numbers, click-through to detail dashboard
- Workspace links as clean tiles with icon + name + description, NOT retro cards
- Footer with last-update timestamp so user knows data freshness
- Settings in a
<dialog> modal with diagnostic info (mic perm, device count, session ID)
Verification discipline
- Open the page in user's real Chrome via MCP before claiming "done"
- Run
enumerateDevices() + permissions.query() to diagnose mic
- Click chips programmatically + read the actual reply text from the DOM
- Paste verification output in the response, don't just describe intent
- The 662 console errors from random Chrome extensions are NOT my code — distinguish
What I'd stopped doing (kept failing on)
- Shipping cosmetic v1 → v2 → v3 without testing in real Chrome
- Defaulting to "neon HUD" because old code had it
- Treating text as a fallback when the mic was the unreliable input
- Saying "shipped, works" when I had only assumed it works
Concrete deliverables that hit 10/10
1. JARVIS Voice — https://jarvis.livegroweveryday.com/voice (v10)
- Scrollable persistent conversation
- Settings drawer (voice picker, TTS mode, auto-scroll, live diagnostics)
- Conversation export to markdown
- Quick-ask chips on empty state
2. TITAN HQ — https://jarvis.livegroweveryday.com/ (v2)
- 6 live KPI tiles fed by s3://innerverse-voice-scratch/state/titan-hq-status.json
- Hourly cron titan-hq-status-hourly keeps tiles fresh
- Same chat surface as JARVIS, shares session ID
- 12 workspace tiles linking to all dashboards (memos, stats, followup, cost, etc.)
When to apply this pattern
Any time I build a new TITAN/JARVIS-facing surface:
- Player pages, dashboard widgets, brand-new tools, mobile companion, etc.
- Lift the CSS variables (
--bg, --bg-card, --accent, --ink, etc.)
- Lift the conversation-pattern JS (state object, renderMsg, ask(), playReply())
- Default to text-first
- Default to localStorage persistence
- Default to real-Chrome verification before claiming done