// 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.
File syntax
- One
key = valueper line. Whitespace around=is ignored. #starts a comment. Inside a value it only counts when preceded by whitespace, sotitle_color=#7AA2F7is a color, not a comment. Quote a value to keep a#that follows a space.- Quote values containing spaces:
cmdline = "root=... rw quiet". The surrounding quotes are stripped. - Entry blocks are
entry { ... }. Blank lines and comments inside a braced block are fine; the block ends at its}. If you omit the braces, the first blank line ends the block — so brace your entries. - Repeating a key keeps the last value. Unknown keys are ignored, and an invalid value is logged and the previous setting kept.
- UTF-8 and UTF-16 (with or without BOM) are both accepted.
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.
| 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). |
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. |
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. |
quiet | 1 = suppress all boot-progress text (black screen during hand-off) · 0 = show Booting …(default). |
editor | 1 (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.
| Key | Values / meaning |
|---|---|
selfheal | 1 (default) = run the boot self-heal pass · 0 = skip it entirely. |
boot_order / selfheal_order | NVRAM 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_fallback | 1 (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 stamp | Not 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.
| Key | Values / meaning |
|---|---|
scan / scan_mode | Auto-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). |
hotplug | 1 (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_existing | 1 = 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 / recovery | 1 = auto-generate a <name> (recovery) entry per Linux entry, appending systemd.unit=rescue.target nomodeset · 0 = off. |
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. See Snapshots. |
Menu appearance and input
The menu's overall shape. Finer styling lives in the sections below — Colors, Icons, Logo, Underline, Blur, Animation.
| Key | Values / meaning |
|---|---|
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). |
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 / names | 1 (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_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. |
box_radius / corner_radius | Corner radius (pixels) of the selection highlight / frost box. 0 = built-in default. Larger = rounder; small values = squarer corners. |
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. |
Diagnostics
| Key | Values / meaning |
|---|---|
log / boot_log / file_log | 1 (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. |
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 / logo_color / accent_logo_color | 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
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.
| 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. |
bg_color / background_color | Solid backdrop color, used when no background image is set or the image cannot be loaded. Default #1A1A2E. |
info_color | Color 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.
| 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 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:
- 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). |
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.
| Key | Values / meaning |
|---|---|
clock / show_clock | 0 / 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_clock | 1 (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_color | Explicit clock text color (#RRGGBB or role). When set, it wins over the palette. Still respects clock=0/1 for visibility. |
clock_size / clock_px | Height in pixels. 0 = scale with the title (default). Alias clock_px is identical. |
clock_format | 24h (default) = 14:05 · 12h = 2:05 PM (no leading zero, AM/PM). Also accepts 12/24. |
clock_seconds | 1 = 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_pos | Where 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_date | 0/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: full→long, ymd→iso, eu→dmy, us→mdy. |
clock_date_format | Date format when the date is shown. Same names as clock_date without the 0/1 toggle. Default long. |
clock_blur | 1 = frosted glass panel behind the clock text (requires a background image; otherwise a translucent tint) · 0 (default) = no backing. |
clock_shadow | 1 (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.
| Key | Values / meaning |
|---|---|
screensaver | 0 (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_timeout | Seconds idle before dimming (default 60). The dim cross-fades the live UI to the bare saver frame. |
screensaver_blank / screensaver_blank_delay | Seconds 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_clock | 1 (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.
| Key | Values / 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.
| Key | Values / meaning |
|---|---|
tpm / measure | 1 (default) = measure via the EFI_TCG2_PROTOCOL when present · 0 = skip measured boot entirely. Aliases: measure is identical. |
tpm_pcr_config | PCR index for the config file as it sits on disk (raw boot.conf bytes). Range 0–23, default 5. |
tpm_pcr_cmdline | PCR 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_interface | 1 (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
- Timeout overrides:
LoaderConfigTimeoutand one-shotLoaderConfigTimeoutOneShot(consumed as it is read; one-shot wins; supportsmenu-force/menu-hiddenand numeric seconds). - Entry selection:
LoaderEntryDefaultand one-shotLoaderEntryOneShot(consumed; one-shot also autobots and wins overremember_last). Lookup uses the canonical entry id — the BLS.confbasename when present, otherwise a slugified display name. - Behavior on read: one-shot variables are deleted whether or not they matched, so a stale value never sticks.
What Visor publishes
LoaderInfo=Visor <version>, captured at the earliest point inefi_mainasLoaderTimeInitUSec(microseconds since the epoch, wall clock).LoaderFirmwareInfo/LoaderFirmwareType= firmware vendor/type strings from the system table (only if the firmware hasn't already published them).LoaderDevicePartUUID= partition UUID of the ESP Visor booted from;LoaderImageIdentifier= device path it was launched from.LoaderFeatures= bitmask forConfigTimeout,EntryDefault/OneShot, etc., plusTPM2_ACTIVE_PCR_BANKSwhen a TPM is active.LoaderEntries= NUL-separated ordered list of entry ids in on-screen order.LoaderEntrySelected+LoaderTimeExecUSec= chosen entry and hand-off time, set immediately before booting;LoaderTimeMenuUSec= when the menu first became interactive.LoaderTpm2ActivePcrBanks= hex mask of active PCR banks (volatile), published when the TPM is active.
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.
| 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. Each record targets an entry withentry = <exact menu name>(preferred) oros = <text>as a fuzzy fallback. 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 {
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:
- 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). When omitted, Visor derives it from the entry name: Arch Linux → icons\arch.png, a Windows image → windows.png, anything else → linux.png. |
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 / luks_password | 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. This is a switch, not a place to put a passphrase — Visor has no key for storing one in the file. |
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 (scope controlled by the scan global key above):
\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. |