# Phase 2: UI Performance - Discussion Log > **Audit trail only.** Do not use as input to planning, research, or execution agents. > Decisions are captured in CONTEXT.md — this log preserves the alternatives considered. **Date:** 2026-07-30 **Phase:** 2-ui-performance **Areas discussed:** Caching approach, Refresh/staleness UX, Profiling targets, Fix scope: backend RPC --- ## Caching approach | Option | Description | Selected | |--------|-------------|----------| | KeepAlive + SWR | KeepAlive for main tabs AND useCachedResource for data | ✓ | | SWR only | Extend useCachedResource, keep full remounts | | | KeepAlive only | Instances alive, ad-hoc data refresh | | **User's choice:** KeepAlive + SWR (recommended) | Option | Description | Selected | |--------|-------------|----------| | Profiling decides | Convert only surfaces PERF-01 names as slow | ✓ | | All main tabs | Blanket conversion | | **User's choice:** Profiling decides (recommended) | Option | Description | Selected | |--------|-------------|----------| | Keep alive, cap count | Include heavy views (Mesh D3+Leaflet), KeepAlive max cap | ✓ | | Exclude heavy views | Only lightweight tabs kept alive | | | You decide | Per-view by measurement | | **User's choice:** Keep alive, cap count (recommended) | Option | Description | Selected | |--------|-------------|----------| | SWR, no KeepAlive | Per-item cache keys, no instance cache | ✓ | | Same as main tabs | KeepAlive + SWR for secondary screens too | | | You decide | Per screen by cardinality | | **User's choice:** SWR, no KeepAlive for secondary screens (recommended) --- ## Refresh/staleness UX | Option | Description | Selected | |--------|-------------|----------| | Invisible | Content updates in place, no indicator | | | Subtle indicator | Small spinner/shimmer while refreshing | ✓ | | Stale-age badges | Show data age via isStale/ageMs | | **User's choice:** Subtle indicator (declined the "Invisible" recommendation) | Option | Description | Selected | |--------|-------------|----------| | 30s, per-view tuning | Hook default; Claude tunes per view | ✓ | | Short (10s) everywhere | Fresher, more RPC chatter | | | Long (60s+) everywhere | Minimal chatter | | **User's choice:** 30s with per-view tuning (recommended) | Option | Description | Selected | |--------|-------------|----------| | Silent keep-last | Keep cached data, retry on focus/TTL | ✓ | | Toast on failure | Surface every background failure | | **User's choice:** Silent keep-last (recommended) | Option | Description | Selected | |--------|-------------|----------| | Yes, except large payloads | sessionStorage persist, skip big lists | ✓ | | Memory only | Cold start on every reload | | **User's choice:** Persist except large payloads (recommended) --- ## Profiling targets | Option | Description | Selected | |--------|-------------|----------| | Apps tab + AppDetails | App browser + detail/log screens | ✓ | | Mesh tab | Map, contacts, messages | ✓ | | Wallet tab + send flows | Balances, send/receive | ✓ | | Cloud/Files + Server | File browser, node status/settings | ✓ | **User's choice:** All four, plus free-text additions: "network and web 5 and cloud and often app store" | Option | Description | Selected | |--------|-------------|----------| | .228 | Designated gate/test node | | | .198 dev pair | Other dev-pair node | | | Whichever node showed it | User names the node | | **User's choice:** Free-text: **archi-dev-box** | Option | Description | Selected | |--------|-------------|----------| | Committed findings doc | Profiling report in phase dir before fixes | ✓ | | Findings in plans only | No standalone report | | **User's choice:** Committed findings doc (recommended) | Option | Description | Selected | |--------|-------------|----------| | No visible spinner on revisit | Subjective-but-crisp pass bar | ✓ | | Numeric budgets | ms budgets measured on-device | | **User's choice:** No visible spinner on revisit (recommended) --- ## Fix scope: backend RPC | Option | Description | Selected | |--------|-------------|----------| | Additive changes only | New aggregate/batch endpoints ok; no refactors/orchestrator | ✓ | | Frontend only | Backend untouched | | | Whatever profiling justifies | Any backend change, gate re-runs as needed | | **User's choice:** Additive changes only (recommended) | Option | Description | Selected | |--------|-------------|----------| | Parallelize + dedup | Promise.all + rpc-client dedup | ✓ | | Aggregate endpoints | Combined-payload RPCs for 3+ call screens | | | You decide per view | Per-screen by measurement | | **User's choice:** Parallelize + dedup (recommended) | Option | Description | Selected | |--------|-------------|----------| | Dev pair only, no OTA | Verify on dev nodes; fleet rollout via release train | ✓ | | OTA when verified | Fleet OTA as part of this phase | | **User's choice:** Dev pair only (recommended) --- ## Scope routing (freeform input) During area selection the user requested a large AIUI/IndeeHub scope expansion. Routed via a follow-up question: | Option | Description | Selected | |--------|-------------|----------| | New phase, discuss next | Add roadmap phase + full discuss-phase | | | Backlog only for now | Keep in Deferred Ideas | | | Fold the small UX fixes into Phase 2 | Chat-expanded + mobile-starts-on-chat ride along; big work deferred | ✓ | **Notes:** The two UX defaults became D-14 in CONTEXT.md. All other AIUI/IndeeHub items recorded verbatim in Deferred Ideas. ## Claude's Discretion - Per-view TTL values - KeepAlive max cap / eviction tuning - Parallelization vs aggregate endpoint per screen (within additive-only bound) - Refresh indicator placement/styling ## Deferred Ideas - AIUI permissioned node access (Pine-parity command surface, no data leaks) - AIUI content deep-dive ("make it perfect") - AIUI peer videos and files - IndeeHub cross-node content source with payments (films, music, everything) - AIUI Nostr integration polish