The webxdc show

Issues

What did not work while making the show, grouped by where it has to be fixed. 12 issues across 11 apps.

In the webxdc widget (4)

File Sync: Realtime channel delivers nothing between two Element Web clients
Ada and Ben both had File Sync open in the same encrypted room; both footers stayed at “0 Online” for over a minute and Ada's packing-list.txt never reached Ben (scenario timed out waiting for it). The same happened with Excalidraw (live strokes never arrived). The widget sends realtime data as encrypted to-device messages (src/room.ts joinRealtime → api.sendToDevice(REALTIME_TYPE, true, …)) and swallows any error, so the cause (Element refusing/failing the encrypted to-device send for fresh accounts, a missing capability, or receive side) is not visible. The mock-host test passed only because to-device messages were relayed by the test itself.
apps/arcanecircle-filesync/shots/end-1-ada.png (1 file, 0 Online) and end-2-ben.png (No files imported, 0 Online); recording.json error: waiting for getByText('packing-list.txt') timed out
MD-Docs: Live typing does not show for the other person
The app also sends keystrokes over the realtime channel, but in Element Ben's editor stays empty while Ada types; the text only arrives with the saved update (~2 s after she stops). In the local emulator the realtime path works.
recording 2026-10-26 03:41: peek at t=3 and t=7 (Ben empty, Ada typing), t=9.5 Ben has the text after "saved"; same in the 03:49 recording
Quake III Arena: Two players do not end up in one match
Ada and Ben both start Open Arena (Ben 6 s, then 12 s after Ada); each gets a match of their own. The scoreboard of each lists only themselves, and the HUD shows the red network-problem icon in the bottom right. Multiplayer goes over joinRealtimeChannel (emulated WebRTC); whether the realtime messages arrive was not traced.
recordings 2026-10-26 04:09 and 04:37: shots/end-1-ada.png and end-2-ben.png of the first run: "1st place with -1", one row each (Ada / Ben); red icon at bottom right on both
Test Webxdc: Realtime channel data never arrives on the other device
Ada and Ben both pressed Join on the realtime channel, then Send Data (Ada twice, Ben once). Each side shows its own SENT line, but no RECEIVED line appeared on the other side within 8–12 s, in three recordings. The widget sends realtime data as encrypted to-device messages (src/room.ts joinRealtime: api.sendToDevice(REALTIME_TYPE, true, …).catch(() => undefined)), so a refusal by Element or a missing to-device capability is swallowed silently.
apps/webxdc-test/recording (scenario log: "realtime received by Ben: false", "realtime received by Ada: false"); frame at ~20 s of clip.mp4 shows two SENT lines for Ada and only "You joined realtime channel." for Ben.

In the widget's app runner (2)

Image Album: AVIF compression never finishes
With the default speed the pictures stay at Encoding…: the AVIF encoder runs in a module worker started from /assets/encoder-….js, outside the runner's /app/<key>/ path, so the worker's own imports (avif_enc-….js) are not served (404). The demo uses no processing, which works.
widget deep test test/real/all/deep/image-album.json: Failed to fetch dynamically imported module …/assets/avif_enc-5lMPN1SA.js; not re-checked in this recording
Next-Tools: Start page shows "404 Not Found"
The app (a Next.js export) opens on its own 404 page instead of the tool overview: its router does not know the runner's path (/app/<key>/index.html). The sidebar works, and every tool opened from it works (client-side navigation); a reload on a tool page has nothing to serve (deep test).
recording 2026-10-26 04:15, Ada at t=2: "404 Not Found / Back home" in the main pane; case converter, UUIDs and hash text then work

In the app itself (5)

Calculator: Floating-point noise in results
21.6 × 1.1 shows 23.760000000000005: the app prints the raw JavaScript number without rounding.
First recording, frame at 10 s of clip.mp4 (display showed 23.760000000000005); the demo now avoids this sum.
Gibbonacci: The game never starts
index.html ships only the Vite legacy (SystemJS) entry; the bundle registers its start-up on window 'DOMContentLoaded' inside System.import(), which runs after that event has already fired. The page stays black and shows only the text of the inline System.import(...) script (made visible by the app's own CSS 'body *{display:flex}'). Re-dispatching DOMContentLoaded by hand makes the game appear, so this is an app bug and should hit Delta Chat too. No clip recorded.
Local widget 0.1.1 mock host: screenshot /tmp/claude-1000/-var-home-t-projects-marcade-projects-webxdc-widget/cf7ece1d-1868-4b8e-9e14-3ee83983a7be/scratchpad/show-3/out/arcanecircle-gibbonacci/start.png shows only 'System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))'; earlier deep test webxdc-widget/test/real/all/deep/arcanecircle-gibbonacci.json (canvases+buttons 0 before, canvas after re-dispatching DOMContentLoaded).
KojiOS: Helper libraries not found (404)
index.html loads ./crypto-js.min.js, ./pako.min.js, ./jsencrypt.min.js, ./js.cookie.min.js, ./jsmediatags.min.js and ./heic2any.min.js, but the .xdc ships them under scripts/. The app falls back for some (console: 'CryptoJS failed to load, using fallback'); the media commands (meta, convpic) lack their libraries.
Local mock host console: 6 x 'Failed to load resource: 404', 'Pako failed to load, using fallback', 'JSEncrypt failed to load, using fallback'; unzip shows the files in scripts/
KojiOS: py needs Pyodide from a CDN
index.html loads https://cdn.jsdelivr.net/pyodide/…/pyodide.js; webxdc apps have no network, so the py command cannot work.
<script src="https://cdn.jsdelivr.net/pyodide/v0.27.6/full/pyodide.js"> in index.html; earlier deep test saw it blocked by CSP
Planner: Task list does not refresh when someone else changes it
Updates from others arrive (a notification toast pops up and the bell gets a dot), but the Overview list only shows them after the person makes a change of their own: Ben saw "Nothing to do" for ~30 s until he added a task, Ada saw Ben's task only after adding one herself, and Ben ticking "Book the van" never showed on Ada's list.
Recordings 1 and 2 (apps/omidz4t-planner/clip.mp4, shots/end-1-ada.png): Ada's list kept 2 tasks while Ben's had 3; toast with the other's task visible.

In the show's recording engine (1)

Dejeweled: Grey flash in the clip when the website screenshot is taken
show.shot() screenshots the widget iframe; with the WebGL canvas of this game the recorded video shows a ~0.5 s grey frame at that moment (also seen with page.screenshot in recording 1, 5 flashes). The app itself works.
apps/arcanecircle-bejeweled/recording/1-ada.webm at main time ~32 s (mean brightness jumps from 31 to 130 for one 0.5 s sample)