particle-os-modules/modules/soar/README.md
fiftydinar 23f020a5b3
feat: soar module (#413)
* feat: `soar` module

* fix(soar): Inverted `unlock-repos` logic

* chore(soar): Add `soar` to modules.json

* fix(soar): Logic for detecting if `unlock-repos` is disabled

* fix(docs): Wrong `/usr/` systemd path reference

* chore(soar): Add log for `unlock_repos`

* chore(soar): Add `finished=false` at the beggining of `soar` shell profile

* fix(soar): `/root` being `$HOME` in config

* fix(soar): Wrong `PATH`

I forgot to add `bin` directory

* docs(soar): Clarify that `PATH` needs to be exported only outside of standard config dir

* chore(soar): Unlock extra repos if `unlock-repos` is enabled

* docs(soar): Mention of external repos

* chore(soar): Simplify getting `XDG` directories

* chore(soar): Add removing config in uninstallation script

* chore(soar): Remove whole config directory instead of file in uninstallation script

* fix(soar): Missing quote in uninstallation script

* chore(soar): Make uninstallation script POSIX

* fix(soar): Bad syntax for `soar-upgrade-packages` service `exec`

It's `ExecStart`, not `Exec`.

* fix(soar): Set `auto-upgrade` timer as `--user` instead of `--system`

* chore(soar): Shorten the boot delay & randomize it for `auto-upgrades`

* chore(soar): Add `network-online.target` in `Wants` to systemd service for `auto-upgrades`

* chore(soar): Remove `upgrade-wait-after-boot`, as good defaults are set with no need for changing

* chore(soar): Add option for unlocking the `PATH` in all conditions

* chore(soar): Add `unlock-path` option to typespec

* docs(soar): Add `unlock-path` to `module.yml` example

* chore(soar): Remove condition for checking the `soar.sh` file

If another `soar` module overwrites the previous one, it should be able to overwrite `soar.sh` shell profile too with custom option if set.

* chore(soar): Remove `unlock-path`, as it's too dangerous

* chore(soar): Don't copy update timer & service if `auto-upgrade` is false

* chore(soar): Style fix

* chore(soar): Don't execute `upgrade` when soar is already running

* chore(soar): Use environment variable for `SOAR_CONFIG` to simplify things

* docs(sour): Fix typo

* chore(soar): Use native `soar` command for setting `bincache` repo only

* fix(soar): Make `soar` condition check for  auto-upgrades more reliable

* chore(soar): Some more improvements to auto-update condition check

False positive can happen if some text editor edits some file like `soar-something.txt` or similar.

This assures more that only executed binary is detected.

* chore(soar): Remove duplicate code for setting config

* docs(soar): Add full example of options in `module.yml`

* chore(soar): Rename `unlock-repos` to `additional-repos` & add docs about repo info

* chore(soar): Enable `pkforge-cargo` & `pkgforge-go` repos

* docs: rewordings, run through languagetool

* chore(soar): Add condition in shell profile to check if `soar` PATH already exists

* chore(soar): Disable redundant shellcheck SC2076 in shell profile

* docs: final reword

---------

Co-authored-by: xyny <git@xyny.anonaddy.me>
Co-authored-by: xyny <60004820+xynydev@users.noreply.github.com>
2025-07-26 14:10:21 +00:00

3.2 KiB

soar

The soar module installs & integrates the soar package manager as an alternative to Homebrew / Linuxbrew.

soar is a package manager, which manages the installation of portable & static binaries. PkgForge's bincache, pkgforge-cargo & pkgforge-go repos are used by default for the binaries. Other default & external repos that contain AppImages & other similar formats are disabled to make soar focused on CLI binaries only. This is configurable if you wish to have a package manager for GUI applications, see Configuration options.

The repositories with prebuilt binaries use the GitHub Container registry as their backend and all their packages are published there.

Compared to Homebrew / Linuxbrew:

  • there are no managed dependencies for packages by design (single package = single binary).
  • no conflicting system packages in the repo (like systemd, dbus or similar).
  • it's simpler in design, with respect for Linux folder structuring

For more information, please see the official documentation of soar.

Features

  • Downloads & installs soar.
  • Sets up systemd timer for auto-upgrading soar packages.
  • Sets up shell profile for automatically adding the directory containing soar binaries to PATH.

Repos

To see the useful information about source, reliability, trust & security of all soar repos, including external ones, you can open the links below:

Local modification

By default, soar utilizes BlueBuild's config (/usr/share/bluebuild/soar/config.toml).

End-users can use custom a soar configuration by creating it at ~/.config/soar/config.toml, or in a custom directory while making sure to supply it to soar by providing SOAR_CONFIG the environment variable in shell profile. If you specify the custom bin_path directory for soar packages, you also need to export that directory to PATH manually in the shell profile.

Uninstallation

Removing the soar module from the recipe is not enough to get it completely removed. On a booted system, it's also necessary to run the soar uninstallation script to uninstall config & installed packages in the ${HOME} directory.

Either a local-user can execute this script manually, or the image-maintainer may make it automatic through a custom systemd service.

Uninstallation script
#!/bin/sh
if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/soar/config.toml" ]; then
  echo "Removing soar config in '${XDG_CONFIG_HOME:-$HOME/.config}/soar/' directory"
  rm -r "${XDG_CONFIG_HOME:-$HOME/.config}/soar/"
else
  echo "'${XDG_CONFIG_HOME:-$HOME/.config}/soar/config.toml' file is already removed"
fi
if [ -d "${XDG_DATA_HOME:-$HOME/.local/share}/soar/" ]; then
  echo "Removing '${XDG_DATA_HOME:-$HOME/.local/share}/soar/' directory"
  rm -r "${XDG_DATA_HOME:-$HOME/.local/share}/soar/"
else
  echo "'${XDG_DATA_HOME:-$HOME/.local/share}/soar/' directory is already removed"
fi