feat(demo): real registry UIs, IndeeHub iframe proxy, mempool tab, media Range

- App UIs now use the real registry shells with dummy data: bitcoin-ui for
  Bitcoin Core (Satoshi subversion) and Bitcoin Knots (Knots subversion) via
  per-path /app/bitcoin-{core,knots}/bitcoin-status; the real lnd-ui (mock
  /proxy/lnd/v1/getinfo+channels, /lnd-connect-info, /api/container/logs); the
  static fedimint-ui. ElectrumX already on the real electrs-ui. Custom mock UIs
  dropped — accurate UX.
- IndeeHub loads in the iframe: nginx reverse-proxies /app/indeedhub/ →
  indee.tx1138.com and strips X-Frame-Options/CSP (it blocked framing before).
- Mempool opens in a new tab (mempool.space can't be iframed).
- Cloud media playback: HTTP Range support in the curated-file server so audio/
  video can stream and seek (needs real files dropped into demo/files/).
- Dockerfile/.dockerignore copy docker/lnd-ui + docker/fedimint-ui.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-06-22 14:19:38 -04:00
co-authored by Claude Opus 4.8
parent a0f70b3949
commit cf5f6d021a
6 changed files with 142 additions and 69 deletions
+9 -8
View File
@@ -53,15 +53,16 @@ export function clearDemoIntroSeen(): void {
// external site). Everything else shows "No demo" on a disabled install button
// and is not launchable.
const DEMO_EXTERNAL_URLS: Record<string, string> = {
// Real, public sites loaded in the in-app iframe.
indeedhub: 'https://indee.tx1138.com/',
// Real, public sites opened in a NEW TAB (they block iframing).
mempool: 'https://mempool.space/testnet',
'mempool-web': 'https://mempool.space/testnet',
}
// Apps with a same-origin mock UI served by the demo backend.
// Apps with a same-origin URL loaded in the in-app iframe — either a mock UI
// served by the demo backend, or a header-stripping reverse-proxy (IndeeHub).
const DEMO_MOCK_UI: Record<string, string> = {
'bitcoin-knots': '/app/bitcoin-ui/',
indeedhub: '/app/indeedhub/',
'bitcoin-knots': '/app/bitcoin-knots/',
'bitcoin-core': '/app/bitcoin-core/',
bitcoin: '/app/bitcoin-core/',
'bitcoin-ui': '/app/bitcoin-ui/',
@@ -78,11 +79,11 @@ const DEMO_MOCK_UI: Record<string, string> = {
}
/**
* Whether a demo app opens in a new tab. Nothing does now — both real external
* sites (mempool.space, indee.tx1138.com) load in the in-app iframe.
* Whether a demo app opens in a new tab. Mempool.space sets X-Frame-Options and
* cannot be iframed, so it opens in a new tab; IndeeHub still loads in-iframe.
*/
export function isDemoExternal(_appId: string): boolean {
return false
export function isDemoExternal(appId: string): boolean {
return appId === 'mempool' || appId === 'mempool-web'
}
/** Can this app be launched/installed in the demo? */