Get software
On a Frostyard image, the image owns /usr. It is read-only, and an update
replaces it. Add your software on top, with the tool that fits.
| You want | Use | Go to |
|---|---|---|
| A desktop app | Flatpak | Flatpak |
| A command-line tool | Homebrew | Homebrew |
A service, a daemon, or a tool that needs /usr or root |
A system extension | System extensions |
| A Debian package, or another distribution | Distrobox | Distrobox |
Do not install APT packages into /usr: an image update does not keep them.
Flatpak
Section titled “Flatpak”Use Flatpak for desktop apps. Snow, Snowfield, and Sundog include Flatpak and the Flathub remote. Floe has no Flatpak: use another tool on it.
Find and install an app:
flatpak search NAMEflatpak install flathub APP_IDCheck that it is there:
flatpak list --appThe app is in the list.
Flatpak apps do not update by themselves unless you turn that on. Update them
with flatpak update, ChairLift, Bazaar (Snow,
Snowfield), or Discover (Sundog). Bazaar and Discover each have an automatic
update setting, which is off by default.
- Snow, Snowfield, and Sundog carry Bazaar, an app store, in their core Flatpak set. Firn installs the set only if your install recipe includes it. On Sundog, the app store is Discover: Sundog turns off Bazaar’s background service.
- Frostyard’s own Flatpak remote has 3 apps: Igloo, Frostnotes, and Frostmail. Add it as a user remote. Each page has the steps. Their runtimes come from Flathub.
- A desktop app for frostread is planned. Frostnotes and Frostmail work on their own, without lodge. You opt into lodge for each app.
- Some desktop apps are system extensions in the catalog instead, for example Visual Studio Code and 1Password. See the catalog.
Homebrew
Section titled “Homebrew”Use Homebrew for command-line tools. Snow, Snowfield, Sundog, and Floe include
it. At first boot, brew-setup.service unpacks it into /var/home/linuxbrew.
The service runs only while /var/home/linuxbrew/.linuxbrew does not exist,
and it gives Homebrew to UID 1000. That is the first user you create.
Check that your shell finds it:
brew --versionYou see a version. If the shell says the command is not found, you are
probably in bash: fish loads Homebrew on its own. Add this line to
~/.bashrc, then open a new terminal:
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"Install a tool, then list what you have:
brew install NAMEbrew listHomebrew updates itself. brew update runs 10 minutes after boot, then about
every 6 hours. brew upgrade runs 30 minutes after boot, then about every 8
hours. On Snow, Snowfield, and Sundog, ChairLift updates Homebrew too.
The images ship Brewfile bundles of recommended tools:
- Snow and Snowfield:
/usr/share/snow/bundles/cli.Brewfileand/usr/share/snow/bundles/fonts.Brewfile. - Floe:
/usr/share/floe/bundles/cli.Brewfile.
Sundog has no bundle file.
Install one with brew bundle --file=PATH. On Snow and Snowfield, ChairLift
can also install curated bundles.
Frostyard’s Homebrew tap, frostyard/tap, has 2 casks: nsl and chairlift.
The nsl page uses it to install the nsl CLI.
System extensions
Section titled “System extensions”Use a system extension for a service, a daemon, or a tool that must be in
/usr or run as root. Docker, Incus, and Tailscale are examples. Every image
carries a definition for each extension in the catalog, switched off. The
extension itself is not in the image: Updex turns it on and downloads it.
An enabled extension updates on its own: a new version is staged and starts at the next boot. See Automatic updates.
Start with Manage extensions. The catalog lists every extension.
Distrobox
Section titled “Distrobox”Use Distrobox for a mutable Debian, or another distribution where apt works.
Snow, Snowfield, Sundog, and Floe ship Podman and Distrobox.
distrobox create --name NAME --image IMAGEdistrobox enter NAMEYou are now in the container, and its package manager works there. Read distrobox.it for the rest.
For a whole Linux machine, use nsl. Images are built from the Frostyard APT repository and update as a whole: you do not add it to an image.
Sources
Section titled “Sources”- Which tool for which software: core
docs/tenets.md, section “Delivery”, atcd2720e0c55d08f3ba8f28a3b55dd5796a5c425a. It prefersbrewoveraptfor user-space command-line tools, Flatpak for desktop software, and systemd-sysext for daemons and system services. It uses systemd-sysext for GUI tools only where a Flatpak is not possible or available. - Suite app delivery: core
docs/adr/0058-ship-suite-desktop-apps-as-flatpaks-and-services-as-sysexts.md(Status: Accepted, 2026-10-26). - Flathub remote: snosi
shared/snow/tree/etc/flatpak/remotes.d/flathub.flatpakrepoandshared/sundog/scripts/postinstall/sundog.postinst.chroot. - Flatpak, Podman, and Distrobox packages: snosi
shared/packages/snow/mkosi.conf,shared/packages/sundog/mkosi.conf, andshared/packages/floe/mkosi.conf. - Snowfield includes the Snow composition: snosi
mkosi.profiles/snowfield/mkosi.conf. - Core Flatpak sets: snosi
flatpaks/snow.jsonandflatpaks/sundog.json. - Frostyard Flatpak remote: flatpak-index
README.mdandapps.jsonat4828c9836d451aaa7376483737d25a764b4e17bd. - The per-user remote: Brian’s decisions T532a (2026-10-29) and T532b: every user adds the remote. A fresh Snow install has no
frostyardremote, user or system (Murbella’s check, T540). - Suite rule: core
docs/adr/0062-make-desktop-suite-apps-standalone-flatpaks-with-opt-in-lodge.md(Accepted 2026-10-27) at4d340b939fccab2ecb7f0be5dbf9e7ab7c03963c. - Homebrew in each image: snosi
shared/composition/snow/mkosi.conf,shared/composition/sundog/mkosi.conf,shared/composition/floe/mkosi.conf, andshared/scripts/build/brew.chroot. - Homebrew first-boot setup: snosi
shared/snow/tree/usr/lib/systemd/system/brew-setup.service. Floe and Sundog use the files undershared/floe/tree/. - Homebrew update timers: snosi
brew-update.timer,brew-update.service,brew-upgrade.timer,brew-upgrade.service, and01-homebrew.preset. - fish setup for Homebrew: snosi
ublue-brew.fish. - Brewfile bundles: snosi
shared/snow/tree/usr/share/snow/bundles/cli.Brewfile,fonts.Brewfile, andshared/floe/tree/usr/share/floe/bundles/cli.Brewfile, the bundle instructions inshared/snow/tree/usr/share/snow/bundles/README.txtandshared/floe/tree/usr/share/floe/bundles/README.txt, and Sundog’s removal of/usr/share/floeinsundog.postinst.chroot. - Frostyard Homebrew tap casks: homebrew-tap
Casks/. - Automatic sysext updates on by default: snosi
05-updex.presetand the section “Automatic sysext updates (updex-update.timer)” indocs/design/sysexts.md. - APT timers off in the image: snosi
00-apt.preset. - Flatpak commands: flatpak
doc/flatpak-search.xml,doc/flatpak-install.xml,doc/flatpak-list.xml(--app), anddoc/flatpak-update.xml. - Distrobox commands: distrobox
docs/usage/distrobox-create.md(--image,--name) anddocs/usage/distrobox-enter.md. - Extension definitions, each with
Enabled=false: snosimkosi.images/base/mkosi.extra/usr/lib/(sysupdate.<name>.d/<name>.feature), for exampledocker.feature. - ChairLift on Snow, Snowfield, and Sundog only:
frostyard-chairliftin snosishared/packages/snow/mkosi.confandshared/packages/sundog/mkosi.conf, not inshared/packages/floe/mkosi.conf. - Sundog turns off Bazaar’s service: snosi
shared/sundog/tree/usr/lib/systemd/user-preset/90-sundog.preset. - Bazaar automatic updates, default
false: bazaardata/io.github.kolunmi.Bazaar.gschema.xml(auto-update). - Discover automatic updates, default
false: discoverkcm/updatessettings.kcfg(UseUnattendedUpdates). - ChairLift bundles come from
/usr/share/snow/bundlesby default: chairliftCONFIG.md(bundles_paths). - Images are built from the APT repository and carry no Frostyard APT source: core ADR-0059 (accepted 2026-10-24), Context, at
28e7847; owner decision, Brian, 2026-10-24.