Install on a Hetzner Cloud VPS
Cloud providers don't let you upload a custom ISO, but they all offer a plain Debian 13 image. xcon OS turns that into an advantage: one script converts a fresh Debian 13 VPS into real xcon OS — with no provider APIs, just root and a disk.
These steps are written for Hetzner Cloud, the provider we've verified end to end. Other providers work on the same principle and are being validated one at a time.
This erases the server and installs xcon OS on it. Run it only on a fresh VPS you own and have nothing to keep on.
Steps
-
In the Hetzner Cloud Console, create a new server:
- Image: Debian 13
- Any type/size (a small one is fine to start)
- Add your SSH key
-
SSH in as root:
ssh root@<your-server-ip> -
Download, verify, and run the installer. The bootstrap script is Ed25519-signed with the same offline key as the system images, so you can verify it before running — the recommended path:
cd /rootcurl -fsSLO https://update.xconos.com/testing/bootstrap-takeover.shcurl -fsSLO https://update.xconos.com/testing/bootstrap-takeover.sh.sigcurl -fsSL https://update.xconos.com/pubkey.pem -o xcon.pubopenssl pkeyutl -verify -pubin -inkey xcon.pub -rawin \-in bootstrap-takeover.sh \-sigfile <(base64 -d bootstrap-takeover.sh.sig) \&& sudo bash bootstrap-takeover.shThe quick (less strict) path is
curl … | sudo bash, but verifying the script first closes the trust chain end to end. -
The script shows the target disk, asks for the xcon password (twice), and requires you to type YES before it does anything.
-
It verifies the signed system image, then hands off. The server reimages itself and comes back as xcon OS at the same IP a few minutes later (Hetzner hands the address back over DHCP).
Open https://<your-server-ip>:8443 in a browser and sign in as
xcon with the password you set.
How it works
The script downloads the signed system image, appends it to a boot
image, and kexecs straight into the xcon installer. The old system's
kernel is discarded, the disk is freed, and the installer writes xcon
OS onto it — installing GRUB for both BIOS and UEFI so it boots on
Hetzner's BIOS setup and UEFI hardware alike.
Because it only ever touches the local disk — never a provider API — the same script is the basis for every other provider we add.
Unattended
For automation (injecting this via cloud-init user-data), skip the prompts:
XCON_PASSWORD='your-password' XCON_YES=1 \
bash bootstrap-takeover.sh