openclaw - 💡(How to fix) Fix Channel dashboard is laggy and not end-user friendly — perf + UX overhaul [1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#61764Fetched 2026-04-08 02:54:47
View on GitHub
Comments
0
Participants
1
Timeline
0
Reactions
0
Author
Participants

The Channel dashboard (ui/src/ui/views/channels.ts and related modules) becomes sluggish with multiple accounts/channels, and its layout leads with developer/debug surfaces (raw JSON snapshots, full config schema trees) that overwhelm non-technical end users. This issue tracks both the performance regressions and a UX redesign toward an end-user-friendly experience.

Root Cause

This bundles perf and UX because the UX redesign (progressive disclosure, lazy config sections, developer-view toggle) directly removes the most expensive render paths. Splitting into sub-issues is fine if preferred — suggested split: (a) quick perf wins #1/#3/#5/#6, (b) config-form lazy rendering, (c) UX redesign.

RAW_BUFFERClick to expand / collapse

Summary

The Channel dashboard (ui/src/ui/views/channels.ts and related modules) becomes sluggish with multiple accounts/channels, and its layout leads with developer/debug surfaces (raw JSON snapshots, full config schema trees) that overwhelm non-technical end users. This issue tracks both the performance regressions and a UX redesign toward an end-user-friendly experience.

Performance gaps

All references are repo-root relative.

  1. Pretty-printed JSON snapshot rendered inline every renderui/src/ui/views/channels.ts:89 calls JSON.stringify(props.snapshot, null, 2). Snapshots grow to 100+KB for typical multi-account setups and this blocks the render thread.
  2. Relative timestamps recomputed on every render with no shared tickui/src/ui/views/channels.ts:82, :84, :305. Each card re-runs `formatRelativeTimestamp()` on every parent render.
  3. `resolveChannelMetaMap()` rebuilt per channel lookupui/src/ui/views/channels.ts:240-243. Iterates `snapshot.channelMeta` and rebuilds an object for every label lookup (~8× per render).
  4. Full recursive config-form tree rendered for every channelui/src/ui/views/config-form.node.ts:405-449 (also 513, 973, 1127, 1320). No virtualization, no lazy loading; 8 channels × deep schema walk per render.
  5. `JSON.stringify(value, null, 2)` in config field rendererui/src/ui/views/config-form.node.ts:27. Pretty-prints every field value on every render.
  6. O(accounts) linear search per channelui/src/ui/views/channels.shared.ts:30-40 (`resolveDefaultChannelAccount`). Called per channel without an `accountsById` index.
  7. `hasRecentActivity()` called 2–3× per accountui/src/ui/views/channels.ts:247, :259, :273. `deriveRunningStatus()` and `deriveConnectedStatus()` each recompute it.
  8. Unmemoized `.toSorted()` per renderui/src/ui/views/channels.ts:44-56. Sort runs even when inputs are unchanged.
  9. `analyzeConfigSchema(schema)` recomputed per channel per renderui/src/ui/views/channels.config.ts:86. ~278 lines of schema walking, not memoized.

Proposed technical fixes

#FixFile:LineEffort
1Hide raw snapshot JSON behind a collapsed `<details>` / Developer toggle; skip `JSON.stringify` until expanded`ui/src/ui/views/channels.ts:89`Low
2Single shared ~5s interval updating all relative timestamps; render as `<time>` updated in place`ui/src/ui/views/channels.ts:82`Med
3Hoist `resolveChannelMetaMap` + build `accountsById` index once per `renderChannels()` call; pass down`ui/src/ui/views/channels.ts:241`, `ui/src/ui/views/channels.shared.ts:30`Low
4Lazy-render config form: only expanded sections walk the schema; memoize `analyzeConfigSchema` by schema identity`ui/src/ui/views/config-form.node.ts:405`, `ui/src/ui/views/channels.config.ts:86`High
5Compute `hasRecentActivity(account)` once per account render; reuse`ui/src/ui/views/channels.ts:247`Low
6Memoize channel sort keyed on `(channelOrder, enabled)` identities`ui/src/ui/views/channels.ts:44`Low
7Defer `JSON.stringify(value, null, 2)` in config fields to on-expand`ui/src/ui/views/config-form.node.ts:27`Low

Quick wins (#1, #3, #5, #6) alone should cut dashboard lag substantially on accounts-heavy setups.

UX gaps (end-user perspective)

  • Page leads with debug surfaces (raw JSON snapshot, full schema tree) instead of channel status.
  • No grouping, no search, no filter — hard to scan with >5 channels or many accounts.
  • Config form exposes every internal field at once; intimidating for non-developers.
  • Status relies on implicit "recent activity" logic instead of clear Connected / Disconnected / Needs attention states.
  • Timestamps drift without a shared tick; users see stale "5m ago" indefinitely.
  • No empty / first-run state tuned for non-devs — empty sections look broken.
  • No inline guidance linking to the relevant docs page for each channel.
  • Color-only status in some spots (accessibility concern).

Proposed UX redesign

Top-level layout — channel card grid

  • One card per channel with:
    • Status pill: Connected / Disconnected / Action needed (icon + text + color)
    • Account count and last activity timestamp
    • Primary actions: Connect, Configure, View logs
    • Link to that channel's docs page on `docs.openclaw.ai`

Progressive disclosure

  • Config form split into Basic and Advanced tabs; Advanced hidden by default.
  • Developer view toggle gates the raw JSON snapshot and low-level schema tree.

Discovery and scanning

  • Search + filter bar: filter by channel, status, account name.
  • Group by status with an "Action needed" section pinned to the top.

First-run and empty states

  • Friendly empty state with a clear CTA ("Connect your first channel") instead of empty tables.
  • Per-channel empty state when no accounts are configured.

Batch actions

  • Enable/disable, reload, reconnect at the channel level without diving into config.

Accessibility

  • Status uses icon + text + color, never color alone.
  • Keyboard-navigable card grid and filter bar.

Acceptance criteria

  • Dashboard stays responsive (target <16ms render per frame) with 20+ accounts across 8 channels.
  • No raw JSON visible by default.
  • A non-developer user can identify a broken channel and reach the fix in ≤2 clicks.
  • Relative timestamps refresh via a single shared interval, not per-render recomputation.
  • Config form does not walk the full schema for collapsed sections.

Notes

This bundles perf and UX because the UX redesign (progressive disclosure, lazy config sections, developer-view toggle) directly removes the most expensive render paths. Splitting into sub-issues is fine if preferred — suggested split: (a) quick perf wins #1/#3/#5/#6, (b) config-form lazy rendering, (c) UX redesign.

extent analysis

TL;DR

Implementing the proposed technical fixes, particularly the quick wins (#1, #3, #5, #6), should substantially reduce dashboard lag on accounts-heavy setups.

Guidance

  • Implement a collapsed <details> section for raw JSON snapshots and skip JSON.stringify until expanded to reduce render thread blocking.
  • Hoist resolveChannelMetaMap and build an accountsById index once per renderChannels() call to reduce unnecessary computations.
  • Memoize hasRecentActivity(account) and reuse the result to avoid redundant computations.
  • Memoize channel sort keyed on (channelOrder, enabled) identities to prevent unnecessary sorting.

Example

// Before
const snapshotJson = JSON.stringify(props.snapshot, null, 2);

// After
const [showSnapshot, setShowSnapshot] = useState(false);
const snapshotJson = showSnapshot ? JSON.stringify(props.snapshot, null, 2) : '';

Notes

The proposed technical fixes and UX redesign are closely tied, as the redesign aims to reduce the most expensive render paths. Implementing the quick wins should provide a substantial performance improvement, and further optimizations can be made based on the results.

Recommendation

Apply the proposed technical fixes, starting with the quick wins (#1, #3, #5, #6), to improve performance and reduce dashboard lag. This should provide a solid foundation for further optimizations and the UX redesign.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix Channel dashboard is laggy and not end-user friendly — perf + UX overhaul [1 participants]