Motivation
A Gokrazy appliance packs Go programs into an immutable image that boots straight into them — no distro userland. skywire is Go, so a dedicated skywire-visor appliance is feasible, and its killer feature is built-in A/B atomic auto-update.
That directly targets the recurring fleet-drift problem (stale versions → dropped rewards + dmsg-disc CPU load), which today fails in many ways on real boards: opt-in apt/unattended-upgrades, Armbian masking the apt-daily timers, tiny zram /var/log filling up, half-upgraded Python breaking unattended-upgrade, missing apt sources. An immutable self-updating image sidesteps all of that.
Scope — visor-core only
Fits (pure Go): dmsg, routing, hypervisor, dmsgpty, internal-mode apps (skysocks, skychat).
Does not fit (external binaries — Gokrazy has no userland/shell):
Also note: the /etc/skywire.conf + autoconfig + systemd config/lifecycle model does not apply on gokrazy (no systemd; config = program flags + gokrazy's own mechanism). This tier coexists with the deb/AUR normal-distro install — it does not replace it.
KEY REQUIREMENT — update over dmsg, not clearnet HTTP
Gokrazy's updater fetches images from an HTTP update source. We should make the appliance self-update over skywire/dmsg instead of regular HTTP, if at all possible:
- Point the gokrazy update source at a dmsg endpoint (an update-visor serving the image over dmsg-http), reusing skywire's
FetchOverDmsg / dmsghttp — so the appliance updates over its own mesh: no clearnet dependency, censorship-resistant, works wherever dmsg reaches.
- Likely shape: a small local dmsg→HTTP shim the gokrazy updater points at (
http://localhost:<port> → dmsg fetch), or a custom updater that speaks dmsg directly. Investigate whether gokrazy's update client is pluggable enough, or whether we wrap/replace it.
- Fallback to HTTP only if a pure-dmsg path proves impractical.
Deliverable
A prototype gokr-packer build of a skywire visor image (visor-core), booting + registering, with the auto-update path demonstrated over dmsg. Measure image size, boot, and the update round-trip.
Relates to: the fleet-not-updating investigation, #3536 (pure-Go DHCP/DNS enabling a gokrazy vpn-router), the 0magnet/router7 host-OS port.
Motivation
A Gokrazy appliance packs Go programs into an immutable image that boots straight into them — no distro userland. skywire is Go, so a dedicated skywire-visor appliance is feasible, and its killer feature is built-in A/B atomic auto-update.
That directly targets the recurring fleet-drift problem (stale versions → dropped rewards + dmsg-disc CPU load), which today fails in many ways on real boards: opt-in apt/unattended-upgrades, Armbian masking the
apt-dailytimers, tiny zram/var/logfilling up, half-upgraded Python breakingunattended-upgrade, missing apt sources. An immutable self-updating image sidesteps all of that.Scope — visor-core only
Fits (pure Go): dmsg, routing, hypervisor, dmsgpty, internal-mode apps (skysocks, skychat).
Does not fit (external binaries — Gokrazy has no userland/shell):
Also note: the
/etc/skywire.conf+autoconfig+ systemd config/lifecycle model does not apply on gokrazy (no systemd; config = program flags + gokrazy's own mechanism). This tier coexists with the deb/AUR normal-distro install — it does not replace it.KEY REQUIREMENT — update over dmsg, not clearnet HTTP
Gokrazy's updater fetches images from an HTTP update source. We should make the appliance self-update over skywire/dmsg instead of regular HTTP, if at all possible:
FetchOverDmsg/dmsghttp— so the appliance updates over its own mesh: no clearnet dependency, censorship-resistant, works wherever dmsg reaches.http://localhost:<port>→ dmsg fetch), or a custom updater that speaks dmsg directly. Investigate whether gokrazy's update client is pluggable enough, or whether we wrap/replace it.Deliverable
A prototype
gokr-packerbuild of a skywire visor image (visor-core), booting + registering, with the auto-update path demonstrated over dmsg. Measure image size, boot, and the update round-trip.Relates to: the fleet-not-updating investigation, #3536 (pure-Go DHCP/DNS enabling a gokrazy vpn-router), the 0magnet/router7 host-OS port.