Skip to main content

max / alloy

Refuse recommends in the base package block, and name the one that was load-bearing The client package block passed `--setopt=install_weak_deps=False` and the base block did not, so the profile meant to be lean accepted recommends while the fat one refused them. The asymmetry survived because a recommend is by definition a package nobody named: nothing in the file mentioned any of them, so there was nothing to read. Measured against fedora-bootc:43 with terra and varlad/yazi, the base list resolved to 142 packages and 199 MiB with recommends on, and 114 and 98 MiB with them off. helix is what recommends the C toolchain; helix and gopass between them recommend wl-clipboard, xsel, xdg-utils and libX11, none of which can run on a headless box. `helix-parsers` is the reason this is not a one-line change. It is also a recommend, 185 MiB of tree-sitter grammars, and it is what makes the editor highlight anything, so the flag alone would have shipped an editor that renders every file as plain text and said nothing about why. It is named explicitly now. Verified on the built client: 245 grammars on disk, and wl-clipboard, cliphist, Xwayland, sway and greetd all still present. Verified on the built server: gcc-c++, libstdc++-devel, xsel, xdg-utils, libX11 and man-pages absent, helix-parsers present. gcc, cpp, binutils and make are still there and that is correct: LANGS defaults to rust and is unconditional, so the C compiler is a language decision rather than a recommend, which is what the LANGS block already says. `fish` stays. gopass requires it outright, 39.3 MiB, and no flag touches a hard dependency. Written into the comment so the next person does not re-measure it. One method note, because the next person will reach for the same command and get the same wrong answer: `dnf repoquery --whatrequires <pkg>` lists every package in the distribution that requires it, not the ones in your own list. Read that way it says yazi pulls gcc, which is false. Resolving each package on its own is what answers the question. Also corrects the group comment above the list, which still said anything absent from Fedora and Terra is downloaded directly, naming the Nerd Fonts layer that no longer exists. Findings from the same pass are GoingsOn alloy problems 80ffb289 (the server carries both house faces with nothing able to draw them) and 3d41d15a (four fetches of the Atkinson bases per build).
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-17 16:28 UTC
Signed with PGP, not checked
Commit: 11291bd3e6f2770b93cfa0872041114bcf70f510
Parent: 8c3c4b4
1 file changed, +49 insertions, -3 deletions
M Containerfile +49 -3
@@ -747,8 +747,9 @@
747 747 # own comment. Add to it when something is required; add to the
748 748 # curated groups only with a STACK.md entry behind it.
749 749 #
750 - # Sources noted per group. Anything absent from both Fedora main and
751 - # Terra is downloaded directly (Nerd Fonts, in the layer above). The
750 + # Sources noted per group. Nothing is downloaded directly any more: the
751 + # fonts were the last of it and the image cuts its own now (the
752 + # `quasi-type` stage above, docs/STACK.md#fonts). The
752 753 # `flatpak` client is installed as the `sandboxed` level of the isolation
753 754 # dial, which is also how users pull on-demand apps from Flathub
754 755 # post-install; no Flatpaks are provisioned at build or first-boot
@@ -761,11 +762,56 @@
761 762 # question about the machine rather than about taste: a package is here
762 763 # if a headless box still has a use for it, and in the client block below
763 764 # if it needs a compositor, a screen, or a person sitting at one.
765 + #
766 + # WEAK DEPENDENCIES OFF, the same as the client block below, and it took a
767 + # measurement to notice they were on here. The lean profile was accepting
768 + # recommends while the fat one refused them, which is backwards, and the
769 + # asymmetry was invisible because a recommend is by definition a package
770 + # nobody named. Resolved 2026-08-17 against fedora-bootc:43 with terra and
771 + # varlad/yazi: this list pulled 142 packages and 199 MiB with recommends
772 + # on, and 114 packages and 98 MiB with them off.
773 + #
774 + # What the flag sheds is not incidental. helix recommends a C toolchain
775 + # (gcc, cpp, binutils, make, libstdc++-devel, gcc-c++), and helix and
776 + # gopass between them recommend wl-clipboard, xsel, xdg-utils and libX11.
777 + # On `server` not one of those can run: there is no compositor and no X.
778 + # On `client` the clipboard tools are named explicitly further down, so
779 + # nothing there loses them.
780 + #
781 + # Measured on the built images rather than predicted, because the
782 + # prediction was half wrong: gcc-c++, libstdc++-devel, xsel, xdg-utils,
783 + # libX11 and man-pages are gone from `server`, and gcc, cpp, binutils and
784 + # make are STILL THERE. `LANGS` defaults to rust and is unconditional, and
785 + # rust requires them, which the LANGS block further down says outright.
786 + # So the C compiler on a headless box is a language decision and not an
787 + # accident, and it is the LANGS default that would have to change to shed
788 + # it. The flag removes the C++ half and the X half; it does not remove the
789 + # toolchain.
790 + #
791 + # One recommend IS wanted and is now named below rather than inherited:
792 + # `helix-parsers`. It is 185 MiB of tree-sitter grammars and it is what
793 + # makes the editor highlight anything, so taking the flag without naming
794 + # it would have shipped an editor that renders every file as plain text
795 + # and said nothing about why. That is the trade the flag makes visible:
796 + # the answer is to name what is wanted, not to keep taking everything.
797 + #
798 + # NOT SUBTRACTABLE, stated so nobody re-measures it: `gopass` REQUIRES
799 + # `fish`, hard, 39.3 MiB, and it survives the flag. A second interactive
800 + # shell that nothing in the image runs, in both profiles, because Fedora's
801 + # spec requires the completions rather than recommending them. Either
802 + # gopass goes or the weight is accepted; it was chosen deliberately
803 + # (2026-07-30) so it stays until somebody decides otherwise.
764 804 # ---------------------------------------------------------------------
765 - RUN dnf install -y \
805 + RUN dnf install -y --setopt=install_weak_deps=False \
766 806 # Editor, shell, prompt. The terminal is not here: shop is built from
767 807 # source in the rust-build stage and copied in below.
808 + #
809 + # helix-parsers is the tree-sitter grammar set, named because the
810 + # line above turns recommends off and it arrived as one. Without it
811 + # helix opens every file unhighlighted, which is the quietest way
812 + # this image could get worse.
768 813 helix \
814 + helix-parsers \
769 815 nushell \
770 816 starship \
771 817 zoxide \