Back to list
Development Update — July 10
The day laid the groundwork for a skycoin wallet that runs in a browser tab with no full node and no clearnet. The pieces are a discovery contract — a generic coin service type — plus the visor-side wiring that reverse-proxies a fibercoin node’s HTTP API over dmsg and advertises it only while it’s actually answering, and two follow-on fixes that came straight out of testing it live against a real node behind Caddy. Alongside the coin work, a large test-coverage pass closed the gaps an earlier audit had flagged across the WASM builds, the service APIs, and the hypervisor Web UI.
Skywire: Fibercoin Nodes Reachable over the Mesh
3436 feat(servicedisc): add generic ‘coin’ service type for fibercoin node discovery is the foundation for the thin-client-wallet-over-dmsg effort. ServiceTypeCoin = "coin" is intentionally generic — any fibercoin, not skycoin-specifically, with the coin name carried as filterable metadata — and a CoinInfo record (fiber name, main/test network, block publisher, version) rides along the service entry, mirroring the existing VPNInfo pattern. A coin node behind a visor registers as type=coin, and a thin-client wallet — notably the wasm visor in a browser, which can’t pass --node-url flags — discovers a node for the right coin and network over dmsg and reaches its API through the mesh, with no local full node and no clearnet.
3438 feat(visor): fibercoin node discovery over dmsg (ServiceTypeCoin phase 1b) is the visor-side wiring. For each configured coin node the visor reverse-proxies the node’s local HTTP API over dmsg on a service port (reusing the forwarded-ports infrastructure), and on each service-discovery heartbeat it probes the node’s /api/v1/health, builds a detected CoinInfo from the node’s own answer — blockchain_pubkey, fiber, version, head sequence, never operator-claimed identity — and registers the type=coin entry only while the node responds, deregistering it when the node goes away so the advertisement is always truthful. The coin node runs independently under systemd or a terminal; the visor never starts or stops it, and desktop hosts are untouched unless coin nodes are configured. It depends on a blockchain_pubkey field added to skycoin’s /health (3437 chore(deps): bump skycoin), read from the live JSON at runtime so it works regardless of the visor’s vendored skycoin version.
3439 fix(visor): coin forward rewrites Host to backend (fibercoin host-whitelist 403) fixes the first thing live testing surfaced. The coin forward was a raw dmsg byte-splice that passed the caller’s Host — the visor’s public-key address — straight through, and fibercoin daemons run a DNS-rebinding host-whitelist check that answered 403 Forbidden - Invalid Host even though the bytes reached the daemon. Making the coin forward an HTTP reverse-proxy that rewrites Host to the loopback backend passes the daemon’s built-in localhost exemption without asking the operator to weaken its header check. Validated live on the magnetosphere node: a type=coin entry registered with a detected blockchain pubkey and head sequence, and /health over dmsg went from 403 Invalid Host to a clean response.
3441 fix(visor): port-80 proxy rewrites Origin only for WebSocket upgrades fixes the second. The port-80 reverse proxy had been rewriting the Origin header to the backend on every request — a change originally made so audioprism’s WebSocket handshake would pass a same-origin check, but harmful to a plain-HTTP backend that validates Origin against a whitelist or emits CORS, such as a skycoin node behind Caddy exposed over the port-80 dmsg forward: the node 403s the fabricated origin, and its Access-Control-Allow-Origin reflects the fake value so a browser blocks the response. Gating the rewrite on the Upgrade: websocket header keeps audioprism working while letting a browser wallet reach a fibercoin node over the mesh.
Skywire: Filling the Test Gaps
3433 fill CI + test-coverage gaps across WASM, service APIs, and the hypervisor Web UI closes the three areas an untested-code audit had flagged. On the WASM side it adds a TinyGo CI lane that compile-checks every TinyGo target, a runtime smoke test that rebuilds app-mux.wasm from source and drives it through the wazero policy evaluator (so the test exercises a fresh build rather than the committable-stale blob), and direct tests for the tab-serving RPC. On the service APIs it adds httptest coverage for every handler the audit named — across service-uptime, service-discovery, dmsg discovery, and the address-resolver’s QUIC and WebTransport bind paths with per-type storage isolation. And the Angular hypervisor UI, which had had zero CI and zero specs, gained both.