UI (this session): - Global audio player now scales the whole interface into the space above it on desktop (sidebar + main) and docks directly above the tab bar on mobile; it stays visible while navigating. - Mesh mobile redesign: floating Chat / BTC / Dead Man / AI / Map tab strip with a single fixed, internally-scrolling pane (page no longer scrolls); tabs hide while a conversation is open; floating back button; collapsible Device panel (starts collapsed); keyboard-aware conversation sizing via VisualViewport so the chat sits just above the keyboard. - Cloud file grid: uniform 4/3 card heights (folders + images match). - Swipe left/right switches tabs on the Apps and Web5 screens. - Map tool fills its pane (no bottom gap); fix skewed Share Location toggle on mobile (global min-height rule was deforming the switch). - Trim redundant helper copy from the mesh AI tab. Also bundles pre-existing in-progress work that was already in the tree: mesh listener/session + wallet + container + bitcoin-status backend changes, docker UI updates, and assorted other UI tweaks. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8.6 KiB
Session handoff — 2026-06-18
UPDATE (later same day): ALL OPEN ITEMS RESOLVED + DEPLOYED (v1.7.99-alpha → .116 + .198).
- #6 Pay-with-QR timeout — real bug (both LNDs confirmed healthy by user). FIPS-first dial ate the whole budget before the working Tor fallback ran. Added
PeerRequest.fips_timeoutcap (fips/dial.rs); invoice/onchain request+status calls fast-fail FIPS (6s) + short Tor window (25s/15s); frontend ceilings 60s→45s. Large downloads keep the full FIPS timeout.- #7
!aigate — added denied-asker capture (MeshState.assist_denied/DeniedAsker,assist.rs::record_denied) →mesh.assistant-status.denied_askers→ "Recently denied" list with one-click Allow inMeshAssistantPanel.vue.- #8 peer-file 403 — NOT a DID reset. Asymmetric federation: .198 had .116 trusted but .116 never added .198. Re-federated (.198 → .116
nodes.json, trusted). Verified: .116/content/<peersonly>= 403 w/o DID, 200 (177KB png) with .198's DID. Plus clearer 403 message + client surfaces the body. Listing left visible ("locked preview", user's choice).- Dual-ecash receive — active modal is
ReceiveBitcoinModal.vue(not the commented-outWeb5SendReceiveModals.vue); already used dual-detectwallet.ecash-receive, fixed Cashu-only wording.- fedimint-clientd icon —
docker_packages.rsarm →fedimint.png+fedimint-clientd.pngasset.- Cashu → 🥜 —
HomeWalletCard.vue.Deploy notes confirmed: binary swap needs atomic
mvover the running file (cp→ "Text file busy"); frontend rsync WITHOUT--deleteto preserve theaiui/subdir in/opt/archipelago/web-ui.
Resume point for the multi-issue bug-fix + deploy session on .116 (archi-thinkpad,
local dev/validation node) and .198 (resilience node). Work was done in
~/Projects/archy. A separate agent's fedimint dual-ecash work landed as commit
4288ae78 during the session (don't re-touch wallet.rs / fedimint_client.rs /
prod_orchestrator.rs / Web5SendReceiveModals.vue without checking with them).
DEPLOY STATUS — done
A surgical deploy (binary + frontend + 2 companion images, not the .228-centric
deploy-to-target.sh, to avoid clobbering .116's custom nginx) shipped to BOTH nodes:
- .116: new binary
/usr/local/bin/archipelago(backup atarchipelago.bak-pre-deploy-*), frontend at/opt/archipelago/web-ui,localhost/{lnd-ui,bitcoin-ui}:latestrebuilt,:localtags dropped. Verified:/bitcoin-statusservesage_ms; lnd-ui onNetwork=hostlistening 18083;/lnd-connect-info→ 200; both companion containers carry new index.html. - .198: same (binary copied — .198 has no Rust toolchain, only npm+podman, so build-on-.116-then-copy is mandatory). Verified identically. Force-recreated both companions.
Build notes: release build ~9 min (opt-level 3). Frontend vite outDir = web/dist/neode-ui/
(NOT neode-ui/dist). Companion images: ensure_image_present only builds if image ABSENT,
and prefers localhost/<base>:local over :latest — so to ship docker changes you must drop
:local and rebuild :latest, then the reconciler (needs_repair compares rendered quadlet
unit vs disk) recreates containers. bitcoin-ui needed an explicit systemctl --user restart
(its quadlet unit text didn't change, so the reconciler didn't auto-recreate it).
FIXED & DEPLOYED
- Mesh chat/peer double-scroll —
useControllerNav.ts(wheel scrolls container under pointer, not focused el) +Mesh.vue(@wheel.stop.prevent). - Second-level cloud folder zoom —
CloudFolder.vuedirection-aware (cloud-zoom-forward/-back, matched depth-forward/back magnitudes 0.75↔1.2). - "FIPS Mesh" → "Fuck IPs Mesh" —
FipsNetworkCard.vue,Server.vue. - .116 connect-wallet QR "failed to fetch" — lnd-ui migrated to host-network +
same-origin nginx proxy:
companion.rs(host_network:true, ports:[]),docker/lnd-ui/{Dockerfile(EXPOSE 18083),nginx.conf(listen 18083 + proxy /lnd-connect-info, /proxy/lnd/, /api/container/logs to 127.0.0.1:5678),index.html(getBackendUrl()→'' relative, credentials:'include')}. ROOT CAUSE was a cross-origin CORS failure (page on :18083 fetching :80). Verified working in incognito; the user's earlier "still broken" was a stale cached old page. Unit testlnd_ui_uses_host_networkpasses. - .198 Bitcoin Knots stale "reconnecting" banner —
bitcoin_status.rs(new server-computedage_msfield so the browser never subtracts across clocks; 20sSTALE_GRACE_MSbefore flipping stale; RPC timeout 8s→12s) +docker/bitcoin-ui/index.html(snapshotAgeMs()uses serverage_ms, falls back to old calc). Two root causes: browser/node clock skew + no grace on single failed polls (swap-thrash node).
OPEN ISSUES (diagnosed, NOT fixed)
-
"Pay with QR" → request timeout — full invoice chain intact (hardened in
790da4bd); 60s timeout = seller node never answers (unreachable transport or hung LND). Runtime, needs 2 live nodes to repro. NOT a code defect found. -
!ainot working — DIAGNOSED, config fix (awaiting user policy decision). Assistant isassistant_trusted_only:true(/var/lib/archipelago/mesh-config.json). The trust gateis_sender_allowed(mesh/listener/assist.rs) only matches askers by archipelago pubkey/DID against federation-Trustednodes.json, but RADIO (meshcore) askers present a firmware key, not the archipelago identity, so they're silently denied (journal: "AssistQuery denied … from=15 name=Arch Optiplex"; federation contact_id ≥ 0x80000000, low ids = radio). Claude key + model (claude-opus-4-8) tested HTTP 200 — NOT the problem. FIX: disable trusted_only, or add the asker's presented key to the allowlist. Full notes in memoryproject_mesh_ai_trusted_only_gate. -
Peer-file download .116→.198 "Access denied — federation peer required" — NEW, NOT yet fixed. Gate at
content.rs:149(returns oncontent_server::ServeResult::Forbidden). The requesting node isn't recognized as an authorized federation peer by the content server / per-file sharing ACL. User's strong hypothesis: a DID/identity reset changed a node's DID, so the sharing ACL / nodes.json holds the OLD identity and no longer matches. User also notes the file is still VISIBLE in the listing (so listing and download use different identity checks — inconsistency to investigate). NEXT: readcontent_serverForbidden logic, compare the requester DID/pubkey vs what's stored; check both nodes'server_info/identity vs each other'sfederation/nodes.json. Same THEME as #7 (identity matching) but a different mechanism.
NEW FRONTEND REQUESTS (not started — batch into one frontend rebuild+redeploy)
fedimint-clientd.svg404 — new fedimint core-app (public/catalog.json:294) has no icon. App-icon convention/assets/img/app-icons/<id>.png(default) — add afedimint-clientdicon (there's an existingfedimint.pngto reuse/adapt). The 404 requests.svgso check the catalog/curated-icon entry.- Cashu icon → cashew emoji (🥜) — change the cashu wallet icon to a cashew nut emoji.
- Receive › ecash should support BOTH fedimint + cashu paste — currently the ecash receive
only mentions Cashu for pasting a token; user expected the paste box to redeem both Cashu AND
Fedimint ecash. Lives in the fedimint agent's recently-committed dual-ecash UI
(
Web5SendReceiveModals.vue/Web5Wallet.vue/WalletSettingsModal.vue) — investigate what they built before changing. - Console noise (lower priority):
cdn.tailwindcss.comproduction warning in lnd-ui + bitcoin-ui (uses Tailwind CDN);api/app-catalog502 (check if persistent). Latent backend nicety:/lnd-connect-infoemits a DOUBLEDAccess-Control-Allow-Origin(backend empty ACAO- main-nginx
add_header $http_origin) — harmless on the new same-origin page but should drop the backend's redundant CORS since lnd-ui now fetches same-origin.
- main-nginx
ENV QUICK-REF
- .116 archi-thinkpad: data
/var/lib/archipelago, nginx root/opt/archipelago/web-ui, http :80 + custom nginx-proxy-manager; user reaches UI via Tailscale100.69.68.39AND LAN. Deploy SSH key~/.ssh/archipelago-deployis passphraseless; SSH-to-self + .198 work non-interactively. - .198:
ssh archipelago@192.168.1.198(passwordless sudo), podman+npm, NO cargo. - Companion build-dir precedence:
/opt/archipelago/docker>~/archy/docker>~/Projects/archy/docker. - Uncommitted working-tree changes (mine, not yet committed): the 11 files for fixes #1–#5.