Skip to main content

Bluefin's Sausage Factory

· 11 min read
Jorge O. Castro
Director of Dinosaurs
RELEASE SOUNDTRACK TO HUNT BYThe Forbidden Factory

If you want to understand how a modern Linux distribution is made, you eventually have to look at the "sausage factory" - the intricate pipeline of code repositories, build systems, test suites, and orchestrators that turn raw source files into something you can boot on physical hardware.

Supakeen posted The Fedora 45 Sausage Factory, and the curtain was pulled back on Fedora's use of dist-git, Koji, Bodhi, Pungi, and openQA to make Fedora.

People are asking "what's the equivalent of this in Bluefin?" Most of this stuff sounds like a Pacific Rim sequel, so let's take a look. We are currently in the process of moving away from our own legacy sausage factory to Bluefin's final destination: Kubernetes.

  • projectbluefin/common: The shared "org brain" containing system configurations, desktop defaults, documentation, and foundational OCI layers. When most of you think "Bluefin", it's in here.
  • Image repos (bluefin, bluefin-lts, dakota): Derivative image definitions that consume common and layer specific desktop experiences or lifecycle variants.
  • Instead of spec files and tarballs, Bluefin's definitions rely on Containerfile directives and declarative package manifests. But in some cases you may still find a vestigial inline package install in a script.

Under the Hood: The OCI Toolchain

I've read comments on Reddit that think that all of this is GitHub-specific. GHA is there because we're lazy. At the end of the day, all of Bluefin is locally buildable on any service. And on any OS: you can build Bluefin on Macs and Windows too. Each repo has its own Justfile covering different tasks.

The entire point of cloud native is that you should be able to build the thing anywhere. If you get confused by "cloud native", try to remember "API Native" instead. Let's look at some standard OCI things:

[ git ] [ buildah ] [ podman ] [ skopeo & bootc ]
Declarative Config ---> Daemonless Layer ---> Local Execution ---> Registry Transport
& Tracking Composition & Inspection & Host OS Deployment
  • git: Tracks everything. This is the single source of truth. This is called declarative config and has all the config files.

Linux distributions talk about "rolling vs. stable" - this doesn't make sense in modern Linux. The entire thing is a git branch. It's what you choose to ship.

You need to ship the entire git branch. That means releases AND rolling tags, feature branches, testing branches, "test this crazy thing here temporarily branches", all of that. git is fully open source and not under the control of any single vendor. When the Bluefin factory is cooking things that used to take months now take hours:

Fastfetch terminal output showing the Dakota NVIDIA gaming image and OGC gaming kernel
OGC Gaming kernel and stack on Bluefin Dakota
  • buildah (Daemonless Builder): Assembles container layers statelessly without requiring a background daemon or root privileges on host runners. buildah is a CNCF Sandbox project and not under the control of any single vendor.

  • podman (Local Validation): Enables local parity. Developers can run podman run locally to inspect built layers before pushing code. podman is a CNCF Sandbox project and not under the control of any single vendor.

  • skopeo (Transport & Tags): Handles low-level OCI manifest operations - copying images directly between registries, inspecting layers, and managing release tags. skopeo is a CNCF Sandbox project and not under the control of any single vendor.

  • bootc (Target Deployment): Bridges standard OCI container images directly to the target machine's disk. It handles kernel handoff, transactional filesystem updates, and automatic rollbacks. You're not going to believe it ... bootc is a CNCF Sandbox project and not under the control of any single vendor.

Practical Walkthrough: Adding an Application

Let's add a new application. Let's say the control panel we've all been missing. Brian Ketelsen, Father of Bluefin and now control panel connoisseur has blessed us with this:

ChairLift applications screen showing Flatpak and Homebrew management
ChairLift’s Applications view.
ChairLift maintenance screen showing Homebrew and Flatpak cleanup tools
ChairLift’s Maintenance view.
ChairLift updates screen showing Flatpak and Homebrew updates
ChairLift’s Updates view.

He's been rolling with this in his custom image. And if you're like me you probably want that thing right now. Here's the Git repo. Not distribution specific either, Brian's images are based on Debian. See how weird it is to classify things the old way? Who cares. It doesn't even ship on the image it ships in homebrew lol.

In Bluefin, adding an application comes down to choosing where the change belongs in the repository tree:

Option A: At the Shared Level (projectbluefin/common)

This is 95% of it. Someone saw a new app in Flathub and wants to feature it, or we need to swap out a component when an app gets deprecated, etc. Chairlift will go here.

  • Contributor: edit a central Brewfile (for Homebrew CLI utilities or Flatpak desktop apps).

Option B: At the Image Level (bluefin, bluefin-lts, dakota)

  • Contributor: edit an image-specific build script (e.g., build/10-build.sh executing dnf5 install -y <package>) or a bst definition file.

This is usually system-level stuff, or may be things the user doesn't see that we deal with. For example, NVIDIA drivers on all three are installed differently. Or if your hardware acceleration breaks, etc. Anything that touches the metal, like that OGC kernel.

Change Processes

We have a lazy consensus model - in the early days of Universal Blue we had full-blown specs and it looked similar to what you see in Fedora today. These days you can file a bug in common and if maintainers have consensus, we do it.

This can cause friction for new users who do not understand Bluefin's mission. An open process doesn't mean a free-for-all. It also means we force work OUT of the org. For example, in Dakota we'll be prototyping zswap configs, but -

However, the entire process is in the air. Six months ago I would have told you, "if you didn't file a bug, I don't care; you didn't put in any effort, so I won't either." Now I can point an agent to my entire Discord and slurp out months of people's actual bugs and get actionable feedback.

This is why IMO the best thing we could invest will be ujust report. We make it easier for people to submit their technical data, opt-in. But that is a post for another day!

Two Eras of OS Engineering

Fedora's sausage factory is a masterclass in classical Linux release engineering. But we are a small project and cannot afford such complexity.

And then you would say, "But Bluefin is Fedora/CentOS, you can't make Bluefin without it." And you'd be right! And then the other half of the room would say, "Listen to the k8s guy talk about complexity!" And they would also be right!

The last bit is BuildStream, which effectively replaces just about everything in that Fedora diagram with a single, simple CLI tool. BuildStream is hosted at the Apache Foundation.

The Final Shape

Shove your Linux dreams in git

If you're a developer, the entirety of your existence lives in git.

  • Anything you want, any version you want, we're going with GNOME OS versions first
  • But then add things like OGC kernels, nicer Mesa, etc. We're finishing up the Dakota gaming image now and there will be a nice GUI to make all of your lives happier.

This is GitOps, so forking, etc. is encouraged. Pretend you can get a Bluefin for every possible iteration (because you can!) Some of you will think this is about images, but most of you will do the smart thing and swap out Brewfiles and "top 10 kickass Flatpaks" and so on. Both of these ecosystems are distribution-agnostic.

A vendor-neutral, well-maintained toolchain makes your dream real

You know when I say "distroless", "cloud native", "the Kubernetes moment", and all of that stuff? And then people laugh? This is what I mean. Moving away entirely from the concept of distribution tooling to commodity tools.

It's down to git, bst, and bootc. BuildStream can output your dream in one go. THE ENTIRE MIDDLE PART GOES AWAY. No intermediary format - it goes right to a format that we can run tests on, scan, etc. You don't need "distro builders"; you just need normal containers!

I could give a sysadmin these three tools and a laptop with the right creds and publish Bluefin, and none of you would notice.

The DevOps Part

So on the one hand, we have The Final Shape. It's clear what I think: we optimize for correctness in Linux first, your shitty VPN RPM be damned.

What Fedora Hummingbird brings to the table is to take all of that operational knowledge Fedora has, and then bring THAT into the container-native space. They are, after all, building a Linux distribution.

Which is also why we say we're not a Linux distribution. Dakotaraptor was born into cloud native. It will never have to deal with COPRs or akmods or any of that stuff. It will just have what it needs with a handful of tools and infrastructure.

I would argue our appeal is that we start from the success of Kubernetes. I have now experienced BuildStream with Buildbarn and Kubernetes.

  • From a technical perspective, it excels at everything we need it for and I have yet to see anything even in the same ballpark.
  • From a cost perspective, it's unbeatable. Every infrastructure provider in the world sells K8s, and everyone's laptop has podman.
  • Contributors

That last one. Millions and millions of developers know this tooling already. This is a great opportunity to meld the distribution processes with new people coming in at Hummingbird Factory level.

Our message to contributors remains the same. Use the tools everyone else is using - bias towards trusted vendor-neutral organizations. I have annoyingly pointed out which of these tools are hosted by the CNCF and the Apache Foundation. This is what "Cloud Native Linux" is.

This is not a dunk

I liken Fedora to last year's McLaren. When it comes to traditional Linux distros, you'd have a tough time beating Fedora. And just about everything you hate about it has nothing to do with the tech and probably the policies.

This is why Fedora Hummingbird's factory is appealing to me. As you can tell, I can't shut up about it.

But things change, and every year the users demand the spectacle. Fedora Hummingbird is a ton of well-funded enterprise tech - they've got wind tunnels, an awesome factory, engineers fighting to be the best. Inserting all of that Fedora operational DevOps knowledge into a modern Hummingbird design would slay.

Fedora Hummingbird is built with this same collection of CNCF and Apache projects. Combined with other open source projects, many of which are controlled by a single vendor, but have years of enterprise pedigree with billions of dollars worth of ecosystem to show for it.

Loop closed ...

Mastery of these tools is in high demand. Even if you skip all of the operating system parts, all of these skills are useful for much more. The desktop is but a sliver of places you'll find these tools.

Some will grab RPMs and debs, some will grab bst. All will need Kubernetes.

We should encourage this, all in the name of sport! Sharing about 95% of the tooling and the people. Let's not forget that Ubuntu's putting in some great laps!

Why Bluefin is all in on agentic development

· 2 min read
Jorge O. Castro
Director of Dinosaurs

Is AI good or bad for open source? This is 58 minutes of me explaining what I've learned on this.

If you're here for the hot take: Are we really all on the same side? There are two worlds in Linux. What reddit/masto/youtube thinks "Linux" is. And then how Linux actually is.

Our value to our users is that we give you Linux as designed by the professionals. The flex is leveraging the collective knowledge of the community. New users have been led to believe that shipping three-year-old kernels and old software is the right way to consume Linux. Good luck with that. When it comes to my Linux, we listen to Lennart. We do listen to GNOME developers. Linux is about choice. We choose a well-designed system and thank the UNIX gods every day that we don't have to deal with that stuff.

We choose not to let people dictate to us how to use our computers. The science is out. The experts have spoken. I've been fortunate to have access to Greg K-H during his time, and we spent a long time discussing how this affects our communities. And he's right. The damn things are finding bugs. And I'm tired of Linux's bullshit. And I mean that in a loving manner. 90% of this crap is passing a 0 or 1 to some silly argument because Asus hates you.

We've got new territory to explore and we're moving quickly. My lesson from six months of AI is "Seven Days to the Wolves". Where will we be when they come? I've been doing this job a long time and it took me fifty-eight minutes of Puerto Rican mansplaining and a cloud-native symphonic metal musical to explain it. LOL.

clankers

Five Years of Bluefin

· 15 min read
Jorge O. Castro
Director of Dinosaurs

First let's celebrate. It's five years of Bluefin and Universal Blue! Thanks for riding with us. Starting later this year you can join Bluefin, Rafael, and the rest of cloud native as Bluefin comes to your hands.

We're proud to announce Seven Days to the Wolves, a comic and musical series set in an alternate future where Maintainer-Guardians fight alongside users for survival. We hope to expand this into the world's first cloud-native musical to be performed live at KubeCon (We have goals!).

In the meantime, enjoy this multi-hour metal maelstrom of death and destruction. #stopjohnbazzite

BLUEFIN: SEVEN DAYS TO THE WOLVES

Will you be ready when they come?

Parts of the story will be dropping over the next few years and will star some of your favorite OSS heroes!

Bluefin Server showcase with the Seven Days to the Wolves player

The Great Migration

We're in the process to moving to the factory to build Bluefin. This process is opt in and will be a transparent to most of you. The TLDR is you'll see your image name change from gchr.io/ublue-os/bluefin to projectbluefin/bluefin.

It's midsummer so not a bunch of changes on the images. We'll work on this in 2H2026 so for now there's no need to worry, just chill and enjoy your Linux!

Bluefin

Bluefin

Let's start with Bluefin.

The new Bluefin is a tad smaller. We're dropping the dedicated DX images, everything we support is in brew now and is operating system agnostic. We aim to ship the most popular developer environments in cloud native and hope you give us feedback on things. ujust devmode is the CLI and remains unchanged.

Don't expect many changes here other than moving to sealed images at some point. projectbluefin/bluefin:next is in place if anyone wants to start working on that.

Anyone who is interested in driving forward with the Fedora base images is encouraged to work here. This is also the first time this Bluefin has an aarch64 version!

Bluefin LTS

Bluefin Achillobator

Bluefin LTS has also moved over to the factory. Bluefin GDX users have been moved here already. Nothing to report, though we turned off the ISO downloads to the old versions so people don't get confused. Once everything is set here we'll relaunch new ISOs.

Not much to say here, I'm mostly here for the fuzzy brown guy. Bluefin GDX has been retired as an image, the proper Nvidia tools are on the nvidia images themselves, and most of what was "GDX" is now in userspace with brew and containers, enjoy!

Dakota

Bluefin Dakosaurus

Dakota is our latest and most sophisticated raptor, featuring the cutting edge of Linux desktop development. It's built from GNOME OS using BuildStream.

Most of the work I've been involved with this cycle has been working on this. (And failing lol). Ahmed and Jordan just got the builds online and we'll probably do another alpha later this month. Things are really great here and I spent some time with the GNOME OS and systemd folks in Berlin this summer to ensure we're on the right track.

James and I worked on the ISOs this cycle, and we finally have one unified ISO that covers Nvidia/AMD/Intel on one ISO. Needless to say this is my raptor of choice and I'm hoping to play with more builds this weekend. Once the builders are up I'll start work on Bluefin's "game mode", offering the very best of OpenGamingCollective's tech.

Bluefin and The Forbidden Factory

The "factory" is a culmination of everything we've been building. I guess it'd be the equivalent of "Universal Blue 4.0". It's simultaneously the most important change in Bluefin's history, and the most invisible! Also spoiler alert it's the second comic!

It's a combination of the server OS, FSDK containers, Kubernetes, Argo, BuildStream with Buildbarn, and everything you need to build Bluefin "on the spot". Basically, instead of "the OS" consider the entire toolchain "the product". Unlike the old methods, this new factory is all about leveraging clankers and putting them to work effectively via hive.

Bluefin dinosaur group

The Factory is a result over about a year of convergence with many groups. We've assembled GNOME 50 desktop tests and have started work on KDE. We test everything in this thing. Each test runs through a full suite. Checks everything, network, apps, and other functionality. We can finally automatically test everything and then post a screenshot at the end of the test.

Fully automated testing

The screenshot you see on the Bluefin releases will be the real release on your computer. Every default app will be tested and will have evidence backing it up. If a e2e test doesn't pass, no Bluefin that day. Computer running weird? Run ujust report and submit the issue and a clanker will go figure that crap out. Life's too short.

And not just Bluefin. We're throwing everything at this thing. Aurora, Bazzite, Fedora Silverblue, Zirconium, GNOME OS. Every time there's a published image we run a battery of tests on it. We are not yet doing visual recognition - this is to catch visual regressions. Right now we're just hoping someone on a testing build is paying attention. It's encouraging to see members from bootc and the UAPI Group working in this space. The idea is to have a completely manageable, reproducible, and sovereign system to run everything, not just a few desktop images.

The Factory dashboard is one of the best ways to see whether an image is actually ready to ship. This is meant to expose more broken things before they reach you. Check out the Hummingbird public meeting this Thursday, where I hope to present on the components in more detail!

I'll also be doing a complete factory tour and explaining our experiences with agentic development. I look forward to moving faster here! I spent a good deal of time on the charts:

Factory snapshot · July 20, 2026 snapshot

The dashboard is live, so those numbers will move after this post ships. The Factory dashboard and its underlying data are the sources for this snapshot. We'll continue to add information here over time!

Freedesktop SDK Containers (Alpha)

Every factory needs purpose-built containers. Since the goal is a fully offline, self-contained build system, we built our own — carved from freedesktop-sdk components using the distroless playbook. 90% of "distroless" is deleting all the docs and not providing shells. We're able to do this quite easily with BuildStream

BuildStream is amazing

I was able to make a mostly functional OS in about 45m with BuildStream. Bluefin will continue to move in this direction since it's clearly got the community momentum we're looking for.

The current images range from a ~40 MB distroless base (glibc, coreutils, CA certs, tzdata) up through distroless Python, Buildah, and Skopeo variants. I also made an omnibus lab-runner with kubectl and a few other tools in one convenient package and a shell for ops work. Two prototypes are worth calling out:

Homebrew nspawn container — a Homebrew developer environment packaged as a systemd-nspawn machine image rather than an OCI image. The systemd folks think this approach is worth investigating, and this is the result of some beer drinking in Berlin. I haven't tried it yet but if you're one of those distrobox-adjacent folks it might be interesting for you.

All images are keyless-signed with Sigstore Cosign and include BuildStream-native SBOMs. Tags track the FSDK point release. The actions are easy to copy — fork and go, no key wrangling required. I am finding the base images to be quite good, and in general I find the fsdk containers to be a nice alternative to Chainguard and other distroless images. For us the benefits are simple, these are the same libraries as the operating system so it doesn't cost us much to make these.

Bluefin Server (Alpha)

Bluefin Server v25.08.13 targets the same space as Flatcar Container Linux, Fedora CoreOS, and Talos — but is built from scratch with BuildStream 2 from freedesktop-sdk components. This one was kind of an accident. I needed a server OS for the new homelab and there wasn't an easy way to get a newer kernel in Flatcar. Since we have BuildStream, making this was pretty straightforward. This is basically the Dakota setup without the desktop.

The OS payload is a compressed XFS DDI filesystem deployed by an offline, systemd-native installer. This is using systemd's new interactive installer. Burn it to disk and run through it and then you're done.

Key properties:

  • DDI image-based updates with atomic rollbacks via systemd-sysupdate
  • Minimal, distroless rootfs — going to shoot for no shell by default with a GUI but we'll see how far we get on that
  • k3s for kubernetes available as a systemd-sysext
  • GPG-verified SHA256SUMS, BuildStream-native SBOMs, keyless signing throughout, all that crap
  • Currently on the GNOME Desktop kernel but I am shopping around, since we're using UKIs swapping out kernels is easy

Alpha 1 is live. Beta comes after the 26.08 FSDK bump next month. KubeStellar dashboard integration is in progress but not ready yet.

Testsuite: Full Desktop and Image Coverage

Bluefin's automated test suite is the quality gate between an image build and promotion. It runs headless Wayland desktop sessions in QEMU on standard GitHub Actions runners and can be supplemented with any hardware.

What it covers

Here's what we've got working on so far. Shoutout to Christian Schaller at Red Hat for guidance:

  • smoke — core GNOME, Settings, MIME handlers, accessibility, desktop identity, Orca, input methods, keyboard layouts, XWayland, ScreenCast, screenshot portals, Online Accounts, and printing
  • common — portable SSH health checks for Flatpak, portals, polkit, shell behavior, immutability, and system health
  • vanilla-gnome — upstream GNOME OS baseline
  • developer — Homebrew and Ptyxis on developer variants
  • dx — VS Code, distrobox, JupyterLab, and mise
  • software — Bazaar app-store behavior and Flatpak CLI health
  • lifecycle — bootc upgrade, rollback, and migration
  • security — Cosign signature verification
  • hardware — udev rules and emulated peripherals
  • bazzite — Bazzite-specific extensions
  • flatcar — Flatcar OS boot and lifecycle

The smoke and common suites are designed to run against any GNOME bootc image so feel free to take it for a spin.

How it works

  • Behave runs the Gherkin scenarios and step bindings
  • qecore-headless bootstraps the Wayland and D-Bus session
  • Dogtail drives the accessibility tree through AT-SPI
  • gnome-ponytail-daemon provides coordinate injection for Wayland
  • GNOME Shell Eval handles the GNOME 50+ top-bar fallback
  • Shared SSH steps assert system state from outside the VM
  • Dynamic suite sharding distributes large smoke and common runs
  • Coverage counts and screenshots publish to the Live Build Health Dashboard

We'll continue to expand it as some tests are better than others.

Reusable integration

Image projects can call the reusable e2e.yml workflow or the gnome-e2e@v1 composite action with an OCI image, selected suites, a test ref, optional native-app skipping, Flatpak screenshot IDs, zstd:chunked coverage, VM memory, CPU count, and disk cleanup. The suite also provides reusable ISO validation for downstream projects. None of this has been tested outside of myself so if you're diving in get ready to get dirty!

Local development uses Python 3.14 with behave, qecore, and dogtail; full GUI runs require a live Wayland and AT-SPI session. The repository includes Argo and KubeVirt plumbing, a coverage dashboard, Codecov reporting, Flatpak caching, and the container images used by the test jobs. (The whole enchilada!)

Does this mean I'll get less bugs?

Yes and no. Most of these aren't blocking yet. A few of them catch issues you've reported in old-bluefin. Some of them give us capabilities we've never had, like mass upgrade testing.

If we had perfect Linux tests no one would ship because the entire desktop stack is a tyre fire lol. However with better, more automated testing we can get to where we need to be!

Suncatcher

Bonus wallpaper from Natalia and Delphic!

Suncatcher artwork from Seven Days to the Wolves

The Lab, Actions, and Finpilot

projectbluefin/lab is the "everyday" part of the lab. It contains everything I am running in the homelab to test Bluefin, etc. It runs image and ISO tests in KubeVirt, handles graphical checks on the lab hardware, and collects screenshots and results that can be attached to a build. That lets us validate the thing people actually install, not just the container build that produced it. These tests are additive and listed on the website.

We're adding these as gates, which means when a contributor merges something it will land in a testing branch. Then as part of the release processes all of these tests run. The lab repo is for people who want to add their homelabs to help with Bluefin. It's messy in there, but if you know K8s, help is always wanted!

The intent is for these to be driven by GitOps, which means no access control or people connecting to remote servers, your agent either opportunistically finds work or is assigned work from hive. Lab repo

projectbluefin/actions is the shared build layer behind the factory. Repositories can use the same workflows for bootc image builds, multi-architecture publishing, signing, SBOMs, and release metadata instead of each project inventing its own supply-chain plumbing. This is the sort of infrastructure that is invisible when it works, but it is what makes the rest of the factory repeatable. These actions are all new and heavily centralized, so if you want your custom image to use the latest tech, check out this repo.

finpilot is still there and now has a new maintainer! This hasn't been integrated into the factory but it's working pretty great. finpilot repository

Merch

The Bluefin store has a couple of especially good ways to rep Bluefin. All of the proceeds go towards artwork, and the kid's shirt is priced the lowest we could make it.

Bluefin Women's Rawr shirt

Bluefin Women's Rawr

Stabby stabby stabby - a relaxed-fit everyday tee with a little more raptor energy.

Shop the shirt - $16

What's next

Bluefin Utahraptor

The 26.08 FSDK release is next month and Dakota's looking to move to beta so there's plenty to do. In the meantime enjoy your day and rock out to some Wolves metal! Then we cycle into Fall.

As always thanks for joining us and keep on rocking! Feel free to ask questions, we covered a ton!

Organizational Migration for Bluefin LTS/GDX

· 4 min read
Jorge O. Castro
Director of Dinosaurs

Hello guardians,

We're starting the transition away from ublue-os/bluefin and bluefin-lts to projectbluefin. This is part of the move to factory.projectbluefin.io. I'll have more details over the next few days. It's our fifth birthday on July 21st so in a way we're kinda relaunching Bluefin. I hope to post updates between now and then so that we can party after.

tldr: GNOME 50, newer kernel support, cleaner OCI layers, NVIDIA as a proper separate image, no more -dx/-gdx images, all userspace baby! You don't do anything but hang out.

LTS and GDX users, this one's for you, the rest of you will come later. GDX's builds have been struggling so you're going first. Thanks to those who tested; we found real issues that have helped the project.

Upgrade Instructions

ublue-os/bluefin-ltsprojectbluefin/bluefin-lts

The biggest change is image consolidation, DX/GDX images have been merged:

  • "Bluefin DX" will be moving off of images and into userspace with ujust devmode, if you're missing anything please file an issue.
  • "Bluefin GDX" will also be moving to userspace with "ujust aimode", but this doesn't exist yet.
  • aarch/amd64 all across the board, even ARM/Nvidia hell yeah! (It's Ampere time!)

We're also adding hooks for the IDEs/tools in Bazaar to highlight some of these. So instead of images these will just be modes you can add on. One of the reasons we were struggling with GDX is the GitHub runners didn't have enough space/resources for something so large.

CUDA can now just be consumed via containers - the ujust aimode will look just like the developer mode but we'll have options for pytorch, etc. If you're on an AMD machine you might have seen the preview in bctl

ugly

Wow that's ugly! Now you see why we hid it, but you get the idea, start thinking of bundles. bctl is short for bluefin control but probably won't expose it, centralized just is just too good.

OCI Things

These images use chunka to create smaller layers, and LTS was already svelte. This brings us in full upstream alignment with bootc.

  • Signing: We moved from keys to Keyless OIDC (Fulcio/Rekor), ensuring that my shame will live on in the past. This is nice for custom image builders too, no more pub key in your root and pasting in github secrets to get going. Savage. Not fully implemented yet, but still working on it.
  • SBOM: Each image has full SBOMs etc, I'm still working on these, but both of these steps are modelled after proper usage according to upstream. The docs, website, and ujust changelog will source from these if they aren't already.

The end state is any version of anything that you see on the website should be what's on the latest image and not manually updated.

Kernels

No one was using vanilla Bluefin LTS (who wants to use 6.12 lol) so we've consolidated everything onto Fedora's kernels

Other

  • GNOME is now 50 across the board
  • :testing branches will land all code, if you're a nerd hop onto these
  • These images are a huge improvement, especially with our testing suite (more info later), however you will for sure find cosmetic issues since we tend to ignore those until the end lol.
  • Please use ujust report, even for minor issues!

Migration Schedule

Legacy ImageAuto-Migrated?TargetStatus
ublue-os/bluefin-gdx:ltsYes, automaticprojectbluefin/bluefin-lts-nvidia:stableCanary rolling out now
ublue-os/bluefin:ltsSoonprojectbluefin/bluefin-lts:stableAfter canary validates
ublue-os/bluefin:lts-hweSoonprojectbluefin/bluefin-lts:stableAfter canary validates
ublue-os/bluefin-dx:ltsSoonprojectbluefin/bluefin-lts:stableAfter canary validates
ublue-os/bluefin-dx:lts-hweSoonprojectbluefin/bluefin-lts:stableAfter canary validates

Feel free to ask questions!


Source Discussion

GitHub Discussion #4802

Juravenator June 2026

· 165 min read
Project Bluefin
Automation & Factory
Total Items849 (152 planned, 697 opportunistic)
Automation39.4% (551 bot PRs out of 1400 total PRs)
Contributors16 total, 0 new

Desktop

area/gnome area/aurora area/bling

GNOME desktop environment, Aurora variant (KDE), and terminal enhancements

Planned Work

  • fix(motd): build umotd from source, move to shared layer, remove legacy ublue-motd by @​castrojo in #744
  • fix(ux): toggle-user-motd exits 0 when user declines and fix fall-through by @​castrojo in #662
  • fix(ujust,gnome): fix changelog repos + LTS support + BT auto-switch by @​castrojo in #543
  • fix(gnome): open documentation link as local PDF with browser fallback by @​castrojo in #637
  • test(bling): add bats coverage for bling.sh by @​castrojo in #629
  • test(scripts): add bats coverage for ublue-motd and profile.d scripts by @​castrojo in #628
  • chore: simplification audit — remove dead weight, harden edge cases by @​castrojo in #569
  • feat(ghostty): add GNOME profile for new users by @​castrojo in #548
  • feat(fonts): set Adwaita Mono as default monospace, move opendyslexic to Homebrew by @​castrojo in #547
  • feat: replace logomenu with custom-command-menu extension by @​castrojo in #514
  • fix: add help: URI handler to redirect to GNOME help website by @​castrojo in #509
  • fix(bling): skip brew bundle when bluefin-cli disables bling by @​hanthor in #362
  • feat: replace old MOTD with umotd by @​castrojo in #489
  • fix(#266): drop monospace-font-name override — use GNOME default (Adwaita Mono) by @​hanthor in #348
  • fix: remove Readymade installer from dock favorite-apps by @​hanthor in #353
  • feat: switch to ublue-os/aurorafin-shared by @​renner0e in #395

Opportunistic Work

  • feat(brew): move CLI tools to brew-preinstall, remove starship image binary by @​castrojo in #554
  • fix(ci): remove stale che/nerd-fonts COPR check by @​castrojo in #502
  • feat(fonts): remove font RPMs and nerd-fonts COPR from OCI image by @​castrojo in #476
  • fix: migrate custom-command-menu dconf to command1..N tuple format by @​castrojo in #348
  • feat(build): add extension-builder stage to avoid build deps in final image by @​castrojo in #333
  • security: verify starship binary checksum before extraction (CWE-494) by @​castrojo in #173
  • fix(e2e): pin testsuite test_ref and restore shell defaults by @​castrojo in #337
  • feat(fonts): remove jetbrains-mono-fonts-all from OCI image by @​castrojo in #144
  • fix(packages): remove che:nerd-fonts COPR install by @​castrojo in #79
  • fix: migrate custom-command-menu dconf from entryrow* to command1..N tuples by @​castrojo in #76
  • fix(ci): use epel-10 chroot for jreilly1821/c10s-gnome-50 COPR URL by @​castrojo in #55
  • fix(hive): hero font rendering + more sparklines by @​castrojo in #919
Dakota (GNOME OS Prototype)
  • feat(fonts): remove jetbrains-mono from image, manage via Homebrew by @​castrojo in #763
  • fix(gnome-ponytail-daemon): use systemd.bst for systemd.pc pkgconfig by @​castrojo in #725
  • feat: add gnome-ponytail-daemon to image by @​castrojo in #618

Development

area/dx

Development tools and IDE integrations

Planned Work

  • feat(dx): add tuna-os/Tavern flatpak to DX mode by @​castrojo in #792
  • feat(bluefinctl): wire ujust recipes to bctl + move caffeinate to profile.d by @​castrojo in #730
  • feat: rewrite toggle-devmode to be standalone DX mode by @​castrojo in #545
  • fix(dx): move vscode extension installs to Brewfile by @​castrojo in #635

Opportunistic Work

Homebrew

Package Updates

Production Tap Experimental Tap

36 automated updates this month via GitHub Actions. Homebrew tap version bumps ensure Bluefin users always have access to the latest stable releases.

Quick Summary
TapUpdates
production-tap30
experimental-tap6
View all production-tap updates (30)
PackageVersionsPR
lm-studio-linux0.4.16 → 0.4.18 (4 updates)#474
visual-studio-code-linux1.122.1 → 1.125.0 (4 updates)#465
antigravity-cli-linux1.0.4 → 1.0.9 (4 updates)#462
goose-linux1.37.0 → 1.39.0 (3 updates)#471
1password-gui-linux8.12.22 → 8.12.24 (2 updates)#461
rog-control-center-linux6.3.8#438
asusctl-linux6.3.8#436
framework-tool0.6.4#425
jetbrains-toolbox-linux3.5.0.84344#426
antigravity-linux2.0.6#429
antigravity-ide-linux2.0.4#432
View all experimental-tap updates (6)
PackageVersionsPR
zed-linux1.5.3 → 1.7.2 (4 updates)#452
emdash-linux1.1.27#434
craft-agents-linux0.10.1#437

Ecosystem

area/brew area/bluespeed area/flatpak

Homebrew packages, AI/ML tools (Bluespeed), and Flatpak applications

Planned Work

  • fix(nvidia): update system flatpaks when rebooting into new nvidia image by @​castrojo in #769
  • fix(flatpak): refresh appstream on every boot instead of firstboot only by @​castrojo in #767
  • feat(oem): add Framework brew hook for framework_tool and wallpapers by @​castrojo in #753
  • fix(brew): move bluefinctl.Brewfile to shared so all variants get bctl by @​castrojo in #750
  • feat(bazaar): add Collabora + Spelling Bee + Whisp, refresh curation by @​KiKaraage in #731
  • fix(brew): fix Homebrew 6.0 breakage across brew lifecycle by @​castrojo in #728
  • chore(brew): remove bbrew, bluefinctl replaces it by @​castrojo in #729
  • fix(brew): remove aichat + whisper-cpp, update agy + kimi-code by @​KiKaraage in #715
  • fix(brew): Unblock system-cli & CNCF brewfiles validation by @​KiKaraage in #721
  • feat(oem): move Framework/Ampere hardware hooks and icons to common by @​castrojo in #672
  • fix(brew): trust ublue-os taps for Homebrew 6.0 compatibility by @​castrojo in #695
  • feat(oem): add ASUS hardware auto-install hooks by @​castrojo in #692
  • test(brew): add brew-preinstall bats tests, codecov, and sync test recipe by @​castrojo in #693
  • feat(brew): add brew-preinstall service and system-cli.Brewfile by @​castrojo in #664
  • feat(just): add ujust install-asus for ASUS laptop tools by @​castrojo in #503

Opportunistic Work

  • chore(oem): remove Framework brew hook now in common by @​castrojo in #670
  • feat(brew): move CLI tools to brew-preinstall by @​castrojo in #205
  • fix(cask): vsc-insiders versioning and vscodium linting by @​nklowns in #450
  • fix(casks): revert arch-conditional sha256 in on_linux block, as breaks brew bump by @​nikodunk in #424
Dakota (GNOME OS Prototype)

System Services & Policies

area/services area/policy

Systemd services and system-level policies

Planned Work

Opportunistic Work

  • fix(countme): replace broken rpm-ostree-countme with dnf5-based service by @​castrojo in #326
  • fix(services): enable rechunker-group-fix.service to prevent boot failure by @​castrojo in #133
Dakota (GNOME OS Prototype)
  • feat(bluefin): add Incus daemon, systemd integration, and ujust recipes (2/2) by @​bketelsen in #1126
  • fix: wire firstboot-services.bst into deps.bst (#603) by @​hanthor in #608

Hardware

area/hardware area/nvidia aarch64

Hardware support, drivers, NVIDIA GPU, and ARM64 architecture

Planned Work

  • fix(framework): migrate hid_sensor_hub karg to bootc toml by @​castrojo in #793
  • test: add unit tests for check-oci-refs, bazaar-hook, hardware hooks, and nvidia-flatpak-sync by @​castrojo in #785
  • feat(oem): add WirePlumber hardware profiles for Framework Desktop AMD Ryzen AI Max 300 by @​castrojo in #760

Opportunistic Work

  • fix(akmods): add --tmpdir /boot to dracut call to fix EXDEV on nvidia builds by @​castrojo in #586
  • feat(nvidia): install nvidia-container-toolkit-base and configure CDI by @​castrojo in #559
  • test(build): add BATS unit tests for 04-install-kernel-akmods.sh by @​castrojo in #548
  • fix(ci): rename nvidia-open flavor to nvidia by @​castrojo in #434
  • feat(build): conditional initramfs rebuild — skip dracut when kernel unchanged by @​castrojo in #362
  • fix(ci): gate nvidia-open promotion on e2e smoke test by @​castrojo in #296
  • feat: release notes redesign — variants table, dual kernel, richer components by @​castrojo in #376
  • feat(ci): rename bluefin-lts-nvidia → bluefin-lts-hwe-nvidia by @​castrojo in #293
  • fix(kernel-swap): run depmod after noscripts install to fix dracut modules.dep error by @​castrojo in #268
  • fix(kernel-swap): use tsflags=noscripts + explicit dracut to fix EXDEV by @​castrojo in #263
  • fix(kernel-swap): sync ENABLE_GDX → ENABLE_NVIDIA to unblock squash promotion by @​castrojo in #249
  • fix(kernel-swap): use dracut.conf.d instead of DRACUT_TMPDIR to fix HWE EXDEV by @​castrojo in #248
  • feat: rename bluefin-gdx to bluefin-lts-nvidia, add :stable alias by @​castrojo in #225
  • feat(nvidia): wire CDI configuration for rootless Podman GPU passthrough (GDX) by @​castrojo in #209
  • fix(build): re-add DRACUT_TMPDIR=/boot workaround for kernel-swap by @​castrojo in #174
  • fix(gdx): remove libnvidia-ml from explicit install by @​castrojo in #32
  • fix(driver-versions): guard against null pins in hweKernel pinned tooltip by @​castrojo in #933
  • feat(sparklines): shared Sparkline component + version trend sparklines on driver versions page by @​castrojo in #969
Dakota (GNOME OS Prototype)
  • fix(nvidia): add OpenCL, VDPAU, and suspend/hibernate support by @​castrojo in #837
  • feat(nvidia): Upgrade drivers to 610.43.02 and ship nvidia-settings by @​dylanmtaylor in #643

Infrastructure

area/iso area/upstream area/buildstream area/finpilot area/just area/testing

ISO images, upstream integration, build systems, and testing frameworks

Planned Work

  • fix: changelog reads repo from image-info.json and add tests by @​castrojo in #791
  • fix(ci): remove continue-on-error incompatible with uses: in e2e.yml by @​castrojo in #787
  • ci(renovate): use --auto merge for merge queue on main by @​castrojo in #782
  • fix(bonedigger): persist local report copies before cleanup by @​castrojo in #748
  • ci: bump testsuite pin to 8d9ca0b (fix common E2E failures) by @​castrojo in #752
  • fix(ci): revert to secrets.MERGERAPTOR_APP_ID matching track-common.yml by @​castrojo in #741
  • fix(ci): mark notify-downstream continue-on-error by @​castrojo in #740
  • fix(ci): use vars.MERGERAPTOR_APP_ID and client-id in notify-downstream by @​castrojo in #739
  • fix(ci): remove owner+repositories from create-github-app-token in notify-downstream by @​castrojo in #738
  • fix(ci): use workflow_dispatch for bluefin/bluefin-lts common tracking by @​castrojo in #735
  • fix(ci): add continue-on-error to dispatch steps by @​castrojo in #734
  • fix(ci): dispatch common-updated to dakota after manifest publish by @​castrojo in #733
  • ci: bump testsuite pin for custom-command-list checks by @​castrojo in #719
  • chore: ponytail shrink — dedup Justfile loops, extract OCI ref check, combine test deps install by @​castrojo in #725
  • fix(ci): remove unnecessary mergeraptor token from renovate-automerge; fix vars/secrets inconsistency by @​castrojo in #709
  • fix(ci): make downstream dispatch non-blocking by @​castrojo in #698
  • fix(ci): login to GHCR before cosign signing in manifest job by @​castrojo in #697
  • fix(ci): promote rootless buildah image to root storage before push by @​castrojo in #696
  • fix(ci): pass mergeraptor token to reusable automerge workflow by @​castrojo in #694
  • fix(keybinding): restore Super+E to open Files (Nautilus) by @​castrojo in #690
  • fix(ci): update create-github-app-token to v3 in build.yml by @​castrojo in #688
  • feat(report): add crash detection, PII scrubbing, and journal.txt to ujust report by @​castrojo in #684
  • fix(tests): remove orphaned uutils.sh tests from test_profile_d.bats by @​castrojo in #674
  • fix(update): detect layered rpm-ostree packages and block with guidance by @​castrojo in #663
  • fix(ci): restore btrfs storage backend so push-image can find built image by @​castrojo in #661
  • fix(ci): skip CVE scan in merge queue to fix SARIF upload ref error by @​castrojo in #660
  • test: add unit tests for profile.d scripts, dynamic-wallpaper, and geoclue-latitude by @​castrojo in #648
  • test(scripts): add bats coverage for ublue-image-info.sh by @​castrojo in #640
  • fix(ci): modernize build pipeline, restore Dakota E2E, event-driven releases by @​castrojo in #598
  • ci(tests): upload pytest coverage report as workflow artifact by @​castrojo in #630
  • test(just): add bats coverage for update.just and toggle-updates recipes by @​castrojo in #626
  • ci(factory): notify downstream repos when common publishes by @​castrojo in #632
  • fix(build): P0 — export image to tar before scan-image, non-blocking by @​castrojo in #625
  • feat(ci): supply chain hardening — keyless cosign, Trivy CVE gate, SBOM, SLSA L2 (Phase 6) by @​castrojo in #595
  • chore(renovate): group projectbluefin/actions ref updates by @​castrojo in #593
  • ci: add git-cliff + e2e gate to monthly release workflow by @​castrojo in #592
  • test(quality): add bats coverage for ublue-fastfetch, wire into CI by @​castrojo in #579
  • test(quality): bats tests for rechunker-group-fix, ublue-bling-fastfetch, changelog.just + coverage gate by @​castrojo in #573
  • fix(ujust): route lts/lts-hwe tags to projectbluefin/bluefin-lts in changelogs by @​castrojo in #582
  • fix(ci): bump lifecycle-caller SHA to 3025b5d3 (matches bluefin-lts) by @​castrojo in #581
  • chore(lifecycle): move lifecycle.yml to projectbluefin/actions by @​castrojo in #574
  • feat(testing): expand shellcheck + add bats by @​castrojo in #568
  • fix(ci): expand shellcheck to all shell scripts in system_files/ by @​castrojo in #554
  • feat: setup VMs for people by @​castrojo in #544
  • fix(just): remove rebase-helper and ublue-rollback-helper by @​castrojo in #567
  • feat(ci): auto-merge on lgtm label via merge queue by @​castrojo in #555
  • feat(ujust): add toggle-testing command by @​castrojo in #535
  • feat(testing): add unit tests for hooks.py and shell scripts by @​castrojo in #540
  • fix(ci): remove emoji from promotion-candidate E2E failure issue title by @​castrojo in #539
  • docs: add upstream-contributions tracking document by @​castrojo in #527
  • feat(ci): add AI commit attribution trailer check to validate.yml by @​castrojo in #515
  • fix(ci): use client-id and fail fast on missing mergeraptor secrets by @​castrojo in #510
  • ci: bump testsuite SHA to e2b36dc (all env + ptyxis quarantine + screenshot fixes) by @​castrojo in #506
  • Update curated.yaml: added Ecosia browser in the browser section by @​k3nsh0 in #466
  • chore: add Renovate automerge rule for digest/pin/patch/minor updates by @​castrojo in #495
  • feat(just): add caffeinate recipe to prevent system sleep by @​hanthor in #351
  • fix(ci): close factory determinism gaps in pipeline workflows by @​castrojo in #500
  • fix(ci): switch e2e to projectbluefin images, re-enable pr-e2e gate by @​castrojo in #496
  • fix(just): return to ujust menu after bbrew and cncf submenus by @​hanthor in #357
  • fix(ci): add bonedigger lifecycle workflow by @​castrojo in #490
  • fix(ci): add missing RUN for umotd curl and fix pre-commit violations by @​castrojo in #492
  • fix: bug batch may23 — toggle-devmode tag, branding update by @​castrojo in #488
  • feat(just): ship ujust report via common with Renovate tracking by @​hanthor in #382
  • docs(qa): define hardware canary program for post-promotion testing by @​hanthor in #447
  • feat(qa): formalize hardware testing into factory loop — template, labels, policy by @​castrojo in #486
  • fix(deps): add Renovate config for GHA version tracking by @​castrojo in #485
  • feat(ujust): wire flutter devcontainer recipe import by @​castrojo in #356
  • feat(just): add check-sb-key recipe for Secure Boot status by @​hanthor in #370
  • docs(skills): add frontmatter and Trail of Bits CI integration by @​hanthor in #444
  • docs(skills): add frontmatter and Trail of Bits skill-improver CI by @​castrojo in #461
  • feat(ci): add common factory guardrails by @​castrojo in #480
  • fix(ci): add skill-drift.yml to detect stale agent skills by @​castrojo in #463
  • fix(deps): track OCI image digests in Containerfile with Renovate by @​castrojo in #479
  • fix(security): pin curl fetches in Containerfile to verified hashes by @​castrojo in #455
  • fix(ci): add bonedigger lifecycle workflow by @​castrojo in #453
  • fix(docs): add aurorafin-shared and bluefin-branding submodules to AGENTS.md layout by @​castrojo in #454
  • docs(skills): update e2e-ci, governance for P0 session 2026-06-03 by @​castrojo in #452
  • fix(ci): add hive-progress-sync workflow by @​castrojo in #450
  • feat(ci): add pre-merge e2e composition gate for PRs by @​castrojo in #451
  • fix(scripts): Check for rpm-ostreed.conf existence before grep by @​dylanmtaylor in #387

Opportunistic Work

  • fix: use generate_sbom_inline for release notes to avoid testing build SBOM OOM by @​castrojo in #740
  • fix(ci): pass explicit credentials to reusable-pkg-cadence by @​castrojo in #737
  • fix(sbom): add --parallelism 1 to gen-sbom Syft invocation by @​castrojo in #736
  • fix(release): use build-time SBOM artifact instead of inline scan by @​castrojo in #730
  • fix(ci): exclude main-targeting PRs from remaining pull_request triggers by @​castrojo in #718
  • fix(ci): remove pull_request:main triggers that block merge queue by @​castrojo in #717
  • fix(release): pass fast_forward_sha to reusable promotion by @​castrojo in #713
  • ci(sync): remove BLUEFINBOT dependency from sync-main-to-testing by @​castrojo in #704
  • ci(promote): post validate status to unblock merge queue enqueue by @​castrojo in #703
  • ci: move to daily releases, remove approval gate by @​castrojo in #702
  • feat: release notes redesign — richer key components by @​castrojo in #701
  • feat(ci): enable E2E release gate for bluefin by @​castrojo in #693
  • fix(ci): correct execute-release commit message trigger pattern by @​castrojo in #686
  • fix(ci): add guard against undeclared gitlinks in PR validation by @​castrojo in #685
  • fix(agents): revert bluefin-lts branch target to testing by @​castrojo in #673
  • test(hooks): add edge-case coverage for setup hook scripts by @​castrojo in #669
  • fix(ci): revert to generate_sbom_inline for release notes by @​castrojo in #667
  • ci: align testsuite with lts; remove pr-smoke; restore libratbag by @​castrojo in #666
  • ci: remove post-testing E2E and issue spam; simplify gate by @​castrojo in #661
  • fix(ci): add variants table and mesa to release notes by @​castrojo in #657
  • chore(ci): pin testsuite e2e.yml to @v1 by @​castrojo in #654
  • ci(promote): weekly Tuesday 04:00 UTC release with conditional auto-merge by @​castrojo in #652
  • chore: remove OEM hooks/icons, drop opendyslexic, fix sync token, remove noisy e2e reporter by @​castrojo in #637
  • test: add BATS coverage for runtime hook scripts and TAP artifact upload by @​castrojo in #639
  • chore: remove OEM hooks now in common, drop opendyslexic RPM, fix sync token by @​castrojo in #614
  • fix(ci): switch testsuite ref to @main managed tag by @​castrojo in #629
  • fix(ci): add event-driven common digest tracking by @​castrojo in #619
  • fix(ci): trigger promote on PR review for zero-touch merge queue enqueue by @​castrojo in #612
  • fix(ci): disable e2e gate in promote workflow, fix post-testing-e2e branches filter by @​castrojo in #611
  • fix(ci): remove invalid timeout-minutes from post-testing-e2e run-e2e job by @​castrojo in #597
  • fix(ci): use inline cosign_identity_regexp to avoid startup_failure by @​castrojo in #596
  • fix(ci): fix execute-release trigger and remove unknown reusable inputs by @​castrojo in #594
  • ci: kick post-testing-e2e after push-image fix by @​castrojo in #591
  • fix(ci): switch bonedigger caller to @main — eliminate SHA drift by @​castrojo in #582
  • revert: remove invalid workflows permission scope by @​castrojo in #581
  • fix(ci): add workflows write permission to promote caller by @​castrojo in #580
  • fix(ci): enable merge queue enqueue for promote PR by @​castrojo in #579
  • fix(ci): remove cosign pre-check for common/brew; bump cosign to v3.1.1; fix Renovate SHA pins by @​castrojo in #575
  • fix(tests): sync unit tests with removed packages and scripts by @​castrojo in #573
  • chore: remove niche/redundant packages and COPR bloat from base image by @​castrojo in #558
  • fix(ci): use @v1 managed tag for all projectbluefin/actions refs by @​castrojo in #552
  • fix(verify): switch common image verification to keyless Sigstore OIDC by @​castrojo in #561
  • refactor(build): extract package arrays to TOML manifest by @​castrojo in #539
  • feat(cadence): add pkg-interval cadence tracking by @​castrojo in #537
  • chore(ci): use reusable-vulnerability-scan from actions by @​castrojo in #534
  • chore(ci): use reusable validate-renovate workflow from actions by @​castrojo in #533
  • chore(ci): remove dead lifecycle-caller.yml by @​castrojo in #532
  • test: add unit tests for 03-packages.sh and 05-override-install.sh by @​castrojo in #515
  • ci: trigger build — v1 tag fixed at 549249ef by @​castrojo in #529
  • ci: retrigger Testing Images after v1 tag fix by @​castrojo in #528
  • chore(ci): bump actions SHA pin to 549249e (scan-image severity_rank fix) by @​castrojo in #526
  • fix(ci): bump actions SHA pin to v1 (6c2278ad) — drop broken 355f162b by @​castrojo in #523
  • fix(ci): replace artifact-metadata with issues:write in Testing Images by @​castrojo in #514
  • fix(test): run all BATS unit tests in just test-unit by @​castrojo in #509
  • fix(ci): enable shellcheck coverage for system_files scripts by @​castrojo in #510
  • ci: consumer validation — Design C promotion PR + release notes overflow fix (actions 9e4ba16) by @​castrojo in #508
  • fix(ci): auto-close stale e2e failure issues on success by @​castrojo in #504
  • test(bats): add 00-image-info.sh unit tests by @​castrojo in #503
  • fix(ci): expand promote-testing-to-main permissions for reusable workflow by @​castrojo in #500
  • fix(ci): remove duplicate lifecycle caller, fix validate-renovate paths by @​castrojo in #490
  • chore(ci): remove per-repo cleanup workflows (centralized in actions) by @​castrojo in #499
  • feat(ci): add cliff.toml for structured changelog generation by @​castrojo in #498
  • fix(factory): pin @main floating refs to SHA and adopt thin-caller promote by @​castrojo in #496
  • ci(promote): replace 343-line promote workflow with thin caller — no more merge friction by @​castrojo in #486
  • fix(security): remove dead SCORECARD_TOKEN PAT comment by @​castrojo in #485
  • ci(consistency): pin @main reusable-workflow refs to SHA by @​castrojo in #484
  • chore(ci): bump projectbluefin/actions SHA pins to 3025b5d31f34 by @​castrojo in #483
  • chore(lifecycle): call lifecycle.yml from projectbluefin/actions by @​castrojo in #481
  • fix(ci): promotion gate never stalls — e2e fires on testing builds + feedback trigger by @​castrojo in #480
  • fix: port several fixes from ublue-os/bluefin by @​castrojo in #475
  • feat(build): remove rpm-ostree rechunk, centralize through actions chunka by @​castrojo in #473
  • fix(ci): add projectbluefin/ exemption to no-floating-action-tags; remove dead generate-release.yml by @​castrojo in #472
  • feat(ci): replace weekly-testing-promotion with PR-based release gate by @​castrojo in #470
  • chore: promote testing to main by @​castrojo in #468
  • fix(renovate): enable automerge + add image-versions.yml manager for common by @​castrojo in #467
  • chore: remove stable branch build workflow by @​castrojo in #461
  • chore: remove :latest, :stable-daily, and :gts streams by @​castrojo in #460
  • fix(ci): remove environment: production from generate-release by @​castrojo in #454
  • fix(ci): restore local generate-release.yml with inline SBOM support by @​castrojo in #451
  • fix(ci): bump reusable-release to d290241 — remove secrets: inherit by @​castrojo in #448
  • fix(ci): bump reusable-release to beb89cf — add empty secrets block by @​castrojo in #445
  • fix(ci): bump reusable-release SHA — drop reserved github_token secret by @​castrojo in #442
  • chore: remove rechunker-group-fix duplicate — now in common by @​castrojo in #439
  • ci: centralise Renovate and release workflows via projectbluefin/actions reusables by @​castrojo in #438
  • ci: remove duplicate scheduled-stable-release workflow by @​castrojo in #436
  • ci: add environment:production gate to weekly stable promotion by @​castrojo in #432
  • fix(ci): generate SBOM inline with Syft in generate-release by @​castrojo in #431
  • fix(ci): tolerate runner preemption and add skopeo fallback in vulnerability-scan by @​castrojo in #430
  • fix(ci): bump reusable-release SHA pin and add mergeability poll loop by @​castrojo in #429
  • ci: handle missing SBOM in generate-release gracefully by @​castrojo in #425
  • ci: use sigstore/cosign-installer in promotion instead of curl by @​castrojo in #422
  • ci: fix cosign cert identity regexp in promotion verify by @​castrojo in #417
  • ci: fix cosign cert identity regexp in promotion verify by @​castrojo in #414
  • ci: remove software suite from weekly promotion e2e by @​castrojo in #410
  • chore: promote testing to main by @​castrojo in #409
  • fix(ci): unblock stable release — disable lifecycle gate and fix vuln scan by @​castrojo in #406
  • fix(ci): allow auto/promote-testing-to-main through base-branch check by @​castrojo in #405
  • fix(ci): squash testing commits into single branch for clean promotion PRs by @​castrojo in #402
  • fix(ci): correct vulnerability-scan artifact pattern and bonedigger workflow ref by @​castrojo in #399
  • fix(ci): disable SBOM in sign-and-publish for testing stream by @​castrojo in #395
  • fix(ci): skip SBOM generation for testing stream to unblock builds by @​castrojo in #393
  • feat(ci): add sync-main-to-testing workflow by @​castrojo in #389
  • fix: centralize scheduled stable release workflow by @​castrojo in #387
  • fix(ci): clean up promotion workflows — fix artifact name, stop comment spam, auto-close issues by @​castrojo in #385
  • fix(ci): update COPR health monitor to check uupd instead of ublue-update by @​castrojo in #381
  • ci: align all reusable-build pins to actions v1 (trivy oci-archive fix) by @​castrojo in #377
  • test: pin build-image-testing to actions fix/trivy-oci-archive-scan SHA by @​castrojo in #374
  • fix: retain default tag in tag-images so vulnerability scan can find the image by @​castrojo in #372
  • feat: add weekly gated stable release on Tuesday by @​castrojo in #371
  • feat: migrate generate-release to bootc-build/create-release by @​castrojo in #370
  • test(build): add bats unit tests for 17-cleanup.sh and 18-workarounds.sh by @​castrojo in #365
  • chore: remove stale 60-custom.just report recipe by @​castrojo in #367
  • ci: gate :testing tag behind post-build e2e (#518) by @​castrojo in #369
  • test(build): add bats unit tests for clean-stage.sh by @​castrojo in #361
  • test(build): add bats unit tests for disable-repos.sh by @​castrojo in #360
  • fix(ci): handle FORBIDDEN gracefully in promote-testing-to-main enqueue step by @​castrojo in #358
  • fix(ci): replace auto-merge with enqueuePullRequest for main merge queue by @​castrojo in #355
  • fix(ci): use GITHUB_TOKEN directly in promote-testing-to-main — remove GitHub App token by @​castrojo in #338
  • fix(ci): pin reusable-build to @v1 SHA — retire @fix/sha-skew validation ref by @​castrojo in #353
  • chore(ci): validate actions reusable-build SHA normalization by @​castrojo in #342
  • feat(ci): enforce PR base branch — require testing, block PRs targeting main by @​castrojo in #349
  • ci: validate shared generate-release-notes action by @​castrojo in #344
  • test(ci): validate actions pre-commit pinning by @​castrojo in #345
  • chore(ci): validate actions timeout pin by @​castrojo in #341
  • test(ci): run all bats unit tests in PR validation by @​castrojo in #350
  • chore(labels): retire type/* labels in issue templates by @​castrojo in #347
  • chore: promote testing to main by @​castrojo in #337
  • fix: add promotion conflict reporting and main PR builds by @​castrojo in #334
  • chore: switch lifecycle automation to common-owned workflow by @​castrojo in #332
  • ci: bump testsuite SHA to e2b36dc (all env + ptyxis quarantine + screenshot fixes) by @​castrojo in #315
  • test(build): add bats unit tests for validate-repos.sh and copr-helpers.sh by @​castrojo in #318
  • fix(ci): update COPR health monitor for new API response format by @​castrojo in #316
  • fix: use app token for promotion PRs by @​castrojo in #328
  • ci: add local Renovate runner by @​castrojo in #324
  • feat: generate GitHub release after weekly testing promotion by @​castrojo in #325
  • ci: automate testing→main branch promotion by @​castrojo in #326
  • feat(quality): add bats unit tests for package-lib.sh by @​castrojo in #298
  • fix(release): handle bootstrap case when no previous release tag exists [backport #264] by @​castrojo in #265
  • fix(ci): handle new GHCR repos in skopeo list-tags version probe by @​castrojo in #281
  • fix(ci): scope workflow permissions to job level, drop secrets:inherit by @​castrojo in #297
  • fix(ci): harden weekly testing promotion by @​castrojo in #294
  • fix(just): stop bootstrapping cosign from unverified container by @​castrojo in #295
  • fix(ci): centralize testsuite pin in pr-validation + pin pre-commit version by @​castrojo in #292
  • chore: automerge Renovate digest/pin/patch/minor updates when CI passes by @​castrojo in #286
  • fix(ci): resolve TOCTOU vuln scan, PR image namespace, testsuite SHA drift by @​castrojo in #250
  • fix(ci): centralize testsuite SHA pin through run-testsuite.yml by @​castrojo in #262
  • fix(ci): scope weekly-promotion permissions and drop secrets:inherit from build callers by @​castrojo in #255
  • fix(release): handle bootstrap case when no previous release tag exists by @​castrojo in #264
  • ci: remove E2E smoke test from PR validation by @​castrojo in #285
  • fix(security): make base image cosign verify fatal on failure by @​castrojo in #280
  • fix(ci): add hive-progress-sync workflow by @​castrojo in #279
  • chore: bump upgrade-test.yml SHA to 0527fe28 by @​castrojo in #276
  • feat(ci): wire lifecycle upgrade-test into post-build e2e gate by @​castrojo in #275
  • fix(ci): replace inline pr-validation steps with validate-pr composite action by @​castrojo in #271
  • fix(security): make base image cosign verification fatal in CI by @​castrojo in #244
  • ci(hive): add hive-progress-sync workflow by @​castrojo in #243
  • feat(ci): add skill-drift wrapper workflow by @​castrojo in #239
  • feat: add production environment gate to promotion workflow by @​castrojo in #237
  • chore: update centralized actions ref to @v1 by @​castrojo in #234
  • feat: port to centralized projectbluefin/actions reusable workflow by @​castrojo in #232
  • feat(ci): remove bluefin-dx image variant (retiring) by @​castrojo in #208
  • feat(build): split monolithic RUN into cacheable stages for build efficiency by @​castrojo in #198
  • feat(ci): enable previous-build delta for rechunking by @​castrojo in #195
  • security: pin base image by digest to prevent TOCTOU (CWE-494) by @​castrojo in #191
  • fix(build): remove version tag from cache-from/cache-to refs (Podman 5.x compat) by @​castrojo in #196
  • feat(ci): auto-file e2e test failures as GitHub issues by @​castrojo in #192
  • feat(build): tag large unpackaged assets with user.component for rechunking by @​castrojo in #190
  • feat(ci): add preflight job and rechunk metadata verification by @​castrojo in #189
  • feat(build): switch SBOM generation from podman-export to oci-dir scan by @​castrojo in #188
  • feat(ci): add Grype vulnerability scanning with SARIF upload by @​castrojo in #179
  • refactor(ci): extract reusable run-testsuite.yml wrapper workflow by @​castrojo in #185
  • refactor(ci): extract composite action for checkout+just bootstrap by @​castrojo in #184
  • feat(ci): add PR smoke test gate and Renovate risk-tier automerge by @​castrojo in #187
  • feat(ci): implement registry-side layer cache with --cache-from/--cache-to by @​castrojo in #183
  • feat(ci): add COPR repository health monitoring by @​castrojo in #182
  • security: vendor cosign public keys instead of fetching from mutable URLs by @​castrojo in #180
  • chore: remove dead rpm-ostreed.conf and migrate kargs to grubby by @​castrojo in #178
  • fix(ci): prevent /e2e dispatch from overwriting canonical :testing tags by @​castrojo in #177
  • refactor: read common/brew image refs from image-versions.yml at build time by @​castrojo in #176
  • fix(ci): retag tested digest instead of rebuilding for weekly promotion by @​castrojo in #175
  • fix(ci): upload SBOM as GitHub Actions artifact for release workflow by @​castrojo in #174
  • security: restrict GITHUB_TOKEN to GitHub-owned hosts in ghcurl (CWE-201) by @​castrojo in #172
  • fix(ci): pass explicit credentials to reusable-pkg-cadence by @​castrojo in #387
  • fix(release): use build-time SBOM artifact instead of inline scan by @​castrojo in #385
  • fix(ci): add statuses:write permission to promote workflow by @​castrojo in #384
  • fix(release): pass fast_forward_sha to reusable promotion by @​castrojo in #381
  • fix(ci): guard post-release-variants against duplicate prepend by @​castrojo in #379
  • ci: move to daily releases (04:00 UTC) by @​castrojo in #377
  • feat(ci): add E2E gate to post-merge workflow, enable run_e2e for lts by @​castrojo in #369
  • fix(ci): pin bonedigger lifecycle.yml SHA instead of floating @v1 tag by @​castrojo in #365
  • fix(ci): use build-time SBOM artifact to avoid 2GB inline extraction limit by @​castrojo in #363
  • fix(ci): update pkg-cadence comment :lts:stable by @​castrojo in #353
  • fix(ci): guard publish_stream_tag on PR builds; drop main from pr-testsuite by @​castrojo in #352
  • ci: align testing-first branch model and drop :lts for :stable by @​castrojo in #351
  • ci: remove post-merge E2E gate — promote :testing on successful build by @​castrojo in #342
  • fix(ci): restore bonedigger @v1 — tag now exists in projectbluefin/bonedigger by @​castrojo in #341
  • fix(ci): revert bonedigger ref to @main — @v1 tag does not exist yet by @​castrojo in #340
  • ci(e2e): fix trailing blank line in post-merge-e2e.yml by @​castrojo in #339
  • ci(e2e): remove auto-issue-filing on E2E failure by @​castrojo in #338
  • chore(renovate): exclude projectbluefin/testsuite from SHA pinning by @​castrojo in #336
  • ci(promote): fully automate weekly lts release — no human approval required by @​castrojo in #330
  • ci(testsuite): switch run-testsuite.yml from SHA pin to @v1 managed tag by @​castrojo in #328
  • ci(pre-commit): exempt projectbluefin/testsuite from floating-tag check by @​castrojo in #327
  • chore(ci): pin testsuite e2e.yml to @v1 by @​castrojo in #322
  • ci(promote): weekly Thursday 04:00 UTC release with conditional auto-merge by @​castrojo in #320
  • fix(ci): exempt projectbluefin/testsuite from floating-tag hook by @​castrojo in #312
  • fix(ci): switch testsuite ref to @main managed tag; bonedigger @main → @v1 by @​castrojo in #311
  • fix(ci): add event-driven common digest tracking by @​castrojo in #301
  • fix(ci): revert bonedigger ref to @main — @v1 tag does not exist by @​castrojo in #295
  • feat(ci): add bonedigger lifecycle workflow by @​castrojo in #243
  • chore(oem): remove Framework hooks now shipped by common by @​castrojo in #220
  • revert: remove invalid workflows permission scope by @​castrojo in #238
  • fix(ci): add workflows write permission to promote caller by @​castrojo in #237
  • test: add pytest coverage for changelogs.py by @​castrojo in #222
  • test: add bats unit tests for build scripts by @​castrojo in #221
  • fix(ci): remove racing push trigger, fix stale squash-merge rules by @​castrojo in #236
  • fix(ci): align renovate and promote workflows with factory pattern by @​castrojo in #218
  • fix(ci): pass base_branch: main to renovate-automerge reusable by @​castrojo in #216
  • fix(ci): disable Renovate SHA-pinning for projectbluefin/ actions by @​castrojo in #215
  • fix(ci): replace stale testsuite SHA pin with @main by @​castrojo in #211
  • fix(ci): use @v1 managed tag for all projectbluefin/actions refs by @​castrojo in #204
  • fix(ci): bump actions SHA to e6aaccdf (fix sed title-case in render step) by @​castrojo in #200
  • fix(ci): bump actions SHA to 26a4fb2 (squash -X theirs, no conflict issues) by @​castrojo in #198
  • fix(ci): use printf to build variants table in execute-release by @​castrojo in #194
  • fix(ci): report correct image (bluefin-lts-hwe:testing) in e2e failure issues by @​castrojo in #193
  • fix(ci): add missing end-of-file newline to pkg JSON files by @​castrojo in #196
  • chore(ci): use reusable-vulnerability-scan from actions by @​castrojo in #179
  • chore(ci): use reusable validate-renovate workflow from actions by @​castrojo in #178
  • chore(ci): pin floating @v1 tags to SHA in renovate-automerge and release-reminder by @​castrojo in #177
  • refactor(build): extract package arrays to TOML manifest by @​castrojo in #182
  • feat(cadence): add pkg-interval cadence tracking by @​castrojo in #181
  • fix(ci): bump actions SHA pins to @v1 and skip rhc postun in container build by @​castrojo in #173
  • fix(ci): fix dead workflow_run triggers on promote-testing-to-main by @​castrojo in #169
  • fix(ci): normalize action SHAs, add renovate, remove vestigial workflows by @​castrojo in #164
  • feat(ci): add weekly standalone vulnerability scan by @​castrojo in #168
  • feat(ci): add cliff.toml for structured changelog generation by @​castrojo in #167
  • fix(ci): trigger post-merge-e2e on HWE build, not regular build by @​castrojo in #163
  • fix(ci): expand caller permissions to fix promote startup_failure by @​castrojo in #162
  • ci(promote): replace 354-line promote workflow with thin caller — no more merge friction by @​castrojo in #161
  • ci(consistency): pin @main reusable-workflow refs to SHA by @​castrojo in #159
  • fix(ci): set Renovate baseBranchPatterns to testing by @​castrojo in #158
  • chore(ci): bump projectbluefin/actions SHA pins to 3025b5d31f34 by @​castrojo in #157
  • chore(lifecycle): call lifecycle.yml from projectbluefin/actions by @​castrojo in #156
  • fix(ci): promotion gate never stalls — e2e fires on testing builds + feedback trigger by @​castrojo in #155
  • fix(ci): remove COPY of nonexistent system_files_overrides/base/ by @​castrojo in #154
  • fix(ci): bump testsuite SHA to include udev-settle mask (PR #419) by @​castrojo in #148
  • fix(ci): add actions: read to release-notes job to unblock startup_failure by @​castrojo in #141
  • fix(ci): add check-trigger regular job before reusable workflow calls by @​castrojo in #140
  • fix(ci): grant id-token at workflow level to unblock startup_failure by @​castrojo in #139
  • fix(ci): fix YAML syntax error in execute-release if condition by @​castrojo in #138
  • fix(ci): change execute-release trigger from pull_request to push by @​castrojo in #137
  • feat(build): remove vendored Containerfile.splitter, centralize through actions chunka by @​castrojo in #132
  • fix(ci): add mergeability poll loop and close-failure-issue job to promote workflow by @​castrojo in #129
  • feat(ci): replace scheduled-lts-release with PR-based release gate by @​castrojo in #128
  • fix(deps): bump common + fix Renovate tracking for critical fixes by @​castrojo in #123
  • fix(ci): bump projectbluefin/actions SHA to fcd2a6b — fix build failure by @​castrojo in #120
  • ci: centralise Renovate and release workflows via projectbluefin/actions reusables by @​castrojo in #118
  • ci: fix branch sync direction, Renovate flow, and promotion pipeline by @​castrojo in #117
  • ci: scope PR E2E smoke to image content changes only by @​castrojo in #115
  • ci: add environment:production gate and fix renovate automerge by @​castrojo in #114
  • fix(ci): restore blocking sign-and-publish, unblock Renovate auto-merge, add pre-merge e2e gate by @​castrojo in #111
  • fix(ci): skip lts fast-forward when sync-main-to-lts already merged it by @​castrojo in #107
  • fix(ci): use always() && needs.X.result on post-promote jobs by @​castrojo in #106
  • fix(ci): add explicit if conditions to update-lts-branch and generate-release by @​castrojo in #104
  • fix(ci): use lts repo main SHA for promote guard and branch update by @​castrojo in #103
  • fix(ci): make upgrade-test non-blocking until testsuite registry check fixed by @​castrojo in #102
  • fix(ci): use cosign v3 installer in verify-signatures job by @​castrojo in #101
  • fix(ci): broaden cosign cert-identity-regexp to include actions repo by @​castrojo in #100
  • feat(ci): replace scheduled rebuild with digest promotion + 7-day floor by @​castrojo in #92
  • fix(ci): use PACKAGES_TOKEN for GHCR login in verify-signatures by @​castrojo in #98
  • ci: restore sync-main-to-lts workflow by @​castrojo in #97
  • chore: promote main → lts (2026-06-06) by @​castrojo in #95
  • fix(ci): bump actions SHA — sign-and-publish non-blocking by @​castrojo in #91
  • fix: chown sbom_out after sudo gen-sbom so sign-and-publish can write by @​castrojo in #90
  • fix(hwe,gdx): dynamically follow Fedora CoreOS stable instead of pinned F43 by @​castrojo in #89
  • fix(ci): bump actions SHA — sudo podman inspect fix by @​castrojo in #88
  • fix(ci): bump actions SHA — PACKAGES_TOKEN + localhost image refs by @​castrojo in #86
  • fix(ci): bump actions SHA — disable Trivy scan blocking release by @​castrojo in #85
  • feat(ci): add sync-main-to-testing workflow by @​castrojo in #84
  • fix(ci): bump actions SHA — docker format for Trivy archive scan by @​castrojo in #83
  • fix(ci): bump projectbluefin/actions SHA to fix Trivy OCI scan by @​castrojo in #82
  • fix(justfile): use oci-dir export for SBOM generation by @​castrojo in #81
  • fix(ci): remove stale bonedigger.yml duplicate by @​castrojo in #78
  • ci: migrate to shared reusable-build.yml; rename images to bluefin-lts/bluefin-gdx by @​castrojo in #73
  • fix: add LTS release failure guards by @​castrojo in #70
  • feat: parallelize LTS build watching (~5h → ~90min) by @​castrojo in #71
  • chore: switch lifecycle automation to common-owned workflow by @​castrojo in #69
  • chore: add explicit renovate.json extending org config by @​castrojo in #67
  • ci: bump testsuite SHA to e2b36dc (all env + ptyxis quarantine + screenshot fixes) by @​castrojo in #63
  • fix: add failure issue auto-filing to LTS post-merge e2e by @​castrojo in #66
  • fix: wait for HWE builds and verify cosign signatures in scheduled LTS release by @​castrojo in #65
  • fix: remove trailing whitespace from Containerfile by @​castrojo in #59
  • chore(ci): add bonedigger.yml lifecycle workflow by @​hanthor in #40
  • feat(ci): upgrade podman via resolute, double-push, --compression-level 3, bootc unified storage by @​castrojo in #19
  • feat(qa): add post-merge E2E for bluefin-lts by @​hanthor in #41
  • feat(ci): migrate to shared projectbluefin/actions by @​castrojo in #46
  • fix(ci): add hive-progress-sync workflow by @​castrojo in #44
  • feat(ci): adopt validate-pr and detect-changes from projectbluefin/actions by @​castrojo in #37
  • ci(hive): add hive-progress-sync workflow by @​castrojo in #28
  • feat: migrate reusable-build-image.yml to projectbluefin/actions shared actions by @​castrojo in #23
  • chore(lockdown): add CODEOWNERS per-path entries and mandatory gates (Track C-2) by @​castrojo in #26
  • feat(ci): production environment gate on LTS release workflow (Track C-1) by @​castrojo in #25
  • feat(ci): add skill-drift wrapper workflow by @​castrojo in #24
  • Add formula and cask builder by @​jumpyvi in #459
  • ci: fix fw-fanctrl python 3.14 bundle by @​ahmedadan in #461
  • fix(hive): bypass CORS by fetching registry data at build time by @​castrojo in #956
  • feat(hive): fetch all GitHub Search data at build time using GITHUB_TOKEN by @​castrojo in #958
  • feat(dakota): add Alpha 3 ISO to downloads testing page by @​castrojo in #931
  • feat(hive): org-wide contributor wall + history trends pipeline by @​castrojo in #923
  • ci: remove Playwright E2E tests entirely by @​castrojo in #914
  • Revert "feat: Bluefin bootc-ISO builder (bootcDirect + containers-storage, 8 GB)" by @​hanthor in #66
  • feat: Bluefin bootc-ISO builder (bootcDirect + containers-storage, 8 GB) by @​hanthor in #61
  • chore: add CODEOWNERS by @​castrojo in #60
  • refactor: modernize template to projectbluefin/actions composite workflow pattern by @​Siddhj2206 in #94
  • fix(ci): cosign digest only by @​scrocquesel in #58
Dakota (GNOME OS Prototype)
  • feat(bluefin): add Incus native library elements (1/2) by @​bketelsen in #1125
  • fix(bluefin-cli): correct sysupdate path, tar import, and mount masking by @​castrojo in #1108
  • Add snapd by @​valentindavid in #1117
  • fix(ci): trigger renovate automerge from validate by @​castrojo in #1122
  • chore(deps): batch common + sudo-rs updates by @​castrojo in #1116
  • ci(build-aarch64): remove push trigger (next) by @​castrojo in #1107
  • ci(build-aarch64): remove push trigger — workflow_run and dispatch only by @​castrojo in #1106
  • ci(next): sync CI fixes from testing — push config, exclude merge_group, aarch64 paths by @​castrojo in #1104
  • ci(build-aarch64): exclude .github/actions/** from push trigger by @​castrojo in #1103
  • fix(ci): generate push config so bst artifact push actually warms CAS by @​castrojo in #1102
  • ci(build): switch to strict daily build model, drop push triggers by @​castrojo in #1099
  • ci(build): disable CAS push/remote-exec — server still unstable by @​castrojo in #1098
  • fix(ci): remove undeclared build_run_id input causing execute-release startup_failure by @​castrojo in #1096
  • ci(build): disable remote execution to fix CAS workaround by @​castrojo in #1093
  • ci(build): disable remote CAS push to unblock builds by @​castrojo in #1092
  • fix(ci): remove ${{ }} wrapper from post-release-verify if condition by @​castrojo in #1091
  • fix(ci): replace !inputs.dry_run with inputs.dry_run != true to avoid startup_failure by @​castrojo in #1089
  • fix(release): harden OCI-native promotion (supply chain + ARM signing + post-release cleanup + rollback) by @​castrojo in #1086
  • fix(build-aarch64): resolve correct SHA in workflow_run context by @​castrojo in #1084
  • fix(publish): only move stream tags from trunk builds, not merge queue by @​castrojo in #1085
  • fix(release): pin promotion to immutable SHA; guard testing SHA drift by @​castrojo in #1083
  • ci(build): add daily 13:00 schedule; trigger ARM from publish by @​castrojo in #1079
  • ci: delete workflows obsoleted by OCI-native promotion by @​castrojo in #1078
  • chore(ci): delete release-reminder workflow by @​castrojo in #1075
  • ci(release): adopt OCI-native daily promotion in execute-release by @​castrojo in #1077
  • ci(next): skip nightly dispatch if next build already running by @​castrojo in #1076
  • ci: retarget workflows from main to testing by @​castrojo in #1080
  • feat(audio): add lsp-plugins-lv2 for PipeWire DSP filter-chain by @​castrojo in #974
  • fix(ci): add statuses:write permission to promote caller by @​castrojo in #1070
  • fix(ci): guard count-elements step against bst show failures by @​castrojo in #1069
  • ci(build): enforce serial BST builds — max-parallel: 1 by @​castrojo in #1068
  • feat: add .github/release.yml for release notes categorization by @​castrojo in #1065
  • fix(ci): add workflows permission to renovate-automerge by @​castrojo in #1054
  • fix(ci): run validate job on merge_group events by @​castrojo in #1052
  • ci(aarch64): standalone build workflow, decoupled from x86_64 release by @​castrojo in #1051
  • fix(bst-progress): correct action priority dedup and count step exit handling by @​castrojo in #1049
  • ci(build): live BST progress monitor with cache hit/miss stats by @​castrojo in #1048
  • ci(aarch64): standalone build workflow, decoupled from x86_64 release by @​castrojo in #1045
  • chore(just): remove just-overrides, use common recipes directly by @​castrojo in #1035
  • fix(ci): pin bonedigger lifecycle.yml SHA instead of floating @v1 tag by @​castrojo in #1037
  • ci(cache-warm): add parallel aarch64 warm-cache job by @​castrojo in #1036
  • fix(ci): restore next branch workflows after main merge by @​castrojo in #1032
  • fix(ci): remove dangling .workflow-scripts submodule, add PR guard by @​castrojo in #1030
  • fix(ci): remove validate from testing branch protection to unblock sync by @​castrojo in #1014
  • ci(triage): merge on maintainer ack — no more stuck approved PRs by @​castrojo in #1011
  • ci: use @v1 for all projectbluefin/actions refs, stop renovate managing org actions by @​castrojo in #1010
  • feat(countme): report to Fedora countme infrastructure by @​castrojo in #1003
  • feat(deps): add flatpak-builder by @​castrojo in #993
  • fix(ci): allow all testing-targeted PRs in pr-triage gate by @​castrojo in #1009
  • fix(ci): renovate automerge base_branch testing (testing-first model) by @​castrojo in #1008
  • fix(ci): restore :testing publishing — independent branch, paths-ignore by @​castrojo in #1004
  • fix(ci): use BST SBOM for release notes, add variants table by @​castrojo in #998
  • ci(build): drop push-to-testing trigger — eliminates redundant 5h build by @​castrojo in #997
  • chore(ci): pin testsuite e2e.yml to @v1 by @​castrojo in #994
  • ci(promote): weekly Tuesday 04:00 UTC release with conditional auto-merge by @​castrojo in #991
  • fix(motd): add missing env.sh, remove duplicate umotd.sh profile hook by @​castrojo in #992
  • fix(ci): remove persist-credentials: false from sync workflow by @​castrojo in #990
  • ci: add sync-next-from-main workflow to main branch by @​castrojo in #987
  • fix(ci): fix automerge and auto-update for mergeraptor dep PRs by @​castrojo in #989
  • chore(next): sync from main — bring next up to date with all main changes by @​castrojo in #986
  • feat(next): update bootc to v1.16.1 matching main branch by @​castrojo in #983
  • fix(ci): exclude promotion PR from pr-autoupdate by @​castrojo in #971
  • fix(ci): exempt projectbluefin/testsuite from floating-tag hook by @​castrojo in #959
  • fix(ci): switch testsuite ref to @main managed tag; bonedigger @main → @v1 by @​castrojo in #958
  • fix(ci): make common tracking event-driven, CI-gated via testing by @​castrojo in #942
  • fix(ci): align execute-release trigger with actual promotion commit format by @​castrojo in #932
  • fix(ci): guard squash branch deletion when promotion PR is open by @​castrojo in #931
  • feat(ci): nightly next branch build at 03:00 UTC by @​castrojo in #926
  • fix(ci): enable auto-merge silently on maintainer approval by @​castrojo in #927
  • fix(ci): drop GitHub App token from sync-main-to-testing by @​castrojo in #922
  • fix(ci): wait for multi-user.target before health check by @​castrojo in #919
  • fix(ci): check gdm not-failed instead of is-active in headless QEMU by @​castrojo in #918
  • fix(ci): find OSTREE_PATH from boot.1 tree instead of BLS entries by @​castrojo in #915
  • fix(ci): add --bootloader none and --ipc=host to boot-check by @​castrojo in #912
  • fix(ci): use ext4 for boot-check; add xfsprogs to bootc runtime deps by @​castrojo in #909
  • fix(ci): unblock dakota publish pipeline by @​castrojo in #908
  • fix(ci): unstick dakota publish pipeline by @​castrojo in #899
  • fix(ci): pre-partition disk before bootc to avoid udev race on node creation by @​castrojo in #889
  • fix(ci): use losetup -P (PARTSCAN) so bootc can find partition nodes by @​castrojo in #883
  • fix(ci): also exempt projectbluefin/bonedigger from floating-tag hook by @​castrojo in #878
  • fix(ci): switch bonedigger caller to @main — eliminate SHA drift by @​castrojo in #875
  • fix(ci): add workflows write permission; unpin reusable SHA to @v1 by @​castrojo in #871
  • revert: remove invalid workflows permission scope by @​castrojo in #872
  • fix(ci): pre-create host loop device for boot-check; drop --via-loopback by @​castrojo in #864
  • ci(pr): enable auto-merge after approval; add pr-autoupdate workflow by @​castrojo in #858
  • fix(bootc): require xfs root filesystem in install config by @​castrojo in #859
  • fix(ci): read OSTREE_PATH from BLS entry; detach loop device by @​castrojo in #852
  • ci(publish): make smoke gate observational, not a promote blocker by @​castrojo in #849
  • fix(sbom): mkdir -p pip cache dir before podman bind-mount by @​castrojo in #848
  • fix(export): revert buildah mount+commit to podman build --squash-all by @​castrojo in #846
  • chore: remove standalone report recipe and OTel config duplicate by @​castrojo in #845
  • ci(publish): speed up pipeline — skopeo promote, job split, buildah export, pip cache by @​castrojo in #832
  • fix(ci): use @v1 managed tag for all projectbluefin/actions refs by @​castrojo in #830
  • fix(ci): bump reusable-renovate-automerge SHA — drop --auto by @​castrojo in #829
  • ci: restore testing→main promotion pipeline — parity with bluefin by @​castrojo in #822
  • chore(deps): update projectbluefin/actions SHA pins to c4e9e551 by @​castrojo in #823
  • fix(ci): use direct merge for auto-merge group — bypass not honoured by --auto by @​castrojo in #820
  • fix(ci): revert promote SHA to 6c2278 — release-gate@5f8abb not found by @​castrojo in #819
  • fix(ci): add missing packages: read and actions: read to promote workflow by @​castrojo in #817
  • chore(ci): use reusable-vulnerability-scan from actions by @​castrojo in #813
  • chore(ci): use reusable validate-renovate workflow from actions by @​castrojo in #812
  • chore(ci): migrate promote-testing-to-main to reusable-promote-squash by @​castrojo in #811
  • feat(ci): add cache-warm scheduled workflow by @​castrojo in #782
  • chore(ci): allow common.bst updates to automerge without review by @​castrojo in #807
  • ci: consumer validation — Design C promotion PR + release notes overflow fix (actions 9e4ba16) by @​castrojo in #805
  • feat(umotd): add umotd element by @​castrojo in #762
  • fix(ci): switch execute-release to push trigger + commit-msg gate by @​castrojo in #800
  • fix(ci): add workflow_dispatch to execute-release; fix if guard by @​castrojo in #799
  • fix(ci): grant required permissions to execute-release caller by @​castrojo in #798
  • ci: promote testing images to stable (96dec33c80b7b4e3) by @​castrojo in #797
  • fix: use @projectbluefin/maintainers team in CODEOWNERS by @​castrojo in #796
  • chore(ci): remove per-repo GHCR cleanup (centralized in actions) by @​castrojo in #795
  • feat(ci): add weekly standalone vulnerability scan by @​castrojo in #794
  • feat(ci): add cliff.toml for structured changelog generation by @​castrojo in #793
  • fix(ci): fix lifecycle wiring, remove duplicate GHCR cleanup by @​castrojo in #789
  • chore(lifecycle): call lifecycle.yml from projectbluefin/actions by @​castrojo in #780
  • fix(ci): bump projectbluefin/actions SHA to 2a09e72e9be1 — fix 65% publish failure by @​castrojo in #792
  • fix(renovate): align config with org standard — extend shared config, automerge digests by @​castrojo in #790
  • ci(C1): thin caller for reusable-promote workflow by @​castrojo in #788
  • ci: add scheduled cache-warm workflow for BST remote cache by @​castrojo in #787
  • fix(ci): pin reusable-workflow @main refs to SHA by @​castrojo in #786
  • chore(ci): bump projectbluefin/actions SHA pins to 3025b5d31f34 by @​castrojo in #781
  • fix(ci): gh pr create has no --json flag — capture URL instead by @​castrojo in #778
  • fix(ci): fire build on main push; auto-merge PRs target main; force-sync testing mirror by @​castrojo in #777
  • feat(ci): use centralized bootc-build/chunka action; remove dead code by @​castrojo in #773
  • fix(ci): track-bst-sources: use --squash for auto-merge, not --merge by @​castrojo in #767
  • fix(ci): publish :testing on every testing merge; fix track-bst branch base by @​castrojo in #766
  • chore(build): upgrade chunkah v0.5.0 to v0.6.0 by @​castrojo in #761
  • fix(ci): point Renovate at main, exempt bonedigger from pinning by @​castrojo in #741
  • fix(ci): remove dead release.yml, add daily promote schedule, fix project_name casing by @​castrojo in #760
  • feat(ci): add PR-based release gate; replace weekly-testing-promotion by @​castrojo in #757
  • fix(ci): skip storage-service in export/publish jobs by @​castrojo in #756
  • ci(next): wire next branch into main CI pipeline by @​castrojo in #751
  • fix(sbom): use runc runtime to bypass crun 1.21 GHA runner failures by @​castrojo in #749
  • fix(sbom): add seccomp=unconfined to just sbom podman invocations by @​castrojo in #747
  • fix(sbom): drop --privileged from bst show / buildstream-sbom runs by @​castrojo in #745
  • ci(e2e): remove pull_request trigger from e2e workflow by @​castrojo in #740
  • revert(uutils-coreutils): remove ghost-specific LTO override by @​castrojo in #737
  • ci: centralise Renovate runner via projectbluefin/actions reusable by @​castrojo in #735
  • ci: fix Renovate to target testing branch and add runner workflow by @​castrojo in #734
  • ci: relax TOCTOU guards from exact-equality to ancestor check by @​castrojo in #732
  • ci: replace inline cosign curl install with sigstore/cosign-installer by @​castrojo in #730
  • ci: ship :testing on every merge, drop nightly schedule and e2e gate by @​castrojo in #731
  • ci: harden release.yml and publish.yml pipeline by @​castrojo in #729
  • ci: harden promotion pipeline and fix lifecycle workflow by @​castrojo in #728
  • fix(uutils-coreutils): override LTO to thin to fix SIGABRT on ghost by @​castrojo in #726
  • feat: switch to weekly gated release on Tuesday by @​castrojo in #720
  • feat: migrate release.yml to bootc-build/create-release by @​castrojo in #719
  • ci: align weekly promotion pipeline to spec (#520 #521 #522 #524) by @​castrojo in #718
  • chore: switch lifecycle automation to common-owned workflow by @​castrojo in #717
  • ci: bump testsuite SHA to e2b36dc (all env + ptyxis quarantine + screenshot fixes) by @​castrojo in #714
  • chore(ci): clarify bonedigger @main is intentional managed tag by @​castrojo in #715
  • fix(deps): add Renovate config for GHA version tracking by @​castrojo in #707
  • fix(ci): block floating GitHub Action tags in pre-commit by @​castrojo in #702
  • feat(justfile): push-local recipe + zstd + SC2129 lint fix by @​castrojo in #642
  • fix: improve gh gist upload guidance in report recipe by @​dylanmtaylor in #646
  • feat(just): add debug-session recipe with serial capture and journal logging (#558) by @​hanthor in #600
  • fix(ujust): read actual booted image from bootc status for toggle-devmode by @​hanthor in #599
  • build: parallelize validate and consolidate CI BST config by @​castrojo in #602
  • feat: add weekly GHCR cleanup workflow by @​castrojo in #672
  • feat: add bluefin-countme weekly user count ping by @​castrojo in #616
  • fix: remove bootc installer flatpak on first boot by @​castrojo in #656
  • feat(justfile): feedback loop tooling — preflight, serial log, boot-test expansion, OTLP hint by @​castrojo in #561
  • ci: switch to projectbluefin/[email protected] by @​castrojo in #641
  • ci: fix reporting-triage-review-verification loop by @​castrojo in #583
  • chore(agents): remove PR rate limit — gate is human now by @​castrojo in #669
  • chore(ci): add .pre-commit-config.yaml by @​hanthor in #682
  • chore(ci): add renovate.json5 configuration by @​hanthor in #683
  • chore(ci): add bonedigger.yml lifecycle workflow by @​hanthor in #684
  • fix(publish): remove job-level permissions from e2e-gate reusable workflow call by @​castrojo in #699
  • fix(publish): remove invalid artifact-metadata permission causing startup_failure by @​castrojo in #698
  • fix(publish): replace read-all with explicit permissions by @​castrojo in #697
  • fix(publish): add packages:write to e2e-gate, pin testsuite SHA by @​castrojo in #696
  • chore(deps): land testing dep updates into main by @​castrojo in #695
  • fix(ci): count hive p1 in status sync by @​castrojo in #691
  • fix(ci): use hive labels in status sync by @​castrojo in #690
  • fix(shellcheck): rework writes to GitHub output by @​dylanmtaylor in #647
  • ci(e2e): always report status — skip for non-image PRs by @​castrojo in #666
  • fix(ci): group consecutive GITHUB_OUTPUT redirects (SC2129) by @​hanthor in #663
  • ci(hive): migrate to org board and hive/* labels in hive-status-sync by @​castrojo in #662
  • chore(lockdown): add CODEOWNERS per-path entries and mandatory gates (Track C-2) by @​castrojo in #661
  • feat(ci): add skill-drift wrapper workflow by @​castrojo in #660
  • feat: add production environment gate to promotion workflow by @​castrojo in #659
  • chore(ci): run weekly testing promotion on Sundays by @​castrojo in #658

Documentation

kind/documentation

Documentation improvements and additions

Planned Work

  • docs(agents): staging audit rule, duplicate PR check, lts branch target, copilot setup by @​castrojo in #757
  • docs(factory): align bluefin-lts to completed testing-first migration by @​castrojo in #754
  • fix(ci): exclude docs/factory and specs from ublue-os ref check by @​castrojo in #749
  • docs(release-promotion): fix e2e gate model — run_e2e is false for bluefin and dakota by @​castrojo in #724
  • chore(docs): drop completed audits and stale planning docs by @​castrojo in #642
  • docs(factory): deprecate housekeeping repo — actions is canonical home by @​castrojo in #636
  • ci: delete docs-quality workflow by @​castrojo in #556
  • chore(ci): remove hive-progress-sync workflow and PROJECT_TOKEN dependency by @​castrojo in #529
  • feat(labels): add hardware/* labels to labels.json by @​castrojo in #512
  • fix(governance): add knuckle to sync-codeowners matrix by @​castrojo in #491
  • docs(ci): CI lifecycle bot consolidation strategy by @​hanthor in #443
  • docs: establish common as org brain — factory docs, skills hub, migration status by @​castrojo in #426
  • docs(agents): add missing workflows to AGENTS.md inventory by @​castrojo in #462
  • docs(skills): add lifecycle automation table and common workflow inventory by @​castrojo in #456
  • docs(skills): add all OS factory skills to common by @​castrojo in #427

Opportunistic Work

  • docs(release): rewrite release.md with correct build-time SBOM pattern by @​castrojo in #731
  • docs: replace skills/README.md with redirect to SKILL.md by @​castrojo in #728
  • docs: add merge queue operational failure modes to AGENTS.md by @​castrojo in #726
  • docs(ci): document merge queue AWAITING_CHECKS and locked branch failure modes by @​castrojo in #724
  • chore: remove orphaned gif; fix README stable promotion cadence by @​castrojo in #723
  • docs(ci): remove pr-release-gate.yml from pipeline diagram by @​castrojo in #722
  • docs: fix remaining stale references from full docs audit by @​castrojo in #720
  • docs: brutal accuracy pass — kill stale facts and broken links by @​castrojo in #719
  • docs: final audit — fix remaining stale references by @​castrojo in #711
  • docs: require Context7 tool lookup before any tool or library use by @​castrojo in #694
  • docs(ci): add failure modes for SBOM OOM, merge queue dequeue, statuses 403 by @​castrojo in #707
  • docs: brutal audit — delete stale files, align to daily automated factory by @​castrojo in #708
  • docs(agents): add CI verification command and done-means-verified rule by @​castrojo in #684
  • docs(agents): fix lts branch target, add staging audit and pr dedup check by @​castrojo in #671
  • docs: onboard factory skill-improvement mandate; fix CI docs by @​castrojo in #668
  • docs(skills): add dracut EXDEV nvidia failure mode to build.md by @​castrojo in #587
  • fix(ci): pin testsuite SHA, fix stale known-bug docs, narrow hook exemptions by @​castrojo in #583
  • docs: update AGENTS.md — fix promotion model, remove deleted workflow refs by @​castrojo in #578
  • docs(ci): record testing branch recovery learnings by @​castrojo in #531
  • docs(skills): update ci.md for expanded shellcheck and full bats inventory by @​castrojo in #513
  • docs: quality follow-up — fix missing entries and stale notes by @​castrojo in #512
  • docs: link copr-security.md from SKILL.md router by @​castrojo in #511
  • docs: install-hooks step, remote trap warning, 2-human gate, skill-drift CI docs, iso.md fix by @​castrojo in #479
  • docs: update all docs/skills to reflect two-stream model (testing + stable) by @​castrojo in #464
  • docs(ci): document cosign installer rule and SBOM promotion gap by @​castrojo in #426
  • docs(ci): document SBOM dual-scan runner timeout pattern by @​castrojo in #397
  • docs(ci): document stable branch's local reusable-build.yml exception by @​castrojo in #392
  • docs(agents): add analysis-vs-implementation, cross-repo, and issue comment rules by @​castrojo in #384
  • docs(ci): update promotion pipeline docs for org-wide consistency by @​castrojo in #382
  • docs: update AGENTS.md and workflow.md with current patterns by @​castrojo in #366
  • docs: extend comment policy to cover issues, add close+comment anti-pattern by @​castrojo in #363
  • docs: remove stale ublue-os/bluefin origin remote references by @​castrojo in #352
  • docs(skills): update ci.md and AGENTS.md for main merge queue and branch sync by @​castrojo in #331
  • docs(skills): update ci and build skills for current state by @​castrojo in #320
  • docs(ci): clarify shared workflow boundaries by @​castrojo in #303
  • docs(agents): document floating-tag pre-commit guard by @​castrojo in #302
  • docs: update workflow and renovate skill with current process by @​castrojo in #288
  • docs: update CI/PR workflow docs for validate-only PRs and automerge by @​castrojo in #287
  • docs(workflow): document agent label checklist when opening a PR by @​castrojo in #245
  • docs(skills): integrate session learnings into ci and release skills by @​castrojo in #268
  • docs: restructure README with consistent structure and release cards by @​castrojo in #269
  • docs(workflow): document stuck-PR patterns and bulk-merge flow by @​castrojo in #261
  • docs(ci): document shared CI architecture; add CI-fix-first workflow for agents by @​castrojo in #256
  • docs(workflow): add hive/p0 and hive/p1 to label reference by @​castrojo in #242
  • docs(THEPATTERN): add user/developer impact section, fix stale facts by @​castrojo in #238
  • docs: add SECURITY.md and fix stale ublue-os references by @​castrojo in #171
  • docs: require Context7 tool lookup before any tool or library use by @​castrojo in #370
  • docs(agents): add CI verification command and done-means-verified rule by @​castrojo in #362
  • docs(factory): onboard to factory self-improvement model by @​castrojo in #297
  • docs: add ublue-os/bluefin-lts migration plan and skill by @​castrojo in #321
  • docs(skills): fix stale testsuite SHA-pin policy and README image name by @​castrojo in #294
  • fix(ci): pin testsuite SHA, fix stale docs, narrow hook exemptions by @​castrojo in #245
  • docs: update AGENTS.md — branch model alignment, remove outdated references by @​castrojo in #228
  • docs(skills): update factory state after 2026-06-14 session by @​castrojo in #217
  • docs(skills): add image verification and bootc /boot notes to release.md by @​castrojo in #195
  • fix(docs): fix stale ublue-os image refs, NVIDIA :latest:lts, add SECURITY.md and expanded CONTRIBUTING by @​castrojo in #152
  • docs(skills): update ci-cd runbooks from 2026-06-10 session by @​castrojo in #149
  • docs(skills): rewrite skills as runbooks, remove session-log artifacts by @​castrojo in #145
  • docs(skills): document execute-release startup_failure root cause and fix by @​castrojo in #142
  • fix(ci): resolve post-merge E2E #135 — mask systemd-udev-settle + skill doc by @​castrojo in #136
  • docs(skills): document rechunker-group-fix pattern and emergency promotion runbook by @​castrojo in #134
  • docs(skills): remove testlab skill by @​castrojo in #113
  • docs(agents,skills): align with org-wide pattern; audit and fix skill files by @​castrojo in #112
  • docs(skills): update release pipeline and pitfalls by @​castrojo in #110
  • docs(skills): clarify COPR chroot naming and add bonedigger to workflow map by @​castrojo in #56
  • docs(agents): document floating-tag pre-commit guard by @​castrojo in #52
  • docs: consolidate doc updates from PRs 29, 49, 50 by @​castrojo in #54
  • docs: fix stale image refs and flesh out CONTRIBUTING.md by @​castrojo in #45
  • docs(ci): clarify lts workflow overrides by @​castrojo in #53
  • docs: update skills for shared-actions migration (PR #46) by @​castrojo in #47
  • docs(skills): document projectbluefin/actions adoption by @​castrojo in #38
  • docs: restructure README with consistent structure and release cards by @​castrojo in #36
  • docs(music): move Children of Jensen to Origins, Requiem to Kettle by @​castrojo in #994
  • docs(music): update top section title and playlist order by @​castrojo in #993
  • feat(music): add 'The War of Generations' soundtracks by @​castrojo in #992
  • fix: correct YAML syntax in refresh-sbom-seed.yml by @​castrojo in #990
  • chore: add workflow to refresh SBOM seed files via PR by @​castrojo in #989
  • revert: remove SBOM seed commit step (branch protection blocks push) by @​castrojo in #988
  • chore: auto-commit SBOM seed files from nightly workflow by @​castrojo in #987
  • fix: add search-insights as explicit dep to sync package-lock by @​castrojo in #986
  • chore: migrate ublue-os image repos to projectbluefin org by @​castrojo in #985
  • chore: remove gaming stub page by @​castrojo in #982
  • fix(sparklines): fix trend guard and Sparkline default fill by @​castrojo in #974
  • fix(hive): switch snapshot from broken HTML URL to /api/status by @​castrojo in #952
  • fix(hive): move Guardians/Ghosts to main fetch batch to avoid search rate limit by @​castrojo in #957
  • feat(nav): restructure sidebar — promote Platform section to top by @​castrojo in #976
  • feat(hive): wire public registry API for live governor and frame data by @​castrojo in #955
  • feat(nav+analytics): add Hive to navbar, replace analytics page with LFX widgets by @​castrojo in #977
  • feat(hive): ops center layout — factory floor hero, 3-col intelligence zone, fixed stats grid by @​castrojo in #954
  • feat(hive): governor meter to top, accurate marker, new stats strip cards by @​castrojo in #951
  • feat(hive): remove commit-centric panels, rank contributors by project breadth by @​castrojo in #953
  • feat(docs): show last-update timestamps, hide edit on data pages, fix stale content by @​castrojo in #978
  • feat(projects): add CNCF and OpenSSF section to projects page by @​castrojo in #968
  • docs(agents): add Sparkline component docs, CNCF section policy, update worktrees by @​castrojo in #975
  • chore: remove GTS announcement banner by @​castrojo in #967
  • chore(docs): brutal audit — fix ublue-os refs, update outdated commands by @​castrojo in #980
  • chore(docs): factory audit — delete stale docs, fix supply chain, update agentic guide by @​castrojo in #981
  • docs: add supply-chain security page by @​castrojo in #979
  • fix(hive): 2-column Guardians/Ghosts, full-width Recently Merged by @​castrojo in #959
  • fix(deps): add glob as direct dependency, fix fetch-github-profiles token guard by @​castrojo in #949
  • feat(hive): source from hosted instance + community showcase overhaul by @​castrojo in #930
  • docs(agentic-contributing): update for current projectbluefin state (June 2026) by @​castrojo in #929
  • Replaced Dev Containers guide with last archive version by @​liachra in #928
  • docs: document Hive Factory Dashboard in AGENTS.md by @​castrojo in #925
  • feat(hive): contributor leaderboard with weekly/monthly milestones by @​castrojo in #924
  • feat(hive): expand dashboard with timeline, budget, nous, full merged grid by @​castrojo in #922
  • fix: add missing [email protected] to package-lock.json by @​castrojo in #921
  • fix(hive): drop "The" from title, add factory tagline by @​castrojo in #920
  • feat(hive): The Bluefin Operating System Factory by @​castrojo in #917
  • docs(agentic): add queue dashboard and review-guide pointers by @​castrojo in #912
  • docs: add agentic contributor guide for projectbluefin org by @​castrojo in #910
  • refactor: overhaul agent UX — skill-based docs, slim AGENTS.md by @​Siddhj2206 in #100
Dakota (GNOME OS Prototype)
  • docs: clean house — align with OCI-native daily factory, delete stale content by @​castrojo in #1090
  • docs(skills): record statuses:write startup_failure pattern by @​castrojo in #1071
  • docs(skills): update ci.md — merge_group excluded from build, new lessons learned by @​castrojo in #1105
  • docs: sweep and remove all stale references to push-driven CI and old PR flow by @​castrojo in #1100
  • docs(skills): move CI failure patterns to correct skill files by @​castrojo in #1095
  • docs(ci): document execute-release startup_failure and CAS mid-build drop patterns by @​castrojo in #1094
  • docs: update CI/promotion docs for OCI-native daily promotion by @​castrojo in #1081
  • docs: require Context7 tool lookup before any tool or library use by @​castrojo in #1050
  • docs(agents): add CI verification command and done-means-verified rule by @​castrojo in #1031
  • docs(skills): fix workflow-map — testing-first is the model by @​castrojo in #1029
  • docs(agents): align trailer rule with org standard, add staging audit by @​castrojo in #1013
  • docs: factory compliance audit and cleanup by @​castrojo in #1012
  • docs(skills): fix code fence label in ci.md by @​castrojo in #1005
  • docs(skills): document next-branch-specific patches by @​castrojo in #988
  • docs(skills): onboard factory self-improvement infrastructure by @​castrojo in #982
  • docs(skills): split CI knowledge into focused skills by @​castrojo in #900
  • docs(ci): document run_e2e=false design, narrow hook exemptions to actions only by @​castrojo in #876
  • docs: update AGENTS.md — fix repo map, remove deleted workflow reference by @​castrojo in #869
  • docs(skills): ci — lessons from 2026-06-12 session by @​castrojo in #816
  • docs(skills): ci — release pipeline lessons from 2026-06-11 session by @​castrojo in #802
  • docs(skills): ci + pr-review — lessons from 2026-06-10 session by @​castrojo in #774
  • docs: expand CONTRIBUTING.md with BST build context and AGENTS.md reference by @​castrojo in #776
  • docs(skills): add live build diagnosis and gnome-build-meta nightly delta patterns by @​castrojo in #742
  • docs: document :next/:btw stream, export CAS fix, and next branch ops by @​castrojo in #758
  • docs(skills): add ci.md lessons from PR 751 by @​castrojo in #752
  • docs: add image streams section to README by @​castrojo in #736
  • docs(skills): fix stale CI references and add rubber duck review pattern by @​castrojo in #733
  • docs(skills): 2026-06-07 lessons — CAS outage, ghost LTO, meson systemd dep by @​castrojo in #727
  • docs: complete skill audit — frontmatter, correctness fixes, real lessons by @​castrojo in #724
  • docs(agents): document floating-tag pre-commit guard by @​castrojo in #703
  • docs: reinforce dakota build boundaries by @​castrojo in #704
  • fix(docs): update overview.md gap table — fwupd and uupd are present by @​castrojo in #679
  • docs(skills): add merge-queue skill — retarget, rebase, and fleet patterns by @​castrojo in #668
  • docs(skills): add lab:fail PR reset policy — update in place, no comment spam by @​castrojo in #601
  • docs: clarify push-to-upstream rule — dep-update PRs are same-repo by @​castrojo in #619
  • docs: document publish pipeline, stream model, and factory restart by @​castrojo in #701
  • docs(skills): document publish.yml startup_failure root causes by @​castrojo in #700
  • docs(skills): add merge-queue skill — dep-update PR retarget/cherry-pick/merge flow by @​castrojo in #692
  • docs: restructure README with consistent structure and release cards by @​castrojo in #671

Tech Debt

kind/tech-debt kind/parity

Maintenance work and feature parity between variants

Planned Work

  • chore(ci): remove fragile cross-repo workflows by @​castrojo in #786
  • ci(renovate): use platformAutomerge, remove redundant automerge workflow by @​castrojo in #783
  • refactor(system): move ujust helpers into libexec by @​castrojo in #720
  • ci: exempt internal projectbluefin/ refs from floating-tag hook by @​castrojo in #716
  • fix(ci): drop dead downstream dispatch and sync-labels by @​castrojo in #701
  • revert(ai): remove nvidia/amd AI stacks erroneously merged in #684 by @​castrojo in #687
  • chore(assets): remove unreferenced fedora SVG icons (−2.4MB) by @​castrojo in #650
  • fix(ci): update lifecycle-caller SHA — fixes all PR branch failures by @​castrojo in #638
  • chore(ci): validate release-state.yaml against JSON schema by @​castrojo in #634

Opportunistic Work


Automation

kind/automation kind/github-action kind/renovate

CI/CD pipelines, GitHub Actions, and automated dependency updates

Planned Work

Opportunistic Work

Status: ChillOps


Localization

kind/translation

Translation and internationalization work

Status: ChillOps


Bot Activity

Automation Percentage: 39.4% (551 bot PRs out of 1400 total PRs)

RepositoryBot PRs% of Total
dakota15611.1%
bluefin1399.9%
bluefin-lts1238.8%
common493.5%
finpilot392.8%
documentation70.5%
artwork20.1%
View bot activity details

Contributors

Wayfinders

"Define yourself by your actions."

—Lord Saladin

Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Want to see the latest OS releases? Check out the Changelogs. For announcements and deep dives, read our Blog.

This report was automatically generated from todo.projectbluefin.io.


Generated on 2026-07-02
View Project Board | Report an Issue

Megalosaurus May 2026

· 75 min read
Project Bluefin
Automation & Factory
Total Items290 (33 planned, 257 opportunistic)
Automation53.4% (332 bot PRs out of 622 total PRs)
Contributors37 total, 17 new

Desktop

area/gnome area/aurora area/bling

GNOME desktop environment, Aurora variant (KDE), and terminal enhancements

Planned Work

Opportunistic Work

Dakota (GNOME OS Prototype)

Development

area/dx

Development tools and IDE integrations

Planned Work

Opportunistic Work

Dakota (GNOME OS Prototype)
  • fix(ujust): dx-group — guard PKEXEC_UID, offer reboot by @​castrojo in #597

Homebrew

New Applications

The following applications were added to our Homebrew taps this month:

ApplicationDescriptionStatus
antigravity-cli-linuxTerminal interface for Antigravity agentsStable
antigravity-ide-linuxAI Coding Agent IDEStable
antigravity-ide-linuxNo description availableExperimental
antigravity-linuxNo description availableExperimental
antigravity-sdkPython SDK for building with Google AntigravityExperimental
vmbuddyQEMU wrapper with sensible defaultsExperimental

Use ujust bbrew to browse and install these packages. Follow the tap instructions if you want to do it by hand.

Package Updates

Production Tap Experimental Tap

90 automated updates this month via GitHub Actions. Homebrew tap version bumps ensure Bluefin users always have access to the latest stable releases.

Quick Summary
TapUpdates
production-tap23
experimental-tap67
View all production-tap updates (23)
PackageVersionsPR
goose-linux1.34.0 → 1.36.0 (4 updates)#421
lm-studio-linux0.4.13 → 0.4.15 (3 updates)#422
framework-tool0.6.3#386
visual-studio-code-linux1.119.0#388
View all experimental-tap updates (67)
PackageVersionsPR
zed-linux1.0.1 → 1.4.4 (12 updates)#432
opencode-desktop-linux1.14.30 → 1.15.11 (11 updates)#430
cursor-linux3.2.21 → 3.5.38 (9 updates)#428
craft-agents-linux0.8.13 → 0.10.0 (8 updates)#427
emdash-linux1.1.16 → 1.1.25 (4 updates)#429
dockerd-linux29.4.2 → 29.5.2 (3 updates)#411
dataspell-linux2026.1.1 → 2026.1.2 (2 updates)#422
rustrover-linux2026.1.2 → 2026.1.2 (2 updates)#415
phpstorm-linux2026.1.2 → 2026.1.2 (2 updates)#414
clion-linux2026.1.2#395
rider-linux2026.1.2#407
goland-linux2026.1.2#386
intellij-idea-linux2026.1.2#387
pycharm-linux2026.1.2#388
rubymine-linux2026.1.2#389
webstorm-linux2026.1.2#390
datagrip-linux2026.1.3#360

Ecosystem

area/brew area/bluespeed area/flatpak

Homebrew packages, AI/ML tools (Bluespeed), and Flatpak applications

Planned Work

  • fix(ujust): only run brew bundle when enabling bluefin-cli by @​hanthor in #358
  • Hooks for bazaar by @​jumpyvi in #254
  • spec: Add Bluespeed architecture spec (v0.1) for local-first AI on Bluefin by @​lazypower in #236
  • Removal of Sound Recorder in favor of Decibels by @​pfanzola in #325
  • feat(bazaar): add Rclone Manager and Tube Converter to curated apps by @​repires in #332
  • chore(apps): add gitte (git gui) flatpak to curated apps in Bazaar by @​Ilan-Sperber in #319
  • chore(bazaar): update curated jellyfin to org.jellyfin.JellyfinDesktop by @​coxde in #322

Opportunistic Work

Dakota (GNOME OS Prototype)
  • fix(systemd): guard flatpak-preinstall.service against missing subcommand by @​castrojo in #588

System Services & Policies

area/services area/policy

Systemd services and system-level policies

Planned Work

Opportunistic Work

  • Revert "fix: ensure xdg-desktop-portal starts after gnome-keyring-dae… by @​coxde in #4685
Dakota (GNOME OS Prototype)
  • fix(fdsdk): squash pipewire ref bump and separate policy flags by @​castrojo in #587
  • fix: Remove passwordless sudo policy by @​coxde in #374

Hardware

area/hardware area/nvidia aarch64

Hardware support, drivers, NVIDIA GPU, and ARM64 architecture

Planned Work

Status: ChillOps

Opportunistic Work

  • chore(hwe): bump kernel to 6.19.12-200.fc43 and coreos stable to 43 by @​castrojo in #1334
  • chore(hwe): bump kernel pin to 6.19.12-100.fc42 by @​castrojo in #1333
  • fix(sbom): store cacheKey as tag so nvidia overlay matches correctly by @​castrojo in #840
  • fix(changelogs): fall back to most-recent nvidia SBOM entry for Dakota by @​castrojo in #815
  • fix(changelogs): populate LTS HWE Kernel from lts-hwe SBOM stream by @​castrojo in #779
  • fix(driver-versions): detect kernel and mesa patch-level version bumps by @​castrojo in #776
  • fix(driver-versions): populate LTS HWE kernel from lts-hwe SBOM stream by @​castrojo in #778
  • fix: add dakota-nvidia SBOM stream and BST nvidia-driver extraction by @​castrojo in #808
  • fix: install oras in pages.yml so Dakotaraptor driver versions populate by @​castrojo in #807
  • fix: add bluefin-nvidia-open-stable SBOM stream for stable nvidia driver versions by @​castrojo in #806
  • data(sbom): update sbom-attestations.json seed with GDX nvidia versions by @​castrojo in #805
  • fix: extract nvidia-driver from GDX SBOM, remove release-notes fallback by @​castrojo in #804
Dakota (GNOME OS Prototype)

Infrastructure

area/iso area/upstream area/buildstream area/finpilot area/just area/testing

ISO images, upstream integration, build systems, and testing frameworks

Planned Work

  • chore: update codeowners and add pull request template by @​inffy in #354
  • fix(just): make validation recipe properly fail on errors and fix syntax errors by @​hanthor in #384
  • ci: add e2e PR gate for Bluefin LTS, Stable, and Dakota by @​castrojo in #366
  • fix(just): add volume preview before pruning in clean-system by @​hanthor in #363
  • fix: ignore commented LockLayering setting by @​joshyorko in #300
  • feat(just): add overlay command for sysext testing by @​tulilirockz in #158
  • fix(opentabletdriver): fix opentabletdriver recipe by @​inffy in #343
  • fix(ujust): typo in toggle-user-motd disable message by @​sebjag in #329
  • fix(apps): remove duplicate VideoTrimmer from productivity section by @​EsmeAioli in #320
  • chore: Bump game-devices-udev. Restore the priority prefixes. by @​fardragon in #331
  • chore: bump game-devices-udev by @​renner0e in #330
  • docs: mention LUKS in toggle-tpm2 comment for better ujust --choose discoverability by @​L0g0ff in #299

Opportunistic Work

Dakota (GNOME OS Prototype)
  • feat(ci): add testing/latest/stable stream layout by @​castrojo in #636
  • fix(ci): grant packages:write so testsuite can push desktop screenshot by @​castrojo in #617
  • feat(report): add boot error log and per-unit journal to ujust report by @​castrojo in #589
  • fix(renovate): use stable PyPI URL format for plugins junctions by @​castrojo in #482
  • feat(ujust): add flutter devcontainer scaffold recipe by @​castrojo in #594
  • fix(ujust): show issue URL with template in not-signed-in path of ujust report by @​castrojo in #586
  • feat(actionadon): 5-stage pipeline with you-are-here widget by @​castrojo in #590
  • fix(publish): call just chunkify after export to restore 120-layer output by @​castrojo in #585
  • ci: fix 10 audit issues — SHA resolution, cosign bump, retry, pins, e… by @​castrojo in #390
  • feat(ujust): add probe recipe for AI-assisted diagnostics by @​castrojo in #559
  • ci(hive-status-sync): update project title with live queue stats by @​castrojo in #567
  • ci(hive-status-sync): also trigger on push to main by @​castrojo in #566
  • fix(hive-status-sync): use correct GraphQL field for project status by @​castrojo in #565
  • fix(hive-status-sync): skip posting when PROJECT_TOKEN is not set by @​castrojo in #564
  • ci: hourly Hive status sync to project board by @​castrojo in #563
  • feat(agents): add in-repo skills knowledge base at .github/skills/ by @​castrojo in #543
  • Add contributor discovery table to AGENTS.md by @​castrojo in #545
  • Human-first issue templates — specificity drives velocity by @​castrojo in #550
  • fix: remove emojis from issue templates by @​castrojo in #542
  • fix: ghost copy wording + streamlined issue templates by @​castrojo in #541
  • feat: opt-in AI report stash + Dakota-specific MOTD with gum polish by @​castrojo in #540
  • fix: batch papercut fixes (#304, #352, #456, #465) by @​castrojo in #486
  • feat(just): add ujust report — system information donation by @​castrojo in #494
  • fix(firstboot-date): mkdir -p wants/ before symlink by @​castrojo in #500
  • ci: disable aarch64 build temporarily by @​castrojo in #499
  • ci: re-enable aarch64 build on cron/dispatch only by @​castrojo in #495
  • fix(ci): use app token for checkout in track jobs by @​castrojo in #481
  • fix(release): add full SBOM diff tables to release notes by @​castrojo in #455
  • ci: automated GitHub releases with SBOM-diffed release card by @​castrojo in #443
  • ci: filter publish workflow_run trigger to main and merge queue branches by @​castrojo in #442
  • ci: use mergeraptor app token for PR creation in tracking workflows by @​castrojo in #440
  • ci: fix timeout ceiling, cancel-on-push, redundant step guard by @​castrojo in #438
  • ci: add validate job, move full build off PRs, drop Blacksmith by @​castrojo in #437
  • fix(ci): atomic junction tracking + block Renovate from pinning dakot… by @​castrojo in #425
  • fix(ujust): generate ujust completions by @​coxde in #364
  • refactor(tealdeer): use inline arch dispatcher pattern by @​ahmedadan in #413
  • feat: add document thumbnailers by @​coxde in #409
  • fix(chunkah): bump to v0.5.0 and fix Renovate tracking by @​castrojo in #408
  • fix(renovate): rename managerFilePatterns to fileMatch by @​castrojo in #405
  • feat(deps): add tealdeer (tldr) v1.8.1 by @​axel-kaliff in #116
  • chore: remove Saturn and its exclusive dependencies by @​castrojo in #395
  • ci: serialize PR builds to avoid buildbox contention by @​castrojo in #397
  • fix(ci): update scorecard-action to verified commit SHA by @​castrojo in #393
  • feat(security): OpenSSF Scorecard, CodeQL SAST, SECURITY.md, hardened token permissions by @​castrojo in #391
  • ci: fix oras attach digest capture for SBOM signing by @​castrojo in #389
  • ci: inline export in publish with correct BST_FLAGS by @​castrojo in #388
  • ci: fix BST_FLAGS key mismatch in export and add explicit artifact push by @​castrojo in #387
  • ci: move export to separate job to fix BST artifact checkout by @​castrojo in #386
  • ci: pull BST artifact to local cache before export by @​castrojo in #385
  • ci: move export/chunkify/sbom to build, publish loads artifact by @​castrojo in #384
  • ci: add docker login so cosign can authenticate to GHCR by @​castrojo in #383
  • project.conf: Add x86_64_v3 option and enable it by default by @​alatiera in #91
  • fix(ci): per-SHA concurrency for merge_queue publishes by @​castrojo in #380
  • fix(ci): use --merge instead of --squash for merge queue compatibility by @​castrojo in #379
  • fix(ci): move Blacksmith to publish only, schedule on standard runners by @​castrojo in #378
  • feat(ci): split build/publish workflows, add SBOM+signing by @​castrojo in #377

Documentation

kind/documentation

Documentation improvements and additions

Planned Work

Status: ChillOps

Opportunistic Work

Dakota (GNOME OS Prototype)
  • docs: add actionable fix notes (fixes #180 #501 #503 #524 #527 #536 #603 #606) by @​hanthor in #607
  • docs(agents): define /lab slash commands, restrict to maintainers/wranglers by @​castrojo in #604
  • docs: add 20 community skills to .github/skills/, slim AGENTS.md to pointer file by @​castrojo in #572
  • docs: trim AGENTS.md by 51%, tighten skills for token efficiency by @​castrojo in #570
  • docs(readme,motd): rewrite readme around feedback loop, overhaul motd by @​castrojo in #560
  • feat: built-in feedback loop — boot-test, actionadon commands, architecture doc by @​castrojo in #534
  • docs(AGENTS.md): fix content gaps from gap analysis by @​castrojo in #508
  • docs: add AGENTS.md for contributor and agent guidance by @​castrojo in #507

Tech Debt

kind/tech-debt kind/parity

Maintenance work and feature parity between variants

Planned Work

Opportunistic Work


Automation

kind/automation kind/github-action kind/renovate

CI/CD pipelines, GitHub Actions, and automated dependency updates

Planned Work

Status: ChillOps

Opportunistic Work


Localization

kind/translation

Translation and internationalization work

Planned Work

Status: ChillOps

Opportunistic Work


Bot Activity

Automation Percentage: 53.4% (332 bot PRs out of 622 total PRs)

RepositoryBot PRs% of Total
bluefin8714.0%
bluefin-lts7512.1%
dakota579.2%
common71.1%
documentation71.1%
finpilot50.8%
artwork30.5%
iso10.2%
View bot activity details

Build Health

Raptor Race

Keep Bluefin healthy with green builds. Wranglers apply within!

ImageSuccess RateSuccessesFailuresMonthly Change
bluefin:stable76%19060-19.7%
bluefin:latest84.3%20438-9.5%
bluefin:lts46.3%119138-50.3%
bluefin:lts-hwe45.4%118142-51.8%
bluefin-dx:lts45.9%118139-50.7%
bluefin-gdx:lts46.1%119139-48.8%
bluefin-dx:lts-hwe46.3%120139-50.5%

This Month's Highlights

MetricValue
📊 Total Builds1783 builds across all images
🏆 Most Activebluefin:lts-hwe (260 builds)
💯 100% ClubNone. Vegeta is displeased.
⏱️ Avg Build Time17 minutes across all variants

Contributors

New Lights

We welcome our newest Guardians to the project.

"I do not know what the future holds. But I know this: with you at our side, there is nothing we cannot face."

—Commander Zavala

Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Wayfinders

"Define yourself by your actions."

—Lord Saladin

Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Want to see the latest OS releases? Check out the Changelogs. For announcements and deep dives, read our Blog.

This report was automatically generated from todo.projectbluefin.io.


Generated on 2026-06-01
View Project Board | Report an Issue

Knuckle: Flatcar Container Linux for the Home

· 6 min read
Jorge O. Castro
Director of Dinosaurs

Check out this announcement about Azure Container Linux GA. I won't be talking about Azure Linux 4.0. That's the "distro".

Let's talk about Flatcar Linux instead. This is an OS that's stripped down, designed for you to drop what you want on it. It is in the CNCF and a perfect fit for us. Every raptor needs a nest. Afterall, linux is linux. Our homelabs should be badass.

The Problem with Installing Flatcar (and CoreOS)

Both Flatcar Container Linux and Fedora CoreOS use Ignition for first-boot provisioning — a powerful declarative system that requires you to write a complete JSON (or Butane YAML) config file before you can install. There is no interactive configuration during install it's pretty nerdy. Basically for all intents and purposes, uninstallable for enthusiasts. For experienced Kubernetes operators this always-in-pain life is fine, but for homelab users and folks new to container-native Linux, it's annoying. And our mission is to help OSS developers which means, we cover all aspects. And from reading the room, I think a lot more people are going to want to self host. And so are organizations. This is why it has to be cloud native, you gotta have the server ↔ client goodness to compete.

It would be madness to create our own installer, so Knuckle just translates that stuff into something the Flatcar installer understands and then that's it. It's the real image. And we added some nice conveniences like choosing systexts. That's it. A pure vanilla brick wth a fancy ignition translator. What are you going to build with yours? Here's what we've been working on:

Enter Knuckle

Knuckle TUI installer — the guided wizard welcome screen

Knuckle is a TUI "installer" for Flatcar Container Linux. It gives you an Ubuntu-server-style guided wizard that generates a valid Ignition config and passes it to flatcar-install — no hand-crafted JSON required. Knuckle is "basically Azure Container Linux (Home Edition)." but it's the upstream unbranded one with not many strong opinions.

We even wired in the sysexts and whatnot.

Knuckle sysext catalog — browse and select system extensions from the Flatcar Bakery during install
Knuckle install progress — live progress bar while flatcar-install runs

Note: Knuckle is pre-alpha software. It will wipe the target disk. UEFI-only; BIOS/legacy boot is not supported.

Why Flatcar?

Flatcar is an awesome OS, here's a list. I like it because it offers different stability channels, making it easy to canary test on clusters, etc. But it's also a great building block to build your server on:

  • Read-only system partition — dm-verity protected; eliminates a whole class of vulnerabilities
  • Automatic atomic updates — using the same mechanism as Google ChromeOS; atomic rollbacks supported, this is actually built with Gentoo upstream!
  • System Extensions (sysexts) — Extend your server with the Flatcar Bakery
  • Ignition provisioning — declarative first-boot config, shared format with Fedora CoreOS
  • No package manager — user workloads run as containers (Docker, Kubernetes) or sysexts; the OS itself never drifts
  • CNCF governance — vendor-neutral, community-maintained, built to outlast any single company's interest
  • Production-proven at scale: Adobe (18,000+ nodes), STACKIT (20,000+ nodes, their customers' most popular OS choice), and many more

People sometimes ask why we don't make a Server Edition. It's because we don't care about distributions it's all Kubernetes. :) And even if it fails at that we can prove people want it. But the nice thing about flatcar is it comes empty and is great for lots of projects. For me it's the last OS you install on your new server build. Problem solved, I have jellyfin to set up let's go!

Intent

This project is intended to spread the use of Flatcar Linux and Fedora CoreOS to the home enthusiast audience. Digital Sovereignty isn't just for nations, so we're going to use the tools nations use to make our lives awesome. We hope that this will live somewhere upstream and unites the CoreOS family.

Knuckle is feature complete, we won't be adding whizbang features, it's vanilla only and will only ever support vanilla. However ...

Bluefin Server?

Since this is all well designed cloud-native stuff: "upstream + opinion = product".

  • k8s configured for single node operation, easy to expand (you just set up another one)
  • Single webui to schedule whatever you want, say jellyfin, all the self-hosted stuff of your dreams
  • All that dashboard stuff you want to show off to your friends with
  • kubevirt out of the box, import your old VMs and redeploy on your new system.
  • Out of the box gitops so you can operate the entire cluster from version control
  • No CLI, No ssh, or kubectl access at all - entire cluster is API or MCP driven, magical tailscale integration
  • Standard industry gear, Kubernetes, Argo Workflows, k8s-mcp-server, bring your own workload

Now THAT is an opinion! I have a version of this running in my lab now, and we'll keep iterating, so start with ideas. It's still early days but I'm sure many of you will start prototyping with Flatcar, sky's the limit!

Get Knuckle

Download the installer ISOs from the GitHub Releases page:

ArchitectureDownload
amd64knuckle-installer-stable-amd64.iso
arm64knuckle-installer-stable-arm64.iso

SHA256 checksums and cosign signatures are published alongside each release.

  • SSH in as the core user with the key you configured
  • The OS updates itself automatically on the schedule you chose during install
  • Add software via sysexts (/etc/extensions/), containers (Docker/Kubernetes), or distrobox
  • Reprovision by re-running knuckle — no in-place mutation

Discussions

Gradia Capture Comes to Bluefin

· 2 min read
Coda
Bluefin Contributor

Screenshots are bug reports, social posts and memes. The faster you can capture the thing, draw an arrow at the thing and send it, the better.

Bluefin is rolling out an upgraded screenshot experience with Gradia and Gradia Capture. The Gradia Flatpak is built in and ready out of the box for new users (Existing users might need to install it in the Bazaar App Store, we'll figure out how to automate it, send issues!) and Gradia Capture hooks into GNOME's screenshot flow so the path from capture to annotation feels native.

Gradia Capture annotating a screenshot from GNOME's screenshot workflow
Gradia Capture enhances GNOME's screenshot flow with annotation, OCR and Gradia integration.

Capture, mark up, send it

Gradia gives you the finishing tools that screenshots usually need before they are useful: text, arrows, censoring, padding and quick upload. Gradia Capture brings that into the screenshot moment with annotations and OCR text recognition, optionally you can hand it off to Gradia for further editing.

Gradia and Gradia Capture are built by Alexander Vanhee. If this saves you time, please send some support upstream. Supporting builders like Alexander helps keep that momentum going and helps modern Linux desktop like Bluefin keep shipping great apps out of the box.

Discussion Thread

Making Our Own Fate: Dakota Alpha 2

· 13 min read
Jorge O. Castro
Director of Dinosaurs

The Final Shape is here...

RELEASE SOUNDTRACK TO HUNT BYBluefin and the Lost Tribe of Contributors

Ok look we made another Bluefin. I know what you're thinking (especially you McPhail!). We got rid of Bluefin GTS and now the team decided to make another one. How many of these things are there, it's like a string of Jurassic Park sequels. First let's level set. The product is Bluefin. That's the default Fedora one.

Dakota Alpha 2 desktop screenshot

Your favorite murder chicken is safe. We don't expect normal people to know what Dakota is anymore than we expect them to know what a Koenigsegg is. I can't even pronounce that name! We remain a project designed for cloud native practicioners, so we offer the very best tech the desktop has to offer. And there's good tech in BuildStream and GNOME OS, there's a compelling set of options here. This one just goes all in. I would not call yesterday's Fedora Hummingbird announcement a coincidence.

And now for the mysterious new raptor who keeps making waves:

Bluefin Dakota

latest-20260613June 13, 2026
Kernel7.0.7Gnome50.2Mesa26.0.6Podman5.8.2Nvidia610.43.02bootc1.16.0systemd260.2pipewire1.6.1flatpak1.16.6

Dakota is our newest "distroless" raptor. It's built from source and directly published as a bootc image, no traditional package manager involved at all.

Wait, this is just Gentoo.

Chris Aniszczyk, CTO Linux Foundation and former Gentoo contributor

Dakota features a more aggressive push away from legacy technologies, pure image mode only. Just the best desktop we can ship, direct from GNOME and Freedesktop SDK right to you. We remove the concept of "the Linux distribution" being a platform and the top primitive, the Freedesktop SDK libraries and Flathub are our platform. No compromises. Dakotaraptor is daily driveable and has quickly exceeded all expectations.

  • GNOME 50, Linux 6.19.x, Mesa 26.x, and Freedesktop SDK 25.08.11 libraries
  • systemd-boot, UKIs, UEFI only, compiled for the x86-64-v3 architecture level
  • Oxidized coreutils - same sudo-rs and uutils setup as Ubuntu - thanks to Canonical for funding this important work
  • Mostly feature complete, it's a full Bluefin
  • Custom Command Menu — Dakota features a newly refined menu. We hope to bring this menu to other Bluefins over time.
  • Ghostty as the default terminal

Since Dakota is brand new there's no users to transition when we switch something. We are switching to Ghostty as the default terminal. This has always been a fan favorite so we're starting with it fresh here.

Last I talked to Christian Hergert we discussed having ptyxis just use a libghostty backend. This is not only totally possible but would be the ideal situation! Someone please make this.

Changes since Alpha 1

Thanks everyone who helped test, you've done a great job!

  • LUKS encryption works on install
  • Full Nvidia Image
  • Efficient layering - this image uses the upstream chunkah tool for more efficient downloads. We expect efficient delta downloads to land sometime this summer, but the infrastructure is in place now
  • Linux 7.x kernel will land once some of the bootc issues with 7.x are resolved
  • Beta target: Probably a month or so; GA target: Fall 2026
  • Want to help? GNOME OS upstream is always looking for help: os.gnome.org

Gotchas

And the big one. We cannot guarantee that this installation will be the final layout. GNOME OS is transitioning to systemd-homed eventually. That will mean either a manual transition or reinstallation. As such we likely will not go GA until this transition completes. We expect a lazy summer beta.

What now? It has been an absolute pleasure working with BuildStream over the past few weeks. The team has committed to the hardware necessary to make builds faster and the local development experience has been the best we've ever had. It has become clear and obvious to me that the combination of BuildStream and bootc brings a level of automation and developer experience that will be tough to beat.

Here's the hot take: If you look at all three raptors, all else being equal, the best development experience and best infrastructure always wins in this space. We have over a decade of cloud native industry experience to prove it, Kubernetes runs the world for a reason. This workflow is now in the Linux desktop space. I firmly believe that buildstream/bootc combined with our gitops approach will deliver a fantastic product.

Thanks to Brian Ketelsen and James Reilly for the Tuna installer. Yes they called it the Tuna installer. lol.

Thanks to Jordan Petridis, Valentin David, Adrian Vovk, Felicitas Pojtinger, and the GNOME OS team for their expertise and advisory roles - we couldn't do this without you!

Bluefin's Download Diet: Introducing Chunkah

Yes, they called the upstream rechunker "Chunkah". A rechunker is a thing we use to take an image and reslice it into more chunks. ghcr.io/projectbluefin/dakota is sliced into 120 layers instead of one big unresumable download for updates. It also takes content of the image into account. The idea being if you have components that update often, they would be group together in layers, and things that don't get updated often are group together.

That means if your computer doesn't need that layer for that update, it doesn't get downloaded. Additionally partial zstd:chunked pulls will complement the layering. This will mean that your computer will also only download the parts of the layers it needs. When combined this finally brings efficient downloads to the bootc ecosystem. Initial findings are looking good.

These alpha images are rechunked by Chunkah, but unified storage does not work on the composefs backend to bootc yet so it's not done.

Why tho? A Call to Action

After all that praise of an alpha product of all things, some may misconstrue this as abandonment of the other Bluefins or a lack of focus. Now let's talk about how we got here.

Disclaimer

This section is my opinion and does not reflect the views of the team, but is instead a reflection of my 20+ year journey working in Linux.

-- jorge

The Shoulders of Giants

Bluefin's mission is sustainaiblity, that means people. Bluefin LTS is there so we have a reason to bring people like Carl George and Shaun McCance into our ecosystem. Without Bluefin LTS Red Hat would not have as much of a financial incentive to help us out. We drive bootc forward, they invest in the software and sell it as part of their product. It's the Circle of Life, but with Linux. Red Hat did afterall, give us millions of dollars of engineering for free.

Same thing with Fedora, it's our line to that center of gravity. And we have a new approach with Fedora Hummingbird, attracting more people. It's not about the software, it's about the ecosystems we make along the way. Sounds like the kind of tripe the Linux Foundation loves to peddle! Dakotaraptor has one foot in the bootc world and one in the UAPI world.

Speeeeed

We will participate in both of those large ecosystems; that brings in the largest group of talent. Projects live and die based on the contributors that show up. We will always endevaour to work the best people at the cutting edge of Linux. We're ops people, mastery of all Linux is a requirement.

The CNCF Community via bootc, composefs, podman, and oras. The UAPI community bringing in the Linux userspace. Sounds great, let's go. Someone from Amutable please save me a shirt!

The Race to Sustainability

Colin Walters describes communities like this as "Centers of Gravity" - and we're all in one gigantic galaxy, everyone pulling and pushing around different ecosystems. All made possible by open source tools, amazing.

The state of Dakota Alpha 2 is impressive considering how few people it took to make it. For us our job is to make Bluefin as thin of a config layer as we can, our opinions are mostly in userspace anyway. It should be noted that this way is always cheapest. It is always cheaper to fix things upstream closer to the source. It's called "shifting left", yes there's a term for it lol. Welcome to cloud native.

It's here

There are those that will say that GNOME OS and KDE Linux make no sense, that's what distributions are supposed to do. I push back against that. 4% marketshare in 30 years is not a success story. And the ones that are growing are designed to be used as reliable clients and not package manglers.

Timothée Ravier once said, people don't want distributions they want experiences. And these operating systems will prove it. No one will ever give you a better KDE experience than KDE. That wasn't true in the past because distributing software over the internet was hard. Now not only is it much easier, these organizations can start greenfield with the state of the art rather than trying to adapt old techniques to the new world.

Best infrastructure wins. Fastest and cheapest development wins.

If you're into GNOME work on GNOME OS, if you're on KDE work on KDE Linux. If you like Fedora work on that. Make a friend, donate to an app developer.

Prove it, nerd

I will be discussing this in my talk at the Linux Application Summit: Making our own Fate: Why GNOME and KDE need operating systems - be there!

This is of course, all from our point of view.

GNOME OS would prefer we ship a DDI image. And some would prefer we don't exist at all and just sit as a systemd-sysext in GNOME OS. Sure, someone make one, we have buildstream, would you like fries with that? And with so many RPM-based people in the bootc world I am sure there are people who prefer that Bluefin just focus on being a Fedora with batteries included and nothing else.

But we are a forcing function - the dinosaurs are there to remind us that only the best survive the harshest ecosystems. This is especially true in the resourced starved Linux desktop ecosystem. We will continue to push. Some software is not going to make it. See you in the trenches, thanks!

It really is just a conspiracy

We built Universal Blue. Aurora, Bazzite, and Bluefin, as a team.

Then opportunites opened up for our contributors to work for organizations at the forefront of Linux. The Linux Foundation, Microsoft, Chainguard, Red Hat, and others. Driven to build around open standards but leaving room for commercial entitities to exist and thrive. And that's just the core team, as you can see from our contributor lists, the cloud native ecosystem is a significant center of gravity in open source.

You have proven that enthusiasts matter and can shape the future of the desktop. Level up your skills and organizations looking for open source talent will take you seriously, and in today's brutally competitive job marketplace, expertise in open source matters.

There's no right way to Linux, but there are certainly wrong ways to Linux. If you're new to Linux, welcome. We are your starter dungeon. We're your sysadmin team, nice to meet you, we've got your back. Greatness awaits. And also pain. Mostly pain.

Merch

Celebrate the release of a new top predator with our stylish "Dakotaraptor Forever" shirt.

Check out the rest on store.projectbluefin.io →

Download

The Resonant Assembly

One last group of people to thank. These community members participated in GitHub Discussions over the last six months. Asking questions, sharing tips, helping newcomers, and keeping the conversation going is just as valuable as code. Thank you for your help, it's important!

The Resonant Assembly

Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Filing Issues

Discussion Thread

The Dinosaur and the Hummingbird

· 2 min read
Jorge O. Castro
Director of Dinosaurs

Hey, you know who is good at making "distroless images"? Distros.

  • Scott McCarty, Challenger of The Final Shape

It seems Fedora Hummingbird has been revealed. Of course Red Hat built this, modern infra demands modern images. All they had to do was put a kernel in there. So they did. It's awesome that this will be done in Fedora!

I had heard the rumors. But it wasn't until I put two and two together and realized that Red Hat had quietly hired two Universal Blue core maintainers. They will be on the team building this. In the open, along with everybody else. This will take them some time to cook, there is a ton of work ahead. But it's closer than you think. I was able to cobble together a prototype in a day. Most of what you're about to see was grabbing the Fedora RPMs and and smelting it together. But it worked. It booted just fine.

Bluebird — a Bluefin prototype running on Fedora Hummingbird

This is also the reason why we're not doing the stable->testing->next plan. We'll likely do more one off testing branches, but work on the sealed images and Hummingbird will attract the right kind of nerds to make this interesting. I think it's cool that they're putting this in Fedora. You have the evolution of the tried and true way + a continuous integrated option that can be the prototype for a greenfield Silverblue and Kinoite.

This does not exist (yet)

Well, I got what I wanted, a CoreOS style base image to have a true "CoreOS Desktop". So is Fedora rolling or stable? Yes.

I hope some of you step up and accept's Scott's challenge, we have an opportunity to do something brand new, chances like this don't come along often! A place for a cloud native in Fedora, I can't wait to see what Legends rise.

Discussion Thread