Root cause of USB boot failure: our xorriso used -e boot/grub/efi.img to embed the EFI image inside the ISO. This works for CD-ROM and QEMU but NOT for USB on real UEFI hardware. Fix: use the Will Haley / Debian live-build approach: - -append_partition 2 (GPT type EFI) appends efi.img AFTER ISO data - -e --interval:appended_partition_2:all:: references the appended partition - --mbr-force-bootable forces MBR active flag - grub-mkstandalone with embedded bootstrap config (searches for grub.cfg) - grub.cfg placed in both /boot/grub/ AND /EFI/BOOT/ on ISO - grub.cfg uses search --label ARCHIPELAGO to find the ISO root This is the exact approach used by StartOS, TAILS, and every production custom Debian live ISO that boots from USB. Also: iso-debug, iso-branding skills + reference docs, dev-start.sh option 0 for branding dev, improved dev-branding.sh and test-iso-qemu.sh. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.5 KiB
5.5 KiB
name, description, allowed-tools
| name | description | allowed-tools |
|---|---|---|
| iso-branding | Design and implement Archipelago boot visuals — GRUB theme, Plymouth splash, ISOLINUX menu, console banners. Handles pixel-art cyberpunk aesthetic with Bitcoin orange accents. Use when working on boot screen design, splash animations, GRUB backgrounds, or installer UI appearance. | Bash, Read, Write, Edit, Grep, Glob, Agent |
ISO Boot Branding — Archipelago
Design and build the visual boot experience from USB power-on to web UI.
Brand Identity
Archipelago = self-sovereign Bitcoin node OS. Floating islands in the sky.
| Element | Value |
|---|---|
| Primary accent | #fb923c (Bitcoin orange) |
| Secondary accent | #f7931a (deeper orange) |
| Success | #4ade80 (green) |
| Background | #0a0a0a → #050505 (near-black) |
| Text | #ffffff (white), #aaaaaa (dim), #555555 (subtle) |
| Glass | rgba(255,255,255,0.06) frost overlay |
| Style | Pixel art cyberpunk, dark glass morphism, CRT scanlines |
| Logo | Pixel-art lowercase "a" (from SVG favicon) |
Boot Stages & What's Customizable
1. GRUB Menu (UEFI boot)
- Background:
branding/grub-theme/background.png— any PNG, GRUB scales it - Theme:
branding/grub-theme/theme.txt— colors, layout, labels - Fonts: Generated with
grub-mkfontduring build, .pf2 format - Config: Written by build script in Step 5 (
grub.cfgheredoc)
GRUB theme.txt properties that work:
desktop-color: "#rrggbb" # Fallback if no background
desktop-image: "background.png" # Background image
title-text: "" # Empty = no title
+ boot_menu {
left/top/width/height = N%
item_color = "#rrggbb"
selected_item_color = "#rrggbb"
item_height = N
item_spacing = N
scrollbar = false
}
+ label {
left/top/width = N%
text = "string"
color = "#rrggbb"
align = "center"
}
IMPORTANT: Do NOT reference font names in theme.txt unless you know the exact internal name from grub-mkfont output. GRUB falls back to default if a font reference fails, which causes the ENTIRE theme to not load.
2. ISOLINUX Menu (BIOS boot)
- Config: Written by build script in Step 5 (
isolinux.cfgheredoc) - Colors: ANSI-style color codes in
MENU COLORdirectives - Title:
MENU TITLEstring - Text-only — no background image (use
vesamenu.c32for graphical, butmenu.c32is more compatible)
3. Plymouth Splash (kernel boot → login)
- Theme:
branding/plymouth-theme/archipelago.script - Logo:
branding/plymouth-theme/logo.png(PNG with transparency) - Config:
branding/plymouth-theme/archipelago.plymouth - Supports: animated progress bar, logo sprites, LUKS password prompt
- Kernel param
splashmust be present (added to GRUB_CMDLINE_LINUX_DEFAULT)
Plymouth script language:
Window.SetBackgroundTopColor(r, g, b); // 0.0-1.0
logo = Image("logo.png");
sprite = Sprite(logo);
sprite.SetX(x); sprite.SetY(y);
Plymouth.SetRefreshFunction(callback);
Plymouth.SetBootProgressFunction(callback);
Plymouth.SetDisplayPasswordFunction(callback);
4. Console Banner (TTY login)
- ASCII art + system info in
/etc/profile.d/archipelago.sh - Generated in auto-install.sh (Step 4, the INSTALLER_SCRIPT heredoc)
- Uses ANSI escape codes for color
5. Installer Prompt
- "ARCHIPELAGO BITCOIN NODE OS / Automatic Installer"
- In the systemd service wrapper:
/usr/local/bin/archipelago-start-installer - Built inside the debootstrap container in Step 2
Dev Workflow
Quick preview (no ISO needed)
# Edit background, see it instantly:
open image-recipe/branding/grub-theme/background.png
# Generate procedural background:
python3 image-recipe/branding/generate-grub-background.py /tmp/bg.png && open /tmp/bg.png
# Generate Plymouth logo:
python3 image-recipe/branding/generate-plymouth-logo.py /tmp/logo.png && open /tmp/logo.png
Full boot test (needs base ISO)
./image-recipe/dev-branding.sh [path-to-iso]
# Or via dev-start.sh option 0
Extracts ISO → patches branding → repackages → boots QEMU. ~30 seconds.
What to edit
| File | Affects |
|---|---|
branding/grub-theme/background.png |
GRUB boot screen image |
branding/grub-theme/theme.txt |
GRUB menu colors, layout |
branding/plymouth-theme/logo.png |
Plymouth boot logo |
branding/plymouth-theme/archipelago.script |
Plymouth animation/progress |
branding/generate-grub-background.py |
Procedural background generator |
branding/generate-plymouth-logo.py |
Procedural logo generator |
Image Specs
| Asset | Format | Size | Notes |
|---|---|---|---|
| GRUB background | PNG | 1024x768 recommended | GRUB scales any size, but large images slow boot |
| Plymouth logo | PNG (RGBA) | 256x256 recommended | Transparent background |
| GRUB fonts | .pf2 | Generated | grub-mkfont -s SIZE -o out.pf2 input.ttf |
Build Integration
GRUB theme is installed in Step 2 (after artifacts placed):
- Static
background.pngcopied frombranding/grub-theme/ - Falls back to Python generator if static file missing
- Fonts generated in debootstrap container with
grub-mkfont
Plymouth theme installed in Step 3 (component copy) + Step 4 (auto-install.sh):
- Files copied to
$ARCH_DIR/plymouth-theme/in ISO - Auto-install.sh copies to target at
/usr/share/plymouth/themes/archipelago/ - Sets as default via
plymouth-set-default-theme
GRUB theme also installed on TARGET system (not just installer):
- Auto-install.sh copies theme to
/mnt/target/boot/grub/themes/archipelago/ - Adds
GRUB_THEME=to/mnt/target/etc/default/grub