// 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:

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

KeyValues / meaning
timeoutN = auto-boot the default after N seconds · -1 = wait forever · 0 = boot default instantly (no menu).
defaultIndex of the default entry (0-based, in the order entries appear in the file).
quiet1 = suppress all boot-progress text (black screen during hand-off) · 0 = show Booting … (default).
text_menu / text_mode1 = plain text-console menu (also the automatic fallback if no Graphics Output Protocol is found) · 0 = graphical menu (default).
resolutionnative (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 / optionsGlobal default kernel command line. Applied to entries that don't set their own (including auto-detected raw kernels). Per-entry cmdline always wins.
titleMenu title text. Absent / empty = Visor · none = no title at all · any other string = shown verbatim.
fontText font. Currently only jetbrains is bundled (see bake_font for using another). Empty = default.
show_names1 (default) = show the name label under each icon · 0 = icons only.
center_info / centre_info1 = 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_pageEntries 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.
autoboot1 = 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 / remember1 = preselect the last-booted entry next time (persisted in NVRAM). Overrides default · 0 = always honour default.
recovery_entries / recovery1 = auto-generate a <name> (recovery) entry per Linux entry, appending systemd.unit=rescue.target nomodeset · 0 = off.
log / boot_log / file_log1 (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.
snapshots1 (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 / pointer1 (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_speedRelative mouse/touchpad movement multiplier. 1 = slowest, 20 = fastest, 4 = default. Absolute touchscreens are mapped directly and ignore this key. Alias: pointer_speed.
hotplug1 (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.
editor1 (default) = allow one-shot kernel cmdline editing at the menu with e · 0 = disable.
box_radius / corner_radiusCorner radius (pixels) of the selection highlight / frost box. 0 = built-in default. Larger = rounder; small values = squarer corners.

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).

KeyValues / meaning
logoAbsent / default = the bundled logo · none / off = no logo, title only · <path> = your own PNG/BMP (square recommended).
logo_modetitle = 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_sizeLogo 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_gapSpace between logo and title in pixels. Default = half the title height.
accent_logo1 = 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

KeyValues / meaning
title_colorTitle text color (#RRGGBB).
name_colorDefault color for every entry's name. Per-entry color= overrides this.
highlight_colorAccent 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.

KeyValues / meaning
blur0 = 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_title1 = add a static blurred panel behind the title · 0 = off.
blur_colorTint color for frosted mode (#RRGGBB). Default white.

Animation

KeyValues / meaning
animation1 (default) = GUI animations and cross-fades on · 0 = every fade, slide, and cross-fade is instant.
anim_speedSelection 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_speedFull-screen fade speed for menu fade-in and boot/power fade-out, 1 to 10 (fast). Default 10. Ignored when animation=0.

Font sizes

KeyValues / meaning
title_sizeTitle height in pixels. Default scales with the screen (~ screen height ÷ 12).
name_sizeEntry-name height in pixels. Default 16.

Icons

All values in pixels. 0 or absent = sensible default.

KeyValues / meaning
icon_sizeIcon edge length (icons are square). Default 64. A per-entry icon_size= overrides this for individual entries.
icon_spacingHorizontal gap between icons. Default 60.
icon_yVertical 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.

KeyValues / meaning
underline_colorColor of the bar. Defaults to highlight_color if not set.
underline_thicknessHeight of the bar in pixels. Default 4.
underline_lengthWidth 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.

KeyValues / meaning
power_positionCorner the three actions are stacked in: bottomright (default), bottomleft, topright, topleft.
shutdown_colorColor of the S hotkey letter. Defaults to highlight_color.
reboot_colorColor of the R hotkey letter. Defaults to highlight_color.
firmware_colorColor of the F hotkey letter. Defaults to highlight_color.
power_icons1 = 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_sizeIcon edge length for power icons in pixels. Default 40.
shutdown_iconPath to a PNG for the Shutdown icon. Used when power_icons=1.
reboot_iconPath to a PNG for the Reboot icon.
firmware_iconPath to a PNG for the Firmware setup icon.

Background

KeyValues / meaning
backgroundFull-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:

Needs a background image; with a solid backdrop it does nothing and the configured colors are kept.

KeyValues / meaning
accent1 = enable palette derivation from the background · 0 = off (default).
accent_underline1 (default) = underline + highlight use the primary role.
accent_icons1 (default) = power icon labels use secondary / tertiary roles.
accent_text1 = title / names / dim text use the onSurface roles · 0 (default).
accent_os_icons1 = flatten the per-OS icons to the primary color too (discards brand colors like Ubuntu orange) · 0 (default).
accent_variantScheme 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.

KeyValues / 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:

  1. 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. See tools/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.
  2. 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 a root= 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:

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 keyMeaning
nameDisplay name under the icon.
icon / icon_sizePNG icon (square, RGBA recommended) and a per-entry size override (overrides global icon_size).
colorPer-entry name color, overrides global name_color.
kernelEFI-stub kernel, UKI, raw kernel, or any EFI loader to chainload.
initrdInitrd image (omit for a UKI). Served via the LINUX_EFI_INITRD_MEDIA LoadFile2 path.
cmdline / optionsKernel command line (omit for a UKI). Overrides the global cmdline for this entry.
uuidPartition GUID pin — kernel and initrd load from that partition first. Matters for multi-disk setups and Windows chainloads.
sha256Pin the image's SHA-256 hash (64 hex characters). Boot is refused on mismatch.
encrypted / kernel_encrypted / initrd_encrypted1 = the path(s) point at VISORENC containers — see Encryption.
luks1 = 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_pathKeyfile path created inside the initramfs. Default /crypto_keyfile.bin.
luks_presetAuto-generate the keyfile kernel option. mkinitcpio / arch → adds cryptkey=rootfs:<path> · dracut / systemd → adds rd.luks.key=<path>.
luks_cmdlineManual kernel options for the keyfile; overrides luks_preset. For custom initramfs setups that don't follow the presets.
luks_confirm1 = ask for the passphrase twice at the prompt; a mismatch reprompts instead of booting with a typo. Off by default.
luks_verbose1 = 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:

  1. Kernel cmdline (the cmdline= field in the entry): Use rd.luks.name=<UUID>=<name> to force the mapper device to a specific name. Do not use rd.luks.uuid=<UUID> alone — that auto-generates the name luks-<UUID>, which will not match a custom root= value.
  2. /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 causes systemd-cryptsetup to 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.
  3. /etc/fstab: Every mount on the LUKS device must use the same mapper name as root=. If you have subvolumes (/, /home, /var, ...), each fstab entry must reference /dev/mapper/<name> — never the auto-generated luks-<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:

Menu controls

KeyAction
/ Move between boot entries / move between entry row and power column.
EnterBoot the focused entry / run the focused power action.
eEdit the kernel command line for this boot only (needs editor=1).
VCycle the bottom panel: entry info → deployments (BLS / ostree) → snapshots → back.
19Boot entry N directly (1-based).
S / R / FShutdown / Reboot / Reboot into firmware setup (from anywhere).
EscFrom 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 / touchMove to select; single click boots (needs mouse=1).
Any key at power-onForce the menu when autoboot=1 or timeout=0.