- Clipboard: the node UI is plain HTTP, so the WebView withholds
navigator.clipboard and the page's own polyfill can only fake a write —
readText() resolved to '' and every Paste button in the wallet silently did
nothing. New ArchipelagoClipboard JS bridge (copy/paste over the Android
clipboard, answering through window.__archyClipboardResult) plus an injected
shim that points navigator.clipboard at it, so existing pages get working
copy AND paste with no web-side change. Registered on the kiosk WebView and
the in-app browser (node apps are plain HTTP too).
- QR scanner: two-tier decode — a cheap centre-crop pass (no TRY_HARDER) at
~18/s catches the well-framed case immediately, while the old full-frame
TRY_HARDER + inverted pass still runs at ~5/s for dense, off-centre and
light-on-dark codes. Adds camera/decoder prewarm (on first node page load and
via ArchipelagoQr.prewarm()), a torch toggle in both scanners, tap-to-focus,
a 1x/1.5x zoom hunt after 3s of no decode, and a success haptic.
- Restart: the retained kiosk WebView is a process-scoped static and the FIPS
service keeps the process alive after a recents swipe, so closing the app
stopped restarting it. MainActivity releases it when the task is finishing,
and the hub menu gains a Restart card (mesh service keeps running).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>