make builder # build the Docker builder image (once)
make plasma # KDE Plasma image
make gnome # GNOME image
make base # console-only, no desktop
make server # headless server appliance (niri + wvkbd + alacritty)
make all # all fourRequires Docker on a host that can run --privileged containers with loop
device access. On x86_64 you additionally need qemu-user-static +
binfmt-support registered for aarch64.
docker run --rm --privileged \
-v "$(pwd)/images:/build/images" -v /dev:/dev \
archlinux-pipa-builder plasmaOutput lands in images/<name>.zip, containing silicium.img,
archlinux_esp.raw, archlinux_boot.raw, archlinux_rootfs.raw,
vbmeta.img, flash.sh, flash-multiboot.sh, BUILDINFO.txt,
SHA256SUMS — flash with ./flash.sh after extracting.
make server builds a fourth flavor: a clean, headless-appliance image with
none of plasma/gnome's desktop-environment footprint, and no pre-installed
workload software either — no ssh/Caddy/Forgejo/Immich/Rust/docker/etc.
It's a blank canvas; whatever you host on it, you install yourself. What it
does provide, out of the box:
- Compositor: niri, a scrollable-tiling Wayland compositor written in Rust. niri v25.08+ fixed the keymap it hands to clients specifically to make on-screen keyboards like wvkbd work correctly, so it's used instead of labwc.
- On-screen keyboard: wvkbd
(
deskintllayout), built from source at image-build time since it isn't packaged for Arch Linux ARM. It's anchored to the bottom of the screen with its default exclusive zone, so it stays visible permanently and niri automatically leaves the rest of the screen for everything else — no toggling required. - Terminal/shell: alacritty + fish, both auto-started.
- Zero-touch, fully passwordless boot: tty1 auto-logs in with no
password prompt at all,
sudois passwordless for the default user too (matches the same "no login required" intent), and a fish autostart hookexecs straight intoniri-session— by the time you can see the screen, alacritty and the keyboard are already up. This hook only fires for the real console login (tty1, non-SSH), so SSH sessions stay plain shells. - Networking: NetworkManager + bluetooth are enabled and unblocked via
rfkill at boot, same as every other flavor here, so wifi/BT come up
without any manual step. Use
nmtui(typeable via the on-screen keyboard) to join a network if there's no ethernet. - Screen scale: niri only supports scaling a specific named output
(e.g.
eDP-1), and the Pad 6 panel's actual connector name isn't knowable at build time, so a small helper script (/usr/local/bin/pipa-niri-set-scale) asks niri for whatever output it detected at each startup and scales that one — 1.7x by default. PIPA_INCLUDE_EXTRAS(box64/gamescope/wine-aarch64/widevine — Android/ gaming compat layers) defaults to0for this flavor specifically, since none of that belongs on a server; override withPIPA_INCLUDE_EXTRAS=1if you actually want it.
See PIPA_WVKBD_* and PIPA_SCREEN_SCALE below to customize it. A
dedicated CI workflow (.github/workflows/server-build.yml) builds and
releases this image independently of the plasma/gnome/base one.
| Variable | Default | Description |
|---|---|---|
PIPA_PKGS_REPO_URL |
https://thespider2.github.io/pipa-pkgs/repo/ |
Kernel/system package repo |
PIPA_ALARM_REPO_URL |
https://maakiopus.github.io/pipa-alarm/repo/ |
Extra-package repo |
PIPA_INCLUDE_SENSORS |
1 |
Set 0 to omit sensor packages |
PIPA_INCLUDE_EXTRAS |
1 |
Set 0 to skip box64/gamescope/wine-aarch64/etc |
PIPA_DEFAULT_USER |
pipa |
Username auto-created at build time (wheel/video/audio/input/storage groups) |
PIPA_DEFAULT_PASSWORD |
pipa |
Password for that user and root — change it after first boot |
PIPA_DEFAULT_HOSTNAME |
pipa |
Hostname baked into the image |
BUILD_GIT_REV |
unknown |
Stamped into BUILDINFO.txt |
Server-mode only (make server):
| Variable | Default | Description |
|---|---|---|
PIPA_WVKBD_REPO_URL |
https://github.com/jjsullivan5196/wvkbd.git |
wvkbd source repo |
PIPA_WVKBD_REV |
master |
git ref to build |
PIPA_WVKBD_LAYOUT |
deskintl |
deskintl or mobintl layout set |
PIPA_WVKBD_HEIGHT |
300 |
On-screen keyboard height in pixels |
PIPA_SCREEN_SCALE |
1.7 |
niri output scale factor, applied at runtime (see "Server image" above) |
If a package is stale or missing in both binary repos:
./scripts/build-from-source.sh box64
# or against a repo you've already cloned:
./scripts/build-from-source.sh linux-pipa /path/to/PKGBUILDs-pipaThis clones maakiopus/PKGBUILDs-pipa and runs makepkg -sf in the given
package directory. Needs to run on aarch64 (or under binfmt) since these
build ARM64 binaries/kernels.