Back to list
Development Update — July 26
Today is the start of a multi-day skychat convergence push (tracked in #3596): the native app and the browser wasm visor have long carried two separate copies of the same chat machinery, and they’ve been drifting. The work begins at the two seams that let the rest converge — a wire format that carries quoted replies to the recipient rather than just the sender, and a history store that finally compiles under GOOS=js so the browser visor can adopt the same persistence the native app uses. Alongside the chat work, the TinyGo wasm-visor gained a runtime toolchain switch for A/B validation, and the packaging docs got a much-needed page on how installed nodes actually update themselves.
Skywire: Quoted Replies, on the Wire
3597 feat(skychat): wire-propagate quoted replies via the shared codec + DM message ids makes reply-threading real across peers. Until now it was sender-local — the wasm visor and native app each tracked “this message quotes that one” only in their own UI buffer, so the recipient never learned a message was a threaded reply. This adds ReplyTo (with omitempty, so the wire stays byte-identical and pre-envelope peers just ignore it) to the shared message.Envelope, and threads it through both visors: the wasm path now mints an 8-byte hex id on every send and surfaces inbound id + reply_to, while the native app’s inbound chatEvent carries reply_to_id on the /events SSE stream. Verified live between a native visor and a browser wasm-visor: a quoted reply arrives with the exact id that was sent. 3598 feat(skychat): native send-side quoted replies (reply_to on /message) completes the symmetry — #3597 had given native the receive side and wasm both sides, and this adds the native send side. /message gains a reply_to field, the chat-msg envelope is now emitted when reply_to or wait_ms is set (a reply_to-only send sets Ack:false so it doesn’t block on an ack-waiter), and the outbound event mirror carries ReplyToID so the sender’s own UI threads too. A default send with neither field stays byte-identical plain text.
Skywire: A wasm-Safe History Store
3599 refactor(skychat): move history store to pkg/skychat/history + wasm-safe MemStore relocates the store from cmd/apps/skychat/history into the shared pkg/skychat tree and splits its backends so it compiles everywhere. The old store’s only backend was BoltStore, which can’t build under js — bbolt mmaps a file and uses absent syscalls — which kept persistence out of reach of the browser visor. Now history.go holds the pure-Go Store interface and types, store_bolt.go keeps BoltStore behind //go:build !js, and a new MemStore implements the same nine-method interface with the same limit semantics (per-message size, per-peer rate limit and FIFO cap, total-bytes cap, TTL sweep, whitelist) on all platforms — the enabling seam for the rest of the convergence. 3601 feat(wasm-visor): back the skychat buffer with pkg/skychat/history MemStore then wires the browser visor’s chat buffer onto that MemStore, replacing its ad-hoc 500-entry chatLog slice — the last place skychat persistence hadn’t converged. appendChat writes history.Message records, skychatMessages() reads them back, and a new skychatHistory(peer) binding gives the browser visor parity with the native /history?peer= endpoint; the wasm-only file-transfer fields live in a small side-map re-hydrated on projection. The shared Message gains ID + ReplyTo so a quoted reply’s thread survives a reload or history backfill.
Skywire: TinyGo A/B and Packaging Docs
3594 feat(wasm-visor): runtime Go<->TinyGo variant switch in one PWA is the harness for validating the TinyGo build before it could ever become the default. hv serve now serves both blobs (selectable via ?variant=go|tinygo) with matching wasm_exec.js and a /wasm-variants.json manifest; the boot glue persists the choice in localStorage and flows it to the (Shared)Worker, showing the toggle only when more than one variant is embedded. Because the secret key is variant-independent, switching toolchains reboots the same PK — same identity, different blob. 3600 docs(packaging): document the three auto-update mechanisms + AUR packages adds a Packaging & Updates section to the docs site covering, with verbatim systemd units and enable/disable/check commands, the three ways an installed node updates itself: apt unattended-upgrades via the skyrepo package, source auto-update via skywire-autoupdate’s daily go install, and Docker auto-pull via the separate skywire-docker-autopull package. It explicitly untangles which unit ships in which package — a recurring source of operators accidentally running two updaters at once — and documents the two AUR pkgbases and their variant PKGBUILDs.