A universal bootc installer backend, designed to be driven by a frontend such as tuna-installer.
fisherman handles disk partitioning, formatting, LUKS encryption, and bootc install to-filesystem image installation. It works with any bootc-compatible image regardless of distro.
fisherman is a Go CLI that reads a JSON recipe and executes a 9-step install pipeline:
| Step | Action |
|---|---|
| 1 | Partition disk (3-partition GPT: EFI + ext4 /boot + root) |
| 2 | Format EFI (mkfs.fat -F32) and /boot (mkfs.ext4) |
| 3 | Set up LUKS (optional: cryptsetup luksFormat + open) |
| 4 | Format root filesystem (mkfs.xfs or mkfs.btrfs) |
| 5 | Mount everything at /mnt/fisherman-target |
| 6 | bootc install to-filesystem via podman run --privileged |
| 7 | Copy system Flatpaks from host to target |
| 8 | Write /etc/hostname into the deployment |
| 9 | Inject rd.luks.uuid + Plymouth args into BLS boot entries, then finalize (fstrim → remount ro → fsfreeze) |
The separate ext4 /boot partition is required because GRUB cannot read modern XFS features (nrext64, exchange, rmapbt). For composefs/systemd-boot images the EFI partition holds the kernel and initrd directly.
When running inside a Flatpak sandbox, fisherman automatically wraps host subprocess calls via flatpak-spawn --host.
sudo fisherman <recipe.json>{
"disk": "/dev/sda",
"filesystem": "xfs",
"composeFsBackend": false,
"unifiedStorage": false,
"selinuxDisabled": false,
"encryption": {
"type": "none"
},
"image": "ghcr.io/tuna-os/yellowfin:gnome50",
"hostname": "myhost",
"flatpaks": ["org.mozilla.firefox"]
}Encryption types: none, luks-passphrase, tpm2-luks, tpm2-luks-passphrase
For luks-passphrase and tpm2-luks-passphrase, add "passphrase": "hunter2" inside the encryption object.
data/images.json is a recursive JSON tree of distro groups and leaf images consumed by tuna-installer's image picker. It can be overridden at runtime:
| Path | Purpose |
|---|---|
/etc/tuna-installer/images.json |
System-wide override |
$XDG_CONFIG_HOME/tuna-installer/images.json |
Per-user override |
go build ./cmd/fisherman/ # build binary
go vet ./... # lint
go test ./... # unit testsThe nightly CI runs a full install + QEMU boot test for each image in tests/bootcrew-matrix.yaml:
| Image | Filesystem | composefs |
|---|---|---|
| bluefin:lts | xfs | no |
| yellowfin:gnome50 | xfs | no |
| ubuntu-bootc | xfs | yes |
| opensuse-bootc | xfs | yes |
| arch-bootc | xfs | yes |
| debian-bootc | xfs | yes |
| frostyard/snow | btrfs | yes |
Fast CI (PR gate) runs a subset. Add new images to tests/bootcrew-matrix.yaml to include them in both workflows automatically.
GPL-3.0-only