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

File syntax

No boot.conf at all is a supported configuration — Visor auto-detects entries (see Features). Validate a config from Linux with visor config validate.

Every key on this page is also described in machine-readable form in docs/boot.conf.schema.json (JSON Schema draft 2020-12, installed to /usr/share/visor/boot.conf.schema.json) — types, defaults, permitted values, aliases and grouping, generated from the parser. Use it to validate a config in an editor or a script.

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

Global keys sit at the top of the file, outside any entry { } block. They are grouped below by what they affect; the file itself accepts them in any order.

Boot behaviour

What gets booted, and whether the menu is shown at all.

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).
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.
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.
quiet1 = suppress all boot-progress text (black screen during hand-off) · 0 = show Booting … (default).
editor1 (default) = allow one-shot kernel cmdline editing at the menu with e · 0 = disable.

Boot self-heal

Every startup, Visor looks after its own NVRAM entry and fallback binary, so OS updates (Windows in particular) can't silently walk off with the boot entry. Nothing is written when there is nothing to fix, and removable media are never touched.

KeyValues / meaning
selfheal1 (default) = run the boot self-heal pass · 0 = skip it entirely.
boot_order / selfheal_orderNVRAM boot-entry policy. ensure (default) = recreate a missing Visor Boot#### entry, and if it has been removed from BootOrder, append it back at the tail. first = same as ensure, plus: when BootCurrent matches the Visor entry (a normal boot through the firmware boot manager), keep Visor first in BootOrder — only rearranges an existing order, never invents one. off = never touch NVRAM variables.
restore_fallback1 (default) = re-copy the running Visor binary to the default fallback path (\EFI\BOOT\BOOTx64.EFI) at startup, restoring it if another OS replaced it (Windows feature updates / 24H2 may stomp it with a copy of bootmgfw.efi) · 0 = off.
.selfheal stampNot a key — the cooldown that protects NVRAM from firmware/OS reorder wars: any BootOrder rewrite arms a short cooldown measured with a small .selfheal stamp file on the ESP, not in NVRAM, so further rewrites are skipped for the next few boot periods.

Since 1.5.6, corrupted Boot#### Visor entries are detected and handled separately: a malformed (non-4-digit) Visor entry is left in place but flagged, visor status reports present (corrupted — run visor update --boot-entry to fix), and visor update --boot-entry recreates a fresh valid entry.

Entry discovery

Where Visor looks for bootable things, and which extra entries it synthesises. Auto-detection only runs when boot.conf lists no entries of its own.

KeyValues / meaning
scan / scan_modeAuto-detection scope. deep (default) = open every filesystem the firmware exposes — finds kernels living in /boot on a root filesystem, at the cost of a few seconds on machines with several disks. quick = look only at the volume Visor booted from, every EFI system partition, and any XBOOTLDR (separate /boot) partition. A quick scan that turns up nothing widens to a deep scan instead of showing an empty menu. Aliases: quick_scan=1 / deep_scan=0, each also spelled without the underscore (quickscan, deepscan).
hotplug1 (default) = while the menu is up, watch for volumes that appear (a USB stick plugged in), scan them for bootable content and pop matching entries into the menu — the new icon fades in and the row slides over to make room. Entries are pinned to the volume they were found on · 0 = off.
scan_existing / hotplug_scan_existing1 = also sweep media that was ALREADY plugged in when Visor started · 0 = off (default). Sweeping costs time (and, with a filesystem driver installed, a probe of every partition), so by default it only happens when Visor auto-detected the entries — if boot.conf lists entries, Visor trusts them and only watches for media that appears later. Runs after the menu is already on screen, one volume at a time.
recovery_entries / recovery1 = auto-generate a <name> (recovery) entry per Linux entry, appending systemd.unit=rescue.target nomodeset · 0 = off.
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. See Snapshots.

Menu appearance and input

The menu's overall shape. Finer styling lives in the sections below — Colors, Icons, Logo, Underline, Blur, Animation.

KeyValues / meaning
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).
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_names / names1 (default) = show the name label under each icon · 0 = icons only. Auto-detected menus default to icons-only unless you set this.
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.
box_radius / corner_radiusCorner radius (pixels) of the selection highlight / frost box. 0 = built-in default. Larger = rounder; small values = squarer corners.
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.

Diagnostics

KeyValues / meaning
log / boot_log / file_log1 (default) = write diagnostics to \EFI\visor\boot.log · 0 = off. This key is read before any log write, so log=0 is honored even on firmware whose ESP write path hangs. The file is append-only and trimmed to the last few sessions once it passes ~128 KiB. Inverse alias: no_log=1.

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_logo / logo_color / accent_logo_color1 = 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

Every key in this table (and every other color key on this page) accepts the same four forms: #RRGGBB for an explicit color, an accent role name such as tertiary to follow the wallpaper palette, 1/on for that element's default accent role, or 0/off to keep the plain color. A key you leave out keeps the element's own default. Tip: title_color=#7AA2F7 is a color; title_color = #7AA2F7 with a space before # would be parsed as title_color plus a comment — write title_color=#7AA2F7 or quote the value.

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.
bg_color / background_colorSolid backdrop color, used when no background image is set or the image cannot be loaded. Default #1A1A2E.
info_colorColor of the secondary info line (the path shown by center_info, deployment and snapshot details). Default white.

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 and BMP are static; GIF and MP4/MOV (MJPEG) play in a loop — the accent palette is taken from the first frame and the frosted-glass panels reuse their blur while the animation plays so the menu stays fast. Frames advance on a wall-clock schedule that drops time on a slow redraw instead of spiralling. 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).

Picking a role per element

The keys above are on/off switches for whole groups. Any individual color key can instead name the role it should take, so one element can break away from the group:

accent           = 1            # derive the palette
underline_color  = tertiary     # ...but the underline follows tertiary
title_color      = #FFFFFF      # ...and the title stays plain white

Valid role names: primary, on_primary, primary_container, on_primary_container, secondary, tertiary, tertiary_container, surface, surface_container, on_surface, on_surface_variant, outline, clock. Hyphens work in place of underscores.

Precedence, most specific first: the element's own key (underline_color) beats its group key (accent_underline), which beats the global accent, which beats the element's built-in default. An explicit #RRGGBB always wins over the derived palette — setting a color is how you opt one element out. A role name needs a palette, so it falls back to the element's normal color when the wallpaper yields none.

Clock

A live clock rendered in the boot menu, outside the selection highlight so it ticks without forcing a full redraw. Shown only when enabled; position, format and decoration are configurable. The time is read from the firmware RTC.

KeyValues / meaning
clock / show_clock0 / off = hidden (default) · 1 / on = shown, tinted with the clock palette role · <role> or #RRGGBB = shown with that role or explicit color. Either key does the same thing; show_clock is the historical name. Accepts the unified color grammar.
accent_clock1 (default when clock is on) = allow the clock role from the wallpaper palette · 0 = keep the clock's plain color. Also accepts a role or #RRGGBB to override the role.
clock_colorExplicit clock text color (#RRGGBB or role). When set, it wins over the palette. Still respects clock=0/1 for visibility.
clock_size / clock_pxHeight in pixels. 0 = scale with the title (default). Alias clock_px is identical.
clock_format24h (default) = 14:05 · 12h = 2:05 PM (no leading zero, AM/PM). Also accepts 12/24.
clock_seconds1 = also show seconds (14:05:09) and update every second · 0 (default) = minutes only. Seconds force a 1 Hz repaint of the clock band only.
clock_position / clock_posWhere the clock sits. One of topright (default), topleft, topcenter/topcentre/top, bottomright, bottomleft, bottomcenter/bottomcentre/bottom, center/centre/middle. Hyphens, underscores and spaces are equivalent: top-right, top_right and top right all parse the same. Top clocks that would collide with the centered header are automatically slid below it.
clock_date0/off (default) = no date · 1/on = date below the time in the long form · or a format name: long (Monday, January 5), iso (2026-01-05), dmy (05/01/26), mdy (01/05/26). Aliases: fulllong, ymdiso, eudmy, usmdy.
clock_date_formatDate format when the date is shown. Same names as clock_date without the 0/1 toggle. Default long.
clock_blur1 = frosted glass panel behind the clock text (requires a background image; otherwise a translucent tint) · 0 (default) = no backing.
clock_shadow1 (default) = subtle drop shadow for contrast · 0 = flat text.

Tip — the clock is the cheapest live element: it repaints only its own band. The header, entries and power actions stay cached. Combine clock_blur=1 with a detailed wallpaper for a subtle glass clock, or leave it off for a minimal look.

Screensaver

Idle dim and blank stages while the graphical menu is up. Visor tracks keys, pointer moves and clicks; after a period without activity the UI elements fade out leaving only the background (plus the clock, if enabled and kept). After a longer idle time the panel blanks to black and stops rendering until the next input.

KeyValues / meaning
screensaver0 (default) = off · 1 = on with the delays below · or a bare number like 60 = on with that idle delay in seconds (shorthand for screensaver=1 plus screensaver_delay=60). Aliases: any truthy yes/true/on.
screensaver_delay / screensaver_timeoutSeconds idle before dimming (default 60). The dim cross-fades the live UI to the bare saver frame.
screensaver_blank / screensaver_blank_delaySeconds idle before blanking to black after the dim (default 600 = 10 min after dim, ~11 min total). 0 = disable blank (dim only). The blank fades out; the next input wakes the screen.
screensaver_clock1 (default) = keep the clock visible while dimmed (ignored once blanked) · 0 = hide it with the rest of the UI.

Idle tracking is suspended while the boot countdown is running, while the text editor is open (e), or while the file browser is open — those are active use even without new keystrokes. Waking from dim cross-fades back; waking from blank fades the menu up from black and restarts the countdown so a stray key never instantly boots. Animated backgrounds keep playing while dimmed but are fully idle while blanked. The cursor's backing store is dropped across the transition so no ghost remains.

Sound

Visor can play a short .wav at startup while the menu is initialising, using its built-in Intel HD Audio driver — no external driver and no dependence on the OS ever having configured audio. The sound is upsampled to 48 kHz and played once, in parallel with the menu fade-in, so sound and picture arrive together. Sounds longer than 4 s are truncated at 4 s.

KeyValues / meaning
menu_sound<path> to a 16-bit PCM .wav (max ~4 s) played once at startup · absent / empty = no sound · off / 0 / n / f = silent.

Audio needs a functional Intel HD Audio (HDA) controller and codec — see Features → Sound for how the driver picks an output (headphones take priority over built-in speakers when a jack is present).

Measured boot & Boot Loader Interface

TPM2 measured boot and systemd Boot Loader Interface interop. Both are on by default when the platform supports them; set either to 0 to disable entirely.

KeyValues / meaning
tpm / measure1 (default) = measure via the EFI_TCG2_PROTOCOL when present · 0 = skip measured boot entirely. Aliases: measure is identical.
tpm_pcr_configPCR index for the config file as it sits on disk (raw boot.conf bytes). Range 0–23, default 5.
tpm_pcr_cmdlinePCR index for the kernel command line (the LoadOptions string including its terminating NUL, matching systemd's tpm_log_load_options layout so a sealed PCR policy stays portable). Range 0–23, default 12.
loader_vars / loader_interface1 (default) = export and honor the systemd Boot Loader Interface EFI variables (vendor GUID 4a67b082-0a4c-41cf-b6c7-440b29bb8c4f) · 0 = do not touch any Loader* variable. Alias loader_interface is identical.

What Visor honors

What Visor publishes

For an OS agent the one-shot variables are the one-boot mechanism: write LoaderEntryOneShot with an entry id and Visor boots it immediately this once, then deletes the variable; ditto for LoaderConfigTimeoutOneShot and the countdown. LoaderDevicePartUUID and LoaderEntries let the OS discover where Visor lives and what it can boot without parsing the ESP.

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. Each record targets an entry with entry = <exact menu name> (preferred) or os = <text> as a fuzzy fallback. 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 {
    entry   = Arch Linux         # target entry — exact menu name (preferred)\n    os      = Arch Linux         # fuzzy name-substring fallback
    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). When omitted, Visor derives it from the entry name: Arch Linuxicons\arch.png, a Windows image → windows.png, anything else → linux.png.
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.
luks / luks_password1 = 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. This is a switch, not a place to put a passphrase — Visor has no key for storing one in the file.
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 (scope controlled by the scan global key above):

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.