Back to list

Development Update — August 1

Today’s work sits mostly on the operator-facing surface: how a visor is tuned, how it’s controlled from the CLI, and how it self-describes. The routing examination continued paying out with a router change that races transport creation against routing over existing transports — so a warm peer connects in half a second instead of paying the full direct-dial latency first. The privacy and routing knobs that had been config-JSON-only got proper autoconfig/config gen flags and a tuning guide, a local privilege-escalation vector in RPC-initiated dmsgpty exec was gated behind opt-in, and cli visor app grew into the app-control superset that proxy and vpn can later alias. A stray Mixed-Content bug in the browser’s mesh navigation was also fixed.

Skywire: Routing, Raced and Routed

3653 perf(router): race transport creation against routing over existing transports is the day’s routing-examination change. An app dial that would create a direct transport (min-hops==1, not existing-tp-only) ran the transport-creation hook synchronously — STCPR→SUDPH→DMSG, each a 3-try retrier, up to ~20s worst case — before the route-finder was ever queried, so a peer already reachable over the visor’s existing autoconnect-shaped transports still paid the full direct-dial latency first. DialRoutes now runs the hook in the background and immediately tries to route over existing transports, whichever lands first winning: a warm peer returns immediately (the hook still finishes and registers the direct transport for later, self-managing its context so the “never cancel the transport” invariant holds), a cold peer waits on the hook once as before. It’s gated by DisableRaceRouteSetup (default off) as a safety valve, and measured live at ~0.5s app connects with zero watchdog events. 3654 fix(wasm): route in-page .dmsg/.skynet links over the mesh, not the browser fixes a Mixed-Content block on the HTTPS wasm-visor page: the in-iframe interception classified a URL as a mesh target only when it was relative, so an absolute http://<name>.dmsg/ link fell through and the browser tried to load it directly. It now treats any absolute URL whose host is a .dmsg/.skynet name or a 66-hex PK as a mesh target regardless of scheme — routing links to the parent for a cross-site resolve, blocking cross-site mesh subresources from reaching the browser, and stripping absolute mesh-host subresources at render time — verified live navigating to skywire.dmsg with zero Mixed-Content errors.

Skywire: Privacy and Routing Knobs, Exposed

3655 feat(autoconfig): add –transport-port (shared master transport port) adds the unified master transport port to autoconfig — it could set per-type ports but not the one-port-for-all setup that config gen has long had — completing the autoconfig → skywire.conf → config gen chain and unblocking the web install-command generator. 3657 feat(config): autoconfig + config-gen flags for privacy/routing knobs adds CLI flags on both surfaces for three per-visor controls that previously required hand-editing skywire.json (which config gen -r can clobber): --min-hops (≥2 forces multihop, a sender-anonymity lever), --ar-transport-limit (address-resolver registration policy), and --no-direct-transports (the #3650 knob), preserving the SKYENV round-trip so every variable config gen reads now has a matching autoconfig flag. 3656 docs(guides): add privacy ↔ performance tuning guide adds an operator guide positioning a visor along the privacy↔performance spectrum — separating the data/IP/metadata dimensions, documenting each real lever with its config knob, and giving three recipes (max performance, balanced, maximum privacy) — a topic that keeps coming up in the community channel. 3658 fix(security): gate RPC-initiated dmsgpty exec behind opt-in config closes a local privilege-escalation vector: API.DmsgPtyExec opened an authenticated dmsgpty stream using the visor’s own identity, gated only by “can you reach the visor RPC” — and on a root deployment the RPC socket is loopback :3435, reachable by every local user, so any unprivileged local process could borrow the root visor’s identity to exec commands. A new Pty.AllowRPCExec field, off by default, gates it; the blast radius is small because only control nodes that initiate cli pty exec --via need it enabled, while inbound targets (whitelist-gated) are unaffected.

Skywire: cli visor app, the App-Control Superset

3662 feat(cli): make visor app the app-control superset — add pk/restart/conns wires in three capabilities whose visor RPCs existed but had no CLI caller: visor app arg pk (the one real functional gap — setting an app’s remote server/exit PK was previously only possible via proxy/vpn start <pk>), visor app restart, and visor app conns (per-connection alive/latency/bandwidth, which neither proxy nor vpn exposed). 3664 feat(cli): lift generic routing-session flags onto visor app start adds the routing-session flags (--existing-tp, --local-route, --mux, --mux-mode, --min-hops) to the generic visor app start, each applied only when explicitly passed so a bare start doesn’t flip visor-wide routing prefs — so cli visor app now covers every generically-applicable capability of proxy/vpn. 3665 refactor(cli): centralize routing-session application in one shared helper then extracts the routing-session RPC sequence — previously duplicated across proxy start, vpn start, and the new visor app start — into one clirpc.ApplyRoutingSession helper, so the three surfaces apply the same order and quirks (the mux sentinels, mux-mode skip, min-hops guard) in one place and can’t drift; behavior is preserved by construction, with the sensitive proxy/vpn streaming and reconnect paths untouched.

3660 feat(buildinfo): fall back to debug.BuildInfo settings for commit/date/tags fixes go install github.com/skycoin/skywire/...@version builds — which carry no ldflags — reporting commit/date/tags as unknown. The Go toolchain already records vcs.revision, vcs.time, and -tags in debug.BuildInfo.Settings for any build, so readDebugBuildInfo now reads those as a fallback only when the -X ldflags weren’t injected — Makefile release builds are unchanged, but a plain go install binary now self-describes its commit, date, and build tags, motivated by the install generator now offering go install. 3663 feat(landingpage): exit-IP check links on the visor landing page adds a “Check your exit IP” line (ip.skycoin.com + ip.skywire.dev) to the shared visor landing page: opened in the wasm-visor’s iframe browser, which routes clearnet through skysocks-client-lite, the reported IP is the proxy exit’s, so one click shows which exit the tab is browsing through — pairing with the default-auto-random proxy exit so the links resolve through a proxy.