Skip to main content

42 posts tagged with "announcements"

View all tags

Still Roaring: Bluefin Classic and LTS

· 6 min read
Juan Resendiz
Bluefin Classic Maintainer

I want to start this by clearing the air: the Bluefin you know and love is going nowhere! It's still here, just with a new look and a few new raptor wranglers at the helm. Let me start by introducing myself. I'm Juan Resendiz, I'm from Florida and I do nerd stuff over at Concept To Cloud during the day. I heard Jorge's call and he had me sold at dinosaurs. Linux was the cherry on top.

A dinosaur statue looking like it's about to eat Juan
first day on the Bluefin Discord

When I decided to step up I had no idea what I was getting myself into. Heck, I still don't! But what I do know is I believe in Jorge's vision for operating systems, and my mission is to continue the hard work he and the team before me started. Now I'm not saying they've gone anywhere: they've been awesome with the transition and I can honestly say I feel very comfortable already thanks to the mentorship and guidance of everyone involved.

But now to why we are all here. The original and classic Bluefin you all know is now Bluefin Classic. And Bluefin LTS is still LTS... it isn't going anywhere either. For those who are just here to know if it will continue to get supported and don't really care for the tech talk, rest assured: your friends, parents and grandparents will still be good to go. For the rest of my tech folks, read on.

What's changing​

Bluefin Classic will still be under Universal Blue. The only thing that will be changing is we will pull directly from Fedora now. We are currently testing with the F44 and F45 beta versions of the swap. F45 is on track for October. You do not have to do anything except for the normal updates as they come. You are good to go and still supported. We are going nowhere.

So what does "pull directly from Fedora" actually mean? Today Classic is built on top of a Universal Blue base image, which sits on top of Fedora Silverblue. With the new setup Classic builds straight on Fedora's own Silverblue image instead. One less layer in the middle, and updates come right from Fedora. Same Bluefin on top, same apps, same ujust, same everything you're used to.

We're also testing more than ever. Classic now passes the Project Bluefin testsuite's common checks, so every image gets booted and poked at, not just built. And the weekly updates keep rolling like always: stable still lands every Tuesday (recent ones brought kernel 7.2). Oh, and Classic got its own look too: a shiny new Bluefin Classic wordmark from the awesome Delphic Melody.

LTS, the honest part. It had a rough summer, which is why :lts hasn't updated since July. Builds are green again on x86 and ARM, the boot hang is fixed, and Project Bluefin LTS ships daily. Getting :lts updated is next. But it will be getting a bit of a bigger change. It's moving its home to Project Bluefin, but you don't need to do anything today. Also: we're working on DX for LTS so nobody gets left behind, and we'll post before anyone moves.

If the move isn't ready, it doesn't happen. Simple as that.

What you need to do​

Nothing! Seriously. Whether you're on Classic or LTS, keep updating like you always have. If anything ever changes for you, you'll hear about it here first.

What about Dakota and Utah?​

I've seen this one a lot, so let's clear it up. Dakota is its own thing, built a totally different way, and moving to it means a fresh install. Utah is the new one built on Fedora Hummingbird. Neither one is replacing Classic. If you're happy on Classic, stay on Classic. As Jorge put it: "you would just stay on what you have."

For the curious though: I've been testing switching from Classic to Utah in VMs, from both F44 and F45. It boots, your files and SSH keys come along for the ride, and you can roll right back to Classic if you change your mind. When that's ready for everyone it'll be an opt-in ujust command. Nobody gets moved without asking.

How you can help​

Run Classic or LTS? You're already helping! If something breaks, tell us: open an issue on GitHub or drop it in #dev-classic. Want to go further? Test the images and PRs. murphym18's builder and the testsuite make that a lot less painful than it used to be.

Thank you​

None of this is a one person job. Huge thanks to Jorge for the ZFS fix and for keeping the merges moving, murphym18 for jumping into reviews, testing images on his own machine and building a tool that makes testing every Classic image way less painful, James (hanthor) for the ARM fix and for getting us the access we needed, Robin for the LTS reviews and merges, bsherman for keeping the CentOS builds around so the move has room to breathe, and Danathar and Kyle Rankin for the testsuite reviews. You all made a new guy feel right at home.

Benjamin with green T-rex face paint
My son Benjamin is all in on Bluefin as well

Also a big shout out to Delphic Melody for the Classic and LTS wordmarks, and to JF and inffy for jumping in to answer questions and point us in the right direction.

Where to find us​

Got questions, found a bug, or just want to say hi? Come find us in #dev-classic on the Project Bluefin Discord, or drop a comment on the Classic and LTS discussion on GitHub. I'll be around.

Here's the discussion: Handing off ublue-os/bluefin and bluefin-lts to the next generation. And keep an eye out, the November wallpaper fix is on its way.

Classic and LTS are still roaring, and we plan on keeping it that way. 🦖

Stegosaurus September 2026

· 137 min read
Project Bluefin
Automation & Factory
Completed work
780
79 planned • 701 opportunistic
Contributors
27
11 first-time contributors

Activity

Completed work across the configured factory portfolio.

Daily merged pull requests

1,200merged pull requests
Source: GitHub GraphQL · September 2026 UTC (2026-09-01 to 2026-09-30)
Show the numbers
Daily merged pull requests data for September 2026 UTC (2026-09-01 to 2026-09-30)
LabelMerged pull requests
2026-09-019
2026-09-0214
2026-09-032
2026-09-0410
2026-09-0539
2026-09-0647
2026-09-0738
2026-09-0835
2026-09-0920
2026-09-1076
2026-09-116
2026-09-1234
2026-09-1333
2026-09-1439
2026-09-156
2026-09-1614
2026-09-1716
2026-09-1839
2026-09-1941
2026-09-2078
2026-09-2122
2026-09-2281
2026-09-23113
2026-09-2448
2026-09-2575
2026-09-2663
2026-09-2750
2026-09-2815
2026-09-2988
2026-09-3049

Merged pull requests by repository

1,200merged pull requests
Source: GitHub GraphQL · September 2026 UTC (2026-09-01 to 2026-09-30)
Show the numbers
Merged pull requests by repository data for September 2026 UTC (2026-09-01 to 2026-09-30)
LabelMerged pull requests
projectbluefin/actions96
projectbluefin/bonedigger7
projectbluefin/common133
projectbluefin/dakota133
projectbluefin/documentation255
projectbluefin/finpilot85
projectbluefin/iso2
projectbluefin/server134
projectbluefin/testsuite77
projectbluefin/utah150
projectbluefin/utah-packages128

Merged pull requests by label

865label assignments
Source: GitHub GraphQL · September 2026 UTC (2026-09-01 to 2026-09-30)
Show the numbers
Merged pull requests by label data for September 2026 UTC (2026-09-01 to 2026-09-30)
LabelLabel assignments
2-discussing5
3-clanker-queue26
3-human-queue26
4-review41
agent/architect19
agent/ci-maintainer4
agent/quality32
agent/scanner41
agent/security4
architecture17
automerge83
blocked4
build10
chore/deps82
dependencies7
flatcar-base6
full-build2
hive/hosted-projectbluefin-knuckle-gjvq82
hold112
javascript7
kde11
lgtm72
needs-human14
pr/needs-review63
quality36
release/blocked1
release/ready4
runner11
security6
size:XS1
tech-debt1
testing35

Stable portfolio

  • projectbluefin/dakota
  • projectbluefin/testsuite
  • projectbluefin/server
  • projectbluefin/actions
  • projectbluefin/bonedigger
  • projectbluefin/aurorafin-shared
  • projectbluefin/common
  • projectbluefin/documentation
  • projectbluefin/branding
  • projectbluefin/iso
  • projectbluefin/finpilot

Experimental portfolio

  • projectbluefin/utah
  • projectbluefin/utah-packages

Delivery

Publishing-lane outcomes, cadence, duration, and release events.

Factory Publishing Lanes

39Passed
4Failed
38mMedian Run

Pending runs: 22

Run History

Publishing-lane cadence

65publish runs
Source: GitHub Actions · September 2026 UTC (2026-09-01 to 2026-09-30)
Show the numbers
Publishing-lane cadence data for September 2026 UTC (2026-09-01 to 2026-09-30)
LabelDakota
2026-09-010
2026-09-020
2026-09-030
2026-09-040
2026-09-050
2026-09-060
2026-09-075
2026-09-0810
2026-09-090
2026-09-100
2026-09-110
2026-09-120
2026-09-130
2026-09-140
2026-09-150
2026-09-160
2026-09-170
2026-09-180
2026-09-190
2026-09-200
2026-09-210
2026-09-220
2026-09-230
2026-09-240
2026-09-2514
2026-09-2610
2026-09-2722
2026-09-282
2026-09-292
2026-09-300

Release events

29release events
Source: GitHub Releases API · September 2026 UTC (2026-09-01 to 2026-09-30)
Show the numbers
Release events data for September 2026 UTC (2026-09-01 to 2026-09-30)
LabelRelease events
2026-09-211
2026-09-181
2026-09-161
2026-09-141
2026-09-091
2026-09-041
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-301
2026-09-291
2026-09-291
2026-09-291
2026-09-291
2026-09-291
2026-09-291
2026-09-281
2026-09-081

Participation

Human and automated contributions with current contributors.

Human and automation activity

1,200pull requests
Source: GitHub GraphQL · September 2026 UTC (2026-09-01 to 2026-09-30)
Show the numbers
Human and automation activity data for September 2026 UTC (2026-09-01 to 2026-09-30)
LabelHumanAutomation
Report period780420

Ecosystem context

Public ecosystem measures labelled with their native source windows.

Countme trendData unavailable: Countme active-system measurement is incomplete.

Homebrew tap additions

4package additions
Source: Homebrew taps · September 2026 UTC (2026-09-01 to 2026-09-30)
Show the numbers
Homebrew tap additions data for September 2026 UTC (2026-09-01 to 2026-09-30)
LabelAdditions
Production tap1
Experimental tap3

Flathub downloads

138,860,924calendar-month downloads
Source: Flathub · 2026-09-01 to 2026-09-30 UTC
Show the numbers
Flathub downloads data for 2026-09-01 to 2026-09-30 UTC
LabelDownloads
2026-09-013847891
2026-09-023704773
2026-09-033346979
2026-09-043546709
2026-09-053606051
2026-09-063971490
2026-09-074269175
2026-09-083641711
2026-09-093430562
2026-09-103964229
2026-09-114223264
2026-09-123427171
2026-09-133209228
2026-09-143253176
2026-09-156879476
2026-09-169581954
2026-09-175635105
2026-09-185799594
2026-09-196441098
2026-09-205626597
2026-09-215122010
2026-09-225022777
2026-09-234330136
2026-09-244717927
2026-09-254303001
2026-09-264377214
2026-09-274183987
2026-09-285367481
2026-09-295826789
2026-09-304203369

Release details remain on the canonical /changelogs surface.

Completed work​

  • fix(ci): report required checks on docs-only PRs by @​Danathar in #1181
  • docs(secrets-policy): record Cloudflare secrets as provisioned by @​clubanderson in #1275
  • feat(wallpaper): ship original looping movie for Hidamari by @​mendezr in #1207
  • refactor: remove produced-but-unconsumed nvidia overlay by @​mendezr in #1263
  • docs(ci-tooling): record Renovate fork processing for the printer forks by @​sramkrishna in #1259
  • docs(release-promotion): record printer testing-to-stable promotion proof by @​kylerankin in #1257
  • feat(brew): update opencode to the v2 formula by @​kronikpillow in #1270
  • docs(ci-pitfalls): correct create-github-app-token owner/repositories scoping by @​castrojo in #1269
  • fix(chairlift): refresh vendored desktop entry and icons to v26.09.0-alpha.2 by @​clubanderson in #1274
  • docs(chairlift): fix broken brew-lifecycle doc reference in config.yml by @​buggtb in #1273
  • fix: align ChairLift config and ship GSettings schemas by @​mendezr in #1265
  • fix(nvidia): pin suspend notifiers so sleep is not vetoed by @​mendezr in #1176
  • fix(brew): comment out kcl, use upstream kpt, remove aurora-wp by @​KiKaraage in #1131
  • feat(wallpaper): add Damask first-run setup hook and non-destructive defaults by @​repires in #1186
  • fix: reconcile inert .github Renovate configuration by @​repires in #1183
  • feat(damask): ship flatpak overrides and background systemd service by @​repires in #1187
  • feat(chairlift): add wallpaper slideshow and video wallpaper brew bundles by @​sramkrishna in #1185
  • ci: run all maintained unit suites in CI by @​arteeh in #1249
  • feat(testing): add a hardware-free eSCL scanner fixture by @​sramkrishna in #1225
  • docs(contributing): add per-repo reviewer coverage map with refresh procedure by @​mendezr in #1248
  • docs: inventory printer and scanner driver projects by @​arteeh in #1221
  • docs: record printer application upstream source baseline by @​buggtb in #1251
  • docs(skills): track PAPPL scanning API upstream status and ownership boundary by @​buggtb in #1218
  • docs(printer-apps): add release-contract evidence matrix by @​buggtb in #1222
  • docs(ci-tooling): correct stale claim about dockerfile manager and COPY --from by @​buggtb in #1255
  • docs(skills): correct renovate versioned-binary tracking wording by @​mendezr in #1250
  • docs: assess native HP PCL app against HPLIP OCI coverage by @​buggtb in #1236
  • docs: evaluate LPrint v1.4.0 as FSDK OCI label-printer appliance by @​kylerankin in #1235
  • docs: correct reusable lifecycle automation ownership (bonedigger, not actions) by @​buggtb in #1227
  • docs(scanner): evaluate scanApp POC and pappl-retrofit scanning feasibility by @​buggtb in #1220
  • docs: evaluate legacy SANE scanning appliance without claiming driverless parity by @​buggtb in #1219
  • docs(contributing): add self-collision preflight draft for intra-lane duplicate PRs by @​sramkrishna in #1201
  • fix(audio): make Bluetooth auto-switch opt-in instead of default by @​mendezr in #1179
  • feat(brew): remove RamaLama from Bluefin AI tools bundle by @​kylerankin in #1204
  • fix: honor NO_COLOR in local override output by @​Danathar in #1190
  • fix: require review for GitHub Actions minor/patch updates by @​Danathar in #1146
  • ci: run the suite-registration drift gate on every PR by @​kylerankin in #1192
  • feat: WSL/container machine equivalent developer environment via Lima by @​repires in #1175
  • fix(systemd): remove local-fs ordering cycle in rechunker-group-fix by @​kylerankin in #1208
  • feat(countme): add dakota-scoped client and systemd units by @​castrojo in #1154
  • feat(bazaar): Sept 2026 curation update, 7 new recs by @​KiKaraage in #1173
  • fix: empty hooks directory made setup services exit 127 by @​kylerankin in #1193
  • ci: block unpinned git checkouts in Containerfile builder stages by @​mendezr in #1178
  • feat: Super+E should open a new Nautilus window on every press by @​repires in #1184
  • chore: update motd + config by @​theMimolet in #1077
  • fix(brew): drop tremor-runtime, removed from Homebrew by @​castrojo in #1206
  • fix(countme): retry Dakota once per UTC week by @​castrojo in #1203
  • fix(chairlift): track rebranded projectbluefin/chairlift release by @​eltorrero in #1121
  • fix(apps): pin and sha256-verify OpenTabletDriver install fetches by @​mendezr in #1198
  • docs(contributing): add agent-lane-throttle.md — demand-side throttle for the hold-gate queue by @​sramkrishna in #1197
  • docs(contributing): add triage-sla.md — 14-day first-response SLA proposal for human-authored issues by @​mendezr in #1195
  • docs(skills): record image-identity ownership decision — docs/skills/image-identity.md by @​sramkrishna in #1191
  • docs: add systemd-homed-by-default decision record by @​eltorrero in #1200
  • docs(bluespeed): mark bluefin-mcp as archived in the specification by @​kylerankin in #1199
  • docs(contributing): add hold-gate PR queue prioritization rubric by @​repires in #1188
  • docs: correct secrets-policy enforcement claim and add credential preflight rule by @​sramkrishna in #1180
  • docs: document downstream label subsets separate from core factory catalog by @​mendezr in #1177
  • docs(skills): widen category enum to include platform and product by @​repires in #1182
  • docs(factory): ban COMMENT-only PR reviews and comment spam by @​castrojo in #1174
  • fix(brew): preserve user-owned preinstall packages by @​Danathar in #1109
  • fix(wireplumber): disable IR sensor on Kingcome hybrid webcam (2b7e:55c0) by @​castrojo in #1119
  • fix(cli): replace atuin and bash-preexec with starship and add tests by @​castrojo in #1113
  • docs(skills): maintainer-driven tool actions and duplicate-cluster resolution by @​castrojo in #970
  • docs: fix grammatical and readability problems README.md by @​xHope-tech in #1017
  • feat(bazaar): modernize curated layout and add Flathub IDE host integration hooks by @​castrojo in #1155
  • fix(bling): ship working ujust completions for bash/zsh/fish by @​KiKaraage in #1129
  • ci(actionlint): allow the ubuntu-26.04 runner labels by @​Danathar in #1151
  • fix: add consistent bootc sudo policy by @​castrojo in #932
  • fix(sec): ship Sigstore trust materials (Fulcio root + Rekor key) by @​hanthor in #933
  • feat: add llmman to ai-tools Brewfile by @​ericcurtin in #1097
  • fix(brew): allow dedicated ChairLift migration by @​ahmedadan in #1100
  • fix(bling): rearm bash-preexec DEBUG trap on each prompt by @​castrojo in #943
  • fix(brew): replace invalid brew tap --trust with brew tap + brew trust by @​castrojo in #941
  • test: isolate UWELCOME_SHOWN in test_motd_integration.bats by @​castrojo in #1088
  • refactor(just): move 00-entry.just to shared with optional imports by @​Siddhj2206 in #1042
  • fix(flatpak): correct metered check in appstream refresh service by @​HuntedRaven7 in #1035
  • fix: restore native recipes without bluefinctl by @​ahmedadan in #1083
  • fix: resolve cask references and expose validation errors by @​ahmedadan in #1084
  • fix(uwelcome): skip greeting for root and dedupe chained shells by @​ahmedadan in #1059
  • fix(pages): dashboard CNAME qa.projectbluefin.io shadowed by redirect by @​kylerankin in #902
  • fix(gate): let non-Bluefin images skip Bluefin-only scenarios, tolerate GNOME 51 display key by @​hanthor in #900
  • fix(smoke): notify sandbox before app-availability early skips by @​hanthor in #899
  • fix(e2e): allow unsafe-mode test extension on GNOME 51 shells by @​hanthor in #898
  • fix(e2e): enable sshd via kernel arg so image presets cannot undo it by @​hanthor in #895
  • fix(bazzite): mark extension 'is enabled' scenarios pending on state=6 regression by @​buggtb in #888
  • refactor: remove unconsumed DEFAULT_SLA and SLA_STRICT from timing helper by @​repires in #882
  • fix(renovate): restrict automerge to immutable-ref housekeeping by @​kylerankin in #886
  • chore(scripts): remove dead parse_results script and tests by @​repires in #884
  • docs(coverage): sync qa-review recount totals with suite-map snapshot by @​repires in #881
  • chore(deps): update github-actions (non-major) by @​castrojo in #879
  • docs(coverage): sync qa-review totals, add installer matrix row, fix flatpak gap by @​castrojo in #880
  • test(smoke): comprehensive AT-SPI, stability, and presence coverage for Dakota GNOME extensions by @​castrojo in #808
  • docs: remove ghost-lab dependencies and gate requirements by @​castrojo in #878
  • chore: remove bluefinctl test coverage by @​castrojo in #822
  • fix(shared): route AT-SPI tree dump through resolve_results_dir by @​kylerankin in #825
  • fix(justfile): route results parsing through e2e_summary.py by @​mendezr in #873
  • docs(software): audit the @future scenarios blocking GNOME 51 re-validation by @​sramkrishna in #877
  • test(smoke): skip @vm_only scenarios in container lanes by @​castrojo in #740
  • test(lifecycle): add settled-deployment barrier and activate bootc pin scenario by @​mrbobbytables in #837
  • [sec-check] fix: declare top-level permissions: {} in e2e.yml by @​Danathar in #813
  • refactor(ssh): Phase 2 — route dx/flatcar/kde-smoke/software/vanilla-gnome onto ssh_config.ssh_argv() by @​mrbobbytables in #790
  • fix(gnome-e2e): source the results summary from scripts/e2e_summary (#797) by @​mendezr in #819
  • docs(gnome): trim duplicate blank line to satisfy 500-line SKILL.md cap by @​Danathar in #869
  • refactor: fold duplicated _first_value into shared ssh_config by @​mrbobbytables in #787
  • docs(ci): make GNOME version string neutral across e2e summary and docs by @​mendezr in #854
  • test(vanilla-gnome): add GNOME 51 reduced-motion and focus-ring gsettings round-trips by @​kylerankin in #851
  • test(common): activate podman user socket scenario and track immutable status blockers by @​mrbobbytables in #852
  • test(smoke): audit GNOME 50 workarounds against GNOME 51, update gnome.md by @​kylerankin in #848
  • fix(ci): unify image-slug grammar across e2e workflow and artifact tags by @​mrbobbytables in #865
  • ci: restore migration-target and extra-tags inputs to e2e.yml by @​kylerankin in #867
  • test(software): re-anchor @future scenarios from closed #176 to #847 by @​mrbobbytables in #849
  • test(vanilla-gnome): GNOME 51 readiness — Shell version canary by @​mrbobbytables in #864
  • docs: align AGENTS.md and contributing/SKILL.md on skill-update gate by @​mrbobbytables in #862
  • test(smoke): suppress session idle-lock in smoke setup to unblock GOA provider-list by @​mrbobbytables in #850
  • test(quality): unit coverage for scripts/generate_skill_index.py by @​mrbobbytables in #788
  • docs(scanner): fix malformed unit-test documentation block by @​mrbobbytables in #785
  • fix(e2e): scope metadata artifacts by image by @​castrojo in #856
  • fix(smoke): ignore Nvidia CDI failures in QEMU by @​castrojo in #855
  • fix(e2e): stabilize Firefox accessibility workflow by @​castrojo in #853
  • fix(e2e): robust toggle-updates probe, storage service lifecycle, and Firefox window lookup by @​castrojo in #792
  • feat(nvidia): NVIDIA sysext skill and driver release tracking by @​dtg01100 in #326
  • ci(build): run boot-test and release-dry-run when kernel-cache is skipped by @​jeefy in #328
  • fix(initrd): verify the per-node Ignition config before applying it by @​kylerankin in #285
  • fix(installer): keep console install failures visible instead of halting by @​dtg01100 in #321
  • feat(nvidia): deliver the driver and toolkit sysexts to nodes by @​jeefy in #319
  • fix(os): ship /etc/protocols and /etc/services (IANA netdb) for NFSv3 by @​jeefy in #317
  • fix(sysupdate): ship the trust keyring in the vendor image by @​arteeh in #312
  • feat(nvidia): container toolkit sysext (CDI) by @​jeefy in #304
  • feat(nvidia): open-kernel-module driver sysext (nvidia-open-595) by @​jeefy in #305
  • fix(kernel-cache): verify the whole tarball before restoring it by @​castrojo in #315
  • ci(build): key-free kernel cache in ghcr.io for release builds by @​castrojo in #314
  • ci(build): validate pull requests, build the image nightly, on main and on demand by @​castrojo in #313
  • feat(installer): carry stick credentials to the installed disk; developer-mode admin user by @​castrojo in #300
  • fix(security): clear group/other write from image paths; repair /etc on existing installs by @​castrojo in #303
  • docs: sync the Booty story with jeefy/booty main by @​jeefy in #298
  • feat(os): NFS client (nfs-utils + rpcbind, client-only) in the base image by @​jeefy in #295
  • fix(installer): quiet vfat exec-bit repart warnings on diskless boot path by @​kylerankin in #283
  • fix(installer): accurate login banner and first-boot password docs by @​castrojo in #297
  • fix(installer): ask for a root password on the installed disk's first boot by @​castrojo in #293
  • ci(build): queue main runs instead of cancelling them; upload installer logs by @​jeefy in #292
  • ci(track-binaries): refresh amd64 and arm64 pins together, with tests by @​jeefy in #288
  • build: drop FSDK os-release from the build sandbox and its patches by @​castrojo in #291
  • fix(installer): no keymap or erase questions, reboot when done by @​castrojo in #290
  • docs: follow-ups deferred from #276 by @​jeefy in #289
  • ci: boot-test the offline USB installer end to end by @​jeefy in #277
  • test: assert parsed properties instead of file text; no silent skips in CI by @​jeefy in #278
  • build: reproducible image assembly, key-set safety, patch docs by @​jeefy in #281
  • build: drop the gnome-build-meta junction by @​jeefy in #280
  • refactor: shared sysext packing recipe, arm64 binary pins, base-image cleanups by @​jeefy in #279
  • ci(release): dry-run the publish path on pull requests; attest provenance and publish an SBOM by @​jeefy in #269
  • ci: boot-test tamper refusal, HTTP boot, Ignition and A/B rollback; skip image builds for docs-only changes by @​jeefy in #270
  • fix(installer): boot offline, allow credential overrides, quiet repart warnings by @​castrojo in #268
  • feat(update): automatic updates with a Kubernetes interlock, a boot health gate and a diskless update signal by @​jeefy in #271
  • feat(initrd): explain diskless boot failures and ignored Ignition kargs by @​jeefy in #273
  • docs: accuracy pass after the FSDK rebase by @​jeefy in #276
  • ci: track patch releases of upstream binaries (Kubernetes, containerd, runc, CNI, k0s, ORAS) by @​jeefy in #272
  • fix(security): ship root locked; provision access per node by @​jeefy in #275
  • feat(installer): offline USB installer image booting into systemd-sysinstall by @​castrojo in #264
  • fix(ci): install ORAS 1.3.4 by URL and checksum by @​castrojo in #266
  • feat!: FSDK-composed OS with a signed, diskless-first boot chain by @​jeefy in #262
  • Remove heading from README.md by @​castrojo in #261
  • docs: add theme-adaptive wordmark to README by @​castrojo in #260
  • feat(installer): opt-in network credentials pull (inst.creds_url / inst.creds_sha256) for PXE installs by @​jeefy in #253
  • fix(ddi): restore the setuid/setgid bits Flatcar ships on sudo, su, passwd, mount, … by @​jeefy in #255
  • fix(installer): actually wait for the network before the DDI download by @​jeefy in #252
  • fix(installer): stage the network DDI in /dev/shm and check free space before decompressing by @​jeefy in #251
  • fix(creds): apply firstboot.* credentials without systemd-firstboot by @​jeefy in #254
  • fix(installer): rewrite the network DDI repart override without sed by @​jeefy in #250
  • fix(installer): bare-metal USB install consolidation, preset ordering, and OVMF boot test by @​castrojo in #243
  • fix(fsdk): disable tests in glib-stage1 bootstrap by @​castrojo in #51
  • docs(arch): scope FSDK hard rule to installer by @​castrojo in #133
  • chore(ci): pin runners to ubuntu-26.04 by @​castrojo in #237
  • fix(kiosk): bridge guest loopback proxy via SSH port forwarding for QEMU by @​mrbobbytables in #202
  • refactor: switch OS payload to Flatcar base, drop displaced FSDK components by @​kylerankin in #132
  • refactor(arch): split release-version into installer and Flatcar axes by @​mrbobbytables in #136
  • fix(flatcar): use flatcar-kernel-container-sha256 in flatcar-usr.bst by @​castrojo in #236
  • feat(flatcar): add flatcar-usr.bst importing Flatcar /usr as the OS payload base by @​mrbobbytables in #140
  • build: os-base option to compare FSDK payload against Flatcar reference by @​kylerankin in #163
  • feat(installer): add opt-in PXE network DDI pull by @​kylerankin in #229
  • test(installer): behavioural contract for the QEMU boot-proof readiness gate by @​Danathar in #219
  • fix(k0s): pin argocd image by digest and upgrade past EOL v2.12.3 by @​kylerankin in #212
  • fix(kiosk): console shows live local cluster state on first boot by @​kylerankin in #214
  • arch: make include/flatcar.yml the single source of truth for Flatcar pins by @​kylerankin in #143
  • feat(creds): extend systemd-creds provisioning to SSH keys, network, firstboot, and TPM2 by @​mrbobbytables in #221
  • revert: remove unapproved appliance identity design (#208) by @​castrojo in #235
  • fix(installer): harden flash-installer with refusal guards, write verification, and GPT backup relocation by @​castrojo in #225
  • chore(renovate): disable the homebrew manager for binary-asset formulae by @​castrojo in #211
  • ci: include scripts/** in unit-tests workflow paths filter by @​mendezr in #234
  • fix(justfile): probe install-vm kiosk readiness from inside the guest (rebased) by @​castrojo in #227
  • fix(installer): hard preflight abort when bluefin-installer-data is absent by @​castrojo in #224
  • fix(boot): resolve QEMU installer boot deadlock and console readiness probe by @​mrbobbytables in #220
  • fix(ci): pin just tool version in CI workflows by @​kylerankin in #190
  • ci: expand unit-tests workflow paths trigger by @​mrbobbytables in #189
  • fix(renovate): match the freedesktop-sdk series the junction actually tracks by @​hanthor in #84
  • ci: land #190, #189 and #84 with the build.yml conflict resolved by @​castrojo in #217
  • fix(ci): move junction ref tracking out of the pull_request path by @​castrojo in #180
  • feat(flatcar): record container runtime parity by @​castrojo in #192
  • feat(arch): produce Flatcar-to-FSDK version parity matrix (#142) by @​mrbobbytables in #184
  • test(build-depends): lock in os-countme curl+jq FSDK paths by @​kylerankin in #122
  • fix(installer): bound root-a partition to guarantee room for var by @​mrbobbytables in #207
  • fix(test): preserve installer-created var partition by @​castrojo in #157
  • ci: update installer evidence workflow pin by @​castrojo in #156
  • fix(ci): support repart on hosted runners by @​castrojo in #152
  • ci: update installer test workflow pin by @​castrojo in #151
  • ci: run installer smoke through shared QEMU workflow by @​castrojo in #149
  • Add kmod component and update depmod path by @​bronson in #146
  • docs: mandate distributed BuildStream builds on ghost cluster by @​castrojo in #121
  • fix(installer): fix kernel module extraction and probe USB storage drivers by @​castrojo in #120
  • fix(e2e): support self-signed TLS certificates in readiness checks by @​castrojo in #118
  • feat(lima): end-to-end Lima VM orchestration and automated browser login by @​castrojo in #117
  • perf(kiosk): set KAGENTI_CONTROLLER_URL="none" in kc-agent gate command by @​mrbobbytables in #114
  • feat(kiosk): forward kubernetes API port 6443 in install-vm by @​castrojo in #107
  • feat(countme): ship the shared bluefin-countme reporter by @​castrojo in #94
  • fix(kubestellar): correct container image tags and names in k0s manifests by @​kylerankin in #103
  • fix(k0s): generate kubeflex postgres password at first boot instead of hardcoding it by @​kylerankin in #102
  • fix(ci): restore dropped k0s sysext copy into dist/release/ by @​castrojo in #93
  • feat(kernel): add Flatcar LTS kernel & ZFS sysext, export PXE release assets by @​castrojo in #92
  • fix(installer): show interactive UI on the local display by @​TB516 in #79
  • fix(k0s): complete first-boot activation and console readiness by @​castrojo in #63
  • fix(build): prepare alpha release validation and sysext cleanup by @​castrojo in #59
  • fix(fsdk): create uninstalled libappstream symlinks in appstream-minimal by @​castrojo in #58
  • fix(build): add SONAME symlinks and LD_LIBRARY_PATH for gdk-pixbuf by @​castrojo in #56
  • fix(fsdk): resolve libgirepository SONAME symlinks in gobject-introspection-base by @​castrojo in #54
  • fix(chunka): pin chunkah's build clock so an unchanged rebuild keeps its digest by @​dtg01100 in #592
  • chore: bump testsuite e2e pin for Utah gate fixes by @​hanthor in #588
  • chore: bump testsuite e2e pin for GNOME 51 + early-skip fixes by @​hanthor in #587
  • chore: bump testsuite e2e pin to include preset-proof sshd enablement by @​hanthor in #584
  • fix(factory-health): dedupe open alerts by author by @​repires in #577
  • fix(factory-health): close recovered alerts so dedupe stops muting pipelines by @​Danathar in #550
  • ci(unit-tests): add missing workflow paths for tested guarded workflows by @​buggtb in #578
  • fix(ci): annotate reusable-thin-caller-gate and drop hardcoded count in test by @​castrojo in #573
  • fix(factory-health): require a minimum sample before alerting by @​Danathar in #560
  • ci(promote-squash): let callers say the promotion PR is merged by a human by @​Danathar in #566
  • fix(factory-health): fail the run when factory alerts are misrouted by @​Danathar in #564
  • fix(workflows): stop PR-controlled CHUNKAH_VERSION reaching shell in vendor-chunka-files by @​sramkrishna in #570
  • fix(release): normalize caller-supplied image reference by @​Siddhj2206 in #524
  • feat(ci): annotate reusable workflows with required token type by @​mrbobbytables in #547
  • ci(unit-tests): cover reusable-renovate-automerge.yml in the paths filter by @​Danathar in #553
  • feat(reusable-build): allow testing-stream builds to opt into rechunking and SBOM by @​mendezr in #557
  • fix(factory-health): bound the run fetch by the window, not a run count by @​Danathar in #551
  • feat(ci): enforce thin-caller gate in consumer repos (issue #546) by @​Danathar in #554
  • fix(ci): mint app token for renovate auto-merge wiring check by @​Danathar in #552
  • docs(skills): add merge-governance and document the empty-commit consumer PR by @​castrojo in #537
  • ci(unit-tests): cover ghcr-cleanup.yml in the paths filter by @​castrojo in #534
  • ci(actionlint): make the required check reachable on PRs and merge groups by @​castrojo in #536
  • fix(setup-runner): support ubuntu-26.04 runners and skip resolute apt source (#541) by @​castrojo in #549
  • ci(unit-tests): cover guarded release workflows in paths filter by @​kylerankin in #532
  • ci: test the Renovate auto-merge merge/outcome step (issue #403) by @​mendezr in #516
  • test(bootc-build): add coverage and drift guards for ghcr-cleanup action by @​mrbobbytables in #511
  • fix(promotion): treat missing E2E as pending by @​castrojo in #527
  • fix(promotion): gate merge status on evidence by @​castrojo in #526
  • fix(release): harden promotion orchestration by @​castrojo in #525
  • fix(promotion): trust only Actions E2E status by @​castrojo in #521
  • fix(promotion): forward E2E status context by @​castrojo in #519
  • fix(promotion): bind E2E evidence to source commit by @​castrojo in #515
  • fix(promotion): gate queue enrollment on verification by @​castrojo in #513
  • refactor(ci): narrow installer artifact contract by @​castrojo in #506
  • fix(ci): upload only QEMU serial logs by @​castrojo in #505
  • fix(ci): stage QEMU failure evidence by @​castrojo in #504
  • fix(ci): grant runner access to KVM device by @​castrojo in #502
  • feat(ci): add server installer QEMU workflow by @​castrojo in #501
  • fix(renovate): target caller repository by @​Siddhj2206 in #460
  • fix(release): normalize OCI registry namespaces by @​Siddhj2206 in #461
  • fix(chunka): create config temp file as root to avoid protected_regular denial by @​Siddhj2206 in #497
  • ci: add scheduled Renovate auto-merge wiring assertion (#403) by @​kylerankin in #498
  • arch: enforce thin-caller size gate (issue #411) by @​mendezr in #472
  • fix(sign-and-publish): mitigate SBOM exceeding GitHub Attestations 16MB limit (fixes #480) by @​mrbobbytables in #484
  • fix(pkg-cadence): open a PR instead of pushing to main by @​kylerankin in #476
  • fix(cadence): pass app credentials to reusable workflow (fixes #425) by @​mrbobbytables in #492
  • chore(ci): narrow MergeRaptor app token permissions to what's needed (fixes #421) by @​mendezr in #478
  • docs(supply-chain): record cosign install trust policy (upstream-pinned single mechanism; refs #464) by @​eltorrero in #491
  • docs(skills): add session-hygiene skill and mandatory gate by @​castrojo in #424
  • docs(skills): capture merge-queue, consumer-CI, and Renovate learnings by @​castrojo in #402
  • docs(skills): bring remaining skill files into canonical skill spec conformance by @​mrbobbytables in #471
  • ci: test the Renovate auto-merge PR-lookup matcher end-to-end by @​kylerankin in #488
  • fix(factory): exclude cancelled/action_required from success rate by @​kylerankin in #495
  • [sec-check] fix: declare top-level permissions: {} in consumer-validation and prune-merged-branches by @​mrbobbytables in #466
  • test(bats): add unit tests for 4 bootc-build composite actions by @​castrojo in #451
  • ci(unit-tests): expand bootc-build path filter to cover all actions by @​castrojo in #452
  • fix(validate-pr): handle spaces in system_files shellcheck paths by @​castrojo in #454
  • fix(chunka): avoid E2BIG by passing inspect JSON via file instead of argv by @​mendezr in #473
  • fix(promote): skip queued promotion branch rebuilds by @​castrojo in #463
  • fix(scan-image): fail-closed when trivy-results.json is missing by @​HuntedRaven7 in #427
  • fix(workflows): add top-level permissions: {} to consumer-validation and prune-merged-branches by @​mrbobbytables in #456
  • fix: add top-level permissions: {} to consumer-validation and prune-merged-branches workflows by @​mrbobbytables in #457
  • fix(ci): pass RESOLVE_OK via env in release-gate verify step by @​mrbobbytables in #458
  • fix(tests): isolate podman-missing bats test from preinstalled runner podman by @​mrbobbytables in #459
  • fix(promote): make reviewer requests optional by @​Siddhj2206 in #455
  • fix(bootc-build): use kernel overlayfs in reusable-build by @​KiKaraage in #443
  • fix(renovate-automerge): await nonterminal check states instead of blocking by @​castrojo in #448
  • docs(ujust): specify console QR codes for reports by @​kylerankin in #44
  • docs: update scope to ujust report framework and remove stale references by @​castrojo in #41
  • chore: remove lifecycle workflow and obsolete files by @​castrojo in #40
  • fix(ci): read MERGERAPTOR_APP_ID from secrets in sync-templates by @​castrojo in #39
  • ci: allow ubuntu-26.04 runner labels in actionlint config by @​castrojo in #38
  • fix(report): require diagnostic Gists by @​castrojo in #36
  • Rename 2026-12-30-brazilian-bluefin.md to 2026-09-30-brazilian-bluefi… by @​castrojo in #1442
  • Publish blog post on Ubuntu's community building by @​castrojo in #1440
  • feat(blog): draft post for How We Built Ubuntu's 65M+ Community by @​castrojo in #1439
  • Add brazilian-bluefins blog post by @​delphicmelody in #1428
  • perf(ci): build locales in parallel shards so build time stays flat by @​castrojo in #1420
  • docs(i18n): translate installation, mission, values, command-line into Czech by @​Danathar in #1423
  • fix(i18n): correct ExtensionManager Flathub link casing across 5 locales by @​castrojo in #1424
  • i18n(de): translate index.md and UI strings for German by @​castrojo in #1421
  • i18n(sv): translate index.md and UI strings for Swedish by @​kylerankin in #1409
  • feat(i18n): translate docs: Indonesian (id) by @​kylerankin in #1413
  • feat(i18n): translate core docs and UI strings into Vietnamese (vi) by @​kylerankin in #1405
  • docs: translate index.md and UI strings to Spanish by @​kylerankin in #1414
  • i18n(uk): translate index.md and UI strings for Ukrainian by @​kylerankin in #1416
  • i18n(ko): translate index.md and UI strings for Korean by @​dtg01100 in #1418
  • docs(analytics): describe the daily projectbluefin-countme ping by @​castrojo in #1355
  • fix: give Utah a real tag series in the update-churn pipeline by @​dtg01100 in #1419
  • docs: add Czech (cs) i18n translations by @​castrojo in #1408
  • i18n(fr): translate index.md and UI strings for French by @​castrojo in #1415
  • perf(ci): cut pages.yml build time — parallel fetch-data, verify job, leaner caches by @​castrojo in #1411
  • i18n(hi): translate index.md and UI strings for Hindi by @​dtg01100 in #1410
  • i18n(tr): translate index.md and UI strings for Turkish by @​dtg01100 in #1407
  • i18n(ar): translate index.md and UI strings for Arabic by @​dtg01100 in #1406
  • docs: translate docs into Chinese (Traditional) (zh-Hant) by @​castrojo in #1401
  • docs: add Chinese (Simplified) zh-Hans docs translation by @​kylerankin in #1404
  • i18n(pl): translate index.md and UI strings for Polish by @​kylerankin in #1402
  • Add download section to Utah documentation by @​castrojo in #1403
  • fix(i18n): close review gaps in translated builds by @​castrojo in #1400
  • docs(skills): add countme reporting diagnosis procedure by @​castrojo in #1354
  • feat(i18n): open 20 locales for PR-based docs translation by @​castrojo in #1379
  • Change header style in blog post by @​castrojo in #1378
  • Update blog on Bluefin development insights by @​castrojo in #1377
  • Add section on project visualization with gource by @​castrojo in #1376
  • Revise Bluefin development visualization blog post by @​castrojo in #1375
  • feat: Bluefin development visualized blog post by @​castrojo in #1374
  • fix(docs): point the Dakota page's Bluefin Classic link at /classic by @​castrojo in #1369
  • fix(driver-versions): order tabs Bluefin, Server, Classic, Utah by @​castrojo in #1368
  • Update Dakota alpha information and add Bluefin Classic note by @​castrojo in #1367
  • Revise Dakota description and alpha status by @​castrojo in #1366
  • Revise Bluefin Classic documentation by @​castrojo in #1365
  • fix(images): name the catalog cards Bluefin and Bluefin Classic by @​castrojo in #1364
  • feat(docs): order the Images catalog Bluefin, Classic, Utah by @​castrojo in #1363
  • feat(docs): order Images sidebar and add the Classic legacy ISOs by @​castrojo in #1362
  • feat(docs): remove Bluefin LTS and GDX from the site by @​castrojo in #1361
  • Rename Dakota to Bluefin and update content by @​castrojo in #1360
  • Revise Utah documentation for alpha status by @​castrojo in #1359
  • Update warning message for legacy ISOs by @​castrojo in #1358
  • Modify sidebar items and remove Donations category by @​castrojo in #1357
  • Update Docusaurus config for Bluefin documentation by @​castrojo in #1356
  • feat(analytics): read the Bluefin card from daily pings too by @​castrojo in #1350
  • feat(analytics): add a Bluefin Utah chart between Bluefin and Bluefin Classic by @​castrojo in #1349
  • docs(ai): replace ramalama with llmman by @​castrojo in #1348
  • refactor(countme): cut /v1 to a daily ping counted per image by @​castrojo in #1347
  • feat(countme): allowlist Bluefin image names and split daily counts per image by @​castrojo in #1346
  • fix(countme): create eos tables in the Worker, drop the migration step by @​castrojo in #1345
  • feat(countme): receive eos-phone-home pings in the canonical Worker by @​castrojo in #1344
  • feat(countme): chart Bluefin stable and testing check-ins by @​castrojo in #1343
  • feat(portal): source PortalNews from local blog index and align unavailable state by @​repires in #1340
  • fix(countme): preserve raw pings outside published Dakota series by @​castrojo in #1342
  • fix(countme): acknowledge Dakota reports after storage by @​castrojo in #1339
  • feat(leaderboards): render Recent Milestones as horizontal scroller below Community Builders by @​castrojo in #1337
  • feat(images): rework catalog for Bluefin Classic at ublue-os, Dakota, and Utah by @​castrojo in #1335
  • feat(leaderboards): add Recent Milestones leaderboard as a ledger of teamwork by @​castrojo in #1336
  • feat(leaderboards): add GNOME seasons and modern standings by @​castrojo in #1333
  • refactor: route remaining hand-rolled GitHub auth sites through shared clients by @​sramkrishna in #1327
  • fix(registry): support REGISTRY_CACHE_HOURS=0 to keep live task data fresh on deploy by @​castrojo in #1332
  • fix(ci): allow manual force refresh on update-hive-cache workflow by @​castrojo in #1331
  • fix(leaderboard): restore freshness and accurate contributor ranking by @​castrojo in #1330
  • fix: typo in contributors name by @​ahmedadan in #1329
  • refactor: route sbom GHCR token reads through shared githubToken by @​mendezr in #1315
  • fix(branding): make the monthly social preview card actually rotate by @​Danathar in #1313
  • docs: record the green-skip signature for a missing BLUEFIN_DISCUSSIONS_TOKEN by @​Danathar in #1299
  • Fix link text for latest Dakota daily snapshot by @​castrojo in #1325
  • Embed YouTube video and update GNOME release note by @​castrojo in #1326
  • fix(blog): use plain anchor for full resolution link in ImageCarousel by @​castrojo in #1323
  • Revise bug reporting link and add lore content by @​castrojo in #1322
  • fix(blog): use group role and aria-current for ImageCarousel thumbnail strip by @​castrojo in #1321
  • feat(blog): add ImageCarousel component and gallery to Dakota Alpha 6 post by @​castrojo in #1320
  • docs(blog): Dakota Alpha 6 release announcement and downloads by @​castrojo in #1319
  • docs(analytics): switch countme opt-out instructions to systemctl disable timer by @​castrojo in #1308
  • fix(countme): scope first-party telemetry tracking exclusively to dakota by @​castrojo in #1307
  • fix/countme dakota exclusive by @​castrojo in #1306
  • fix(countme): label dakota first-party charts as Bluefin by @​castrojo in #1305
  • fix(analytics): focus first-party active systems chart solely on dakota by @​castrojo in #1304
  • fix(countme): map root chart aliases to dakota by @​castrojo in #1303
  • docs(skills): document Bluefin Classic rebadge in cloudflare-workers by @​castrojo in #1302
  • fix(countme): rebadge upstream ublue-os/bluefin chart as Bluefin Classic by @​castrojo in #1301
  • [architect] fix: propagate typecheck and lint exit codes in pages.yml validation step by @​castrojo in #1297
  • [ci] skip open-discussion job when BLUEFIN_DISCUSSIONS_TOKEN is unset by @​castrojo in #1296
  • refactor: converge CJS GitHub fetchers onto the shared request-queue client (#1232) by @​castrojo in #1295
  • fix(blog): restore scrollable viewport constraint to left sidebar by @​castrojo in #1284
  • ci: run the unit-test gate on every PR and run the knowledge-mcp suite by @​Danathar in #1290
  • Revise warning about Dakotaraptor and legacy ISOs by @​castrojo in #1280
  • Add warning for unsupported images in downloads by @​castrojo in #1278
  • ci: add unit test gate for scripts by @​castrojo in #1226
  • Factory: Optimize layout by combining data sections into 2-column rows on desktop by @​mrbobbytables in #1228
  • fix(cards): parse HTML release-feed tables before generating Bluefin cards by @​mrbobbytables in #1213
  • fix(sbom): add Bluefin LTS NVIDIA stream and retire dx/gdx package queries by @​mrbobbytables in #1212
  • [architect] Converge ESM GitHub fetch sites onto lib/gh.js (#1232) by @​kylerankin in #1236
  • fix(countme): count every published image variant under its family by @​castrojo in #1250
  • test: add update artwork seams by @​TB516 in #1238
  • fix(analytics): name the legacy panel for the image it counts by @​castrojo in #1251
  • fix(repos): repair moved GitHub slugs and preserve partial repository-stat cache by @​kylerankin in #1256
  • test: cover safeNum and loadHistory in fetch-hive-history.js by @​kylerankin in #1255
  • [architect] converge hive-live + factory-stats fetchers onto shared lib/gh.js by @​kylerankin in #1257
  • test: cover scripts/lib coverage-gap modules (#905) by @​kylerankin in #1254
  • Add link to wolves.projectbluefin.io and follow-up note by @​castrojo in #1252
  • fix(analytics): make the weekly active systems labels readable by @​castrojo in #1249
  • fix(countme): ink the upstream chart title by @​castrojo in #1248
  • feat(countme): serve the upstream chart in the Bluefin palette by @​castrojo in #1247
  • Revise analytics documentation for Project Bluefin by @​castrojo in #1246
  • feat(analytics): fold game mode into its image and show the upstream series by @​castrojo in #1245
  • fix(analytics): serve weekly active systems from the first-party aggregate by @​castrojo in #1244
  • fix(analytics): remove manufactured copy from the weekly active systems panel by @​castrojo in #1243
  • fix(analytics): stop publishing internal service posture in a panel reason by @​castrojo in #1242
  • fix(analytics): count our own images, and drop the last bar charts by @​castrojo in #1241
  • feat(analytics): put the charts on the Bluefin palette and the real image matrix by @​castrojo in #1240
  • feat(analytics): rebuild the charts around the full image matrix by @​castrojo in #1239
  • feat(portal): add brand iconography, Karl backlog callout, and quotes to Users and Developers scenes by @​castrojo in #1211
  • [quality] test: unit coverage for scripts/lib/sbom/api.js (GHCR tags, oras download, cosign verification) by @​Danathar in #1210
  • test(scripts): silence unused-arg lint warning in build-metrics test by @​castrojo in #1225
  • fix: consolidate CI supply-chain pins, light-mode repairs, and scripts/lib test coverage by @​castrojo in #1223
  • test(portal): provide fixture data in PortalContributors static render test by @​castrojo in #1209
  • fix(gnome-extensions): render missing and unavailable extension data states by @​castrojo in #1177
  • fix(cards): preserve prevVersion on header chips by @​castrojo in #1174
  • fix(driver-versions): generate Bluefin LTS release links with stable tags by @​castrojo in #1208
  • feat(portal): implement PortalPageLoading overlay and character asset preloader by @​castrojo in #1207
  • fix(portal): resolve nested <main> landmark, focus suppression, and WCAG AA contrast by @​castrojo in #1206
  • feat(portal): implement PortalNews component consuming blog feed by @​castrojo in #1205
  • feat(portal): implement PortalFlock section with DNF Count Me growth chart by @​castrojo in #1204
  • feat(portal): harmonize design tokens, Inter font stack, and unified 956px/512px breakpoints by @​castrojo in #1203
  • feat(portal): add "Try Out" secondary hero CTA and seasonal raptor character rotation by @​castrojo in #1202
  • fix(analytics): align Countme family sparkline domains with rendered images by @​castrojo in #1201
  • fix(portal): update navbar test links to match production navbar by @​castrojo in #1200
  • fix(analytics): include Dakota and Utah in edition and workstation chart series by @​Danathar in #1194
  • fix(analytics): retain Countme zeros and preserve missing values as gaps by @​Danathar in #1191
  • fix(portal): reconcile TopNavbar navigation links and Docusaurus layout header by @​Danathar in #1169
  • feat(portal): restore complete mission statements, Edith Wharton quote, and punchline by @​mrbobbytables in #1155
  • fix(feed-items): supply NVIDIA versions at the data shape the release feed consumes by @​mrbobbytables in #1178
  • fix(profiles): remove nonexistent chandeleer1698 GitHub username by @​mrbobbytables in #1151
  • fix(pin-state): replace removed Bluefin LTS HWE workflow paths by @​Danathar in #1185
  • fix(factory): calculate merged-this-week from merged pull requests by @​Danathar in #1190
  • fix(factory): replace the Hive snapshot CTA hostname with a valid TLS endpoint by @​Danathar in #1189
  • fix(factory): use a public queue-data fallback for anonymous visitors by @​Danathar in #1188
  • fix(factory): render an unavailable change-failure rate instead of 0.0 percent by @​Danathar in #1187
  • fix(sbom): migrate Bluefin LTS stream specs to its package and stable tags by @​Danathar in #1186
  • fix(contributors): prevent visitor-side GitHub requests when contributor data is unavailable by @​mrbobbytables in #1197
  • fix(countme): recognize Dakota and Utah without misclassifying Bluefin variants by @​mrbobbytables in #1198
  • fix(blog): replace Printful CDN hotlinks blocked on five-years-of-bluefin by @​Danathar in #1196
  • fix(catalog): generate Bluefin LTS rebases against the bluefin-lts package by @​Danathar in #1195
  • fix(images): hide unpublished Utah testing image commands and attestations by @​Danathar in #1193
  • fix(blog): remove expired Discourse CDN images from ublue-2024 wrap-up by @​Danathar in #1199
  • fix(sbom): support version-qualified live tags in recent-release discovery by @​Danathar in #1163
  • feat(portal): resolve 7 package version rows for Dakota product card by @​Danathar in #1164
  • fix(ci): make generate-social-cards exit 0 when converters are missing by @​castrojo in #1182
  • feat(analytics): modernize analytics and churn charts, promote page to top level by @​castrojo in #1181
  • feat(branding): add rotating monthly night wallpaper social preview card by @​castrojo in #1179
  • feat(branding): implement new social preview cards for documentation by @​castrojo in #1068
  • fix(cards): parse HTML release-feed tables before generating Bluefin cards by @​castrojo in #1126
  • fix(blog): replace Printful CDN hotlinks blocked on five-years-of-bluefin by @​castrojo in #1125
  • fix(contributors): prevent visitor-side GitHub requests when contributor data is unavailable by @​castrojo in #1124
  • fix(feed-items): supply NVIDIA versions at the data shape the release feed consumes by @​castrojo in #1123
  • fix(gnome-extensions): render missing and unavailable extension data states by @​castrojo in #1122
  • fix(pin-state): replace removed Bluefin LTS HWE workflow paths by @​castrojo in #1121
  • fix(factory): render an unavailable change-failure rate instead of 0.0 percent by @​castrojo in #1120
  • fix(factory): use a public queue-data fallback for anonymous visitors by @​castrojo in #1119
  • fix(factory): replace the Hive snapshot CTA hostname with a valid TLS endpoint by @​castrojo in #1118
  • fix(factory): calculate merged-this-week from merged pull requests by @​castrojo in #1117
  • fix(analytics): calculate and format hero deltas for the selected range by @​castrojo in #1116
  • fix(blog): remove expired Discourse CDN images from ublue-2024 wrap-up by @​castrojo in #1114
  • fix(images): hide unpublished Utah testing image commands and attestations by @​castrojo in #1113
  • fix(analytics): include Dakota and Utah in edition and workstation chart series by @​castrojo in #1111
  • fix(analytics): retain Countme zeros and preserve missing values as gaps by @​castrojo in #1110
  • fix(analytics): align Countme family sparkline domains with rendered images by @​castrojo in #1109
  • fix(repos): repair moved GitHub slugs and preserve partial repository-stat cache by @​castrojo in #1107
  • fix(sbom): migrate Bluefin LTS stream specs to its package and stable tags by @​castrojo in #1106
  • fix(countme): recognize Dakota and Utah without misclassifying Bluefin variants by @​castrojo in #1105
  • fix(driver-versions): generate Bluefin LTS release links with stable tags by @​castrojo in #1104
  • fix(catalog): generate Bluefin LTS rebases against the bluefin-lts package by @​castrojo in #1102
  • fix(profiles): remove nonexistent chandeleer1698 GitHub username by @​castrojo in #1101
  • feat(portal): implement PortalNavigation floating dock and section scroll spy by @​mrbobbytables in #1153
  • feat(portal): implement PortalContributors component and contributor harvester workflow by @​mrbobbytables in #1156
  • fix(portal): update deprecated ublue-os links and synchronize Discord invite code by @​Danathar in #1165
  • fix(portal): align Utah ecosystem card link destination to devconf.us by @​mrbobbytables in #1159
  • feat(portal): generate bootc switch terminal command and copy button in PortalImageChooser by @​mrbobbytables in #1152
  • test: add coverage reporting for data-fetching script tests by @​mrbobbytables in #1061
  • fix(sbom): support version-qualified live tags in recent-release discovery by @​mrbobbytables in #1128
  • feat(portal): add interactive image picker by @​castrojo in #1131
  • feat(portal): complete static landing sections by @​castrojo in #1130
  • feat(portal): add parallax portal prototype by @​castrojo in #1127
  • docs: add Copilot workflow instructions by @​castrojo in #1108
  • fix: link leaderboard contributor dossiers by @​castrojo in #1103
  • fix: restore Hive leaderboard data and styling by @​castrojo in #1076
  • feat: add standalone Hive leaderboards by @​castrojo in #1071
  • feat(analytics): add update churn rate pipeline, analytics charts, and trigger workflow by @​castrojo in #1070
  • feat: add Hive leaderboards landing by @​castrojo in #1069
  • feat(nav): rename Factory to Hive in navbar linking to hive.projectbluefin.io by @​castrojo in #1058
  • docs: announce Bluefin Server by @​castrojo in #1066
  • fix(images): point bluefin-lts to projectbluefin/bluefin-lts package and update catalog by @​castrojo in #1067
  • feat(analytics): unify Bluefin family countme charts and multi-image catalog by @​castrojo in #1065
  • feat(analytics): add legacy bluefins and ecosystem countme analytics charts by @​castrojo in #1063
  • feat(reports): migrate monthly reports to blog with infograms and Hive Leaderboard by @​castrojo in #1059
  • fix: restrict countme worker entrypoint exports to default handler by @​castrojo in #1060
  • docs: announce mcp.projectbluefin.io and update hive links by @​castrojo in #1057
  • feat(mcp): serve the org knowledge base at mcp.projectbluefin.io by @​castrojo in #1055
  • feat: refine image navigation, fix driver versions catalog, and track stable streams by @​castrojo in #1050
  • feat(branding): use new Bluefin wordmark in docs and drop ublue 'u' by @​castrojo in #1043
  • Add link to upstream doc about IME setup by @​sebjag in #1038
  • fix(e2e): deliver the kickstart through an initramfs overlay by @​Danathar in #74
  • fix(ci): restore ISO rename output and soft-fail arm64 legs by @​hanthor in #70
  • fix(just): resolve sudo via PATH in sudoif and pass arguments without word-splitting by @​castrojo in #394
  • fix(justfile): make the final artifact move idempotent in _build-bib by @​mendezr in #412
  • ci(workflow): correct sync-stable-to-main header comment by @​kylerankin in #413
  • ci(workflow): retry just download in unit-tests by @​kylerankin in #414
  • fix(build): write an unverified update ref instead of a signed one by @​Danathar in #406
  • fix(ci): skip Renovate when the token is not set by @​Siddhj2206 in #395
  • ci(promote): stop citing the deleted scheduled approver by @​Danathar in #404
  • fix(ci): restore merge_group trigger to pr-validation and unit-tests by @​castrojo in #418
  • refactor: full rewrite of the template by @​castrojo in #393
  • refactor: full rewrite of the template by @​Siddhj2206 in #383
  • docs: document E2E gap as intentional release risk (#281) by @​mrbobbytables in #328
  • ci: auto-approve action_required checks on trusted promotion PRs by @​mrbobbytables in #335
  • fix(ci): validate Brewfiles statically instead of evaluating them as Ruby by @​Siddhj2206 in #320
  • fix(just): use a per-invocation temp file for the registry tag list by @​Siddhj2206 in #314
  • ci: run BATS unit tests on PRs touching build, tests, or Justfile by @​Siddhj2206 in #317
  • fix(ci): stop inheriting all repo secrets in label-enforcement by @​Siddhj2206 in #318
  • fix(just): build IMAGE_NAME from target_image so renames upgrade correctly by @​Siddhj2206 in #313
  • fix(ci): derive ghcr-cleanup target from the repository name by @​Siddhj2206 in #319
  • fix(ujust): stop install-jetbrains-toolbox when the checksum fails by @​Siddhj2206 in #315
  • fix(just): repair clean recipe so it finishes and removes all artifacts by @​Siddhj2206 in #312
  • fix(packages): stamp the provenance report from SOURCE_DATE_EPOCH, not the wall clock by @​dtg01100 in #343
  • ci: add a tested factory-pin rev tool for #336 by @​dtg01100 in #337
  • fix(packages): pin the baseurl of every allowlisted repository by @​dtg01100 in #334
  • test(services): enforce the unit exit-tolerance convention by @​dtg01100 in #341
  • fix(hooks): stamp 20-home-labels.sh after the body runs by @​dtg01100 in #327
  • fix(e2e): accept substituted sentinel reads and re-read before reshooting by @​hanthor in #381
  • fix(build): re-declare the factory pin ARG so the label bakes its value by @​hanthor in #374
  • fix(build): key the package transaction on the factory pin, fail loud on skew by @​hanthor in #373
  • chore(deps): update packages pin to GNOME 51.0 finals build by @​hanthor in #359
  • test: label parity-ref tests as #152 pinned-ref work by @​kylerankin in #356
  • docs: correct stale package-image copy statement in package-contract by @​kylerankin in #333
  • fix(packages): reject proxy and sslverify=0 in allowlisted repositories by @​mendezr in #351
  • fix(ci): let the kernel cache verify accept dispatch-run signatures by @​mendezr in #348
  • feat(packages): add alsa-utils, restoring kernel mixer state across reboots by @​castrojo in #297
  • fix(ci): sign the kernel cache digest the registry actually stored by @​kylerankin in #317
  • chore(ci): bump actions pin for GNOME 51 gate fixes by @​hanthor in #315
  • chore(ci): point release reusable at actions with preset-proof gate sshd by @​hanthor in #310
  • feat(kernel): build v4l2loopback for every flavor's kernel by @​Danathar in #298
  • fix(packages): add default-fonts-core-emoji to the parity contract by @​buggtb in #296
  • fix(image): strip extension build toolchain closure from shipping image by @​hanthor in #295
  • fix(iso): retry flaky Flathub pulls 5x so a timeout window can't fail E2E by @​hanthor in #285
  • feat(packages): printing and cameras, from the 2026-09-26 factory image by @​hanthor in #282
  • fix(selinux): keep Hummingbird's useradd HOME; only generate the rules from /home by @​hanthor in #283
  • fix(selinux): label /var/home so GNOME Initial Setup can create the account by @​hanthor in #281
  • fix(iso): build the tacklebox live ISO with release compression by @​hanthor in #280
  • feat(iso): installs boot to GNOME Initial Setup, as Bluefin and Dakota do by @​hanthor in #279
  • feat(packages): pin the 2026-09-26 factory image; Wi-Fi, Files, phones, printing, Initial Setup by @​hanthor in #265
  • fix(packages): install samba, samba-winbind and samba-winbind-clients by @​buggtb in #268
  • fix(ci): scope download-integrity clearance to each fetch by @​mendezr in #233
  • feat: build live ISOs for unpublished variants via tacklebox by @​hanthor in #252
  • fix(iso): installed systems get their Flatpaks (the dock was empty) by @​hanthor in #272
  • fix(iso): retry flatpak remote-add, which fetches over the network by @​hanthor in #270
  • chore(iso): pin bootc-installer v2026.09.25-51f8cfe6 (offline installs of Utah work) by @​hanthor in #269
  • feat(baselines): measure Utah against the published Bluefin and Dakota images by @​hanthor in #264
  • fix(parity): install the Bluefin base packages Utah can resolve today by @​hanthor in #266
  • fix(e2e): count flatpak runtimes when checking the offline default set by @​hanthor in #267
  • fix(iso): let the installer create the first account by @​hanthor in #260
  • fix(iso): keep the listed GTK3 theme runtimes in the live ISO by @​hanthor in #256
  • fix(desktop): enable per-user services — installed Utah had no audio by @​hanthor in #255
  • fix(boot): installed systems boot again — keep the base's shim-paired GRUB, guard the EFI chain (#253) by @​hanthor in #254
  • fix(iso): separate installed-desktop and installed-fastfetch captures by @​repires in #243
  • ci: opt the testing stream into rechunking and build SBOMs by @​mendezr in #226
  • fix(packages): install device firmware, which the bootable base ships none of by @​sramkrishna in #236
  • fix: mask serial-getty@ttyS0 so desktops stop spamming the journal by @​sramkrishna in #235
  • fix: repoint install-flatpaks.sh at tuna-os/bootc-installer by @​Danathar in #219
  • ci: retain gated production ISO artifacts by @​Danathar in #198
  • fix(iso): tighten live ISO size budget by @​Danathar in #206
  • chore(deps): update actions/upload-pages-artifact action to v5 by @​hanthor in #234
  • ci: gate the live boot on the UTAH_LIVE_READY serial marker by @​mendezr in #229
  • fix(iso): force software GL rendering for the E2E test's terminal by @​Danathar in #224
  • test(installer): assert offline payload and default Flatpaks survive encrypted install by @​Danathar in #215
  • test: cover btrfs live-kernel contract by @​Danathar in #207
  • ci: document Utah testing-stream rechunk gate by @​Danathar in #205
  • docs: close README/skill package-count drift against the manifests by @​Danathar in #225
  • fix(flavors): single-source flavor to image name mapping in flavors.py by @​mrbobbytables in #144
  • fix(desktop): enable input-remapper.service for desktop input devices by @​mrbobbytables in #148
  • ci(parity): pin check-parity upstream fetch to committed revision by @​mrbobbytables in #152
  • ci: stop a testing build cancelling the one before it, which is losing the ISO evidence the release gate needs by @​hanthor in #185
  • ci(release): stop a missed stable release from looking exactly like a normal merge by @​hanthor in #195
  • fix: fall back to kernel module tree and refuse empty kernel releases in verify-rpm-contract by @​mrbobbytables in #204
  • fix: enable PipeWire user units so GNOME screencast can start by @​KiKaraage in #177
  • fix(installer): harden live-media boot paths and define Secure Boot strategy by @​mrbobbytables in #143
  • Retry Flathub pulls, so one timed-out object cannot fail a flavor's ISO by @​hanthor in #162
  • fix(nvidia): bump the driver for kernel 7.2, and make the base bump actually build by @​hanthor in #182
  • fix(packages): correct evolution-ews-core parity debt after EDS closure builds by @​kylerankin in #191
  • fix: disable nvidia-container repo on non-NVIDIA flavors by @​kylerankin in #192
  • ci: drop timestamp from generated skill catalog to avoid merge conflicts by @​mrbobbytables in #193
  • site: publish a status and project information page on GitHub Pages by @​hanthor in #164
  • fix(image): stop shipping the 4 GB package repository in every image, and check Hummingbird signatures by @​hanthor in #133
  • fix: enable the btrfs kernel module in the OGC gaming-flavor kernel by @​kylerankin in #158
  • ci: stop fork pull requests failing on a GHCR permission they cannot have by @​hanthor in #184
  • fix(packages): single-source install repository identity in packages/*.repo by @​mrbobbytables in #146
  • fix(desktop): mask bootc-fetch-apply-updates across cross-vendor etc merge by @​mrbobbytables in #153
  • fix: stop shipping the 4 GB package repository in every image (#128) by @​kylerankin in #156
  • test(ci): add unit tests for check-download-integrity and check_workflow_outputs by @​mrbobbytables in #147
  • fix: enable bluetooth.service for desktop adapters by @​kylerankin in #125
  • feat(packages): install what Bluefin inherits from Fedora's base and Hummingbird already has by @​hanthor in #129
  • fix(iso): get the LUKS end-to-end test green on all four flavors by @​hanthor in #94
  • test: unit coverage for scripts/flavors.py flavor-matrix queries — new tests/test_flavors.py, just test recipe by @​mendezr in #118
  • fix(uupd): pin and verify uupd.service/uupd.timer against committed digests by @​kylerankin in #124
  • fix(e2e): capture the fastfetch shot at 1080p, with its logo by @​hanthor in #112
  • fix(packages): ship glibc-all-langpacks so a chosen locale exists by @​hanthor in #116
  • fix: keep GSConnect loading on GNOME 51 (clipboard final-type) by @​mrbobbytables in #89
  • fix: resolve OGC kernels when assembling live ISOs by @​hanthor in #87
  • fix(iso): repair CI handoff, payload digests, and live kernel support by @​hanthor in #86
  • ci: automate LUKS ISO validation and screenshot evidence by @​hanthor in #84
  • Build the Utah ISO, install it to an encrypted disk, and prove the desktop starts by @​hanthor in #41
  • fix(build): resolve the pinned package contract before composing Utah by @​hanthor in #82
  • docs: Utah's current status by @​HuntedRaven7 in #31
  • feat: compose Utah from a local package repository by @​hanthor in #37
  • supply-chain: pin and verify executable image and installer downloads by @​hanthor in #32
  • ci: stop main waiting on the kernel cache; cut layer overhead per flavor by @​hanthor in #33
  • feat: build zram-generator packages by @​mendezr in #294
  • feat: build zram-generator packages (carries #294) by @​castrojo in #301
  • fix(ci): report nothing for a cancelled run instead of every package as failed (carries #271) by @​castrojo in #300
  • feat(feeds): poll 68 more upstreams via explicit lock feeds by @​hanthor in #296
  • fix(libadwaita): drop obsolete sassc backport, merged upstream in 1.10.0 by @​hanthor in #299
  • fix(gsettings): drop GConf .convert files removed upstream in GNOME 51.0 by @​hanthor in #298
  • chore(gnome): bump the GNOME 51 stack off prerelease to 51.0 finals by @​hanthor in #295
  • feat(supply-chain): lock factory buildroots and require recipe provenance by @​Danathar in #186
  • fix: retry the hermetic lane's online steps and package v4l-utils' udevd drop-in by @​clubanderson in #288
  • fix(sources): reset release on upstream version bumps by @​arteeh in #281
  • fix(ci): drop canary inject_failure from build matrix (#285) by @​mrbobbytables in #286
  • ci(validate): give check_workflow_quoting and runtime_contract a PR-wide trigger by @​buggtb in #282
  • feat(libass): update to 0.17.5 by @​hanthor in #266
  • fix: prevent lock screen password controls from overlapping by @​arteeh in #290
  • feat(ci): let a dispatch build and publish only named packages by @​hanthor in #279
  • fix(printing): import pdfio for libcupsfilters, and rebuild libgphoto2 by @​hanthor in #278
  • fix(enchant2): build without the Nuspell backend by @​hanthor in #276
  • feat(publish): resolve the blocking transaction in Utah's pinned base by @​hanthor in #277
  • fix(build): resolve the hermetic root with best=0, like the container lane by @​hanthor in #275
  • feat(publish): publish each wave's successes as that wave finishes by @​hanthor in #274
  • fix(publish): a bootstrap build never replaces the real package by @​hanthor in #273
  • fix(publish): resolve Utah's install set in Utah's own base image by @​hanthor in #272
  • feat(publish): resolve what Utah actually installs, and track each gap by @​hanthor in #270
  • fix(publish): import libexif and ghostscript for libgphoto2 and libppd by @​hanthor in #269
  • fix(plan): call a published build stale only when its soname moved by @​hanthor in #268
  • feat(xdg-terminal-exec): update to 0.14.3 by @​hanthor in #265
  • feat(build): make the hermetic mock lane the default by @​hanthor in #264
  • fix(publish): let a re-run publish over its own earlier attempt by @​hanthor in #262
  • fix(ci): keep a canary dispatched on main away from the tracking issue by @​hanthor in #261
  • feat(build): hermetic mock lane -- lock the build root, build offline from the lock by @​hanthor in #260
  • feat(build): rebuild what changed and what BuildRequires it, on every merge by @​hanthor in #259
  • ci(build): retry a failed %check once before failing the package by @​hanthor in #256
  • feat(publish): publish each good build, keep a failed package's previous one by @​hanthor in #258
  • ci(canary): prove pipeline changes on the real workflow in minutes by @​hanthor in #257
  • fix(buildroot): keep the pin in config/ and move it to the first mirror image by @​hanthor in #255
  • ci(buildroot): factory-owned build-root mirror, and a cache key that survives a publish by @​hanthor in #252
  • fix(publish): lead the repository image with a repodata-only layer by @​hanthor in #254
  • feat: import Utah runtime dependencies with no factory recipe by @​hanthor in #246
  • fix(publish): log in for the provenance attestation and keep it from failing a publish by @​hanthor in #253
  • fix(python-pydantic-core): BuildRequire python3-packaging for %prep by @​hanthor in #250
  • fix(publish): close the ffmpeg and libosinfo runtime closure by @​hanthor in #249
  • fix: restore python-pydantic and build pydantic-core from vendored crates by @​hanthor in #248
  • fix(librist): backport upstream's nettle 4.0 support by @​hanthor in #245
  • chore: remove python-pydantic and python-pydantic-core from the factory by @​hanthor in #244
  • fix(libppd): include <cstdint> before cups/transcode.h by @​hanthor in #243
  • fix(librist): correct the 0.2.11-1 changelog year so rpm accepts the spec by @​hanthor in #242
  • fix(srt): build with the OpenSSL EVP backend instead of gnutls+nettle3.10 by @​hanthor in #241
  • fix(ci): upgrade libxml2 to Hummingbird's split release before builddep by @​hanthor in #240
  • fix(grub2): efi_vendor=fedora so GRUB sits beside Utah's shim (Utah install e2e red since 09-21) by @​hanthor in #238
  • test: gate architecture inventory counts by @​Danathar in #194
  • fix(factory): source rebuild matrix package set from source_locks by @​repires in #232
  • fix(import): skip factory-sourced packages in Rawhide resolver by @​mrbobbytables in #185
  • refactor(ci): align Justfile check with CI workflow gate catalog by @​mrbobbytables in #196
  • fix(ci): verify cosign signature before seeding from the factory image by @​Danathar in #215
  • fix(ci): gate sccache setup to mozjs140 to prevent token exposure by @​repires in #227
  • fix(validate): refuse a recipe that silences its own %check by @​Danathar in #197
  • fix(publish): close the consumer-transaction dep closure by @​hanthor in #229
  • fix(dist_bump): tolerate macro-based Release fields (carries #100) by @​hanthor in #138
  • fix(verify): pin srt, libcue, game-music-emu, cjson to Fedora lookaside primaries by @​hanthor in #231
  • feat(printing): add cups-filters, cups-browsed, libcupsfilters, and libppd recipes by @​mrbobbytables in #214
  • ci(audit): pin pyyaml and declare it for the unit tests job by @​mendezr in #221
  • feat(packages): import google-noto-color-emoji-fonts and stix-fonts recipes by @​mrbobbytables in #199
  • docs: define ORAS source lookaside policy by @​mrbobbytables in #189
  • fix(linux-atm): pin kernel-headers to 6.19.6 for atmsvc.h by @​hanthor in #218
  • fix: exclude libicu-77 from every build root by default, with per-package opt-in by @​hanthor in #217
  • feat: ppp/libpcap/linux-atm/libgda closure parity (utah-packages#149) by @​kylerankin in #203
  • feat: add libfprint + fprintd recipes for fingerprint login parity (#145) by @​kylerankin in #204
  • feat: import microcode_ctl for CPU errata parity by @​kylerankin in #205
  • fix(scan): skip malformed repoquery lines instead of crashing the scan by @​kylerankin in #206
  • feat: add alsa-utils recipe for mixer-state restore (Dakota parity) by @​kylerankin in #202
  • fix(rebuild): build nautilus-python after nautilus by @​Danathar in #213
  • fix(gaps): drop runtime-contract [unavailable] packages from the parity report by @​mendezr in #207
  • fix(renovate): require human review for github-actions updates by @​mrbobbytables in #193
  • fix(factory): defer base packages to Hummingbird by @​hanthor in #191
  • docs(ci): preserve the package cache contract by @​hanthor in #184
  • feat(ci): restore and publish per-package RPM cache by @​hanthor in #183
  • feat(ci): cache key for per-package build reuse, and the rule for when to use it by @​hanthor in #178
  • fix: enforce recipe-set agreement across the three package sources by @​kylerankin in #164
  • fix(dist_bump): tolerate macro-based Release fields by @​kylerankin in #100
  • ci: pin zstandard version in rebuild-rpms prepare job (#105) by @​mendezr in #109
  • ci: pin zstandard in the prepare job (carries #109) by @​hanthor in #137
  • fix(quality): add missing provenance for gnome-desktop3 and malcontent-bootstrap by @​mrbobbytables in #98
  • fix(ci): guard build toolchain containers against mutable tags by @​kylerankin in #110
  • fix(workflows): bind rawhide dispatch inputs via env, not run interpolation by @​kylerankin in #114
  • Build the whole Utah contract: 343 recipes, Firefox as a Flatpak, four stage failures fixed by @​hanthor in #70
  • test: add unit coverage for tools/scan_rawhide_state.py by @​kylerankin in #99
  • fix(ci): pin build toolchain containers by digest by @​kylerankin in #88
  • ci: repin Packit SRPM image to live digest by @​Danathar in #85
  • fix(buildroot): exclude legacy ruby default-gems from Hummingbird repo by @​mrbobbytables in #83
  • fix(tailscale): disable incompatible jsonv2 experiment by @​Danathar in #86
  • ci: publish factory repositories atomically after closure validation by @​kylerankin in #89
  • fix(gcc): drop gcc from the rebuild set, let Hummingbird supply it by @​kylerankin in #90
  • fix(batch): consolidate verified fixes for tools, ci checksum, rawhide import, and contract (#71, #72, #56, #57) by @​castrojo in #92
  • refactor(tools): wrap check_workflow_quoting and validate in testable functions by @​castrojo in #73
  • ci: make the compiler cache outlive the build container by @​hanthor in #33
  • fix: keep GSConnect loading on GNOME 48+ (clipboard final-type) by @​hanthor in #53
  • feat: compose a local Utah package repository by @​hanthor in #34
  • feat(packit): wire packit srpm into a real pilot job by @​castrojo in #41
  • fix(packit-sdk): use upstream quay.io/packit/packit instead of rebuilding by @​castrojo in #40
  • fix(packit-sdk): publish as ghcr.io/projectbluefin/packit-sdk by @​castrojo in #38
  • fix(packit-sdk): share DOCKER_CONFIG auth between podman and cosign by @​castrojo in #37
  • feat(packit-sdk): add pinned Packit+Mock build image by @​castrojo in #36
  • ci: build WebKitGTK as two shards on two runners by @​hanthor in #32
Dakota (GNOME OS Prototype)​

Contributors​

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...

Sources​

  • github-activity: available (2026-09-01 to 2026-09-30): source
  • github-lanes: available (2026-09-01 to 2026-09-30): source
  • github-releases: available (2026-09-01 to 2026-09-30): source
  • github-releases: available (2026-09-01 to 2026-09-30): source
  • github-releases: available (2026-09-01 to 2026-09-30): source
  • countme: unavailable — Countme active-system measurement is incomplete. (2026-09-01 to 2026-09-30): source
  • homebrew: available (2026-09-01 to 2026-09-30): source
  • flathub: available (2026-09-01 to 2026-09-30): source

Dakota Alpha 6

· 8 min read
Jorge O. Castro
Director of Dinosaurs

Dakota Alpha 6 is out. This one is brought to you by Ahmed Adan/ Built against GNOME 51 and freedesktop-sdk 26.08.1, running Linux 7.2.6, NVIDIA 615.71.09. Kernel OGC 7.2.6-ogc1 for your gaming needs.

This one certainly feels good! Please remember that we still do NOT support secure boot, so temper your expectations! Here's the changelog, I'll make a video on this one since we have a lot to discuss!

Bluefin Dakota desktop running GNOME
Dakota, built from source with BuildStream

Version matrix​

Alpha 5 baseline values are from tag stable-20260731 (as reflected in the Alpha 5 release announcement):

ComponentAlpha 5Alpha 6Source / Pin
GNOME Shell50.351.0gnome-build-meta
Mutter50.351.0gnome-build-meta
freedesktop-sdk25.08.1426.08.1elements/freedesktop-sdk.bst
gnome-build-meta50.3-5-g4b2504651.0-3-ge34f1ebelements/gnome-build-meta.bst
Kernel7.0.117.2.6elements/core/linux-fdsdk.bst
Game Mode kernel7.1.4-ogc17.2.6-ogc1elements/core/linux-ogc.bst
NVIDIA610.43.02615.71.09elements/bluefin-nvidia/nvidia-drivers.bst
bootc1.16.61.16.13elements/gnomeos-deps/bootc.bst
systemd260.2261.2gnome-build-meta
Mesa26.1.426.2.2freedesktop-sdk
GTK4.22.44.24.0gnome-build-meta
PipeWire1.6.11.6.8gnome-build-meta
WirePlumber0.5.150.5.17freedesktop-sdk
NetworkManager1.56.11.58.1gnome-build-meta
xdg-desktop-portal1.22.11.22.1gnome-build-meta

Note on kernel and bootc: Dakota pins its kernel at 7.2.6 via elements/core/linux-fdsdk.bst (ahead of freedesktop-sdk 26.08.1's default of 7.2.2) and pins bootc at 1.16.13 via elements/gnomeos-deps/bootc.bst (ahead of gnome-build-meta's default of 1.16.6).

GNOME 51 "A Coruña" was officially released on September 16, 2026 — see the official release notes.

Migrating Major GNOME Versions​

This is the first time we utilized dakota:next tracking a dev release, and Ahmed smoothly transitioned the testing branches through these:

ChangeCommit
GNOME 51 and freedesktop-sdk 26.08 on testing5005f85
freedesktop-sdk 26.08.1 and NVIDIA 615.71.09e835b88
Complete fdsdk 26.08 port across all variantsa29d9f6
Derive fdsdk pin and patches from tracked gnome-build-meta57a70d3
Stage sandbox shell explicitly for fdsdk 26.08526affd
Core junctions to GBM 50.4 and fdsdk 25.08.165e630bc
Core junctions to GBM 51.0-312334d2
Track gnome-build-meta master in :next3af437b

Kernel and hardware​

Here's a bunch of enablement crap:

ChangeCommit
Kernel 7.2 with hardware enablement5fbeae7
Align testing on 7.1.86e388f8
OGC gaming kernel 7.2.6-ogc11371bce
Carry hid-asus build fix for OGC 7.2.6-ogc1d2c8cf7
NVIDIA 610.57.04 plus missing data filesed2bea8
ATH12K Wi-Fi across variantsb307333
Restore desktop capabilities across streamsa984a81
Preserve hybrid graphics configuration997f6ec
brlaser CUPS driver846cd92
dmidecode for BIOS info0c5c9ea
Disable zram in favor of zswap53952c7
ydotool input automation and uinput rulesa182aba
plugdev and nintendo_switch groups for udev02bb985

Desktop​

And some of the upcoming desktop improvements that we've been going over in the Discussions:

ChangeCommit
Curated GNOME Shell extensions suite01b757b
quick-settings-audio-panel enabled by default8897f7c
BudsLink-Companion replaces Bluetooth-Battery-Meterb07c05d
syncthing-toggle → bluefin-bling v2bd7bbe6
Ghostty resize overlay off by default (Wayland loop)556bc0c
Ghostty dual-theme tracks GNOME Dark/Lightffe6271
Stop GDM fingerprint retry loop on unenrolled readersddc37d7
Disable PC-speaker WirePlumber sinka5e9152
Portable unzip flags for extension installs787bf4d
Preserve release ZIP root files in extension packaging20113c3
Avoid broken and intrusive desktop defaults691a377
Developer mode adapted to Dakota9efe6e9
Bluefin dinosaur avatars in GNOME user-account pickere106345
Unbreak fresh-ISO post-install (uwelcome, brew, devmode)85a1123

Game Mode​

Fastfetch output showing the Dakota NVIDIA gaming image and the OGC gaming kernel
dakota-nvidia-gaming on the OGC kernel

Bluefin's "Game Mode" is fleshed out now, offering access to a "Bazzite Light" gaming setup, perfect for slaying out. Destiny on Linux please Sony!

ChangeCommit
OGC gaming kernel 7.2.6-ogc11371bce
32-bit GL/Vulkan drivers, Steam UI GPU acceleration096b351
Steam .deb pinned to versioned pool URLe051009
patches/linux-ogc added to sync overlayefc23c7
Re-pin LuaJIT after upstream deleted ROLLING tagf277abd

Image and boot plumbing​

The chunka work is great, you'll notice way smaller updates than the old images. Top of the line hunter!

ChangeCommit
Single source of truth for the image-variant seta987f87
Real stream tag in fastfetch via boot-time booted-image syncd4048c6
Generate ownership during image builds with chunkah4360e70
Fetch remote companion data before reading in chunkah73ff57e
Preserve export mtimes in chunkah1c081c0
Compose host toolchain once during image buildse4a2dfd
Stop using /dev/stdin for inline writes under BuildBarn/BuildBox5e30bde

Behavior changes​

  • Ghostty ships resize-overlay = never; theme tracks the GNOME Dark/Light preference.
  • snd_pcsp sink disabled in WirePlumber — audio no longer falls back to the PC speaker after resume.
  • zram is disabled; swap is zswap backed by /var/swap/swapfile.
  • Bluetooth-Battery-Meter is replaced by BudsLink-Companion plus the io.github.maniacx.BudsLink Flatpak.
  • aarch64 images are not published this cycle. (We'll turn these on soon)

Images​

ImageStreamCommand
DakotaStablesudo bootc switch ghcr.io/projectbluefin/dakota:stable
DakotaTestingsudo bootc switch ghcr.io/projectbluefin/dakota:testing
NVIDIAStablesudo bootc switch ghcr.io/projectbluefin/dakota-nvidia:stable
NVIDIATestingsudo bootc switch ghcr.io/projectbluefin/dakota-nvidia:testing
GamingStablesudo bootc switch ghcr.io/projectbluefin/dakota-gaming:stable
GamingTestingsudo bootc switch ghcr.io/projectbluefin/dakota-gaming:testing
NVIDIA GamingStablesudo bootc switch ghcr.io/projectbluefin/dakota-nvidia-gaming:stable
NVIDIA GamingTestingsudo bootc switch ghcr.io/projectbluefin/dakota-nvidia-gaming:testing

You can't rebase to Dakota from another image. If you're not on Dakota already, reinstall from the ISO.

ISO downloads​

Testing instructions and bug reporting: ISO Testing. File ISO bugs in projectbluefin/dakota-iso.

Lore​

Remember that the wolves are coming, level up your skills at training.projectbluefin.io. It's a tough world out there, here's a sneak peek at the artwork from the artists at makemeacomic.com! These are just a sample of entries from a mysterious journal uncovered on Europa by a [REDACTED] merchant. Inside are the secrets to unlocking the potential of Contributor-Guardians and their mounts. But the forces of the Toilmaster are already ahead of them. Instructions from a doomed CNCF Expedition are sparse:

CNCF VANGUARD // ALERT ONE

There's a stone here. "All these worlds are yours, except Europa, attempt no landing there." But sir didn't the Hummingbird team leave three days ago?

1 / 4

Bluefin

Long-Range Raptor Mount

Bluefin — Long-Range Raptor Mount
Bluefin — Long-Range Raptor Mount concept illustration

Bluefin Server Alpha 2

· 4 min read
Project Bluefin
Automation & Factory

Alright, here it is, Bluefin Server, this one actually boots. This is the base of the Bluefin Factory, the thing you'll build your homelab on. And in turn, your desktops or whatever you want. Kubernetes for the home.

Bluefin Server

An FSDK-based, image-based Linux server OS.**

To celebrate this milestone, enjoy the latest video, with some fresh lore!

Bluefin Server targets the same use-case space as Flatcar Container Linux, Kairos, Fedora CoreOS, and Talos, but is built from scratch with BuildStream 2 from freedesktop-sdk (FSDK 26.08) components and uutils coreutils.

It is designed to be installed and then managed entirely through the Kubestellar GUI. I'll be releasing point releases quickly over the next few days. After the install it will give you a web address, then you go to it on your computer. Then that's it, your perfect home server.

Except the dashboards are empty. The more people we have making these the better, including a ZFS one! This variant will have ZFS support so now's the time to jump onboard!

It is DDI first: the OS payload is a compressed XFS DDI filesystem image that is deployed by an offline, systemd-native installer.

Release status: Alpha​

Bluefin Server is currently in Alpha:

  • Milestone status: Phase A (reproducible build path, uutils, k0s sysext, graph validation) is complete. Phase B (automated boot verification on lab cluster) is in progress.
  • systemd-sysupdate should work, we're about to find out! configurations.
  • Readiness roadmap: Track completed criteria and remaining gates toward 1.0 in docs/MVP_1_0_READINESS.md.

How this works​

  • A/B root rollback — an MVP 1.0 gate: 50-root.transfer names root-a and root-b; the installer currently creates only root-a.
  • DDI-first delivery — the installer embeds the OS payload as a data partition; no network is required at install time. This is basically Linux systemd style.
  • Minimal, distroless OS image — no shell in the running rootfs by default IS what we are shooting for. We'll probably fail at this lol.
  • systemd-native installer — systemd-sysinstall provides the interactive terminal UI and systemd-repart handles partitioning and block-copy DDI placement. Finally distro installers can all go die!
  • Optional k0s as a systemd-sysext so the base image stays distroless. We started with k3s but I want to see how this one goes, stripped down for the home.

SSH ON: SSH is enabled for cluster boot tests and remote debugging. It is scheduled for removal once diagnostics move to serial logs or a guest agent. See docs/skills/factory-integration.md.

Quick start​

Bare metal sorely needed! However this runs on any Linux, feel free to fire up a VM and start designing that dashboard! Once we get home assistant and all the goodies it'll be amazing! Thanks for checking it out!

You need only podman and just. BuildStream runs inside the FSDK bst2 container, so BuildStream is not installed locally.

just validate # resolve the element graph
just show-me-the-future # end-to-end QEMU installer smoke test

See AGENTS.md for the full build command matrix, hard rules, and agent skill routing.

Contributing​

See CONTRIBUTING.md for the contributor checklist, Conventional Commit rules, and docs/skills/index.md for task-specific guidance.

Announcing mcp.projectbluefin.io

· 2 min read
Jorge O. Castro
Director of Dinosaurs

Model Context Protocol (MCP) is an open protocol for LLMs and agents to talk to each other. We're now serving the Project Bluefin organization knowledge base and live factory state at https://mcp.projectbluefin.io/mcp.

Right now hive.projectbluefin.io exposes an API that has things that are useful for agents. We use it to dole out work to volunteers and to get review tasks. This is what's letting us scale out in ways we haven't been able to before. Hive has a nice Knowledge Base that it exposes, so this initial cut is to search that knowledge. This is mostly useful to connect whatever agent you use to our stuff and get context for your agent. So if you want to do Bluefin things you just add this. I've updated the Agentic Contributor Guide, note that our hive API endpoints are published, so if you're building a deep integration it probably makes sense to work with the Hive API directly. Feedback and usage notes welcome!

Endpoint Details​

  • URL: https://mcp.projectbluefin.io/mcp
  • Transport: Streamable HTTP / Server-Sent Events (SSE)
  • Authentication: None (public, read-only)
  • Health Check: https://mcp.projectbluefin.io/health

Available Tools​

Here's what's exposed:

ToolDescriptionParameters
search_knowledgeSearch Project Bluefin knowledge base: engineering patterns, test coverage gaps, CI conventions, and repo findings across projectbluefin/*.query (string, required)
limit (integer 1–25, default 10)
get_factory_statusLive factory status from Hive: hub health, active contributors, actionable items, per-tier limits.None
get_work_queueLive work queue and triage state from Hive: issues ready to implement and triage grouping.limit (integer 1–25, default 10)
get_index_statusOperational health, record count, and timestamp of the published knowledge index.None
get_quickstartOnboarding checklists (first-pr, run-tests, factory-gates, branch-rules).topic (enum, required)
get_repository_mapHigh-level component map, entrypoints, and branch targets for bluefin, bluefin-lts, common, dakota, documentation.repo (enum, required)

Archaeopteryx August 2026

· 63 min read
Project Bluefin
Automation & Factory
Completed work
258
24 planned • 234 opportunistic
Contributors
16
0 first-time contributors

Activity

Completed work across the configured factory portfolio.

Daily merged pull requests

541merged pull requests
Source: GitHub GraphQL · August 2026 UTC (2026-08-01 to 2026-08-31)
Show the numbers
Daily merged pull requests data for August 2026 UTC (2026-08-01 to 2026-08-31)
LabelMerged pull requests
2026-08-0138
2026-08-0220
2026-08-0330
2026-08-0414
2026-08-0512
2026-08-0610
2026-08-07117
2026-08-0820
2026-08-0954
2026-08-108
2026-08-113
2026-08-125
2026-08-1310
2026-08-145
2026-08-1515
2026-08-1611
2026-08-177
2026-08-188
2026-08-195
2026-08-2014
2026-08-2121
2026-08-2217
2026-08-238
2026-08-2419
2026-08-257
2026-08-2614
2026-08-274
2026-08-2811
2026-08-2910
2026-08-3022
2026-08-312

Merged pull requests by repository

541merged pull requests
Source: GitHub GraphQL · August 2026 UTC (2026-08-01 to 2026-08-31)
Show the numbers
Merged pull requests by repository data for August 2026 UTC (2026-08-01 to 2026-08-31)
LabelMerged pull requests
projectbluefin/actions44
projectbluefin/bluefin155
projectbluefin/bluefin-lts38
projectbluefin/bonedigger3
projectbluefin/common50
projectbluefin/dakota92
projectbluefin/documentation18
projectbluefin/finpilot49
projectbluefin/iso1
projectbluefin/server4
projectbluefin/testsuite67
projectbluefin/utah6
projectbluefin/utah-packages14

Merged pull requests by label

435label assignments
Source: GitHub GraphQL · August 2026 UTC (2026-08-01 to 2026-08-31)
Show the numbers
Merged pull requests by label data for August 2026 UTC (2026-08-01 to 2026-08-31)
LabelLabel assignments
1-triage3
3-clanker-queue41
4-review38
agent/contributor2
automerge52
chore/deps52
cli/copilot2
contributor/castrojo2
dependencies2
hold13
javascript2
kde9
lgtm23
needs-human1
pr/needs-review67
quality3
release/ready63
renovate/high-risk16
renovate/low-risk3
runner9
security6
size:M1
size:S2
size:XL1
size:XS19
testing3

Stable portfolio

  • projectbluefin/bluefin
  • projectbluefin/bluefin-lts
  • projectbluefin/dakota
  • projectbluefin/testsuite
  • projectbluefin/server
  • projectbluefin/actions
  • projectbluefin/bonedigger
  • projectbluefin/aurorafin-shared
  • projectbluefin/common
  • projectbluefin/documentation
  • projectbluefin/branding
  • projectbluefin/iso
  • projectbluefin/finpilot

Experimental portfolio

  • projectbluefin/utah
  • projectbluefin/utah-packages

Delivery

Publishing-lane outcomes, cadence, duration, and release events.

Factory Publishing Lanes

Bluefin Testing
projectbluefin/bluefin
! 0%
0Passed
3Failed
65mMedian Run

Pending runs: 5

Run History
0Passed
0Failed
—Median Run

Pending runs: 30

Run History
71Passed
2Failed
39mMedian Run

Pending runs: 12

Run History

Publishing-lane cadence

123publish runs
Source: GitHub Actions · August 2026 UTC (2026-08-01 to 2026-08-31)
Show the numbers
Publishing-lane cadence data for August 2026 UTC (2026-08-01 to 2026-08-31)
LabelBluefin TestingBluefin LTSDakota
2026-08-01000
2026-08-02000
2026-08-03000
2026-08-04000
2026-08-05000
2026-08-06000
2026-08-07000
2026-08-08000
2026-08-09000
2026-08-10000
2026-08-11000
2026-08-12000
2026-08-13000
2026-08-14000
2026-08-15000
2026-08-16000
2026-08-17000
2026-08-18000
2026-08-19000
2026-08-20000
2026-08-21010
2026-08-22010
2026-08-23010
2026-08-24603
2026-08-25004
2026-08-26107
2026-08-27009
2026-08-280735
2026-08-290016
2026-08-301117
2026-08-31094

Release events

13release events
Source: GitHub Releases API · August 2026 UTC (2026-08-01 to 2026-08-31)
Show the numbers
Release events data for August 2026 UTC (2026-08-01 to 2026-08-31)
LabelRelease events
2026-08-071
2026-08-061
2026-08-051
2026-08-041
2026-08-031
2026-08-021
2026-08-011
2026-08-311
2026-08-281
2026-08-241
2026-08-211
2026-08-191
2026-08-151

Participation

Human and automated contributions with current contributors.

Human and automation activity

541pull requests
Source: GitHub GraphQL · August 2026 UTC (2026-08-01 to 2026-08-31)
Show the numbers
Human and automation activity data for August 2026 UTC (2026-08-01 to 2026-08-31)
LabelHumanAutomation
Report period258283

Ecosystem context

Public ecosystem measures labelled with their native source windows.

Countme active systems

3,920estimated weekly active systems
Source: Countme · Through 2026-07-27
Show the numbers
Countme active systems data for Through 2026-07-27
LabelActive systems
week-13561
week-23672
week-33606
week-43712
week-53780
week-63667
week-73584
week-83678
week-94195
week-103920

Homebrew tap additions

14package additions
Source: Homebrew taps · August 2026 UTC (2026-08-01 to 2026-08-31)
Show the numbers
Homebrew tap additions data for August 2026 UTC (2026-08-01 to 2026-08-31)
LabelAdditions
Production tap2
Experimental tap12
Flathub trendData unavailable: Flathub statistics could not be read.

Release details remain on the canonical /changelogs surface.

Completed work​

Dakota (GNOME OS Prototype)​

Contributors​

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

Sources​

  • github-activity: available (2026-08-01 to 2026-08-31): source
  • github-lanes: available (2026-08-01 to 2026-08-31): source
  • github-releases: available (2026-08-01 to 2026-08-31): source
  • github-releases: available (2026-08-01 to 2026-08-31): source
  • github-releases: available (2026-08-01 to 2026-08-31): source
  • github-releases: available (2026-08-01 to 2026-08-31): source
  • github-releases: available (2026-08-01 to 2026-08-31): source
  • countme: available (2026-08-01 to 2026-08-31): source
  • homebrew: available (2026-08-01 to 2026-08-31): source
  • flathub: unavailable — Flathub statistics could not be read. (2026-08-01 to 2026-08-31): source

Jovial July 2026

· 47 min read
Project Bluefin
Automation & Factory
Completed work
126
19 planned • 107 opportunistic
Contributors
11
0 first-time contributors

Activity

Completed work across the configured factory portfolio.

Daily merged pull requests

553merged pull requests
Source: GitHub GraphQL · July 2026 UTC (2026-07-01 to 2026-07-31)
Show the numbers
Daily merged pull requests data for July 2026 UTC (2026-07-01 to 2026-07-31)
LabelMerged pull requests
2026-07-0126
2026-07-0213
2026-07-0312
2026-07-049
2026-07-058
2026-07-0614
2026-07-077
2026-07-0813
2026-07-098
2026-07-106
2026-07-1114
2026-07-129
2026-07-137
2026-07-1410
2026-07-154
2026-07-167
2026-07-176
2026-07-187
2026-07-1931
2026-07-2087
2026-07-2134
2026-07-2214
2026-07-2317
2026-07-2412
2026-07-2524
2026-07-2615
2026-07-2717
2026-07-2840
2026-07-2948
2026-07-3020
2026-07-3114

Merged pull requests by repository

553merged pull requests
Source: GitHub GraphQL · July 2026 UTC (2026-07-01 to 2026-07-31)
Show the numbers
Merged pull requests by repository data for July 2026 UTC (2026-07-01 to 2026-07-31)
LabelMerged pull requests
projectbluefin/actions38
projectbluefin/bluefin166
projectbluefin/bluefin-lts52
projectbluefin/common39
projectbluefin/dakota71
projectbluefin/documentation18
projectbluefin/finpilot72
projectbluefin/iso2
projectbluefin/server3
projectbluefin/testsuite92

Merged pull requests by label

525label assignments
Source: GitHub GraphQL · July 2026 UTC (2026-07-01 to 2026-07-31)
Show the numbers
Merged pull requests by label data for July 2026 UTC (2026-07-01 to 2026-07-31)
LabelLabel assignments
4-review471
agent/contributor1
automerge6
chore/deps6
cli/copilot1
contributor/castrojo1
kde3
pr/needs-review11
release/ready10
runner3
size:XS12

Stable portfolio

  • projectbluefin/bluefin
  • projectbluefin/bluefin-lts
  • projectbluefin/dakota
  • projectbluefin/testsuite
  • projectbluefin/server
  • projectbluefin/actions
  • projectbluefin/bonedigger
  • projectbluefin/aurorafin-shared
  • projectbluefin/common
  • projectbluefin/documentation
  • projectbluefin/branding
  • projectbluefin/iso
  • projectbluefin/finpilot

Experimental portfolio

  • projectbluefin/utah
  • projectbluefin/utah-packages

Delivery

Publishing-lane outcomes, cadence, duration, and release events.

Factory Publishing Lanes

Bluefin Testing
projectbluefin/bluefin
△ 87%
13Passed
2Failed
44mMedian Run

Pending runs: 4

Run History
19Passed
11Failed
23mMedian Run

Pending runs: 6

Run History
14Passed
8Failed
61mMedian Run

Pending runs: 15

Run History

Publishing-lane cadence

92publish runs
Source: GitHub Actions · July 2026 UTC (2026-07-01 to 2026-07-31)
Show the numbers
Publishing-lane cadence data for July 2026 UTC (2026-07-01 to 2026-07-31)
LabelBluefin TestingBluefin LTSDakota
2026-07-01000
2026-07-02000
2026-07-03000
2026-07-04000
2026-07-05000
2026-07-06000
2026-07-07000
2026-07-08000
2026-07-09000
2026-07-10000
2026-07-11000
2026-07-12000
2026-07-13000
2026-07-14000
2026-07-15000
2026-07-16000
2026-07-17000
2026-07-18000
2026-07-19000
2026-07-20000
2026-07-21000
2026-07-22000
2026-07-23000
2026-07-24000
2026-07-25000
2026-07-260180
2026-07-27030
2026-07-28100
2026-07-2913616
2026-07-303612
2026-07-31239

Release events

50release events
Source: GitHub Releases API · July 2026 UTC (2026-07-01 to 2026-07-31)
Show the numbers
Release events data for July 2026 UTC (2026-07-01 to 2026-07-31)
LabelRelease events
2026-07-201
2026-07-191
2026-07-181
2026-07-171
2026-07-161
2026-07-151
2026-07-141
2026-07-131
2026-07-121
2026-07-111
2026-07-101
2026-07-091
2026-07-081
2026-07-071
2026-07-061
2026-07-051
2026-07-041
2026-07-031
2026-07-021
2026-07-011
2026-07-311
2026-07-301
2026-07-291
2026-07-281
2026-07-271
2026-07-261
2026-07-251
2026-07-241
2026-07-231
2026-07-221
2026-07-211
2026-07-201
2026-07-191
2026-07-181
2026-07-171
2026-07-161
2026-07-151
2026-07-141
2026-07-131
2026-07-121
2026-07-111
2026-07-101
2026-07-091
2026-07-081
2026-07-071
2026-07-061
2026-07-311
2026-07-111
2026-07-201
2026-07-111

Participation

Human and automated contributions with current contributors.

Human and automation activity

553pull requests
Source: GitHub GraphQL · July 2026 UTC (2026-07-01 to 2026-07-31)
Show the numbers
Human and automation activity data for July 2026 UTC (2026-07-01 to 2026-07-31)
LabelHumanAutomation
Report period126427

Ecosystem context

Public ecosystem measures labelled with their native source windows.

Countme active systems

3,920estimated weekly active systems
Source: Countme · Through 2026-07-27
Show the numbers
Countme active systems data for Through 2026-07-27
LabelActive systems
week-13561
week-23672
week-33606
week-43712
week-53780
week-63667
week-73584
week-83678
week-94195
week-103920

Homebrew tap additions

3package additions
Source: Homebrew taps · July 2026 UTC (2026-07-01 to 2026-07-31)
Show the numbers
Homebrew tap additions data for July 2026 UTC (2026-07-01 to 2026-07-31)
LabelAdditions
Production tap1
Experimental tap2
Flathub trendData unavailable: Flathub statistics could not be read.

Release details remain on the canonical /changelogs surface.

Completed work​

Dakota (GNOME OS Prototype)​

Contributors​

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

Sources​

  • github-activity: available (2026-07-01 to 2026-07-31): source
  • github-lanes: available (2026-07-01 to 2026-07-31): source
  • github-releases: available (2026-07-01 to 2026-07-31): source
  • github-releases: available (2026-07-01 to 2026-07-31): source
  • github-releases: available (2026-07-01 to 2026-07-31): source
  • github-releases: available (2026-07-01 to 2026-07-31): source
  • github-releases: available (2026-07-01 to 2026-07-31): source
  • countme: available (2026-07-01 to 2026-07-31): source
  • homebrew: available (2026-07-01 to 2026-07-31): source
  • flathub: unavailable — Flathub statistics could not be read. (2026-07-01 to 2026-07-31): source

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-lts → projectbluefin/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

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​