7.4 KiB
KAMOS - Gaming OS
Play. Perform. Dominate.
KAMOS is a personal Bazzite-based bootc image with custom logo, wallpaper, boot splash, and OS branding. Built on top of ghcr.io/ublue-os/bazzite-nvidia:stable so the proprietary NVIDIA driver and Bazzite's gaming/desktop tuning come for free.
Architecture note (important if you're on a Mac)
KAMOS is linux/amd64 only. Bazzite NVIDIA has no ARM64 build and NVIDIA's proprietary driver doesn't run on Apple Silicon anyway. The MacBook M2 is fine as a build host (CI does the heavy lifting) and as a test host via VMware Fusion's x86_64 emulation, but KAMOS is meant to run on a real NVIDIA PC.
Layout
kamos/
├── Containerfile # FROM bazzite-nvidia:stable + COPY + RUN build.sh
├── Justfile # build / build-iso / build-qcow2 / lint
├── build_files/
│ └── build.sh # all KAMOS customisation lives here
├── disk_config/
│ └── iso.toml # bootc-image-builder ISO config
├── system_files/ # COPY'd into / inside the image
│ └── usr/share/
│ ├── backgrounds/kamos/ # drop kamos-wallpaper.jpg here
│ ├── plymouth/themes/kamos/ # boot splash (kamos.plymouth + kamos.script + logo)
│ └── pixmaps/ # drop kamos-logo.png here (GRUB logo)
├── .forgejo/workflows/build.yml # primary CI - builds & pushes to Forgejo
└── .github/workflows/build.yml # disabled GitHub equivalent (mirror if needed)
Step 1 — Drop in your KAMOS branding assets
The repo has placeholder DROP_*_HERE.txt files in the right folders. Replace them with:
| Path | What goes here | Recommended size |
|---|---|---|
system_files/usr/share/backgrounds/kamos/kamos-wallpaper.jpg |
Your "Play. Perform. Dominate." wallpaper | 3840x2160 or 1920x1080 |
system_files/usr/share/plymouth/themes/kamos/kamos-logo.png |
KAMOS logo (raven crest) for boot splash | 256x256 or 512x512, transparent PNG |
system_files/usr/share/pixmaps/kamos-logo.png |
Same logo, used by GRUB boot menu | 256x256 or 512x512, transparent PNG |
You can drop additional files anywhere under system_files/; they'll all be COPY'd into /. Delete the DROP_*_HERE.txt files once you've added the real assets.
Step 2 — Configure your Forgejo registry
The repo is already wired for cgi.medsys.cloud/mkm1971/kamos and the runner label ubuntu-latest. You only need to add three secrets so CI can push and sign images.
Go to https://cgi.medsys.cloud/mkm1971/kamos/settings/actions/secrets and add:
| Secret name | Value |
|---|---|
SIGNING_SECRET |
The full contents of cosign.key (created in Step 3 below) |
REGISTRY_USER |
mkm1971 |
REGISTRY_TOKEN |
A Forgejo access token with package write scope |
To create REGISTRY_TOKEN: in Forgejo, click your avatar (top-right) → Settings → Applications → Generate New Token. Name it kamos-ci, tick the package: write scope, click Generate, and copy the token immediately (it's shown only once).
Step 3 — Generate a cosign signing key
On your M2:
brew install cosign
cd /path/to/kamos
COSIGN_PASSWORD="" cosign generate-key-pair
Creates cosign.key (private — never commit) and cosign.pub (commit this). Paste the contents of cosign.key into the SIGNING_SECRET repository secret.
Step 4 — Push to Forgejo and let CI build
git init
git add .
git commit -m "KAMOS initial scaffold"
git remote add origin https://cgi.medsys.cloud/mkm1971/kamos.git
git push -u origin main
Forgejo Actions needs an linux-amd64 runner. Register one on any x86_64 Linux machine (the NVIDIA PC works perfectly).
Step 5 — (Optional) Iterate locally on the M2
The base image is x86_64, so Podman has to emulate. Slow but works for quick checks.
brew install podman just
podman machine init --cpus 6 --memory 8192 --disk-size 60
podman machine start
just build
Step 6 — Generate a bootable ISO for VMware Fusion
just build # builds the OCI image
just build-iso # wraps it with bootc-image-builder into output/bootiso/install.iso
VMware Fusion 13+ on Apple Silicon supports x86_64 emulation. New VM → install from ISO → choose output/bootiso/install.iso → guest type "Other Linux 5.x kernel 64-bit". Expect single-digit FPS in the GUI, but the boot splash and branding will render fine. This is the path you mentioned for your VMware testing setup.
Step 7 — Install on the real NVIDIA PC
If the PC is already on a bootc image (Bazzite, Bluefin, Aurora, etc.):
sudo bootc switch cgi.medsys.cloud/mkm1971/kamos:stable
sudo systemctl reboot
If it's running something else, install Bazzite from its normal ISO first, then bootc switch to KAMOS. Or burn the ISO from step 6 to a USB stick and install fresh.
Updating
CI rebuilds weekly so you pick up upstream Bazzite security fixes. Push any commit to main or run the workflow manually to bump immediately.
What gets branded
build.sh applies KAMOS branding in seven places:
/etc/os-release→NAME,PRETTY_NAME,VARIANT,HOME_URL(soneofetch/fastfetchshow "KAMOS Gaming OS - Play. Perform. Dominate.")- GNOME default wallpaper (system-wide via dconf override, applies to all new users)
- GNOME lock-screen / screensaver background (same wallpaper)
- Plymouth boot splash (custom
kamostheme with pulsing logo on black) - Initramfs is regenerated with
dracut --force --regenerate-allso the splash shows on first boot - GRUB boot-menu logo (logo PNG dropped into Bazzite's GRUB theme)
- Container image labels (visible in registries / artifacthub)
Troubleshooting
podman build fails with "exec format error": forgot --platform=linux/amd64 on Apple Silicon, or QEMU user-static isn't enabled in your Podman machine.
Boot splash doesn't show: confirm the kernel cmdline has rhgb quiet splash (it does, via iso.toml). On a bootc switch upgrade you may need to re-run dracut --force --regenerate-all and reboot once.
Wallpaper doesn't apply for existing user: the dconf override is system-db:local, which only affects new users. Existing accounts have their own user dconf — set it manually once with gsettings set org.gnome.desktop.background picture-uri 'file:///usr/share/backgrounds/kamos/kamos-wallpaper.jpg'.
Image builds but boot loops on real hardware: usually SecureBoot rejecting unsigned NVIDIA modules. Disable SecureBoot in BIOS or enroll Bazzite's MOK key (Bazzite docs cover this).
Cosign signing step fails: SIGNING_SECRET must be the contents of cosign.key, not a path. The key must be generated with an empty password.
License
Apache-2.0 — same as the upstream ublue-os/image-template.