Fixes the reported demo issues and two prod UI behaviors:
Cloud media: serve the committed demo/content library (music/photos/docs were never loaded — loader only read empty demo/files); WAV/SVG fallback for unbacked seeds; no more fake Videos; no supported source error gone
LND custom UI: connect QR + details now render (cert/macaroon/ports were missing from /lnd-connect-info); new on-chain + Lightning balance cards
Fixes the reported demo issues and two prod UI behaviors:
- Cloud media: serve the committed demo/content library (music/photos/docs were never loaded — loader only read empty demo/files); WAV/SVG fallback for unbacked seeds; no more fake Videos; no supported source error gone
- LND custom UI: connect QR + details now render (cert/macaroon/ports were missing from /lnd-connect-info); new on-chain + Lightning balance cards
- Mempool demo proxies mempool.guide (mempool.space blocks embedding) + WS upgrade passthrough
- Monitoring page fully dummied (correct MetricSnapshot shapes); Networking Profits streaming.list-services mocked
- App icons fixed (lnd.svg → lnd.png + 15 other broken paths)
- 8 more installed demo apps with placeholder dashboards; non-demoable apps say Not available in demo (no more Checking…)
- Reconnect banner: server.get-state implemented + WS heartbeat 20s (proxy idle timeouts)
- App sessions overlay the current page in every display mode — open tx never navigates away
- Mobile: dashboard pinned to 100dvh across ≤920px so pages scroll clear of the browser tab bar
Verified with a 21-point Playwright walk against the local DEMO stack (21/21 pass); vue-tsc clean; 672/672 unit tests pass.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
- Serve committed demo/content (music/photos/documents) alongside demo/files
drop-ins, normalizing top-level folder names; Dockerfile now COPYs it. This
is why Cloud music failed: the real library sat in demo/content while the
loader only read the empty demo/files.
- Drop unbacked seeded Videos; runtime WAV/SVG fallback for any seeded media
without a real file so playback never hits 'no supported source'.
- monitoring.current/history/alerts/alert-rules/export rewritten to the exact
MetricSnapshot shapes Monitoring.vue expects (epoch-second timestamps,
containers with limits/block IO, rpc_latency_ms, ws_connections).
- streaming.list-services + configure-service (Networking Profits page was
erroring with Method not found).
- server.get-state snapshot so the 30s resync / reconnect path stops erroring.
- lnd-connect-info now returns cert/macaroon base64url + grpc/rest ports (the
lnd-ui shell only renders the wallet QR + details when they're present);
LND REST balance endpoints for the shell's new balance cards.
- Fix broken icon paths (lnd.svg → lnd.png and 15 others) against real assets.
- containers-scanned: true so app cards never sit on 'Checking…'.
- 8 new installed demo apps with placeholder dashboard UIs (btcpay-server,
grafana, nextcloud, jellyfin, vaultwarden, nostr-rs-relay, searxng,
uptime-kuma) via the previously unused demoAppShell.
- WS heartbeat 45s → 20s (+ping 25s) so idle-timeout proxies in front of the
public demo stop killing the socket (the 'always reconnecting' report).
- nginx demo proxy: mempool.space → mempool.guide (mempool.space blocks the
proxied embed) + WebSocket upgrade passthrough; txid hydration follows.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Launching an app (or opening a tx in mempool from Home/wallet/channels) used
to router.push the app-session page in overlay/fullscreen modes, swapping the
page underneath — confusing and lossy. All display modes are now store-driven:
panel renders beside the page, overlay/fullscreen render above it (teleported
to body), and the route never changes. Deep-link paths (/tx/<hash>) ride along
via the launcher's panelPath instead of a route query; closing always returns
exactly where the user was. The app-session route stays for direct links.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Register the 8 new placeholder apps in DEMO_MOCK_UI so they're launchable
and installable in the demo.
- Demo bypasses the new-tab/tab-launch lists for demoable apps — they're
served same-origin by the mock backend with no framing headers, so they
render in the in-app session instead of opening broken localhost tabs.
- Non-demoable apps now say 'Not available in demo' instead of 'No demo'.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 100dvh pin only applied below 768px; between 768–920px mobile browsers
still sized the dashboard to 100vh, hiding the bottom of every page behind
the browser tab bar with no way to scroll it into view. Apply the same pin
at ≤920px so pages always scroll fully clear with the scroll-pad margin.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fetched from /proxy/lnd/v1/balance/{blockchain,channels}; the cards stay
hidden when the endpoints are unavailable so older deployments are unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Fixes the reported demo issues and two prod UI behaviors:
Verified with a 21-point Playwright walk against the local DEMO stack (21/21 pass); vue-tsc clean; 672/672 unit tests pass.
🤖 Generated with Claude Code
Fetched from /proxy/lnd/v1/balance/{blockchain,channels}; the cards stay hidden when the endpoints are unavailable so older deployments are unaffected. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>