Skip to content

What is in the image, and what should not be

An inventory of the packages in the PortareOS image, from the package definitions and checked against a device running build 20260925 (d3fa9894): the binaries, libraries and services present, their sizes, and who links what. Sizes are as installed: /usr/lib 732 MB, /usr/share 457 MB, /usr/bin 220 MB, about 1.4 GB in all. Each package is in one of three lists: essential, candidate for removal, questionable.

The rule this applies is the README's: if it is not needed for a smooth game, it is not in the image.

Essential

Package Why
linux 7.2.11, linux-firmware, busybox, systemd, util-linux, coreutils, bash, kmod, udev The base.
mesa (turnip, freedreno; libgallium 21 MB), vulkan-loader, libdrm, libglvnd The display.
pipewire, wireplumber, alsa-lib, alsa-ucm-conf, alsa-topology-conf Audio; the 32 / 44.1 / 48 kHz link runs through it.
iwd, portnet, wireless-regdb, openssh, rsync, bluez Wi-Fi, SSH, controllers. iwd does the 802.11 and the addressing; portnet is the command that drives it.
retroarch, core-info, slang-shaders (trimmed, see below), the 15 cores (193 MB) The systems.
xemu-sa (19 MB), armsx2-lr, scummvm-lr, ppsspp-lr, mpv, ffmpeg, libplacebo, luajit The standalone systems and the three large cores; mpv's Lua runs our seek script.
portarelauncher, portareos, system-utils, quirks, autostart, powerstate, sleep, inputplumber (10 MB) Our own stack; inputplumber is the gamepad.
steam, gamescope, xwayland, seatd, fex-emu, pressure-vessel, the X11 libraries The one compositor exception, about 35 MB on the image; the runtime lives on /storage.
retroarch-assets (33 MB) RetroArch's own menu needs its assets. Trimmable to one menu driver's.
e2fsprogs, dosfstools, exfatprogs, parted, udevil, umtprd Cards, drives, USB file transfer.
dbus, glib, openssl, gnutls, curl, wget, jq, xmlstarlet What the scripts use.

Candidates for removal

Package MB Why
kernel-overlays 59 Not what it looked like: 16 MB of modules, the rest the Nova's own firmware, already trimmed to this device's DSP, GPU, Wi-Fi and Bluetooth blobs. Nothing worth cutting.
slang-shaders — trim, not drop 70 → ~10 We use crt/crt-guest-advanced, handheld/lcd-grid-v2 and our own portare/. Keep those families and what they include; drop the other 60 MB.
renderdoc, apitrace (with glretrace, eglretrace), gdb, gdbserver, perf, vulkan-tools, glslc, binutils (strings, readelf), v4l-utils, edid-decode, cec-ctl, plplay, gltrim, wflinfo ~55 Debugging and GPU tracing tools, in a release image. DEBUG_PACKAGES is off, so they arrive as somebody's dependency; find whose.
The sqlite3 CLI, nano and dialog, bluez's btmon ~1 Duplicates and unused command-line tools.
iwd_get-networks, ukify, spit – Leftover scripts.

Questionable: replace, or reconsider

Package MB The question
python3 with pyudev, six, pyyaml, setuptools 34 Real users: portareos-bluetooth-agent, the pairing agent that runs as a service, and Steam's steamdeps. Rewrite the agent in C against bluez's D-Bus API, or as a bluetoothctl script, and Python goes.
mangohud, mangoapp 12 A performance overlay: handy for development, an anti-feature for a player. gamescope runs without it.
scummvm-lr 77 ScummVM as the libretro core, with the standalone's engines less ten that want a keyboard or carry nothing playable here. Every engine in the tree would be 120.
fbneo core 76 The largest core: every arcade driver. Fine for as long as arcade is a system.
umtprd (MTP) beside the USB network gadget – Two USB file-transfer paths where one would do.
libtirpc, heimdal, rpcbind 0 Checked on the device: libtirpc and heimdal are not on the image at all and rpcbind is a stray systemd target with no binary. The ~10 MB this row used to claim is not there to reclaim.

Services that start at boot and deserve a look

batteryledstatus (idle unless led.color=battery), debug-shell, debugconfig. input runs portsense, which replaced a shell script that ran an evtest per device.

Removed

Done in #334, from the lists above:

Package MB How
retropie-shaders (the /usr/share/common-shaders tree), the common-shaders and glsl-shaders lines for other boards 22 out of virtual/emulators
gtk3, with gdk-pixbuf, atk, at-spi2-core, pango and their tools ~12 xemu-sa listed gtk3 and atk for a display backend it does not use; libdecor built its GTK plugin. Both dropped, and the chain fell away.
espeak 1 PKG_SOUND emptied
entware 1 out of virtual/image, with the /opt link
btop 1 BTOP_TOOL gone from the options; htop stays
xorg-launch-helper, its xorg.service, xrandr 1 xwayland listed the helper, glew the CLI; neither needed them
the 310 .info files of cores we do not ship 1 core-info installs the fifteen we have, under their own names: Saturn's was mednafen_saturn, as the core file was, which the old rename to beetle_ had broken; it is ymir now

Done in #351:

Package MB How
rust, rustc-snapshot, rust-std-snapshot, cargo, cargo-snapshot, cbindgen, bindgen-cli 0 never in an image and no package built with them: Mesa has rusticl off and there is no NVK on an Adreno. Out of both trees with their update scripts.
libbluray, libaacs, libbdplus, libudfread, libdvdcss, libdvdread, libdvdnav, rtmpdump, zvbi, aom, libdvbpsi 0 no dependents anywhere; never built
libva, intel-vaapi-driver, media-driver, gmmlib, nvidia-vaapi-driver, nv-codec-headers, libva-utils, vadumpcaps 0 x86 and NVIDIA only; ffmpeg and mesa lose the VA-API branch that could not fire
rkmpp 0 Rockchip only; ffmpeg loses its RK* case
the root ffmpeg folder 0 shadowed by the project's package and never read

gmu has gone: it was a second audio stack - SDL2, mpg123, vorbis, flac, opus - for the one job mpv already did through ffmpeg. PORTAMP is that mpv with a spectrum analyser for a picture and a player drawn around it, and adds no package. The GStreamer plugins, libmpeg2 and x264 stay, kept in reserve for playback; nothing links them today.

Done in #347:

Package MB How
libretro-database, all but our systems 95 the package copies the cheat folders of the systems we build, 77 MB, instead of all 172
tailscale, zerotier-one 28 out of the network metapackage and the options
retroarch-overlays and its overlay mount 13 out of the RetroArch set; RetroArch's overlay directory is ~/overlays, for anyone's own
plplay 0 libplacebo's demo player, not built
usb-modeswitch 1 out of the image
bluez's meshctl and mesh-cfgclient 1 bluez built without mesh
apitrace, renderdoc, nvtop, memtester, valgrind, kmsxx, libva-utils 0 never in an image: the debug set is off for official builds, which the nightlies are. The set is gdb, strace, vblank-rate and pcm-flags now, 12 MB, in unofficial builds only.
v4l-utils 3 already gone from fresh builds since IR remote support went off (#422373c); the image on the device predates that

Done in #335:

Package MB How
scummvm as a standalone, fluidsynth and its service ~10 ScummVM is the libretro core now, with FluidLite inside it for MIDI; the soundfont stays. The standalone's 76 MB is replaced by the core's 77, with ten engines fewer. The saving is fluidsynth and the service.
qt6, and the CI job that built it ~60 ARMSX2 is built as upstream's SDL frontend, armsx2-sdl: VK_KHR_display to the panel, FullscreenUI for the menus, no window. Tested on the Nova before the switch. FEXConfig, a Qt desktop dialog, is not built.

Done in #429:

Package MB How
mkcontroller and its autostart 0 wrote 27 DEVICE_BTN_* variables nothing reads. control-gen stopped printing a DEVICE line, so the GUID was empty and every value came out blank; the only consumer anywhere is a template for standalone Mednafen, which is not installed.
six AYANEO and Thor inputplumber configs 0 other handhelds' input maps in a one-device tree. The Nova's was the file named 02-ayn-controller.yaml.

Done in #701: 253 recipes no stage of the build reaches - toolchain, base, either emulator stage, image or kernel. genbuildplan.py plans every stage at ae8b932a05 step for step the same without them. The image loses only the installer's entry in modules, which pointed at a script it never shipped.

Package MB How
docker, moby, cli, containerd, runc, tini, docker-compose, ctop 0 CONTAINER_SUPPORT gone, with the Kodi-era docker addon template
nfs-utils, rpcbind, libnfs 0 NFS_SUPPORT gone; the kernel keeps CONFIG_NFS_FS off as before
openvpn, zerotier-one, tailscale 0 OPENVPN_SUPPORT and ZEROTIER_SUPPORT gone
lirc, libirman, eventlircd, ir-bpf-decoders, evrepeat, v4l-utils 0 REMOTE_SUPPORT, which nothing read any more
installer, oem, testing, driverselect, device-tree-overlays, tm16xx-display 0 their switches gone, and the modules entry that ran the installer
xorg-server, the xf86-video and xf86-input drivers, fluxbox, the X core fonts, xcb-util 0 the image runs Wayland; xwayland stays
u-boot, atf, crust, rkbin, syslinux, grub, the Amlogic, Exynos and Raspberry Pi boot blobs 0 the Nova boots through qcom-abl
gcc-aarch64, gcc-arm-none-eabi, gcc-bpf, gcc-or1k, the Linaro compilers, their binutils, go 0 cross compilers nothing builds with
mold 0 out of the linker choice with MOLD_SUPPORT
gstreamer and its plugins, libmpeg2, x264, x265 0 the reserve #351 kept; nothing asked for it since
the rest 0 other boards' drivers (librga, generic-dsi, RTW88, nvidia), benchmarks and tracers (glmark2, vkmark, apitrace, renderdoc, valgrind), mesa's panfrost host build with libclc, libraries nothing links and Python build tools nothing builds with

quilt stays: tools/refresh-patches builds it on demand. Twelve license texts went with the recipes that were the only ones to declare them.

The sum

Still on the table: slang-shaders ~60 + Python 34: about 95 MB, without touching a supported system. Locales, gconv, p7zip and btrfs-progs came out for about 31 MB; see "Trimmed in place" below. About 250 MB is out already (above); gdb, strace, vblank-rate and pcm-flags, 12 MB, come only with an unofficial build.

Method

Package set: a walk of PKG_DEPENDS_TARGET from virtual/image through packages/ (then also projects/PortareOS/packages/, project overrides winning, before the two trees were folded into one), conditionals included. Ground truth: on the device, ls -S /usr/bin, du -sm over /usr/lib and /usr/share, ldd over every binary in /usr/bin to see who links GTK, GStreamer, Python, Qt and X11, the systemd unit list, and command -v for the tools in question.

Trimmed in place

Not removals of a package, but of what a package installs.

What Was Now Kept
gconv 19.2 MB, 257 modules 1.2 MB, 13 Latin-1 and -15, UTF-16/32, the Japanese encodings and libJIS. UTF-8 is inside glibc and needs no module.
i18n/locales 12.1 MB, 369 4.1 MB, 19 en_US and ja_JP, and the closure of what they copy and include - mostly iso14651_t1_common at 3.2 MB, which collation needs.
p7zip 5.0 MB, 3 binaries 1.1 MB, 1 7za, the standalone one. 7z needed 7z.so and Codecs behind it; 7zr read only .7z. Nothing on the image called any of them.
btrfs-progs 1.6 MB gone CONFIG_BTRFS_FS is off with it, asserted =n in kernel_options, so the device declines such a card rather than mounting one it cannot check.
btrfs and ntfs kernel drivers - gone Asserted =n in kernel_options. Neither filesystem has a checker on the image any more - ntfs-3g went in #403 - so a card formatted either way is declined rather than mounted unrepairable. Cards arrive FAT32 or exFAT; internal storage is ext4.