| name | brew-lifecycle |
| version | 1.4 |
| last_updated | 2026-08-18 |
| id | brew-lifecycle |
| one_line_purpose | Manage OS-managed Homebrew packages and RPM/brew placement. |
| entry_point | docs/skills/brew-lifecycle/SKILL.md |
| category | ci-ops |
| mcp_compliance_level | partial |
| optimization_status | draft |
| status | active |
| dependencies | [] |
| tags | ["brew","homebrew","packages"] |
| description | Manage OS-managed Homebrew packages. Use when adding/removing default brew packages, moving tools between RPM and brew, or auditing image-vs-brew placement. |
| metadata | {"type":"procedure","context7-sources":["/bootc-dev/bootc","/homebrew/brew","/systemd/systemd"]} |
brew-lifecycle — Homebrew Package Lifecycle for Bluefin
How to add, remove, and manage system-default Homebrew packages across
the Bluefin factory. Covers the brew-preinstall service, the preinstall.d
pattern, and the rules for what can and cannot move to brew.
When to Use
- Adding or removing a package from
preinstall.d/system-cli.Brewfile
- Moving a self-contained CLI tool off the RPM image and into brew
- Adding or removing a tap (
trusted: true requirements, Brewfile syntax)
- Pinning architecture-specific checksums for a Linux cask
- Debugging a failed or skipped
brew-preinstall.service
- Deciding whether a new tool belongs on the image or in a Brewfile
- Auditing image diet (removing dead-weight packages from bluefin/lts/dakota)
When NOT to Use
- Installing system-level packages (udev rules, kernel modules, daemons, firmware): those stay on the image as RPMs regardless
rpm-ostree install is never the answer — see placement-rules.md
- Adding user-installed (opt-in) packages: those go in the opt-in Brewfiles (
cli.Brewfile, cncf.Brewfile, etc.), not preinstall.d/
Adding and removing packages — the exact steps
Add a package
- Add a
brew "<name>" line to
system_files/shared/usr/share/ublue-os/homebrew/preinstall.d/system-cli.Brewfile
- Open a PR. No version bumping, no manual trigger.
- On next login after the OS update, every user gets the package installed.
Remove a package
- Remove the
brew "<name>" line from the Brewfile.
- Open a PR.
- On next login after the OS update, users who got it through the managed set
get it uninstalled. Users who installed it themselves are unaffected.
Add or remove a cask
Use cask "<name>" in a managed Brewfile. The service installs casks through
the existing brew bundle pass, tracks them separately in the state file, and
uses brew uninstall --cask when a managed cask is removed.
The repository validator and lifecycle parser accept indentation and either
Ruby quote style:
cask
cask