<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog</title><link>https://skycoin.github.io/blog/</link><description>Recent content on Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 18 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://skycoin.github.io/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Development Update — June 18</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-18/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-18/</guid><description>&lt;p&gt;The most important day in a while, and it started with the network down. The dmsg-only convergence work of the prior days, combined with a fleet-wide redeploy, walked straight into a &lt;strong&gt;cold-start bootstrap trap&lt;/strong&gt;: every dmsg-server was waiting on a registration that could only succeed once &lt;em&gt;another&lt;/em&gt; server was already accepting — a circular dependency where nobody could be first, so the whole fleet stayed down even though every binary was healthy. Untangling it took a chain of fixes that each peeled back one layer of the trap, and once the network was back up, a multi-agent code audit of the v1.3.72–76 dmsg changes turned up a long tail of leaks, races, and &amp;ldquo;looks-healthy-but-can&amp;rsquo;t-relay&amp;rdquo; failure modes — all fixed the same day, culminating in the v1.3.76 release. This post traces the arc: the outage, the root cause, the audit, and a hard-fail defense against silent post-quantum downgrades.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 17</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-17/</link><pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-17/</guid><description>&lt;p&gt;The big structural change of the day was collapsing the visor&amp;rsquo;s two same-key dmsg clients into one — and the bumpy path it took to land. The visor had been running a discovery client and a direct client under the same public key, and because dmsg servers evict by newest-session-wins, the two were quietly evicting each other on every shared server: a continuous self-eviction storm measured at tens of session-deaths per minute per server. The fix went in, got reverted when it surfaced a fatal re-entrant deadlock, and was re-applied with the deadlock fixed. Around that headline: a clutch of resolving-proxy alias features (including a clickable &lt;code&gt;home.dmsg&lt;/code&gt; directory page), a redis-starvation fix in service discovery, a dmsg-server config simplification, and the noise-fork PQ design doc catching up to the code.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 16</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-16/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-16/</guid><description>&lt;p&gt;The headline is post-quantum cryptography landing in the Noise handshake. Over three pull requests — a design sketch, a self-contained crypto layer, and the live wiring — skywire&amp;rsquo;s encrypted transports gained a hybrid X25519 + ML-KEM-768 key agreement, with no new round trips, no flag to flip, and full backward compatibility with peers that haven&amp;rsquo;t updated. Around it: an end-of-month docs refresh of the reward rules to match the current dmsg-only deployment, two transport-reliability changes aimed at dead-edge detection (OS-level keepalive and a local-route-calc preference for disjoint mux legs), and the migration off the frozen noise fork that made the PQ work possible in the first place.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 15</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-15/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-15/</guid><description>&lt;p&gt;A short but consequential day, with two changes that each close a gap the old code couldn&amp;rsquo;t see. The router gains a per-leg end-to-end liveness probe, so a multiplexed route whose path dies &lt;em&gt;beyond&lt;/em&gt; the first hop is detected and dropped instead of silently black-holing traffic. And the rewards regional-saturation formula is reworked so that running more visors at a country&amp;rsquo;s IP grows the country&amp;rsquo;s pot proportionally rather than freezing it at the single-visor amount — fixing a case where adding visors actively diluted everyone&amp;rsquo;s reward.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 14</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-14/</link><pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-14/</guid><description>&lt;p&gt;A day of grounding the dmsg-only default in reality: as the network leans harder on the overlay, the failure modes that used to be masked by a plain-HTTP fallback now have to be fixed properly. Two of them were boot-and-reconnect wedges — a dmsg-only visor that spun forever trying to reach the transport-discovery, and a SUDPH client that retried a closed socket until it gave up. Alongside those, a new &lt;code&gt;inject_pk&lt;/code&gt; mode makes forwarded websites HTTP-aware (the backend finally learns &lt;em&gt;who&lt;/em&gt; is connecting), the router&amp;rsquo;s setup-failure diagnostics are made panic-safe and then richer, and a couple of CLI/UI papercuts get smoothed.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 13</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-13/</link><pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-13/</guid><description>&lt;p&gt;A day that follows the plain-HTTP retirement to its logical conclusion: if deployment services live on the overlay, you need a clean way to &lt;em&gt;see&lt;/em&gt; them from a browser without a clearnet hop — and that way is the resolving SOCKS5 proxy. The headline work makes those &lt;code&gt;.dmsg&lt;/code&gt; / &lt;code&gt;.skynet&lt;/code&gt; proxies smarter: a visor asked for &lt;em&gt;its own&lt;/em&gt; key now short-circuits in-process instead of dialing a wasteful round-trip back to itself, and a configurable alias lets &lt;code&gt;skywire.dmsg&lt;/code&gt; mean &amp;ldquo;the local visor&amp;rsquo;s landing page.&amp;rdquo; Around it: the CLI finally drops its dead plain-HTTP fallback (the resolver is the supported replacement), a discovery-side timeout-and-hang fix on &lt;code&gt;/uptimes?v=v3&lt;/code&gt;, a self-healing &lt;code&gt;--direct&lt;/code&gt; route for control-plane forwards, and the real fix for a dmsg-discovery CPU storm that had been pinning the service for hours.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 12</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-12/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-12/</guid><description>&lt;p&gt;The headline is persistent pty sessions: the hypervisor web terminal can now drop, reconnect, and rebind to the &lt;em&gt;same&lt;/em&gt; shell with its missed output replayed — built up across four self-contained phases so the concurrency-critical core was validated before anything touched the host&amp;rsquo;s hot path. Around it, a receive-side route-setup race gets fixed by parking frames instead of dropping them; the CLI stops silently serving stale cache data when you asked for fresh; minimal visor configs finally seed the direct-service entries they need to reach TPD over dmsg; the web terminal works for sub-hypervisor visors; and &lt;code&gt;reward lookup&lt;/code&gt; and &lt;code&gt;hv ls --load&lt;/code&gt; give operators two new windows over dmsg.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 11</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-11/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-11/</guid><description>&lt;p&gt;A day spent making things recover from failure instead of silently wedging on it. skysocks-client&amp;rsquo;s reconnect loop finally fires on the failure that matters most — a route group torn down router-side without an EOF — and interactive pty terminals stop dying every two minutes of idle. Underneath, a sustained adversarial audit during a live deploy-churn window turned up a string of churn-exposed leaks, races, a crash, and a transport-eviction bug that was breaking routes for minutes at a time. Plus a &lt;code&gt;--cascade&lt;/code&gt; config flag so operators can opt into the source-driven route setup, and a documented hook for restarting out-of-tree services after an auto-update.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 10</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-10/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-10/</guid><description>&lt;p&gt;A heavy day on two fronts. The first is the dmsg server: it stops booting on plain HTTP entirely — building its transit client before the server, registering and resolving strictly over dmsg, falling back to the embedded deployment config when no block is set, and self-updating its embedded server list over dmsg — and it gains a way for a &lt;em&gt;non-public&lt;/em&gt; server to be reachable inbound via signed peer announcements. The second is the adaptive routing arc for multiplexed proxies, which lands its full observable → manual → adaptive control loop: &lt;code&gt;mux-set&lt;/code&gt; to reconcile a leg-set, &lt;code&gt;mux-auto&lt;/code&gt; to prune toward a latency preset, and the GROW direction so a session re-grows lost redundancy. Around those, a long run of lifecycle-audit fixes hardened the router, transport, dmsg session, and CXO layers against leaks and races found during live deploy-churn.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 9</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-09/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-09/</guid><description>&lt;p&gt;A day of sharpening the tools you measure and operate the network with. The route-finder learns to hand back per-hop latency so a client can rank routes without re-probing them; the &lt;code&gt;proxy mux-info&lt;/code&gt; view gains a live throughput-and-share readout so you can see what a multiplexed session is actually delivering right now; and the CLI takes another step off the plain-HTTP edge of the deployment services. Underneath that, two leaks and a race get root-caused — a CXO publisher heap leak that was OOM-looping the transport-discovery in hours, and a router data race that turned out to be the real cause of the linux CI failures.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 8</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-08/</link><pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-08/</guid><description>&lt;p&gt;A day with two threads running in parallel: making multihop route setup tolerate the network&amp;rsquo;s churn instead of failing on it, and giving the resolving proxy real source-routing power. The route-setup work adds a per-hop id-reservation retry on transient dmsg-202 and replaces dmsgweb&amp;rsquo;s reconnect storm with a single client. The resolver work lets you name a dmsg rendezvous server or an exact transport path right in the hostname — pinning how a &lt;code&gt;.dmsg&lt;/code&gt; or &lt;code&gt;.skynet&lt;/code&gt; address is reached. Around them: latency-weighted route selection becomes the finder&amp;rsquo;s default, debug logs and pprof get consolidated onto one dmsg port, and a third CXO goroutine leak is closed.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 7</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-07/</link><pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-07/</guid><description>&lt;p&gt;The day the dmsg session lifecycle finally got fixed — the change that was the real root cause behind &amp;ldquo;dmsg error 202&amp;rdquo; and the per-hop coin flip that made multihop route setup unreliable for months. Newest-session-wins replaces a lifecycle that rejected healthy reconnects and clung to half-dead corpses. Alongside it: bounding the mux-bandwidth RTT probe so it can&amp;rsquo;t hang the run, and a hypervisor UI pass that adds a DMSG-server IP column, fixes text contrast, and declutters the skynet forms.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 6</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-06/</link><pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-06/</guid><description>&lt;p&gt;A day spent unsticking the things that quietly leak, wedge, or fall back to plain HTTP. The headline is a dmsg-only fix for the blank hypervisor network tab — a casualty of the new default config — alongside a setup-node connection pool that stopped handing out dead connections and a CXO goroutine leak that was dragging whole hosts down. Around them: the rewards calc sourcing uptime from the transport-gated tracker, and the &lt;code&gt;got&lt;/code&gt; CLI learning to actually use its SOCKS5 proxy.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 5</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-05/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-05/</guid><description>&lt;p&gt;A big day the day after a release, and the dominant thread is multihop route setup again — but this time with a hard, pragmatic pivot. Live A/B testing showed the new source-driven cascade installs routes whose control plane succeeds on every hop yet whose &lt;em&gt;data plane&lt;/em&gt; doesn&amp;rsquo;t carry traffic, so the default flips back to legacy direct-dial route setup while the cascade&amp;rsquo;s data-plane bug is chased down, with the dial loop hardened to walk more candidate intermediates and a mux that now self-heals its degree in the background. Around it: a benevolent bandwidth-spreading routing-policy preset, a TPD fix that keeps both edges of an expired transport (worth ~half the network&amp;rsquo;s bandwidth rewards), a launcher fix that had the skysocks- and vpn-clients dead on arrival, a synchronous bbolt integrity walk that stops ARM boards crash-looping, the ssh/sshd/sshfs commands unified under &lt;code&gt;cli pty&lt;/code&gt;, and a clutch of CXO, skychat, and logserver ergonomics.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 4</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-04/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-04/</guid><description>&lt;p&gt;A big day, the day after a release. v1.3.64 shipped, and then the work turned to the thing that had been making multihop routes unreliable for months: &lt;strong&gt;route setup&lt;/strong&gt;. The headline is a redesign of how routing rules get installed — the route-setup node stops dialing every hop over dmsg and becomes a pure signing oracle, with the source injecting the signed rules down the route&amp;rsquo;s own transports. That gets &lt;a href="./posts/source-driven-cascade-route-setup/"&gt;its own article&lt;/a&gt;; it took five pull requests and a lot of live debugging to land working end-to-end. Around it: a sudph reliability fix so visors recover after an address-resolver restart, a route-finding correctness fix, two new standalone diagnostic tools (a dmsg probe and a skywire-native sshfs), the &lt;code&gt;cli version&lt;/code&gt; command, and a handful of post-release cleanups.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Programmable Routing Policy: Skylark and WASM</title><link>https://skycoin.github.io/blog/posts/programmable-routing-policy/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/programmable-routing-policy/</guid><description>&lt;p&gt;Skywire&amp;rsquo;s router has, over the last month, become genuinely capable. It builds &lt;strong&gt;multihop&lt;/strong&gt; routes through chosen intermediates, fans a flow across &lt;strong&gt;multiplexed&lt;/strong&gt; parallel routes, keeps those routes &lt;strong&gt;disjoint&lt;/strong&gt; (no shared middle hop), routes the forward and reverse legs &lt;strong&gt;asymmetrically&lt;/strong&gt;, and &lt;strong&gt;ranks candidates by measured per-hop latency&lt;/strong&gt;. That&amp;rsquo;s a rich mechanism.&lt;/p&gt;
&lt;p&gt;But a mechanism needs a policy. &lt;em&gt;Which&lt;/em&gt; of those capabilities applies to a given flow — how many routes, how many hops, through which countries, rotated how often — was, until recently, a decision hardwired in Go. If you wanted your VPN traffic to take a different path than your chat traffic, or to avoid transiting a particular jurisdiction, or to fan across four disjoint paths during the workday and collapse to one at night, you patched the router.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Route Setup Over Transports: The Source-Driven Cascade</title><link>https://skycoin.github.io/blog/posts/source-driven-cascade-route-setup/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/source-driven-cascade-route-setup/</guid><description>&lt;p&gt;To carry traffic across the skywire overlay, a multihop route has to be &lt;em&gt;built&lt;/em&gt;: each visor along the path needs a routing rule telling it which transport to forward a packet onto next. Installing those rules has, until now, been the job of a &lt;strong&gt;route-setup node&lt;/strong&gt; (RSN) — a dedicated service that, given a route, reaches out to every hop and writes the rule.&lt;/p&gt;
&lt;p&gt;The way it reached each hop was the problem. The RSN dialed each visor &lt;strong&gt;over dmsg&lt;/strong&gt;. And dmsg reachability is not the same thing as &lt;em&gt;route&lt;/em&gt; reachability. A visor can be perfectly alive on its transports — its stcpr and sudph links up, forwarding packets fine — while its dmsg session has quietly gone half-dead (an older build with an undetected zombie session, a relay that dropped it). The RSN would try to dial that hop over dmsg, time out, and the whole route setup would fail — even though every transport the route actually needs is working.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Skychat: Group Messaging on a Peer-to-Peer Mesh</title><link>https://skycoin.github.io/blog/posts/skychat-group-messaging/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/skychat-group-messaging/</guid><description>&lt;p&gt;Skychat is the chat application that ships with skywire — direct messages and group conversations between visors. It is also, quietly, one of the best stress tests the project has. A group chat exercises almost everything underneath it at once: the encrypted transport mesh, the CXO data layer that synchronizes shared state, presence and reconnection, and the unforgiving question every messaging system eventually faces — when you send a message, does it actually &lt;em&gt;arrive&lt;/em&gt;?&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Standalone Skywire Utilities: Encrypted Connection, Public Key as Identity</title><link>https://skycoin.github.io/blog/posts/standalone-skywire-pk-identity/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/standalone-skywire-pk-identity/</guid><description>&lt;p&gt;If you keep peeling back skywire&amp;rsquo;s layers — the apps, the multihop router, the multiplexed routes, the discovery services, the dmsg relay — what&amp;rsquo;s at the very bottom? One primitive: an &lt;strong&gt;encrypted connection between two public keys&lt;/strong&gt;. The noise handshake provides the encryption; the public key &lt;em&gt;is&lt;/em&gt; the identity. No certificate authority vouches for it, no DNS name resolves to it, no allocated IP belongs to it. A party is its key, and two keys that have completed a handshake have, by construction, authenticated each other and established a confidential channel.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 3</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-03/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-03/</guid><description>&lt;p&gt;A day about taking plain HTTP off the critical path. With the overlay&amp;rsquo;s reliability and egress now in good shape, the default generated config drops the plain-HTTP service-discovery fallback — services are reached over the peer-to-peer overlay (dmsg today, skynet transports by design). Plain HTTP now survives only as a compatibility shim for custom deployments; on the public network it&amp;rsquo;s headed for the door entirely. Getting there safely meant draining &amp;ldquo;ghost&amp;rdquo; transports at the source, cutting the transport-discovery&amp;rsquo;s egress with gzip + caching, and bounding a runaway CXO goroutine spawn. Plus the Windows installer is fixed and v1.3.64 is prepared.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 2</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-02/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-02/</guid><description>&lt;p&gt;A routing-reliability day, and two releases. The router gets a run of hardening — one hop&amp;rsquo;s failure no longer tears down the whole route, a cluster of panics and races are guarded, and a multiplexed-route stall is fixed. The dmsg-first client stops a bad HTTP fallback, the hypervisor starts forwarding browser-side UI errors into the visor log (where they&amp;rsquo;re actually visible), and v1.3.62 / v1.3.63 ship.&lt;/p&gt;
&lt;h3 id="skywire-router--dont-let-one-hop-sink-the-route"&gt;Skywire: Router — Don&amp;rsquo;t Let One Hop Sink the Route&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;2976&lt;/code&gt; fix(router): stop one hop&amp;rsquo;s failure from RST-ing the whole route (setup cascade)&lt;/strong&gt; — during route setup, a single hop failing could cascade into a reset of the entire route. Now a hop failure is contained, so the rest of the route survives and can be repaired rather than torn down wholesale. This is the kind of fix that turns &amp;ldquo;the route flaps when any intermediate hiccups&amp;rdquo; into &amp;ldquo;the route tolerates a hiccup.&amp;rdquo;&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — June 1</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-06-01/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-06-01/</guid><description>&lt;p&gt;The standalone chat path reaches its purest form: CXO-backed group messaging over &lt;strong&gt;native TCP, peer-to-peer, with no dmsg involved at all&lt;/strong&gt; — just two public keys and an encrypted transport between them. Plus transitive hypervisor trust, a per-server service health check, and a cluster of router and CXO fixes (one of which we&amp;rsquo;ll revisit later in the month).&lt;/p&gt;
&lt;h3 id="skywire-standalone-skychat--cxo-over-native-tcp-no-dmsg"&gt;Skywire: Standalone Skychat — CXO Over Native TCP, No DMSG&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;2950&lt;/code&gt; feat(skychat): CXO-backed messaging over native TCP in standalone (P2P, no dmsg)&lt;/strong&gt; — the standalone chat app can now run its CXO-backed group messaging directly over a noise-encrypted native-TCP connection between peers, with &lt;strong&gt;no dmsg layer at all&lt;/strong&gt;. Each instance is identified by its public key; the noise handshake encrypts the link; CXO feeds carry the messages. Two (or more) peers point at each other&amp;rsquo;s &lt;code&gt;pk@host:port&lt;/code&gt; and have a working, encrypted, public-key-authenticated group — no visor, no router, no dmsg server, no discovery service.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 31</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-31/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-31/</guid><description>&lt;p&gt;A short day, mostly routing-policy ergonomics: the policy&amp;rsquo;s rotation callbacks get richer inputs, and the proxy and VPN clients learn to take a &lt;code&gt;--routing-policy&lt;/code&gt; directly on the command line.&lt;/p&gt;
&lt;h3 id="skywire-routing-policy--richer-rotation-cli-wiring"&gt;Skywire: Routing Policy — Richer Rotation, CLI Wiring&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;2938&lt;/code&gt; feat(router/policy): expose leg byte counters and hop chain to rotation callbacks&lt;/strong&gt; — a policy&amp;rsquo;s rotation callback now receives the per-leg byte counters and the hop chain. A rotation policy can make decisions on real data — &amp;ldquo;this leg has moved very little traffic&amp;rdquo; or &amp;ldquo;this path runs through an intermediate I want to avoid&amp;rdquo; — rather than rotating blindly on a timer.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 30</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-30/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-30/</guid><description>&lt;p&gt;A light day. The node survey learns to report CPU details on the hardware skywire actually runs on — ARM single-board computers and Windows — and the &lt;code&gt;hv ls&lt;/code&gt; listing gains multi-section output with aligned columns.&lt;/p&gt;
&lt;h3 id="skywire-survey--cpu-info-on-the-real-hardware"&gt;Skywire: Survey — CPU Info on the Real Hardware&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;2934&lt;/code&gt; feat(survey): internalize zcalusic/sysinfo + populate CPU on ARM SBCs and Windows&lt;/strong&gt; — the node survey (the hardware/OS inventory a visor reports) internalizes the &lt;code&gt;zcalusic/sysinfo&lt;/code&gt; library and fills in CPU details on the platforms where it was previously blank: ARM single-board computers (the Raspberry-Pi-class hardware much of the network runs on) and Windows. Internalizing the dependency also means the survey isn&amp;rsquo;t at the mercy of an external library&amp;rsquo;s platform gaps — the code that needs fixing is in-tree.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 29</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-29/</link><pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-29/</guid><description>&lt;p&gt;The routing-policy work keeps building. Yesterday&amp;rsquo;s Starlark policies gain a &lt;strong&gt;WASM backend&lt;/strong&gt; (a compiled, language-agnostic alternative to the Starlark interpreter), the operator-facing name &lt;strong&gt;&amp;ldquo;skylark&amp;rdquo;&lt;/strong&gt;, periodic route &lt;strong&gt;rotation&lt;/strong&gt;, a hypervisor-UI panel to manage it, and runtime per-app hot-swap. Underneath, the router&amp;rsquo;s mux loop gets a best-effort + local-fallback path, and the CXO node sheds a long-standing accept-path serialization bottleneck. Two releases, v1.3.60 and v1.3.61, go out.&lt;/p&gt;
&lt;h3 id="skywire-routing-policy--wasm-backend-rotation-and-skylark"&gt;Skywire: Routing Policy — WASM Backend, Rotation, and &amp;ldquo;Skylark&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;2913&lt;/code&gt; feat(router/policy): WASM backend for routing policies&lt;/strong&gt; — alongside the Starlark interpreter, policies can be compiled to &lt;strong&gt;WASM&lt;/strong&gt; and run through a WASM backend. Starlark is the readable, write-it-inline option; WASM is the compile-it-from-any-language, run-it-fast option. The router can evaluate either.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 28</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-28/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-28/</guid><description>&lt;p&gt;The headline feature of the week lands: &lt;strong&gt;operator-programmable routing policy&lt;/strong&gt;. Skywire&amp;rsquo;s router already does multihop, multiplexed, latency-ranked, asymmetric path selection — but &lt;em&gt;which&lt;/em&gt; path a given flow takes was hardwired in Go. Today that decision becomes a program the operator writes, in &lt;strong&gt;Starlark&lt;/strong&gt; (a small, sandboxed, Python-like language), evaluated per dial. A flow can be steered onto disjoint paths, pinned by 5-tuple, made latency-adaptive, prioritized by DSCP, or forced onto the overlay — by policy, not by patch.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 27</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-27/</link><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-27/</guid><description>&lt;p&gt;A big structural day. Two long-running refactors converge: the &lt;strong&gt;unified app framework&lt;/strong&gt; (#2775) names the implicit contract every skywire app has been following and starts folding the built-in services into it, and the &lt;strong&gt;pty rename&lt;/strong&gt; finishes de-coupling the pty subsystem from dmsg — &lt;code&gt;pkg/dmsg/dmsgpty&lt;/code&gt; becomes &lt;code&gt;pkg/pty&lt;/code&gt;, because the pty runs over dmsg, skynet, tcp, &lt;em&gt;or&lt;/em&gt; http, and the name should say so. Plus the pair-binary collapse and a round of hypervisor-cache tuning that produces two patch releases.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 26</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-26/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-26/</guid><description>&lt;p&gt;A refactoring-heavy day with one clear goal: make the visor config generator &lt;strong&gt;compile to WASM under TinyGo&lt;/strong&gt;, so the install-command generator page can build a real config in the browser from the live flag set. That meant surgically removing &lt;code&gt;net/http&lt;/code&gt; and &lt;code&gt;encoding/json&lt;/code&gt; from the config-gen build graph and hand-rolling a streaming JSON serializer. Alongside, the skypty-over-skynet listener gets the fixes that make it actually start and accept connections.&lt;/p&gt;
&lt;h3 id="skywire-a-wasm-clean-config-generator"&gt;Skywire: A WASM-Clean Config Generator&lt;/h3&gt;
&lt;p&gt;The install-command generator lifts skywire&amp;rsquo;s own &lt;code&gt;autoconfig&lt;/code&gt; flag set into a browser form via a TinyGo-compiled WASM blob — so the flags shown always match the binary. To generate a &lt;em&gt;config&lt;/em&gt; in the browser (not just assemble a command line), the config generator itself has to compile under TinyGo, which is strict about what packages it accepts. Today does that surgery.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 25</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-25/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-25/</guid><description>&lt;p&gt;The CLI&amp;rsquo;s connection to a visor gets unified around one idea: address a visor by its &lt;strong&gt;public key&lt;/strong&gt; and reach it over whichever transport works. &lt;code&gt;--rpc&lt;/code&gt; and &lt;code&gt;--via&lt;/code&gt; now accept both &lt;code&gt;dmsg://&amp;lt;pk&amp;gt;&lt;/code&gt; and &lt;code&gt;skynet://&amp;lt;pk&amp;gt;&lt;/code&gt;, the dmsg and skynet bridges fold into a single RPC surface, and &lt;code&gt;--via skynet://&lt;/code&gt; works end to end. The control plane gets the same both-transports-are-first-class treatment the data plane already had — plus self-healing for degraded dmsg.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Skywire as a Personal Fleet Substrate</title><link>https://skycoin.github.io/blog/posts/skywire-as-a-personal-fleet-substrate/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/skywire-as-a-personal-fleet-substrate/</guid><description>&lt;p&gt;Most discussions of &amp;ldquo;distributed computing&amp;rdquo; reach for the wrong frame when applied to a personal cluster of machines you actually own. The Hadoop / Spark / Kubernetes mental model assumes you have a homogeneous workload that splits cleanly across many workers — the &amp;ldquo;parallelize one big problem&amp;rdquo; shape. For most personal infrastructure, that workload doesn&amp;rsquo;t exist. You don&amp;rsquo;t have terabytes of data to process or a million-row sweep to chew through every night.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 24</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-24/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-24/</guid><description>&lt;p&gt;The management plane starts moving onto the overlay. Visor↔hypervisor RPC and the pty session can now &lt;strong&gt;auto-upgrade to skynet&lt;/strong&gt; — carrying control traffic over skywire&amp;rsquo;s own routed transports rather than only over dmsg. The pty UI gets a &lt;code&gt;skypty-ui&lt;/code&gt; rebrand, the installers get a round of fixes (and the groundwork for generating the config at install time), and two patch releases go out.&lt;/p&gt;
&lt;h3 id="skywire-management-over-skynet"&gt;Skywire: Management Over Skynet&lt;/h3&gt;
&lt;p&gt;Control traffic — the RPC a hypervisor uses to drive a visor, and the pty session an operator opens into it — has historically ridden dmsg. Today it learns to ride the routed overlay too.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 23</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-23/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-23/</guid><description>&lt;p&gt;A heavy day, and a release. The routing layer learns &lt;strong&gt;asymmetric, latency-ranked&lt;/strong&gt; path selection — forward and reverse legs can carry different route counts and minimum hops, and candidates are ranked by measured per-hop latency rather than picked arbitrarily. Transport discovery becomes &lt;strong&gt;CXO-aware&lt;/strong&gt;: local route calculation reads the transport graph from the CXO feed before reaching for HTTP. The hypervisor gains real &lt;strong&gt;drill-down&lt;/strong&gt; — proxying RPC through a sub-hypervisor to manage visors nested behind it — plus runtime management commands. And it all ships as &lt;strong&gt;v1.3.54&lt;/strong&gt;.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 22</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-22/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-22/</guid><description>&lt;p&gt;A small, consolidating day. The &lt;code&gt;--min-hops&lt;/code&gt; constraint finishes its journey through the app dial chain, ping gets a hard timeout, and a subtle CXO prefix-matching bug gets fixed.&lt;/p&gt;
&lt;h3 id="skywire-min-hops-through-the-app-dial-chain"&gt;Skywire: Min-Hops Through the App Dial Chain&lt;/h3&gt;
&lt;p&gt;The minimum-hop-count constraint — force a dial onto the overlay rather than letting it take a direct shortcut — needs to be honored all the way from the app down to the router. Today closes the last gaps.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 21</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-21/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-21/</guid><description>&lt;p&gt;A routing-correctness day. The local-route calculator gets a proper N-hop BFS so multi-hop local routes are found deterministically and honor a minimum hop count, and the mux-bandwidth and ping paths get a round of race fixes and failure-surfacing so the measurements are trustworthy.&lt;/p&gt;
&lt;h3 id="skywire-local-routing--deterministic-n-hop-bfs"&gt;Skywire: Local Routing — Deterministic N-Hop BFS&lt;/h3&gt;
&lt;p&gt;When a route can be assembled from transports the visor already knows about (without consulting the route-finder service), it does so locally. That local calculation needed to be both correct and deterministic.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 20</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-20/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-20/</guid><description>&lt;p&gt;The multiplexed-routing work gets serious about &lt;em&gt;measurement&lt;/em&gt;. A new &lt;code&gt;StreamMuxBandwidth&lt;/code&gt; RPC and a &lt;code&gt;cli mux-bw&lt;/code&gt; command — with a live TUI dashboard — turn &amp;ldquo;route a flow over N disjoint paths&amp;rdquo; into measured throughput, queueing delay, and an idle baseline. The &lt;code&gt;DialOptions&lt;/code&gt; grow disjoint-mux and intermediate-exclusion controls so the paths can be forced apart. Alongside, a round of hypervisor-UI fixes and a couple of router correctness fixes.&lt;/p&gt;
&lt;h3 id="skywire-multiplexed-bandwidth--measure-the-disjoint-paths"&gt;Skywire: Multiplexed Bandwidth — Measure the Disjoint Paths&lt;/h3&gt;
&lt;p&gt;If multiplexed routing is the headline capability, it needs to be measurable. Today builds the instrument.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 19</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-19/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-19/</guid><description>&lt;p&gt;A shorter day, with three through-lines: the &lt;code&gt;ping tree&lt;/code&gt; diagnostic moves to a server-side gRPC stream, parallel multiplexed-route dialing gets a &lt;code&gt;--routes&lt;/code&gt; knob (and a CI harness to assert on it), and the storage layer learns to &lt;strong&gt;auto-recover from bbolt corruption&lt;/strong&gt; instead of crash-looping on it.&lt;/p&gt;
&lt;h3 id="skywire-ping-tree--server-side-streaming"&gt;Skywire: Ping-Tree — Server-Side Streaming&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;ping tree&lt;/code&gt; view — which walks the route tree to a destination and times each hop — moves its heavy lifting server-side.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 18</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-18/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-18/</guid><description>&lt;p&gt;Two foundational threads today. The big one is &lt;strong&gt;IPv6 dual-stack&lt;/strong&gt; — issue #1525 lands across the schema, the address resolver, the dmsg-server advertisement, and a Happy-Eyeballs dialer, in a tidy phased rollout. The other is the &lt;strong&gt;standalone skychat&lt;/strong&gt; path: a noise-TCP direct connection (encrypted, public-key-addressed) plus a &lt;code&gt;--standalone&lt;/code&gt; mode that runs the chat app with no visor process behind it — just the encrypted connection and a pubkey identity. Plus the usual CXO/pairing reconnect hardening and the start of a CI mux-route probe.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 17</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-17/</link><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-17/</guid><description>&lt;p&gt;Two threads dominate today. First, skychat&amp;rsquo;s &lt;strong&gt;pairing&lt;/strong&gt; path — direct, one-to-one CXO-backed messaging — gets its own baseline tests and CLI surface, sitting alongside the group path. Second, the skychat-group gossip model shifts to an &lt;strong&gt;admin-aggregator, full-mesh&lt;/strong&gt; topology with signed mutations and signed leaf messages, dropping the older admin-mirror feed scheme. Underneath, a cluster of CXO node/skyobject/cxds fixes, and dmsgpty&amp;rsquo;s MultiDialer grows a &lt;strong&gt;skynet&lt;/strong&gt; listener and dialer — pty reaching a peer over skywire&amp;rsquo;s own p2p transports, not only dmsg.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 16</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-16/</link><pubDate>Sat, 16 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-16/</guid><description>&lt;p&gt;A heavy reliability day. The skychat-group work keeps closing the gap between &amp;ldquo;a message was sent&amp;rdquo; and &amp;ldquo;a message was delivered&amp;rdquo; — a fresh wave of per-layer drop counters and per-peer last-inbound surfaces make the receive path observable, while signed roster/admin gossip and history-replay-beyond-the-ring harden it. Underneath, the CXO node and treestore get a cluster of restart- and rejoin-robustness fixes, the hypervisor gains a nested-visor &lt;em&gt;tree&lt;/em&gt; view (backend + UI), and dmsgpty starts a two-phase dialer refactor.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 15</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-15/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-15/</guid><description>&lt;p&gt;The faithful-UDP arc lands. Five stacked PRs add UDP-over-skynet end to end: wire type, route group, per-datagram AEAD, the visor-side bridge for forwarded ports, and the app-API surface for &lt;code&gt;DialPacket&lt;/code&gt;. Plus a standalone &lt;code&gt;skyudp-bridge&lt;/code&gt; (sibling to skymail-bridge) and the next round of skychat-group reliability fixes — the cascade that produces the &lt;code&gt;subscriber_alive&lt;/code&gt; auto-recovery story.&lt;/p&gt;
&lt;h3 id="skywire-faithful-udp-over-skynet-stages-15"&gt;Skywire: Faithful UDP-Over-Skynet (Stages 1–5)&lt;/h3&gt;
&lt;p&gt;The architectural problem: skywire&amp;rsquo;s route groups have always been TCP-shaped — ordered, reliable, head-of-line-blocked on packet loss. Most real-world UDP traffic (DNS, NTP, VoIP, gaming, QUIC) treats late packets as worse than lost packets. Tunneling UDP through a TCP-shaped stream defeats the point.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Faithful UDP-Over-Skynet</title><link>https://skycoin.github.io/blog/posts/faithful-udp-over-skynet/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/faithful-udp-over-skynet/</guid><description>&lt;p&gt;Skywire has always carried TCP traffic well. Route groups are reliable, ordered, head-of-line-blocked on packet loss — exactly the contract &lt;code&gt;net.Conn&lt;/code&gt; callers expect. That&amp;rsquo;s the right shape for HTTP, SSH, raw TCP forwarding, and almost everything else apps reach for by default.&lt;/p&gt;
&lt;p&gt;But real-world UDP applications — DNS, NTP, VoIP, gaming, QUIC, anything that has its own loss-tolerance built in — treat &lt;strong&gt;late packets as worse than lost packets&lt;/strong&gt;. A DNS resolver that retries after 100ms doesn&amp;rsquo;t want the original response to arrive 5 seconds later through a TCP-shaped tunnel. A VoIP codec that masks 20ms of lost audio doesn&amp;rsquo;t want all subsequent audio to wait while the lost packet retransmits. A gaming engine doesn&amp;rsquo;t want the world-state update from a frame ago — it wants the current update or nothing.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 14</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-14/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-14/</guid><description>&lt;p&gt;Largest day on develop in recent memory. Three big arcs land: &lt;strong&gt;federated send for group chat&lt;/strong&gt; (members publish to their own feeds instead of relaying through the owner), the &lt;strong&gt;admin-role + admin-mirror cascade&lt;/strong&gt;, and the &lt;strong&gt;skymail-bridge&lt;/strong&gt; for email-over-skywire. Plus a sweep of fixes to the per-peerSub liveness model from yesterday, the dmsgpty-via-visor-RPC routing, and specs cleanup.&lt;/p&gt;
&lt;h3 id="skywire-skychatgroup--federated-send"&gt;Skywire: Skychat/Group — Federated Send&lt;/h3&gt;
&lt;p&gt;PR #2580 inverts the v1 model. Pre-fix: only the owner published; members had to route through the owner&amp;rsquo;s relay listener (PR #2506). Post-fix: every member publishes to their own per-PK feed; other members subscribe to every other member&amp;rsquo;s feed.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Skymail-Bridge: Email Over Skywire</title><link>https://skycoin.github.io/blog/posts/skymail-bridge-email-over-skywire/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/skymail-bridge-email-over-skywire/</guid><description>&lt;p&gt;Email is the oldest addressable identity on the internet, and it&amp;rsquo;s been outside Skywire&amp;rsquo;s reach since the project began. Today&amp;rsquo;s PR #2598 closes that gap: &lt;strong&gt;&lt;code&gt;skymail-bridge&lt;/code&gt;&lt;/strong&gt; — a sender-side SMTP bridge that lets an operator send email to and receive email from a Skywire identity, using the same Postfix machinery they already run.&lt;/p&gt;
&lt;h3 id="the-address-shape"&gt;The address shape&lt;/h3&gt;
&lt;p&gt;A Skywire identity is a 33-byte compressed secp256k1 public key. Base32-encoded (RFC 4648), that&amp;rsquo;s 52 characters — small enough to fit inside RFC 1035&amp;rsquo;s 63-octet DNS label limit, which is the hard constraint email addresses have to live within. Hex would be 66 characters and break.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 13</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-13/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-13/</guid><description>&lt;p&gt;The day after the v1.3.53 ship: most of the work is on the chat-app&amp;rsquo;s subscriber-liveness model. Four flags collapse into one, and a watchdog plus a fan-out fix shake out the remaining false negatives on &lt;code&gt;subscriber_alive&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="skywire-skychatgroup--unified-liveness-signal"&gt;Skywire: Skychat/Group — Unified Liveness Signal&lt;/h3&gt;
&lt;p&gt;PR #2537 is the cleanup: four separate liveness fields collapse into a single &lt;code&gt;lastInboundNs&lt;/code&gt; (atomic int64, set on every observable inbound event). The old fields were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Session.subAlive bool&lt;/code&gt; — toggled on Connect / Close&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Session.lastHeartbeatNs&lt;/code&gt; — heartbeat-only signal&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Record.LastMessageAt&lt;/code&gt; — chat-only, persisted&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Record.Status&lt;/code&gt; — configuration state pulling double duty as health&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They kept disagreeing. Each pair-wise disagreement got its own fix (PRs #2530–#2534 in this same arc) and the holistic answer was a single timestamp that&amp;rsquo;s &lt;em&gt;computed&lt;/em&gt; from events instead of stored in multiple places.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 12</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-12/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-12/</guid><description>&lt;p&gt;A massive day for skychat. The chat-app gets group chat, encrypted DM, per-PK aliases, history replay, peer-receipt acks, a unified CLI TUI, and the dmsgscp utility — all merged today. v1.3.53 ships at the end.&lt;/p&gt;
&lt;h3 id="skywire-skychat-d1--group-chat-over-cxo"&gt;Skywire: Skychat D1 — Group Chat over CXO&lt;/h3&gt;
&lt;p&gt;PR #2505 introduces D1 group chat. The model: one member owns the group&amp;rsquo;s CXO feed and publishes messages; other members subscribe (read-only in v1; PR #2506 adds member-side relay).&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Skychat D1: Group Chat Over CXO</title><link>https://skycoin.github.io/blog/posts/skychat-d1-group-chat/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/skychat-d1-group-chat/</guid><description>&lt;p&gt;Skychat got DM-shaped messaging years ago. Group chat is a different shape — multi-party, lossy-tolerant, with members joining and leaving — and it&amp;rsquo;s been an open feature gap. Today&amp;rsquo;s PR stack ships &lt;strong&gt;D1 group chat&lt;/strong&gt;: the first design iteration, owner-centric, riding on CXO feeds, with end-to-end encryption optional via per-group AES keys.&lt;/p&gt;
&lt;h3 id="the-d1-model"&gt;The D1 model&lt;/h3&gt;
&lt;p&gt;D1 picks the smallest viable shape that lets a group of people exchange messages reliably:&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 11</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-11/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-11/</guid><description>&lt;h3 id="skywire-v1352--network-state--observability-release"&gt;Skywire: v1.3.52 — Network-State + Observability Release&lt;/h3&gt;
&lt;p&gt;PR #80c2fd2c1 cuts release v1.3.52, capping the network-state arc that ran from late April through last week. Headline items in the release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DHT removal in favor of CXO + HTTP discovery (#2459)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pkg/services&lt;/code&gt; framework with single-process multi-service supervisor (#2464–#2472)&lt;/li&gt;
&lt;li&gt;Single-container CI e2e (#2471)&lt;/li&gt;
&lt;li&gt;CXO publishers on every authoritative source; CXO subscribers replacing HTTP polls across the visor and tpviz (#2456–#2463)&lt;/li&gt;
&lt;li&gt;dmsgfirst APIClient with HTTP fallback (#2433, #2441)&lt;/li&gt;
&lt;li&gt;Per-transport latency end-to-end (#2401)&lt;/li&gt;
&lt;li&gt;Transport uptime via CXO-driven heartbeats with minute granularity (#2426)&lt;/li&gt;
&lt;li&gt;Stats / serviceuptime / version provenance in local bbolt (#2428)&lt;/li&gt;
&lt;li&gt;WAN-reachable hypervisor-embedded dmsg + discovery proxy + terminal persistence (#2450)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The release lines up the network for the round of resilience and observability work landing this week.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 8</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-08/</link><pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-08/</guid><description>&lt;p&gt;Today is a turning point. Two large arcs land on the same day: &lt;strong&gt;Kademlia DHT is removed from the codebase&lt;/strong&gt;, and the &lt;strong&gt;deployment services migrate onto a shared &lt;code&gt;pkg/services&lt;/code&gt; framework&lt;/strong&gt; that collapses nine deployment containers into one for CI e2e.&lt;/p&gt;
&lt;h3 id="skywire-dht-removed--cxo--http-discovery-wins"&gt;Skywire: DHT Removed — CXO + HTTP Discovery Wins&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;2459&lt;/code&gt; chore: remove the Kademlia DHT subsystem in favor of CXO + HTTP discovery&lt;/strong&gt; — the DHT shipped in late April was a sincere attempt at decentralized discovery. Two weeks of running it in production surfaced enough operational sharp edges (value-size limits, signature collision dedup, the difference between DHT and HTTP being a constant source of &amp;ldquo;which one is right&amp;rdquo; questions) that the project chose the simpler CXO-publisher / CXO-subscriber model instead.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Skywire Discovery: From DHT to CXO + HTTP</title><link>https://skycoin.github.io/blog/posts/skywire-discovery-cxo-over-dht/</link><pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/skywire-discovery-cxo-over-dht/</guid><description>&lt;p&gt;Two weeks ago we shipped a Kademlia DHT as the decentralized discovery layer for Skywire — TPD, SD, and dmsg-discovery mirrored their authoritative data into it, visors could read from it as an alternative to HTTP, and the dmsg-servers ran full DHT nodes. The vision was that production services would gradually transition to bootstrapping points while the DHT carried the real load.&lt;/p&gt;
&lt;p&gt;Today we&amp;rsquo;re removing the DHT.&lt;/p&gt;
&lt;p&gt;The replacement isn&amp;rsquo;t a step back to centralized HTTP. It&amp;rsquo;s a different decentralization model — &lt;strong&gt;CXO publishers and subscribers&lt;/strong&gt; — that turns out to fit Skywire&amp;rsquo;s actual needs much better than a Kademlia DHT.&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item><item><title>Development Update — May 7</title><link>https://skycoin.github.io/blog/posts/dev-update-2026-05-07/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://skycoin.github.io/blog/posts/dev-update-2026-05-07/</guid><description>&lt;h3 id="skywire-dmsg-self-deadlock-fixes-under-dmsgfirst-path"&gt;Skywire: DMSG Self-Deadlock Fixes Under dmsgfirst Path&lt;/h3&gt;
&lt;p&gt;The dmsgfirst client introduced yesterday (PR #2433) surfaced a class of self-deadlocks in dmsg-discovery code paths. When a visor&amp;rsquo;s dmsg disc client runs over dmsg (instead of HTTP), and that client tries to fetch its own entry — or fetch an entry it needs to complete its own connect — the recursive call pattern can deadlock on the dmsg session lock.&lt;/p&gt;
&lt;p&gt;Four PRs land on the same day to plug them all:&lt;/p&gt;</description><enclosure url="https://skycoin.github.io/blog/img/skywire-the-next-internet.png" length="194882" type="image/png"/></item></channel></rss>