Files
OpenPXE/docs/queued/ipxe-pxe-menu-theme-research.md
T
Miles WardandClaude Opus 4.7 9f694f7c79 v0.4.63: SSO row alignment, themed checkbox, dropdown affordance
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]>
2026-05-26 02:32:38 -04:00

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/PXE is configured with CONSOLE_FRAMEBUFFER
    • IMAGE_PNG + CONSOLE_CMD (the three flags console --picture needs).
  • 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 / choose widgets (single highlight bar, no borders) painted on top of the PNG, with margins set via console --left/--right/--top/--bottom to keep the text off the logo. Not GRUB, not syslinux — UEFI iVentoy uses iPXE's snponly.efi / pxeboot.efi, and --picture does 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.

  1. Compositor (extend, don't replace) — extend crates/iso-store/src/pxe_logo.rs to emit per-resolution PNGs (1024x768, 1280x1024, 1920x1080 as the v1 set). image + imageproc crates handle scaling; ab_glyph / fontdue for raster text (subtitle, hostname, version). One source SVG/logo, three to five rendered PNGs cached on disk.
  2. Script generatoripxe_script.rs already emits console --picture … || console. Add a ?res= query param (or per-MAC client hint persisted in hosts.json) and serve the matching PNG plus matching console --x --y line. Keep the text-console fallback already in place.
  3. 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.
  4. 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/--bottom to 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 in ipxe_script.rs).
  • Build a pxe_theme module beside pxe_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.
  • Serve at /branding/pxe-menu-{w}x{h}.png. Default 1024x768; expose a Settings dropdown.
  • In ipxe_script.rs, emit console --picture …/pxe-menu-1024x768.png --left 80 --right 80 --top 180 --bottom 60 || console, then the existing menu / item / choose block — text now lands inside the framed window.
  • Compile iPXE with CONSOLE_FRAMEBUFFER, IMAGE_PNG, CONSOLE_CMD, CONSOLE_VESAFB (BIOS) and CONSOLE_EFIFB (UEFI). The v0.4.61 image attempted this in-Docker via QEMU emulation and hit cc1 segfaults. The follow-up will use a Gitea Actions runner pinned to native linux/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