Skip to main content

max / alloy

Ship a Rust toolchain in the base image The console is built in the rust-build stage and only its binary is copied into the runtime image, so an Alloy machine could run Rust programs and not build one. Same gap git had, closed by the same audience argument. It is also a hard requirement for the build-host role: sandod shells out to cargo build --release in its own workdir and refuses to compile anywhere but its configured build host, so a Sando host with no cargo is not a Sando host. Costs 610 MiB installed across 16 packages, most of it rust-std-static and llvm-libs. That is the largest single line in the package block by a wide margin, so IMAGE.md now carries per-image toolchain selection at mint time as an open question.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-26 20:32 UTC
Signed with PGP, not checked
Commit: 7b92637251940c5069b30f1280af0aebfb98cf7e
Parent: a6b06be
2 files changed, +30 insertions, -0 deletions
@@ -378,6 +378,35 @@
378 378 # perl helpers, which is the difference between a git that works
379 379 # and a git that works when you ask it a question.
380 380 git \
381 + # Rust toolchain. The console is built in the rust-build stage above
382 + # and only its binary is copied into this image, so until now an
383 + # Alloy machine could run Rust programs and not build one. That is
384 + # the same gap git had and the same audience argument closes it.
385 + #
386 + # It is also a hard requirement for the build-host role. sandod
387 + # shells out to `cargo build --release` in its own workdir and
388 + # refuses to compile anywhere but its configured build host, so a
389 + # Sando host with no cargo is not a Sando host. Naming that here
390 + # because it is the reason the line landed now rather than later.
391 + #
392 + # No separate linker line: `rust` pulls gcc, binutils and
393 + # glibc-devel, so cc arrives with it. Fedora 43 carries 1.96.1,
394 + # ahead of the workspace's 1.86 floor and current enough for
395 + # crates tracking recent stable.
396 + #
397 + # The cost is 610 MiB installed across 16 packages, most of it
398 + # rust-std-static (164 MiB) and llvm-libs (139 MiB). That is an
399 + # order of magnitude above the hardware-health group above and by
400 + # a distance the largest thing in this block, so it is stated
401 + # rather than absorbed. Per-image language selection at mint time
402 + # is the way this stops being one number for everyone; see
403 + # docs/IMAGE.md.
404 + #
405 + # rustup is deliberately not here. It installs into $HOME, needs
406 + # nothing from the image, and stays the answer for a pinned or
407 + # nightly toolchain. Nor are project-specific -devel packages:
408 + # those belong to whatever is being built, not to the OS.
409 + rust cargo \
381 410 # xdg-user-dirs. Without it a new account gets a bare home and no
382 411 # ~/Documents, ~/Downloads or ~/Pictures, which is what the GTK
383 412 # file-chooser portal and yazi both open into.
@@ -104,5 +104,6 @@
104 104 - [ ] `bootc-image-builder` for ISO generation. First-time-user path is `bootc install` from a live environment; the ISO is what makes that a smooth experience. Verify the ISO builder handles Alloy's specific package set.
105 105 - [x] **Containerfile stage policy: multi-stage only where a non-Fedora Rust binary needs to ship.** Currently that is one stage, `rust-build`, and it builds the Alloy console. Everything else comes from RPM in the runtime stage. Do not add stages preemptively. Corrected 2026-07-19: this line named wl-screenrec as the stage's occupant, which was stale — wl-screenrec was deferred rather than shipped, so for a while there was no stage at all. The console is the case the policy was written for and did not anticipate: it is the one binary Alloy authors, so no repo can ever carry it, and a distro whose headline surface is its console cannot ship without one. It is built on `fedora:43` rather than on the dev box so the toolchain and glibc match the runtime stage.
106 106 - [ ] **An always-on x86_64 builder.** The blocker under "CI" above, and the thing the signing key and the weekly base-update rebuild both wait on. astra is always-on and aarch64; fw13 is x86_64 and sleeps.
107 + - [ ] **Language toolchains selected per image rather than for everyone.** The Rust toolchain went into the base on 2026-07-26 because Alloy's audience is developers and because the build-host role needs cargo present (sandod compiles in its own workdir and will not run without it). It costs 610 MiB installed, which is the largest single line in the package block and roughly twelve times the hardware-health group. One number for every install is the wrong shape as soon as a second language is wanted: a Go or Python or C toolchain each carries a comparable bill, and no machine wants all of them. Minting is where this resolves, since a per-machine image is already being produced with a baked key, so the toolchain set is another mint-time input rather than a new mechanism. Open: whether the base keeps Rust as the default when selection exists, or drops to none and makes every toolchain a choice. See [[alloy-image-minting]].
107 108 - [x] Source hosting: **`makenot.work/git/max/alloy`**, our own platform. The old answer here was the sr.ht account `~maxmj` for v0 with LLC-owned `~makecreative` as the long-term target; sourcehut is now a backup remote and that migration question retires with it.
108 109 - [x] **Publish `:latest`, `:<fedora-version>`, and `:<fedora-version>-YYYYMMDD` tags.** Currently `:latest`, `:43`, `:43-YYYYMMDD`. `:latest` for casual users, the bare version for version-pinned users, the dated tag for reproducibility. Wired up when distribution starts.