An opinionated, immutable Fedora-based desktop environment built for SREs, DevOps, and Systems Engineers.
Designed for stability, reproducibility, and minimal maintenance, Apparatus uses bootc and ostree to provide a hardened, predictable workstation that stays out of your way.
Apparatus is built on the principle of minimal drift. By leveraging Fedora's immutable architecture, it provides a consistent environment that doesn't rot over time.
- Immutable Core: Powered by
bootc, ensuring that the base system is cryptographically verifiable and resistant to configuration drift. - Zero-Dependency Build: The build engine is engineered to be entirely self-contained, using simple shell primitives to parse versions from
apparatus.envwithout requiringyqorpythonin the build stage. - Single Source of Truth: All critical component versions (OS, Hyprland, Tooling) are managed via a single
.envfile, facilitating reproducible image builds. - Container-First Workflow: Development tools, runtimes, and dependencies do not touch the host system; they live in isolated, versioned Distrobox containers.
To deploy Apparatus on a fresh Fedora Silverblue installation, follow the rebase workflow.
For testing and initial deployment, use the unverified registry path:
# Define the image path
IMAGE_PATH=ghcr.io/vincentvdk/apparatus-os
# Rebase using bootc
sudo bootc rebase ostree-unverified-registry:$IMAGE_PATH:latest
# Reboot to apply changes
systemctl rebootOnce you have validated the image, switch to the trusted, signed production image:
# Define the image path
IMAGE_PATH=ghcr.io/vincentvdk/apparatus-os
# Rebase using bootc
sudo bootc rebase ostree-image-signed:docker://$IMAGE_PATH:latest
# Reboot to complete the transition
systemctl rebootAfter the first boot, use the butler utility to initialize user-level configurations (Flathub, user-specific symlinks, and profile defaults):
# Initialize user-level environment
butler initAll development work occurs within isolated containers. This ensures that the host OS remains clean, lightweight, and immutable.
# Create a dedicated environment for a specific stack (e.g., Go/Kubernetes)
distrobox create -i ghcr.io/vinintvdk/apparatus-box:latest -n k8s-dev
# Enter the environment to run workloads
distrobox enter k8s-devThe build system is designed for high reliability in CI/CD pipelines.
- Containerfile.bootc: Uses a multi-stage build approach. A
deliverystage prepares the build context (scripts,.envfiles) before being mounted via--mount=type=bindinto the mainbootcbuild stage. - Dependency-Free Parsing: The
justfileorchestrator extracts versions fromapparatus.envusing standardgrep/cut, ensuring the build can run in any minimal container environment. - Automated Validation: Every build concludes with
bootc container lintandostree container committo ensure image integrity.
The documentation is built using Zensical. To build and view the docs locally:
# Build the documentation site
cp docs/zensical.toml . && \
podman run --rm -v $(pwd):/app:z -w /app docker.io/zensical/zensical build && \
rm zensical.toml
# Or build and serve with live reload using Zensical's built-in server
cp docs/zensical.toml . && \
podman run --rm -v $(pwd):/app:z -w /app -p 8000:8000 docker.io/zensical/zensical serve -a 0.0.0.0:8000Then open your browser to: http://localhost:8000