Packages (scraps)

scraps

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.

scraps system get / check / upgrade

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.

Building from source

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.

Undoing a transaction

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.

Reporting style

SCRAPS_STYLE in /etc/scraps/scraps.conf chooses the wording and layout. The resolver, downloads and progress are identical in all three.

scraplinuxthe default - :: headings, a line per dependency
aptDebian's shape
aerynAeryn OS's shape - a boxed, columnar transaction summary

Repositories

mainthe base system and the libraries it needs
basedesktops, X11, Wayland, and other larger stacks
extraapplications and general-purpose tools
kernelskernels, kernel headers, firmware
profilewhole-environment meta packages - a desktop, an audio stack, in one name
fixcorrections that no version change would carry
bigpackages past the mirror's file size limit: firmware, the toolchain
nonfree, alt-nonfree, multiliboff 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.

Signatures

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

Ephemeral shells

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.

Ports

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.

More: scraplinux linux docs · install · configuration · kernels & generations · networking, desktops & init · troubleshooting & reference