-
released this
2026-05-24 13:12:16 -04:00 | 47 commits to main since this releaseOpenPXE v0.4.0
Quality-of-life release on top of v0.3.2: upload reliability + diagnostics,
a per-host install log, and a true jet-black dark theme.New features
- Host log under the Hosts tab — every time a PXE client actually starts
imaging (i.e./boot/<entry>.ipxeis served past any password gate, or a
per-MAC host binding fires) OpenPXE records(timestamp, MAC, IP, image)
to a bounded ring (latest 500) and appends it toboot_log.jsonlunder
the work dir. The newHost logcard shows it newest-first. Reserved
console shortcuts (_local,_queue, …) are deliberately skipped so the
log stays focused on "what got installed where." - GET
/api/boot-log— JSON endpoint backing the new tab. Empty until
the first client boots. - iPXE MAC plumbing — per-entry chain URLs and password-prompt
submissions now carry?mac=${mac}so the boot log can attribute events
to a host without depending on DHCP correlation.
Reliability
- Upload truncation handled correctly. The multipart loop used
while let Ok(Some(_)) = field.chunk().await, which silently treated
mid-stream errors (reverse-proxy buffer caps like Cloudflare's 100 MB
free-tier limit, Cloudflare 524s, half-closed TCP, etc.) as clean EOF —
the server would happily finalise a partial ISO. v0.4.0 distinguishes
Ok(None)fromErr(_)and returns400 Bad Requestwith the
underlying cause and a "try the LAN IP directly" hint when the body is
truncated. - Per-stage upload tracing.
openpxe::http::uploadnow logs at
info/warn/errorfor every transition (begin → MB watermarks at
64/128/256/… → body complete → introspect → final). A stuck or rejected
upload is now debuggable from the Terminal tab. - Client-side upload telemetry. The browser drop-zone now shows
bytes/total, percent, throughput, and ETA while uploading. Common
failures (413, 502, 504, network drop, timeout) map to actionable hints.
UI
- Jet-black dark theme. Replaced the blue-tinted ramp (
#0b1018→
#1a2334) with a true-black palette (#000000→#0a0a0a→#141414
→#1c1c1c), modelled on NetBox Labs' product chrome. The teal accent
is preserved for brand continuity. Terminal toolbar/input recoloured to
match. - Service status moved to the sidebar. The top-right "● ready" chip
is gone; readiness is now part of the sidebar footer block alongside the
advertised PXE URL ("Service status: Ready / Advertised to clients /
http://…"). The advertised address was already the PXE boot IP
(auto-detected NIC) rather than the WebUI URL, but operators wanted them
grouped together. - Queue tab — card header "Forge" → "Status".
- Hosts tab — dropped the "Inspired by Tinkerbell smee" attribution
blurb. The MAC-binding mechanic is still the same; the marketing footnote
was just clutter.
Container image
gitea.milesward.dev/mward4/openpxe:0.4.0gitea.milesward.dev/mward4/openpxe:latest
linux/amd64; ~97 MB; Debian 12-slim runtime + binary + iPXE binaries
- wimboot. Non-root UID 10001 with
setcap NET_BIND_SERVICE.
Quality
- 89 tests passing (was 85 in v0.3.2). Includes 4 new integration
tests for the boot log (records correctly + skips reserved targets +
empty endpoint behaviour) and 5 new unit tests for the in-memory ring- on-disk JSONL.
cargo clippy --workspace --all-targetsclean.
Known caveats
- Uploading >100 MB ISOs through a Cloudflare reverse proxy will still
reject (Cloudflare's body cap, not OpenPXE's). The new UI/server hints
point the operator at the LAN IP for big files.
Downloads
- Host log under the Hosts tab — every time a PXE client actually starts