BlueForge is the desktop OS I build for myself: secure, practical, and ready for daily dev work from first boot.
It is based on ghcr.io/ublue-os/bluefin:stable, but tuned to my workflow: Ghostty-first terminal behavior, security tools I actually use, and runtime app management that stays simple.
Compared to stock Bluefin, this is the setup I want to live in every day.
- System packages: Ghostty, Helium (
helium-bin), 1Password, Mullvad VPN. - Why these are baked in: login/network security are non-negotiable, and the terminal should feel right immediately.
- CLI tools (Homebrew):
bat,eza,fd,rg,gh,git,neovim,bun,nvm,opencode,claude-code,starship,btop,tmux. - GUI apps (Flatpak): Thunderbird, GNOME utilities, Flatseal, Mission Center, Warehouse, Ignition, Impression, DistroShelf, Bazaar, Refine, plus GTK theme runtimes.
- Why most apps stay runtime-managed: faster iteration and easier updates without rebuilding the base image.
- Removed:
ptyxis(Ghostty is preferred instead). - Not preinstalled: Firefox Flatpak is intentionally not in defaults.
- Disabled by default: Cosign signing and SBOM attestation stay off until secrets are configured.
- Sets Ghostty as preferred terminal via
/etc/xdg/xdg-terminals.list. - Enables
podman.socketat build time. - Copies and merges custom Brewfiles,
ujustrecipes, and Flatpak preinstall manifests into system locations. - Uses isolated COPR installs for Ghostty and Helium to avoid repo persistence.
Last updated: 2026-02-16
BlueForge uses a multi-stage Containerfile:
ctxstage assembles:- local
build/ - local
custom/ ghcr.io/projectbluefin/commonsystem filesghcr.io/ublue-os/brewsystem files
- local
- final stage starts from
ghcr.io/ublue-os/bluefin:stableand runsbuild/10-build.shwith/ctxmounted.
This keeps customization modular and reproducible while staying aligned with Universal Blue conventions.
If I had to describe this OS in one line: Bluefin reliability, but with my defaults already made.
- Security-first without being heavy-handed.
- Terminal-first without abandoning desktop quality-of-life.
- Runtime apps and tooling so iteration stays fast.
- Minimal surprises in day-to-day use.
- You want Bluefin stability with curated defaults.
- You prefer a terminal-first workflow but still want polished desktop UX.
- You want security tools available immediately.
- You want most tools managed at runtime instead of rebaking images constantly.
Containerfile- base image, layered context, and build execution.build/10-build.sh- build-time packages and system configuration.custom/brew/*.Brewfile- runtime CLI/dev/font package bundles.custom/flatpaks/default.preinstall- first-boot GUI app manifest.custom/ujust/*.just- user-facing app/system helpers..github/workflows/*.yml- CI build, cleanup, Renovate, and validation workflows.
Create a new GitHub repo from this template.
Set your OS/repo name consistently in:
Containerfile(# Name: your-name)Justfile(export image_name := env("IMAGE_NAME", "your-name"))README.mdtitleartifacthub-repo.yml(repositoryID: your-name)custom/ujust/README.md(localhost/your-name:stableexamples).github/workflows/clean.ymlpackage reference
In GitHub repo settings:
- Enable Actions.
- Set workflow permissions to Read and write.
- Enable permission for Actions to create/approve PRs.
- Build-time system changes: edit
build/10-build.sh. - Runtime CLI tools: edit
custom/brew/default.Brewfileand related Brewfiles. - Runtime GUI apps: edit
custom/flatpaks/default.preinstall. - User shortcuts: edit
custom/ujust/custom-apps.justandcustom/ujust/custom-system.just.
just build
just build-qcow2
just run-vm-qcow2Optional ISO flow:
just build-iso
just run-vm-isosudo bootc switch ghcr.io/<your-user>/<your-repo>:stable
sudo systemctl rebootSigning is intentionally disabled by default so first builds work immediately.
When ready:
- Generate keys with
cosign generate-key-pair. - Add private key contents to GitHub Actions secret
SIGNING_SECRET. - Commit your real
cosign.pub. - Uncomment signing steps in
.github/workflows/build.yml. - (Optional) Uncomment SBOM generation + attestation steps.
Never commit cosign.key.
Install runtime packages:
ujust install-default-apps
ujust install-dev-tools
ujust install-fonts
ujust install-all-brewExtra helpers:
ujust install-jetbrains-toolbox
ujust configure-dev-groups
ujust clean-containers
ujust update-and-rebootPRs run validations for:
- Shell scripts (
shellcheck) - Brewfile syntax
- Flatpak IDs
- Justfile syntax
- Renovate config
Main branch builds and publishes the stable image tags.
- Universal Blue: https://universal-blue.org/
- Bluefin: https://projectbluefin.io
- bootc: https://containers.github.io/bootc/
- Flatpak app IDs: https://flathub.org/