↻ Mobile refactored to RTK (#143 ). The mobile app was restructured into CORE (session/ — RTK slice + reducers + selectors) / EDGE (session/runtime/ + services/) / SHELL (ui/ + app/), and the 1219-line lib/sessionManager.ts god-object was deleted . File paths and symbols cited in the issues indexed below have moved to that layout — each linked issue now carries its own "↻ Code moved" pointer at the top. The refactor was behavior-preserving , so every finding here still reproduces.
Tracking issue for the Helm mobile UI research sweep — a deep review of the mobile web app (landing + live/demo session) using Playwright against the dev server, full source review of every UI component + CSS, and a competitor-UI gap analysis (Claude, ChatGPT, Copilot, Codex).
It indexes the 62 findings filed as #1 –#62 . Checkboxes below double as a triage board.
Recommended priority
P0 — Safety-critical (4)
Trust/permission correctness — users can act on incomplete or misleading information.
P1 — Bugs & reliability (16)
Silent failures, missing states, and incorrect rendering.
P2 — Enhancements, a11y & polish (42)
Parity with leading agent UIs, accessibility, and visual refinement.
No visible "Scroll to latest" button when scrolled up during streaming #2 — No visible "Scroll to latest" button when scrolled up during streaming
Send button does not become a Stop button while a turn is in flight #3 — Send button does not become a Stop button while a turn is in flight
No "queue / steer while running" feedback when sending during an active turn #4 — No "queue / steer while running" feedback when sending during an active turn
Tool cards show output only after completion — no live stdout streaming #5 — Tool cards show output only after completion — no live stdout streaming
Composer has no attachment / image upload support #6 — Composer has no attachment / image upload support
Composer has no voice dictation / mic input #7 — Composer has no voice dictation / mic input
"Enter sends" with no option — easy to send prompts accidentally on mobile #9 — "Enter sends" with no option — easy to send prompts accidentally on mobile
No expand / full-screen editor for long prompts #10 — No expand / full-screen editor for long prompts
No slash-commands, prompt templates, or suggested prompts #11 — No slash-commands, prompt templates, or suggested prompts
Code blocks have no Copy button #12 — Code blocks have no Copy button
Code blocks drop the language label (fence info string is parsed then discarded) #13 — Code blocks drop the language label (fence info string is parsed then discarded)
No syntax highlighting in code blocks #14 — No syntax highlighting in code blocks
No copy affordance on assistant messages #15 — No copy affordance on assistant messages
Tool-card ARGUMENTS / RESULT / command have no Copy button #16 — Tool-card ARGUMENTS / RESULT / command have no Copy button
Markdown renderer lacks strikethrough, task lists, and images #19 — Markdown renderer lacks strikethrough, task lists, and images
User messages have no timestamp (only assistant turns show time) #20 — User messages have no timestamp (only assistant turns show time)
No long-press / context menu on messages (copy, share, quote) #21 — No long-press / context menu on messages (copy, share, quote)
File edits are shown as raw args, not a diff with +/- coloring #22 — File edits are shown as raw args, not a diff with +/- coloring
Tool summary falls back to raw JSON.stringify (ugly, overlong one-liners) #23 — Tool summary falls back to raw JSON.stringify (ugly, overlong one-liners)
Tool result preview is truncated with no "view full output" #24 — Tool result preview is truncated with no "view full output"
No grouping/collapsing of long tool-call runs (wall of cards in autopilot) #25 — No grouping/collapsing of long tool-call runs (wall of cards in autopilot)
Nested scroll: tool result max-height creates scroll-within-scroll on mobile #26 — Nested scroll: tool result max-height creates scroll-within-scroll on mobile
Approval banner has no timeout countdown despite timeout→deny behavior #30 — Approval banner has no timeout countdown despite timeout→deny behavior
Approval buttons' aria-label is just the option label (no tool context) #33 — Approval buttons' aria-label is just the option label (no tool context)
No pre-execution command editing before approving a tool call #34 — No pre-execution command editing before approving a tool call
No way to rename a session from the phone #37 — No way to rename a session from the phone
No session search / filter in the drawer #38 — No session search / filter in the drawer
Relative time renders "0s" for just-now (should read "now") #39 — Relative time renders "0s" for just-now (should read "now")
No unread-activity indicator per session or on the drawer button #40 — No unread-activity indicator per session or on the drawer button
No offline / reconnect banner in the thread when the relay drops #43 — No offline / reconnect banner in the thread when the relay drops
Icon buttons (38px) and send button (36px) are below the 44px touch-target minimum #48 — Icon buttons (38px) and send button (36px) are below the 44px touch-target minimum
Low contrast: faint text (--fg-faint) on background fails WCAG AA #50 — Low contrast: faint text (--fg-faint) on background fails WCAG AA
Body text uses absolute px and ignores OS dynamic text size #51 — Body text uses absolute px and ignores OS dynamic text size
Entire thread is aria-live="polite" — streaming may flood screen readers #52 — Entire thread is aria-live="polite" — streaming may flood screen readers
Empty chat state is a plain dim line — no illustrated empty state or suggested prompts #54 — Empty chat state is a plain dim line — no illustrated empty state or suggested prompts
No skeleton loaders during session restore (only a pulsing "H") #55 — No skeleton loaders during session restore (only a pulsing "H")
No desktop/tablet layout — session content is fixed at 760px with large empty gutters #56 — No desktop/tablet layout — session content is fixed at 760px with large empty gutters
Dark-only: no light theme / prefers-color-scheme support #57 — Dark-only: no light theme / prefers-color-scheme support
Long sessions render the entire timeline with no virtualization #58 — Long sessions render the entire timeline with no virtualization
No haptic feedback when confirming an approval (only on arrival) #60 — No haptic feedback when confirming an approval (only on arrival)
No pull-to-refresh to load earlier history (state exists, gesture missing) #61 — No pull-to-refresh to load earlier history (state exists, gesture missing)
Decorative SVG icons expose as unlabeled images in the a11y tree #62 — Decorative SVG icons expose as unlabeled images in the a11y tree
By theme
Safety-critical (4)
Approvals & permissions (6)
Streaming & generation controls (4)
Composer (7)
Markdown & code rendering (7)
Tool-call cards (6)
Sessions & drawer (7)
Pairing & onboarding (1)
Accessibility (a11y) (6)
Performance (1)
Mobile-specific (3)
General UX (10)
Index generated from a UI research sweep (Playwright live review + source audit + competitor gap analysis). No code was committed to the repo as part of this research.
Tracking issue for the Helm mobile UI research sweep — a deep review of the mobile web app (landing + live/demo session) using Playwright against the dev server, full source review of every UI component + CSS, and a competitor-UI gap analysis (Claude, ChatGPT, Copilot, Codex).
It indexes the 62 findings filed as #1–#62. Checkboxes below double as a triage board.
Recommended priority
P0 — Safety-critical (4)
Trust/permission correctness — users can act on incomplete or misleading information.
P1 — Bugs & reliability (16)
Silent failures, missing states, and incorrect rendering.
P2 — Enhancements, a11y & polish (42)
Parity with leading agent UIs, accessibility, and visual refinement.
By theme
Safety-critical (4)
Approvals & permissions (6)
Streaming & generation controls (4)
Composer (7)
Markdown & code rendering (7)
Tool-call cards (6)
Sessions & drawer (7)
Pairing & onboarding (1)
Accessibility (a11y) (6)
Performance (1)
Mobile-specific (3)
General UX (10)
Index generated from a UI research sweep (Playwright live review + source audit + competitor gap analysis). No code was committed to the repo as part of this research.