Visor Studio is a visual boot.conf configurator for Visor BootManager. It helps you edit, preview, validate, and export a Visor configuration without rebooting after every small change.
The project started from the very real pain of editing boot.conf, rebooting, noticing one wrong color/path/layout value, booting back into the OS, and doing it again. Visor Studio makes that loop faster by putting the config, diagnostics, generated output, and boot menu preview in one place.
Visor Studio is a companion project for Visor BootManager. It is not the bootloader itself.
- Visor-aware parser for
entry {},linux {}, andwindows {}blocks - Schema-driven config controls from Visor's upstream
boot.conf.schema.json - Alias handling for older/friendlier config keys
- Diagnostics for malformed syntax, unknown keys, duplicate keys, risky values, and unclosed blocks
- Safe auto-fix for aliases and hex color comment hazards
- Unknown keys are preserved instead of silently discarded
- Live boot menu preview using bundled Visor default config and assets
- Entry wizard with Linux, UKI, Windows, and custom EFI presets
- Automatic icon suggestions from entry names
- Upload support for custom backgrounds, logos, icons, power icons, and fonts
- Local draft persistence across refreshes
- Drag-and-drop boot entry reordering
- Raw config, generated config, and diff views with syntax highlighting
- Export bundle containing
EFI/visor/boot.conf, staged assets, and install instructions
Main editor with a custom preview, staged assets, generated config flow, and schema-driven controls.
Fullscreen boot menu preview.
Boot entry wizard with presets, icon suggestion, upload support, and path helper commands.
Diagnostics and safe auto-fix warnings before exporting.
Export bundle with uploaded assets staged for EFI copy.
.
├── main.py # FastAPI app
├── core/ # Parser, serializer, schema metadata
│ └── boot.conf.schema.json # Upstream Visor schema snapshot
├── schemas/ # API request/response models
├── tests/ # Backend tests
├── frontend/ # React/Vite app
│ ├── src/ # UI, preview, controls, local asset handling
│ └── public/
│ ├── defaults/ # Bundled upstream boot.conf.example
│ └── visor-assets/ # Bundled Visor default assets
├── docs/ # Screenshots used by the README
├── samples/ # Sample configs for testing
├── NOTICE.md # Upstream attribution
└── LICENSE
- Python 3.12+
- Node.js 20+ recommended
- npm
Start the backend:
python -m venv .venv
source .venv/bin/activate
pip install -e ".[test]"
uvicorn main:app --reloadStart the frontend in another terminal:
cd frontend
npm install
npm run devOpen the Vite URL shown in the terminal, usually:
http://127.0.0.1:5173
The frontend expects the backend at:
http://127.0.0.1:8000
Backend tests:
pytest -qFrontend checks:
cd frontend
npm test
npm run buildThe repo includes a production Dockerfile that builds the Vite frontend and serves it from the FastAPI app.
Build locally:
docker build -t visor-studio .Run locally:
docker run --rm -p 8000:8000 visor-studioThen open:
http://127.0.0.1:8000
For Railway, deploy from the repository root. Railway should detect the root Dockerfile automatically and run the container with its provided $PORT.
Health check:
GET /health
Parse a Visor config:
POST /api/parse-visor
Generate normalized boot.conf:
POST /api/generate
Apply safe text fixes:
POST /api/autofix
Read schema metadata for the UI:
GET /api/schema
Browser uploads are staged locally in the app. They are used for previewing and for building an export ZIP, but Visor itself still needs files to exist on the EFI System Partition at boot. PNG uploads that use indexed/paletted color are converted in the browser to a Visor-friendly PNG before export.
When you download the export bundle, it includes:
EFI/visor/boot.conf
EFI/visor/backgrounds/... # staged backgrounds
EFI/visor/logos/... # staged logos
EFI/visor/icons/... # staged icons and power icons
INSTALL.txt
Typical install command after unzipping the bundle:
sudo cp -r EFI/visor /boot/efi/EFI/If your EFI System Partition is mounted somewhere else, replace /boot/efi with the correct mount point, such as /efi or /mnt.
EFI System Partitions usually do not preserve Linux file ownership, so the command intentionally avoids archive-mode ownership preservation.
Visor paths should match what Visor can read at boot, usually paths on the EFI System Partition or boot filesystem using backslashes:
\EFI\visor\icons\arch.png
\EFI\Linux\arch-linux.efi
\vmlinuz-linux
\initramfs-linux.img
Useful commands to find candidates on your machine:
findmnt /boot /efi /boot/efi
find /boot /efi /boot/efi -maxdepth 4 -type f \( -name '*.efi' -o -name 'vmlinuz*' -o -name 'initramfs*' -o -name 'initrd*' \)The preview is useful for reducing reboot-and-check cycles, but it is still a browser approximation of Visor's EFI renderer.
- It cannot verify that kernel, initrd, EFI, logo, background, icon, or font paths exist on your EFI System Partition.
- Uploaded files are not installed automatically; the export bundle must still be copied to the correct EFI location.
- Some runtime behavior is config-only in Studio, including hotplug scanning, NVRAM remember-last behavior, logging, snapshot discovery, and real firmware setup actions.
- Theme file loading is not fully simulated yet.
- Browser font rendering and EFI text rendering will never be perfectly identical.
Built by Farid.
Visor BootManager and bundled Visor assets are created by IO-ZetZor. Assets are used with permission from the Visor maintainer.
See NOTICE.md for upstream attribution.
This project is licensed under the BSD 2-Clause License. See LICENSE.




