-
v0.6.1 — latest iPXE + auto NIC driver fallback Pre-Release
released this
2026-06-09 11:18:07 -04:00 | 11 commits to main since this releasev0.6.1 — latest iPXE + automatic NIC driver fallback
Mirrors the worthwhile device-support wins from iVentoy 1.0.24→1.0.35 onto OpenPXE's proxy-DHCP + iPXE-chainload architecture. (iVentoy's other changes don't apply: arm64-server / distro-display fixes live in its injected Linux, which we don't have; iSCSI is niche; Matrix Boot is closed-source.)
iPXE refreshed (mirrors 1.0.35 "Update iPXE")
- From-source build pinned to ipxe/ipxe master @ 2026-06-09 (
95ffbf47) — newer NIC drivers + EFI fixes. The pin also busts the cached build layer so the release genuinely recompiles iPXE.
Automatic NIC driver fallback (mirrors 1.0.34 "driver / boot-file mode" — zero toggle)
- The proxy-DHCP serves the firmware-net build (
snponly/undionly) by default — unchanged, so hardware that boots today never regresses. - If a client's firmware NIC stack fails (it re-PXE-boots without ever completing the tell-tale iPXE-user-class handoff), that MAC is automatically escalated to iPXE's own all-drivers build (
ipxe.efi/ipxe.pxe/ipxe-i386.efi/ipxe-arm64.efi) so iPXE's native drivers can bind the card. The choice is sticky per-MAC after a confirmed handoff. No settings, no UI — it just works. - All-drivers binaries now embedded for every supported arch.
Core principles intact: DHCP-proxy-only, container-first, Rust-focused (the logic is all Rust; only the iPXE fetch/build stays shell), Windows hard-rules untouched.
Validation
clippy clean; full workspace test suite green (core 99 incl. new DriverMode tests, dhcp-proxy +4 escalation tests, http-api 31+68, iso-store 61, tftp 6, bin 2); the Docker build recompiled iPXE from latest master successfully (the build is the upstream-compatibility check).
Image:
gitea.milesward.dev/mward4/openpxe:0.6.1(also:latest) — linux/amd64, digestsha256:f9683754495b7e756a3e5e4a5b08344cf94b6e31a4124a891ad49605d293bdf6.Downloads
- From-source build pinned to ipxe/ipxe master @ 2026-06-09 (
-
v0.6.0 — bootable-ISO polish + ESXi Pre-Release
released this
2026-06-05 13:02:38 -04:00 | 13 commits to main since this releasev0.6.0 — closes the 0.5.x chapter
Bootable-ISO handling is now honest end-to-end, and generic El Torito ISOs (ESXi/VMvisor installers, BSDs, firmware tools) boot via iPXE sanboot with no special-casing.
Boot detection / menu
- An unclassified ISO gets a boot entry only when it is actually bootable — it carries an El Torito catalog, or it is a remote-share ISO we could not introspect (assumed bootable). A locally-introspected ISO with no boot catalog (a data/appliance image like a VMware vCenter Server Appliance bundle) gets no entry and stays out of the iPXE menu instead of offering a pick that always fails.
- ESXi installer ISOs (
VMware-VMvisor-Installer-*.iso) are El Torito images → they surface in the installer menu and sanboot the raw ISO, backed by HTTP range reads (size is a non-issue). No new code path or operator toggle. - Dropped the stale "(SAN boot — may fail for >1GiB ISOs)" disclaimer; sanboot is the primary path for Windows and any El Torito image.
- Dashboard panel renamed "Images that won't boot with current settings" → "Non-bootable images" (nothing here is settings-dependent).
Carried from v0.5.9
- El Torito boot-catalog detection + retroactive re-introspection of stale local ISOs on startup (fixes Windows 11 / IoT ISOs uploaded by older builds without re-upload).
- Static SSO login button (served from the public
/api/me; metadata/entity-ID stay gated).
Validation
Full v0.5.0→v0.5.9 compatibility sweep: clippy clean; entire workspace test suite green (core 96, http-api 31+68, iso-store 61, dhcp 1, tftp 6, bin 2);
app.jssyntax-checked.Image:
gitea.milesward.dev/mward4/openpxe:0.6.0(also:latest) — linux/amd64, digestsha256:49dfd27cf009adcc53f50328e179ad8f7ff677fd8d1a549f7ac56c11159c3a06.Downloads
-
v0.5.9 Pre-Release
released this
2026-06-05 11:47:41 -04:00 | 14 commits to main since this releasev0.5.9 — boot detection + SSO login fixes
Storage / boot
- El Torito boot-catalog detection. ISOs are now classified by whether they actually carry a boot catalog, not by file size. Bootable ISOs we cannot otherwise identify (BSD, ESXi, firmware tools, custom spins) boot via iPXE sanboot; genuine data/appliance images (e.g. VMware vCenter bundles) are flagged honestly instead of mislabeled.
- Retroactive re-introspection on upgrade. Local ISOs uploaded by an older build are re-probed on startup, so a Windows 11 / Windows 11 IoT ISO that previously showed "won't boot" is reclassified and boots — no delete-and-re-upload.
- Dashboard image counts now bucket Windows / Linux / other accurately.
Single sign-on
- The "Sign in with …" button is now static — it renders whenever SSO is usable, signed in or out. Previously it keyed off an auth-gated endpoint and vanished instance-wide after the first login. A minimal, non-sensitive SSO descriptor now ships on the public
/api/me; metadata/entity-ID stay gated.
Image:
gitea.milesward.dev/mward4/openpxe:0.5.9(also:latest) — linux/amd64, digestsha256:6668a132c3c7b3316e888847b02ea6bd03b48f3064129ffde52d40ac3ce8c587.Downloads
-
v0.5.8 — Windows ISOs just work + Storage UX Pre-Release
released this
2026-06-04 21:24:23 -04:00 | 17 commits to main since this releaseOpenPXE v0.5.8 — Windows ISOs just work, plus Storage UX
Windows boot (no setup, no SMB)
Windows ISOs now boot out of the box via iPXE HTTP sanboot — iPXE
exposes the raw, unmodified ISO as an emulated CD backed by on-demand
HTTP range reads, and Windows Setup boots from it. No SMB server, no
extraction, no operator toggle, works in any environment. Nothing is
injected into Windows (nohttpdisk.sys, no test certificates, no
trust-store changes).- Broadened Windows detection for modern UDF-only Windows 10/11 ISOs
(UTF-16 filename markers + filename hint) — their cryptic volume labels
previously left them unrecognized. - The Windows Installers submenu now appears automatically whenever a
Windows ISO is present. - The dashboard no longer flags Windows ISOs as "won't boot"; the generic
large-ISO warning was reworded so genuinely non-bootable images (e.g.
VMware VCSA appliance bundles) read clearly.
Storage UX
- Available images are now listed alphabetically.
- Uploads gain a Cancel button (aborts and discards the partial file).
- A leave-page warning appears while an upload is in flight.
docker pull gitea.milesward.dev/mward4/openpxe:0.5.8 # or :latestStatic
x86_64-unknown-linux-muslbinary; 263 tests pass, clippy clean.Downloads
- Broadened Windows detection for modern UDF-only Windows 10/11 ISOs
-
v0.5.7 — legacy-BIOS boot-menu fix Pre-Release
released this
2026-06-03 19:28:10 -04:00 | 18 commits to main since this releaseOpenPXE v0.5.7 — legacy-BIOS boot-menu fix
The graphical PNG boot-menu background broke menu rendering on legacy
BIOS clients. The menu issuedconsole --picture … || console, but on
a no-PNG BIOS build (undionly.kpxe) the--pictureattempt misbehaves
before the|| consolefallback can recover — it tries to set a
framebuffer mode the BIOS console can't honour.Fix: the background is now gated on
iseq ${platform} efi, so BIOS
clients never issue the command and drop straight to the plain text
menu, while UEFI clients still get the graphical background. Automatic
and per-client — a mixed BIOS+UEFI fleet each gets the right treatment,
no toggle required.docker pull gitea.milesward.dev/mward4/openpxe:0.5.7 # or :latestDownloads
-
v0.5.6 — boot-URL port fix Pre-Release
released this
2026-06-03 18:49:59 -04:00 | 19 commits to main since this releaseOpenPXE v0.5.6 — boot-URL port hot fix
Bug fix for non-port-80 deployments. The base URL advertised to PXE
clients was built ashttp://<ip>with no port, ignoring
OPENPXE_HTTP_PORT. Since every client-facing URL derives from it — the
DHCP-proxy iPXE filename, UEFI HTTP boot, and the boot menu's
kernel/initrd/ISO links — any deployment on a non-80 port told clients
to fetch:80(the wrong service). On Unraid that's the webGUI, which
301-redirects tohttps; iPXE (no TLS) then aborts the chain with
Operation not supported. This broke the exact setup the Unraid
template recommends (HTTP port 4200, chosen to avoid the webGUI).Fix: the advertised base URL now includes the port unless it's 80 —
http://10.0.0.5stays clean,http://10.0.0.5:4200is reachable.
Regression-tested.docker pull gitea.milesward.dev/mward4/openpxe:0.5.6 # or :latestIf you run OpenPXE on a non-80 HTTP port, re-pull and PXE boot works with
no other changes.Downloads
-
v0.5.5 — SFTP-over-SSH remote shares Pre-Release
released this
2026-06-03 11:49:37 -04:00 | 21 commits to main since this releaseOpenPXE v0.5.5 — SFTP-over-SSH remote shares
Adds SFTP as a third remote ISO-library protocol alongside SMB and NFS.
docker pull gitea.milesward.dev/mward4/openpxe:0.5.5 # or :latestWhat's new
- SFTP remote shares — point OpenPXE at an SSH/SFTP server and boot ISOs straight off it. Pure-Rust (
russh+russh-sftp, ring crypto backend): no kernel mount, no subprocess, no OpenSSL, no new C dependencies. - HTTP Range support — like NFS (and unlike SMB), SFTP-sourced ISOs support byte-range reads (the SFTP file handle seeks), so kernel/initrd extraction and httpdisk range requests work.
- Auth — password or SSH private key (optional passphrase). The server's SSH host key is pinned trust-on-first-use; a changed key is refused with a clear warning.
- UI — "SFTP (SSH)" added to the Remote shares protocol dropdown with a password/key toggle and host-key fingerprint display. Plus
sftpterminal commands (list/add/remove/scan) and/api/sftp-shares.
Why not SCP
SCP is sequential-only (no random access → no HTTP Range, unlike SFTP/NFS), and the mature Rust SCP crates wrap libssh2 (C + OpenSSL), which would break the static-musl, OpenSSL-free build.
Notes
russhis pinned to=0.55.0— the newest release that coexists with the SAML crypto stack (bergshamra-cryptopins RustCrypto release-candidate crates that conflict with russh 0.61's stable ones). Functionally identical; ring-backed, OpenSSL-free.- Static
x86_64-unknown-linux-muslbinary; 252 tests pass, clippy clean.
Downloads
- SFTP remote shares — point OpenPXE at an SSH/SFTP server and boot ISOs straight off it. Pure-Rust (
-
v0.5.4 Stable
released this
2026-06-03 03:33:05 -04:00 | 22 commits to main since this releaseOpenPXE v0.5.4
Internal code-cleanup pass — the final tidy-up before real-world hardware
testing. No behaviour changes; 248 tests green, clippy clean, same static
x86_64-unknown-linux-muslbinary.docker pull gitea.milesward.dev/mward4/openpxe:0.5.4 # or :latestWhat changed (engineering only)
- Uniform HTTP errors. New
AppErrormapsopenpxe_core::Errorto one
consistent status/body; the clearly-safe handlers now?through it.
Handlers with intentional domain statuses (duplicate-share → 409, etc.)
were left explicit on purpose, so no API status changed. - Layered config via
figment.Config::loadmerges defaults → TOML →
OPENPXE_*env. The historical flat var names (OPENPXE_HTTP_PORT,
OPENPXE_ISO_DIR, …) keep working unchanged, plus a nested
OPENPXE_SECTION__FIELDform, and every field is now covered (the old
hand-rolled mapping silently skippedunattended_dirand the bind
addresses). Backed by hermeticfigment::Jailtests. - Typed
/api/status. The 25-key hand-built JSON blob is now a typed
StatusResponsestruct (compile-checked contract with the WebUI), guarded
by a test asserting every key the UI reads. - Dependency hygiene.
thiserror1 → 2; dropped unusedmime/
mime_guess/once_cell. - De-duplication.
pct_encode/xml_escapeconsolidated into
openpxe_core::encoding(were copy-pasted across the HTTP + SAML layers). - Concurrency tidy. The chunked-upload registry is now a
parking_lot::RwLock(sync, never held across.await); the per-session
lock stays atokio::Mutex. - Test coverage. Added an
instasnapshot of the rendered iPXE menu and
wiremockcoverage of the SAML metadata-URL fetch.
Notes
Duration::from_hours/from_minswere kept (they're stable on the pinned
Rust 1.95 toolchain and clippy prefers the readable form).- The
/api/docstyped-struct conversion was deliberately deferred (lowest
value, highest churn, no functional benefit).
Downloads
- Uniform HTTP errors. New
-
v0.5.3 Pre-Release
released this
2026-06-03 02:50:51 -04:00 | 23 commits to main since this releaseOpenPXE v0.5.3
UI polish on top of v0.5.2.
docker pull gitea.milesward.dev/mward4/openpxe:0.5.3 # or :latestChanges
- Branding previews are now theme-accurate. In Settings → Branding, each
logo swatch (Light / Dark / Client) previews on a background matching where
the mark actually lands — light page, dark page, and the dark PXE boot
screen — independent of the theme you're currently viewing Settings in. The
Dark-mode slot no longer renders on a light card. - Unified button spacing site-wide. Every primary card action button
(Save, Bind, Add, Launch, …) now shares one consistent gap above it via a
single rule, and the ad-hoc per-button inline margins were removed. Fixes
the Hosts → "Bind MAC to target" button butting directly against the form.
Not changed (by design)
- The PXE boot-menu selection highlight is unchanged. A rotating RGB
highlight isn't achievable in iPXE's menu (it draws once and blocks for a
keypress — no animation loop); doing it for real needs a custom menu
renderer, tracked as a future effort.
Under the hood
- Same single static
x86_64-unknown-linux-muslbinary, built via the native
cargo-zigbuildcross-compile pipeline introduced in v0.5.2 (no QEMU). - Workspace: tests green, clippy clean.
Downloads
- Branding previews are now theme-accurate. In Settings → Branding, each
-
v0.5.2 Pre-Release
released this
2026-05-31 16:11:59 -04:00 | 25 commits to main since this releaseOpenPXE v0.5.2
Builds on the v0.5.1 SAML SSO release with a FleetDM-style login, themable
branding, and a full unattended-install pipeline (Kickstart / Preseed /
Autoinstall / Windows answer files) wired through host pins and the queue.Pull into Unraid (host networking):
docker pull gitea.milesward.dev/mward4/openpxe:0.5.2 # or :latestAuthentication / login page
- FleetDM-style separation. The local username/password form is now a
self-contained block; when SSO is enabled, a distinct “Sign in with …”
button sits below an or divider (optionally with the IdP logo) instead of
the credential fields doubling as the SSO trigger. - The Settings → SSO copy now reflects that SAML is live (no more
“runtime pending” language).
Branding — three logo slots
Branding splits into three independent slots, all on one row in
Settings → Branding:- Light mode and Dark mode logos drive the top-left mark and the
sign-in page — whichever theme is active picks its variant (with
cross-theme fallback). Toggling the theme swaps the logo live. - Client logo is the raster painted above the PXE boot menu
(/branding/pxe-logo), seen by booting machines. - The favicon is now pinned to the bundled OpenPXE mark on its own
endpoint (/assets/favicon.svg) — it never follows custom branding, so the
browser-tab icon stays recognisably OpenPXE. - A pre-v0.5.2 single uploaded logo is migrated automatically into the
dark + client slots on first launch.
Unattended installs (Storage → Advanced)
- New Unattended file upload drop-zone: “Drop a Kickstart, Preseed,
Autoinstall, or Answer File here.” Accepts.ks,.cfg,.seed,
.yaml,.yml,.xml, anduser-data. Files are classified on upload
and stored in their own directory (/var/lib/openpxe/unattended) — never
the ISO listing or the PXE menu. - Use
{{HOSTNAME}},{{IP}},{{MAC}}placeholders in your answer file;
they are substituted per-host at boot.
Host pins + Queue profiles
- Hosts pin form gains Auto hostname (optional), Auto IP address
(optional), and an Unattended file dropdown next to Label; the table
shows an Auto-deploy summary per binding. - Queue positions gain a Profile button that prompts for the same
three fields per queued device. - On boot, a bound/queued MAC with an unattended file selected has the right
kernel argument injected automatically:- Kickstart →
inst.ks=… - Preseed →
auto=true priority=critical url=… - Autoinstall →
autoinstall ds=nocloud-net;s=…/(cloud-init NoCloud seed
dir, servinguser-data+meta-data) - The auto hostname/IP are templated into the served answer file. OpenPXE
remains a DHCP proxy — it does not assign leases; the values are
applied by the installer as static-network directives in the answer file.
- Kickstart →
Storage — Remote shares
- Default protocol is now NFS (no credential row, cleaner form).
- Updated copy: “Remote .iso libraries are read on demand — no local cache to
preserve disk usage. Support for NFS 3.0 and SMB. Ensure that the hosts IP
address is provisioned.”
Under the hood
- Still a single static
x86_64-unknown-linux-muslbinary — pure Rust, no
OpenSSL/C deps added. - Workspace: 235 tests green, clippy clean.
- New API surface:
POST/GET /api/unattended,DELETE /api/unattended/:id,
publicGET /unattended/:id(templated serve) + NoCloud seed dir;
POST/DELETE /api/branding/logo/:slot;PUT /api/queue/:id/profile;
host pin + queue entry carry an optional deployment profile.
Downloads
- FleetDM-style separation. The local username/password form is now a