ScrapLinux's package manager, written specifically for this
distribution. Binary packages are .scrapsz files - a plain
tar.xz archive holding a .PKGINFO metadata block, a
.FILES manifest, and the payload rooted at
/.
scraps add vim install
scraps rem vim remove
scraps rem -d vim remove, and anything only it needed as a dependency
scraps search editor search names and descriptions
scraps info vim what a package is, its version, its dependencies
scraps list everything currently installed
scraps files vim every file a package owns
scraps owns /usr/bin/vim which installed package owns a given file
scraps fetch all refresh the repository indexes over the network
scraps upgrade upgrade everything installed to the latest available
scraps system get the installed release, kernel and generation
scraps system check everything system upgrade would do - nothing applied
scraps system upgrade sync, upgrade packages and the kernel, apply pending
fixes, reconcile the declarative config files
Every add/rem updates
pkgs.conf's mirror automatically - see
configuration. There's no separate
declarative package list to keep in sync; plain scraps add
is the normal, correct way to manage packages.
Some corrections don't move a package version: a default that turned out to be harmful, a service file that was wrong, a script that failed on some machines. An upgrade can't carry those, since there's no newer version to upgrade to. The fix repository is where they live - an ordinary binary repository, so applying a fix is still an install and the system stays binary, with one extra file naming which correction rides in which package.
scraps system check bootloader only what might explain a machine that will not boot scraps system upgrade kernel scraps system upgrade major only the most serious fixes scraps system upgrade bugfix both fix levels, and none of the plain changes
Every pending fix is listed before anything installs, and applied
fixes are remembered, so one is offered once and never again.
scraps system upgrade runs scraplinux-rebuild
itself at the end, so a package upgrade and a config change converge
through one command.
Not every package has a binary built for it. When one doesn't, scraps offers to build it on the spot.
scraps add -s some-package build from the port, even when a binary also exists scraps build recipe build a specific recipe file into an .scrapsz directly
Recipes come from the ports tree, a separate host from the binary
mirror, reached through SCRAPS_PORTS - never one of the
repositories in /etc/scraps/repos.d.
scraps rollback undo the most recent transaction scraps rollback 20260815-111525 undo a specific one scraps log what has been done, and which transactions are on disk
On a btrfs root scraps also takes a filesystem snapshot before every transaction, catching anything a package's install script did on its own - separate from file-level rollback.
SCRAPS_STYLE in /etc/scraps/scraps.conf
chooses the wording and layout. The resolver, downloads and progress
are identical in all three.
scraplinux | the default - :: headings, a line per dependency |
apt | Debian's shape |
aeryn | Aeryn OS's shape - a boxed, columnar transaction summary |
main | the base system and the libraries it needs |
base | desktops, X11, Wayland, and other larger stacks |
extra | applications and general-purpose tools |
kernels | kernels, kernel headers, firmware |
profile | whole-environment meta packages - a desktop, an audio stack, in one name |
fix | corrections that no version change would carry |
big | packages past the mirror's file size limit: firmware, the toolchain |
nonfree, alt-nonfree, multilib | off by default; opt in explicitly |
Configured per repository in /etc/scraps/repos.d/*.repo:
name = main url = https://raw.githubusercontent.com/apiwo/scraplinux-pkgs/main/ALL/main enabled = yes priority = 10 sig = optional
Browse contents at scraplinux-pkgs and recipes at ports-scraplinux.apiwow.net.
Every index is signed with signify
- Ed25519, one line of public key, no GPG anywhere near the base
system. The public key arrives with scraplinux-base, in
/etc/scraps/keys, before the first fetch.
sig = required an index without a good signature is not used sig = optional checked when it can be, said out loud when it cannot (default) sig = off not checked at all
scraplinux-shell git tmux ripgrep a throwaway environment with those packages scraplinux-shell --network curl with network access scraplinux-shell --keep vim -- vim x build it, keep it after you exit scraplinux gc clean up the package cache and unused environments
Content-addressed by package set, so the same request reuses a
previous build instead of rebuilding it. Every invocation also sweeps
for an environment left mounted by a session that was killed outright
- unmounted, and removed unless it was built --keep.
Every package in the repositories is generated from a single line
in ports/manifest.tsv:
repo name version buildsys license depends makedepends url source desc
gen-ports.py turns each row into a recipe matched to
the declared build system. A package that needs something the
template can't express gets a hand-written recipe with a
recipe.local marker beside it, which stops the next
manifest-driven regeneration from overwriting the hand work.
Package and recipe changes go to
scraplinux-ports,
not the main scraplinux repository.