Building Aurora locally without GitHub
Understanding Aurora's Architecture
Aurora images are built from multiple repositories working together:
- ublue-os/aurora - Main image repository that orchestrates the build process and defines the final images
- get-aurora-dev/common - Aurora-specific configurations, ujust recipes, artwork, and customizations (built on top of projectbluefin/common)
- projectbluefin/common - Shared distro experience layer (ujust, MOTD, CLI config, etc.) used by both Aurora and Bluefin
- ublue-os/brew - Homebrew setup and configuration
The build process in ublue-os/aurora pulls these common layers as OCI containers. The get-aurora-dev/common image itself is built from projectbluefin/common as its base, creating a layered architecture.
Build Dependencies
Building Images
Clone the main Aurora repository:
git clone https://github.com/ublue-os/aurora
cd aurora
The Justfile at the root of the repo is used to build the images, here are some examples:
| Command | Description |
|---|---|
just build aurora | Defaults to latest main |
just build aurora-dx | Builds Aurora DX |
just build aurora-dx beta nvidia-open | Builds beta nvidia-open version of Aurora DX |
just build aurora stable nvidia-open | Builds nvidia-open version of the Aurora stable branch |
The general pattern is just build/run image tag flavor
- Images:
aurora,aurora-dx - Tags:
stable,latest,beta - Flavors:
main,nvidia-open
The build process will automatically pull the necessary OCI containers from get-aurora-dev/common (which includes projectbluefin/common) and ublue-os/brew during the build.
What Gets Built
When you build an Aurora image locally:
- The base Fedora Kinoite image is pulled from
ghcr.io/ublue-os/kinoite-main - OCI containers from
get-aurora-dev/commonare layered in (which includesprojectbluefin/commonshared experience layer plus Aurora-specific configs, artwork, ujust recipes) - OCI containers from
ublue-os/breware layered in (Homebrew setup) - Additional packages and configurations specific to the image variant are applied
- The final image is created in your local container storage
Rebasing to a Locally Built Image
For bootc to see the new image it has to be moved from users container-storage to the container-storage of the root user like this:
podman image scp localhost/aurora:latest root@localhost
sudo bootc switch --transport containers-storage localhost/aurora:latest
and lastly reboot into the new image
systemctl reboot
You can also add sudo before the just build commands, then you don't need to do the podman image scp part.
Testing Local Changes to Common Layers
If you want to modify and test Aurora-specific configurations (ujust recipes, artwork, etc.) locally, follow this workflow:
Step 1: Clone and Modify the Common Repository
git clone https://github.com/get-aurora-dev/common
cd common
Make your desired changes to the common repository files.
Step 2: Build the Common Container Locally
Build the common OCI container:
just build
This will create a local image tagged as localhost/aurora-common:latest (or similar, depending on the repository's build configuration).
Step 3: Modify Aurora's Containerfile
In your local ublue-os/aurora repository, you need to modify the Containerfile to reference your local common build instead of the remote one.
In the Containerfile in the root of the repository, find the FROM ${COMMON_IMAGE}@${COMMON_IMAGE_SHA} AS common line and change it to point to your local build:
-FROM ${COMMON_IMAGE}@${COMMON_IMAGE_SHA} AS common
+FROM localhost/aurora-common AS common
Step 4: Build Aurora with Your Local Common Changes
Now build the Aurora image:
cd ../aurora
just build
This will build Aurora using your locally modified common layer.
Step 5: Test Your Changes
Follow the Rebasing to a Locally Built Image instructions above to switch to your locally built image and test your changes.
Step 6: Iterate
If you need to make more changes:
- Modify files in the common repository
- Rebuild the common container:
cd ../common && just build - Rebuild the Aurora image:
cd ../aurora && just build - Rebase to the new local image
Contributing Your Changes
Once you've tested your changes locally:
- For Aurora-specific features (configurations, artwork, Aurora ujust recipes), submit a pull request to get-aurora-dev/common
- For shared features that affect both Aurora and Bluefin (base ujust recipes, MOTD, CLI config), contribute to projectbluefin/common
- For Homebrew-related changes, contribute to ublue-os/brew
- For changes to the Aurora image itself (package lists, build scripts), contribute to ublue-os/aurora
Remember to revert any Containerfile changes you made for local testing before committing to the Aurora repository.
Testing Without Building an Image
Changes that don't require a reboot
Makes /usr writable for the duration of this boot, this is usually good enough for most things
sudo bootc usroverlay
Use dnf /make whatever modification to /usr
sudo dnf -y downgrade somepackage-6.9.1-1$(rpm -E %{dist})
reboot to undo any changes you made after the overlayfs on /usr is mounted
Changes that persist after reboot
Could be useful for firmware downgrades or triaging bugs that only happen on shutdown etc.
sudo ostree admin unlock --hotfix
This will make the current deployment writable and will make it work like any other deployment as well
rpm-ostree status
● ostree-image-signed:docker://ghcr.io/ublue-os/aurora-dx:stable-daily
Digest: sha256:4d08e32db51d634eb6fa1cf27e8472de074db783aee5c89849899e00c36c4b59
Version: 42.20250630 (2025-06-30T04:54:48Z)
Unlocked: hotfix
sudo dnf -y downgrade atheros-firmware-20250311-1$(rpm -E %{dist})
To get rid of the writable deployment you can either just (wait for an) update and it will get cleaned up eventually or you boot into the previous deployment from Grub and run:
rpm-ostree cleanup --pending