Three UI nits the operator caught on v0.4.62, plus the queued PXE-theme research note for the next release. - SSO header grid is now a 4-column form-row matching the Administrator account card column-for-column (display name / logo URL / metadata source / metadata URL). Switching to XML mode collapses column 4 and drops the multi-line textarea on its own full-width row below. - Native form chrome (checkboxes, scroll bars) follows the active OpenPXE theme via CSS `color-scheme`; the inline meta tag was forcing dark form controls in light mode, which is why the "Enable single sign-on" checkbox rendered as an opaque black square against the light panel. - Checkbox itself is now custom-styled (16x16 rounded square, accent fill + tick on :checked) so the chrome reads identically across both palettes and browsers, not just on whichever WebKit happens to honor `accent-color`. - <select> dropdowns get a hand-drawn chevron via background-image SVG; with `-webkit-appearance: none` the native arrow had disappeared, making "Metadata source" look squished next to the inputs beside it. - Update credentials + Save SSO settings buttons get explicit top margins so they sit clearly under their input rows instead of butting against the field beneath. - `docs/queued/ipxe-pxe-menu-theme-research.md` captures findings on how iVentoy paints its boot menu (iPXE `console --picture` with baked-in per-resolution PNGs, no EDID auto-detect) and the recommended Rust architecture for the follow-up release. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
5.4 KiB
PXE menu theme — research for next-release follow-up
Status: queued. v0.4.63 keeps the ASCII-banner fallback + console --picture
compositor wired; this note captures the design for the menu-theming work
that lands once iPXE rebuilt with IMAGE_PNG is published.
How iVentoy actually does it
iVentoy is closed-source for its menu, but the supporting bits are
public at https://github.com/ventoy/PXE — a vanilla iPXE snapshot
(iPXE/ipxe-bd13697) used to produce the loader binaries iVentoy
serves over TFTP (pxeboot.efi, iventoy_loader_16000,
iventoy_loader_16000_uefi).
The graphical menu itself is rendered by iPXE's framebuffer console
with a baked-in PNG background via console --picture — same
primitive OpenPXE already uses in crates/http-api/src/ipxe_script.rs.
Evidence:
- The iPXE build in
ventoy/PXEis configured withCONSOLE_FRAMEBUFFERIMAGE_PNG+CONSOLE_CMD(the three flagsconsole --pictureneeds).
- iVentoy issue #11 confirms "iventoy using default 1024x768"; users report 800x600 / 1024x768 / 1280x720 / 1280x1024 / 1920x1080 as selectable resolutions from the iVentoy web UI Configuration tab, not via EDID auto-detect. iPXE has no EDID parsing; the daemon writes a resolution-tagged script per boot and serves the matching PNG.
- iVentoy docs explicitly state both Free and Pro editions do not support modifying the boot background/title — it's baked into the shipped PNG assets.
- Chrome is iPXE's native
menu/item/choosewidgets (single highlight bar, no borders) painted on top of the PNG, with margins set viaconsole --left/--right/--top/--bottomto keep the text off the logo. Not GRUB, not syslinux — UEFI iVentoy uses iPXE'ssnponly.efi/pxeboot.efi, and--picturedoes work under UEFI GOP despite older folklore.
Do not conflate this with Ventoy-USB, which is a separate codebase and
uses GRUB2 themes (theme.txt, background_ventoy.png, select_c.png).
Rust ingredients to replicate / surpass
Most of these already exist in the workspace.
- Compositor (extend, don't replace) — extend
crates/iso-store/src/pxe_logo.rsto emit per-resolution PNGs (1024x768, 1280x1024, 1920x1080 as the v1 set).image+imageproccrates handle scaling;ab_glyph/fontduefor raster text (subtitle, hostname, version). One source SVG/logo, three to five rendered PNGs cached on disk. - Script generator —
ipxe_script.rsalready emitsconsole --picture … || console. Add a?res=query param (or per-MAC client hint persisted inhosts.json) and serve the matching PNG plus matchingconsole --x --yline. Keep the text-console fallback already in place. - Resolution selection — iPXE exposes
${vesa-x}/${vesa-y}on BIOS; UEFI side we can probe firmware vars at chain-time. The simpler v1 is a "low-res / hi-res" toggle in Settings plus a per-host override — mirrors iVentoy's UX, no kernel helper needed. True EDID parsing is overkill for the first cut. - Chrome upgrades over iVentoy — iPXE menus are limited (single
highlight, no borders). To look distinctly cooler without leaving
iPXE: paint border / title / footer into the PNG, leave a window
in the middle, then
console --left/--right/--top/--bottomto inset the iPXE menu exactly into that window. ASCII box-drawing inside the menu remains fragile (iPXE mangles non-ASCII on some builds — already noted inipxe_script.rs).
Recommended architecture for the next OpenPXE release
- Build a
pxe_thememodule besidepxe_logo.rs: takes operator logo- theme tokens (accent colour, title, footer) and renders a layered
PNG (background gradient → framing chrome → logo → title bar → footer
with
${hostname}/${version}/${ip}) at the three target resolutions. Cache by hash of inputs.
- theme tokens (accent colour, title, footer) and renders a layered
PNG (background gradient → framing chrome → logo → title bar → footer
with
- Serve at
/branding/pxe-menu-{w}x{h}.png. Default 1024x768; expose a Settings dropdown. - In
ipxe_script.rs, emitconsole --picture …/pxe-menu-1024x768.png --left 80 --right 80 --top 180 --bottom 60 || console, then the existingmenu/item/chooseblock — text now lands inside the framed window. - Compile iPXE with
CONSOLE_FRAMEBUFFER,IMAGE_PNG,CONSOLE_CMD,CONSOLE_VESAFB(BIOS) andCONSOLE_EFIFB(UEFI). The v0.4.61 image attempted this in-Docker via QEMU emulation and hitcc1segfaults. The follow-up will use a Gitea Actions runner pinned to nativelinux/amd64(an Unraid host already exists for this). - Stretch goal: a second "theme pack" that ships a layered PNG with subtle scanlines / grid — iPXE can't animate, but a well-designed static composite beats iVentoy's plain centered logo handily.
Source URLs
- https://github.com/ventoy/PXE
- https://github.com/ventoy/PXE/tree/master/iPXE
- https://github.com/ventoy/PXE/issues/11 — 1024x768 default
- https://github.com/ventoy/PXE/issues/59 — iVentoy iPXE EFI loader
- https://ipxe.org/cmd/console —
--pictureand compile flags - https://github.com/ipxe/ipxe/discussions/945 — background image how-to
- https://github.com/ipxe/ipxe/discussions/802 —
CONSOLE_FRAMEBUFFERrequirement - https://github.com/ipxe/ipxe/discussions/1006 — picture resolution behaviour
- https://www.iventoy.com/en/doc_edition.html — background / title not user-customisable
- https://kingtam.win/archives/iventoy.html — third-party iPXE-based iVentoy alternative