// reference
Configuration
Everything boot.conf understands.
Config lives at \EFI\visor\boot.conf on the ESP. A fully-commented reference ships as boot.conf.example. Two rules apply everywhere:
- Paths are relative to the root of the filesystem containing the file and use backslashes. Assets normally live on the ESP, for example
\EFI\visor\icons\arch.png. On a separate/bootfilesystem use\vmlinuz-...; use\boot\vmlinuz-...only when/bootis a directory inside the root filesystem. - Colors are
#RRGGBB.
No boot.conf at all is a supported configuration — Visor auto-detects entries (see Features). Validate a config from Linux with visor config validate.
Kernels and initrds on non-FAT partitions (btrfs, ext4, etc.) need an efifs driver in \EFI\visor\drivers\. A UKI on the ESP under \EFI\Linux\*.efi always works without a driver.
Global settings
| Key | Values / meaning |
|---|---|
timeout | N = auto-boot the default after N seconds · -1 = wait forever · 0 = boot default instantly (no menu). |
default | Index of the default entry (0-based, in the order entries appear in the file). |
quiet | 1 = suppress all boot-progress text (black screen during hand-off) · 0 = show Booting …(default). |
text_menu / text_mode | 1 = plain text-console menu (also the automatic fallback if no Graphics Output Protocol is found) · 0 = graphical menu (default). |
resolution | native (default) = keep the firmware's current mode · max = highest mode the firmware offers · WxH e.g. 1920x1080 (switches to that exact mode if available). |
cmdline / options | Global default kernel command line. Applied to entries that don't set their own (including auto-detected raw kernels). Per-entry cmdline always wins. |
title | Menu title text. Absent / empty = Visor · none = no title at all · any other string = shown verbatim. |
font | Text font. Currently only jetbrains is bundled (see bake_font for using another). Empty = default. |
show_names | 1 (default) = show the name label under each icon · 0 = icons only. |
center_info / centre_info | 1 = show details for the selected entry near the bottom of the screen. When show_names=1 this is path-only; when show_names=0 it shows the name above the path · 0 = off. |
entries_per_page | Entries per page (default 3). When more entries exist than fit, chevron arrows appear and paging cross-fades between pages at the speed set by anim_speed. |
autoboot | 1 = skip the menu entirely and boot the entry immediately (the single entry, or the remembered/default one). Hold any key during power-on to force the menu · 0 = always show the menu (default). |
remember_last / remember | 1 = preselect the last-booted entry next time (persisted in NVRAM). Overrides default · 0 = always honour default. |
recovery_entries / recovery | 1 = auto-generate a <name> (recovery) entry per Linux entry, appending systemd.unit=rescue.target nomodeset · 0 = off. |
log / boot_log / file_log | 1 (default) = write diagnostics to \EFI\visor\boot.log · 0 = off. Logging is checked before any log write, so setting log=0 is honored even when the ESP write path is broken. Aliases: boot_log, file_log. Inverse alias: no_log=1. |
snapshots | 1 (default) = load \EFI\visor\snapshots.conf if present, falling back to \EFI\visor\snapshot.conf (singular) if the plural is absent, then auto-detect btrfs snapshots · manifest = only the manifest file, no auto-detection · 0 = off. |
mouse / pointer | 1 (default) = a cursor appears when a pointer device is present; single click boots an entry or triggers a power action · 0 = off. |
mouse_speed / pointer_speed | Relative mouse/touchpad movement multiplier. 1 = slowest, 20 = fastest, 4 = default. Absolute touchscreens are mapped directly and ignore this key. Alias: pointer_speed. |
hotplug | 1 (default) = when the menu is armed, scan all volumes that are already connected (including USB sticks already plugged in), then watch for volumes that appear later and add their entries live (fade in, slide over) · 0 = off. Hotplugged and pre-connected volumes are only scanned when boot.conf has no manual entries (auto-detection mode) — set scan_existing=1 to override that. |
editor | 1 (default) = allow one-shot kernel cmdline editing at the menu with e · 0 = disable. |
box_radius / corner_radius | Corner radius (pixels) of the selection highlight / frost box. 0 = built-in default. Larger = rounder; small values = squarer corners. |
Logo
An image drawn in the header, next to the title or on its own. The bundled Visor logo (\EFI\visor\logo.png) is used by default. PNG or BMP; transparency is respected, and a square image looks best (it is scaled to a square).
| Key | Values / meaning |
|---|---|
logo | Absent / default = the bundled logo · none / off = no logo, title only · <path> = your own PNG/BMP (square recommended). |
logo_mode | title = logo left of the title, vertically centred (default) · only = logo alone, the title text is not drawn · above = logo centred above the title · none = no logo (same as logo=none). |
logo_size | Logo edge length in pixels. 0 / absent = auto-scales with the title: 1.5× the title height beside it, 2× when standalone or stacked. Capped so the header never grows into the entry row. |
logo_gap | Space between logo and title in pixels. Default = half the title height. |
accent_logo | 1 = tint the logo with the wallpaper accent color instead of drawing its own colors (needs accent=1; defaults to whatever accent_text is). Useful for single-color logos like the bundled one. |
Colors
| Key | Values / meaning |
|---|---|
title_color | Title text color (#RRGGBB). |
name_color | Default color for every entry's name. Per-entry color= overrides this. |
highlight_color | Accent color of the selection highlight and underline. |
Blur highlight
Replace the flat selection card with a blurred-glass panel that follows the selection (entries and power actions), with softly feathered edges.
| Key | Values / meaning |
|---|---|
blur | 0 = off (flat card, default) · 1 = frosted glass (blur + light tint) · clear = clear glass (blur only, no tint). The panel blurs the background image; with no background it falls back to a translucent tint. |
blur_title | 1 = add a static blurred panel behind the title · 0 = off. |
blur_color | Tint color for frosted mode (#RRGGBB). Default white. |
Animation
| Key | Values / meaning |
|---|---|
animation | 1 (default) = GUI animations and cross-fades on · 0 = every fade, slide, and cross-fade is instant. |
anim_speed | Selection animation speed, 1 (slow) to 10 (fast). Default 8. Switching between entries and power actions cross-fades; moving within a row/column slides. Ignored when animation=0. |
fade_speed | Full-screen fade speed for menu fade-in and boot/power fade-out, 1 to 10 (fast). Default 10. Ignored when animation=0. |
Font sizes
| Key | Values / meaning |
|---|---|
title_size | Title height in pixels. Default scales with the screen (~ screen height ÷ 12). |
name_size | Entry-name height in pixels. Default 16. |
Icons
All values in pixels. 0 or absent = sensible default.
| Key | Values / meaning |
|---|---|
icon_size | Icon edge length (icons are square). Default 64. A per-entry icon_size= overrides this for individual entries. |
icon_spacing | Horizontal gap between icons. Default 60. |
icon_y | Vertical center of the icon row (pixels from the top). Default = middle of the screen. Icons of different sizes are centred on this line; their labels share one baseline below the tallest icon. |
Selection underline
The accent bar under the selected entry.
| Key | Values / meaning |
|---|---|
underline_color | Color of the bar. Defaults to highlight_color if not set. |
underline_thickness | Height of the bar in pixels. Default 4. |
underline_length | Width of the bar in pixels. Default = icon width + a small margin. |
Power actions
Shutdown, Reboot, and Firmware setup actions, accessible via the S / R / F keys and optionally a corner icon stack.
| Key | Values / meaning |
|---|---|
power_position | Corner the three actions are stacked in: bottomright (default), bottomleft, topright, topleft. |
shutdown_color | Color of the S hotkey letter. Defaults to highlight_color. |
reboot_color | Color of the R hotkey letter. Defaults to highlight_color. |
firmware_color | Color of the F hotkey letter. Defaults to highlight_color. |
power_icons | 1 = show the three actions as PNG icons instead of text labels · 0 = text labels (default). Any action without a loaded icon falls back to text. |
power_icon_size | Icon edge length for power icons in pixels. Default 40. |
shutdown_icon | Path to a PNG for the Shutdown icon. Used when power_icons=1. |
reboot_icon | Path to a PNG for the Reboot icon. |
firmware_icon | Path to a PNG for the Firmware setup icon. |
Background
| Key | Values / meaning |
|---|---|
background | Full-screen background image (PNG, RGB or RGBA). Falls back to backgrounds\default.png. Omit for a solid backdrop. |
Dynamic accent
Derive a Material You palette from the background image and apply it to the UI — the same pipeline the caelestia shell uses for the desktop. The wallpaper is quantized (Wu box-cut, 128 colors), a seed color is picked with Material's Score algorithm, and the full set of Material dynamic-color roles is generated for a dark scheme:
- primary → selection underline + highlight
- secondary → shutdown / reboot power actions
- tertiary → firmware power action
- onSurface → entry names (when
accent_text=1) - onSurfaceVariant → countdown, hints, dim labels
- surface → fallback background tint; onPrimaryContainer frost tint
Needs a background image; with a solid backdrop it does nothing and the configured colors are kept.
| Key | Values / meaning |
|---|---|
accent | 1 = enable palette derivation from the background · 0 = off (default). |
accent_underline | 1 (default) = underline + highlight use the primary role. |
accent_icons | 1 (default) = power icon labels use secondary / tertiary roles. |
accent_text | 1 = title / names / dim text use the onSurface roles · 0 (default). |
accent_os_icons | 1 = flatten the per-OS icons to the primary color too (discards brand colors like Ubuntu orange) · 0 (default). |
accent_variant | Scheme variant: tonal (balanced, default), neutral (nearly grey), content (chroma follows the wallpaper), fidelity (true to a vivid seed), vibrant (stronger), expressive (large hue shift), monochrome (greyscale). |
Any color set explicitly (e.g. underline_color, name_color) is overridden by the accent for whichever roles are enabled above.
Themes
A theme is a .conf file in \EFI\visor\themes\ containing any of the UI keys above (colors, sizes, icons, underline, power, background, title, logo, …). Its values override boot.conf. Boot entries always stay in boot.conf — themes are UI-only.
| Key | Values / meaning |
|---|---|
theme | <name> = load \EFI\visor\themes\<name>.conf · random = pick a random theme each boot · cycle = advance to the next theme each boot (position saved in NVRAM). |
Snapshots
Visor supports booting into btrfs snapshots from two sources, in priority order:
- Manifest (recommended): A Linux-side hook mirrors the snapshot list to the ESP at
\EFI\visor\snapshots.conf. Visor also falls back to\EFI\visor\snapshot.conf(singular) if the plural file is absent — check the boot log to see which name was loaded. Seetools/visor-snapshot-sync; run it from a pacman hook or a systemd path unit watching/.snapshots. Works on any firmware, exact cmdlines from the running system. - Auto-detect (zero-config fallback): When no manifest exists and a btrfs EFI driver is loaded, Visor detects snapshots itself — snapper, Timeshift (btrfs mode), or plain subvolume layouts under
/.snapshots. Needs exactly one Linux entry with aroot=cmdline; shows the newest 12 snapshots, booted with the entry's current kernel.
Manifest entries use a snapshot { } block:
snapshot {
os = Arch Linux # boot entry to attach to (name substring)
id = 42
date = 2026-07-18 14:22
desc = pacman -Syu linux
cmdline = root=UUID=... rootflags=subvol=@/.snapshots/42/snapshot ro
}
In the menu, press V on an entry to cycle its bottom panel: entry info → deployments (BLS / ostree) → snapshots → back. Up / Down or the mouse wheel select; Enter boots the selected snapshot (one-shot); Esc backs out.
Boot entries
Visor auto-detects how to boot each entry from the image itself:
- A PE image with no initrd/cmdline → chainloaded (Windows
bootmgfw.efi, GRUB, shim). Loaded by device path so the loader finds its own files. - A PE image (UKI or EFI-stub vmlinuz) →
LoadImage/StartImage, with cmdline and initrd applied via the standardLINUX_EFI_INITRD_MEDIA_GUIDprotocol. - A raw (non-PE) kernel → Linux EFI handover boot-params path.
There is no separate linux / windows block type or a type= key — everything is entry { }. The old block names are still accepted as aliases so existing configs keep working.
entry {
name = "Arch Linux"
icon = \EFI\visor\icons\arch.png
color = #1793D1
kernel = \vmlinuz-linux
initrd = \initramfs-linux.img
cmdline = "root=PARTUUID=... rw quiet"
}
entry {
name = "Windows 11"
icon = \EFI\visor\icons\windows.png
kernel = \EFI\Microsoft\Boot\bootmgfw.efi
}
| Entry key | Meaning |
|---|---|
name | Display name under the icon. |
icon / icon_size | PNG icon (square, RGBA recommended) and a per-entry size override (overrides global icon_size). |
color | Per-entry name color, overrides global name_color. |
kernel | EFI-stub kernel, UKI, raw kernel, or any EFI loader to chainload. |
initrd | Initrd image (omit for a UKI). Served via the LINUX_EFI_INITRD_MEDIA LoadFile2 path. |
cmdline / options | Kernel command line (omit for a UKI). Overrides the global cmdline for this entry. |
uuid | Partition GUID pin — kernel and initrd load from that partition first. Matters for multi-disk setups and Windows chainloads. |
sha256 | Pin the image's SHA-256 hash (64 hex characters). Boot is refused on mismatch. |
encrypted / kernel_encrypted / initrd_encrypted | 1 = the path(s) point at VISORENC containers — see Encryption. |
luks | 1 = ask for a LUKS password and inject it as a temporary keyfile into the in-memory initrd, then the initramfs uses it to unlock the root device. |
luks_key_path | Keyfile path created inside the initramfs. Default /crypto_keyfile.bin. |
luks_preset | Auto-generate the keyfile kernel option. mkinitcpio / arch → adds cryptkey=rootfs:<path> · dracut / systemd → adds rd.luks.key=<path>. |
luks_cmdline | Manual kernel options for the keyfile; overrides luks_preset. For custom initramfs setups that don't follow the presets. |
luks_confirm | 1 = ask for the passphrase twice at the prompt; a mismatch reprompts instead of booting with a typo. Off by default. |
luks_verbose | 1 = remove quiet and splash from this entry's cmdline so the initramfs retry prompt is visible when a passphrase is rejected. Off by default. |
Encrypted entry example
entry {
name = "Encrypted Arch"
icon = \EFI\visor\icons\arch.png
kernel = \vmlinuz-linux.venc
initrd = \initramfs-linux.img.venc
encrypted = 1
cmdline = "root=PARTUUID=... rw quiet"
}
CRITICAL: mapper-name consistency
The mapper device name in your kernel cmdline must match what /etc/fstab and /etc/crypttab expect. A mismatch can cause confusing multi-stage boot failures (kernel panic, hung mounts, emergency mode). Follow this checklist:
- Kernel cmdline (the
cmdline=field in the entry): Userd.luks.name=<UUID>=<name>to force the mapper device to a specific name. Do not userd.luks.uuid=<UUID>alone — that auto-generates the nameluks-<UUID>, which will not match a customroot=value. /etc/crypttab: If root decryption is handled entirely via the kernel cmdline (as it is here), you should remove the root's crypttab entry entirely. Keeping it causessystemd-cryptsetupto generate a competing service for the same device, which will fail with “already mapped or mounted” and drag dependent targets into emergency mode — even though root itself unlocks fine./etc/fstab: Every mount on the LUKS device must use the same mapper name asroot=. If you have subvolumes (/,/home,/var, ...), each fstab entry must reference/dev/mapper/<name>— never the auto-generatedluks-<UUID>or any other name. A single fstab entry with the wrong name will cause the boot to hang or time out waiting for that device.
In short: pick one mapper name, use it consistently in rd.luks.name=, root=, and every fstab mount — and drop the root's crypttab line.
LUKS entry example
entry {
name = "Arch LUKS"
icon = \EFI\visor\icons\arch.png
kernel = \vmlinuz-linux
initrd = \initramfs-linux.img
cmdline = "rd.luks.name=12345678-1234-1234-1234-123456789abc=cryptroot root=/dev/mapper/cryptroot rw quiet"
luks = 1
luks_key_path = /crypto_keyfile.bin
luks_preset = mkinitcpio
# For custom initramfs setups, use luks_cmdline instead.
}
UKI + LUKS example
The UKI is left unchanged; Visor provides a supplemental keyfile-only initrd through the Linux EFI initrd protocol. Your UKI's embedded initramfs must support the generated or manual keyfile option. See the LUKS root example above for the mapper-name consistency checklist.
entry {
name = "Arch UKI LUKS"
icon = \EFI\visor\icons\arch.png
kernel = \EFI\Linux\arch-linux.efi
cmdline = "rd.luks.name=12345678-1234-1234-1234-123456789abc=cryptroot root=/dev/mapper/cryptroot rw quiet"
luks = 1
luks_key_path = /crypto_keyfile.bin
luks_preset = mkinitcpio
}
Auto-detection
When boot.conf is absent or has no entry { } blocks, Visor scans the ESP:
\EFI\Linux\*.efi→ Unified Kernel Images (each becomes an entry)\boot\vmlinuz*,\vmlinuz*→ raw kernels (fallback if no UKIs are found)\EFI\Microsoft\Boot\bootmgfw.efi→ Windows Boot Manager
Menu controls
| Key | Action |
|---|---|
| ← → / ↑ ↓ | Move between boot entries / move between entry row and power column. |
| Enter | Boot the focused entry / run the focused power action. |
| e | Edit the kernel command line for this boot only (needs editor=1). |
| V | Cycle the bottom panel: entry info → deployments (BLS / ostree) → snapshots → back. |
| 1 – 9 | Boot entry N directly (1-based). |
| S / R / F | Shutdown / Reboot / Reboot into firmware setup (from anywhere). |
| Esc | From the main menu, open the options / rescue console — list and pick entries, edit kernel options for one boot, read boot.log, reboot, or enter firmware setup. Back out of panels / prompts / the rescue console. |
| Mouse / touch | Move to select; single click boots (needs mouse=1). |
| Any key at power-on | Force the menu when autoboot=1 or timeout=0. |