PortareOS is a personal fork of ROCKNIX, for the Retroid Pocket Nova and nothing else.
Home: os.portare.org
ROCKNIX is an immutable Linux distribution for handheld gaming devices, developed by a community of enthusiasts, and is itself a fork of JELOS. Nearly all of the work that makes this project possible is theirs. PortareOS adds a layer of device-specific tuning on top and removes everything that is not the Nova.
The Nova has a 1280x960 (4:3) 120Hz panel and sits alongside the Retroid Pocket 6 in ROCKNIX's SM8550 platform, sharing its device tree and its emulator configuration. That sharing is sensible upstream, since they are the same SoC, but it means a number of defaults written for the RP6's 1920x1080 16:9 display land unexamined on the Nova.
This fork exists to correct that, and to carry Nova-specific work that would not make sense upstream:
- Panel and display tuning for 1280x960, covering render resolutions and integer scaling for the systems whose native height divides cleanly into 960.
- Deep suspend enabled for the Nova.
- microSD at UHS-I SDR104 rather than legacy High Speed.
- Input latency work across the gamepad, compositor and emulator frame queue.
sched_extwithscx_lavd, the latency-aware scheduler, for frame pacing across the Nova's big.LITTLE layout.
Several of the kernel patches behind those come from pocknix-os rather than from this fork. See Credits.
Where this is going next is in ROADMAP.md.
This fork has diverged deliberately and does not track upstream closely.
Everything that is not SM8550 has been removed from the tree: the other twelve device projects, the per-device configuration, patches and hardware quirks that packages carried for every other handheld, the weston compositor path, the nine non-ROCKNIX hardware projects inherited from the LibreELEC lineage, the LEIoT and LibreELEC distributions, Kodi, and the unbuilt addon set. Two things are deliberately still there: case ${DEVICE} branches inside recipes shared with upstream, because they are inert with only one device and editing them would conflict on every import, and the other SM8550 device trees, which are tracked in #9. The in-tree identifiers are renamed to PortareOS, and emulationstation-next is built from a fork rather than from ROCKNIX's copy.
The practical consequence is that merging from upstream now takes real work, and that is an accepted trade. Individual fixes here may still be worth offering upstream on their own; the tree as a whole is not.
Sources are still fetched from ROCKNIX's distribution-sources mirror, and several components are still built from ROCKNIX's repositories. Those are dependencies, not branding, and they keep their names.
Please do not raise PortareOS problems with the ROCKNIX maintainers. For the upstream project, its community and its documentation, go to rocknix.org and the ROCKNIX Discord.
Beyond the device tree, the parts of the stack this fork has actually rewritten or thrown out.
Pulse is banned. There is no pulseaudio recipe left in the tree, nothing links
libpulse, no pulse daemon is built, and a check in validate-pull-request.yml
fails the build if any of it comes back.
Everything reaches PipeWire, though not all by the same road, because that is decided by what each upstream project supports:
| reaches PipeWire via | |
|---|---|
| EmulationStation | libpipewire, native |
| RetroArch, FluidSynth, OpenAL Soft | their own PipeWire backends |
| Flycast, ares, ARMSX2, RPCS3 | SDL2 / SDL3, built with the PipeWire driver and PulseAudio off |
| Dolphin | alsa-lib's pcm_pipewire, in process |
The one deliberate exception is pipewire-pulse, which stays enabled. Steam and
the games it runs carry their own libpulse in the Steam runtime and cannot be
recompiled, so something has to answer them.
The latency floor came down with it. default.clock.min-quantum and the
pulse-compat minimums are pinned at 256 frames, 5.3ms at 48kHz, against the 960
frames (20ms) this fork inherited.
emulationstation-next is
built from a fork. VolumeControl was ALSA and PulseAudio side by side, wrapped
in __APPLE__ and WIN32 branches for platforms this will never run on. It is
now one native libpipewire implementation that binds the default sink through
the registry and sets channelVolumes directly.
Video playback moved from VLC to libmpv's software render API, and the gettext translation layer is gone.
VLC, sndio, libao, m8c and pulseaudio are all out of the image. So are ten standalone emulators: aethersx2, cemu, drastic, daedalusx64, bigpemu, touchhle, skyemu, nanoboyadvance, hatari and vita3k, dropped for being duplicates of something already here, 16:9 only, or simply not wanted. Twenty five remain.
That is on top of the device and distribution removals described above.
The device still drains battery while suspended, and coming back is slower than it should be. It should be instant. That is the next thing to take apart.
Inherited from ROCKNIX:
- Integrated cross-device local and remote network play.
- In-game touch support.
- Fine grain control for battery life or performance.
- Support for playing music and video.
- Bluetooth audio and controller support.
- Support for HDMI audio and video out, and USB audio.
- Device to device and device to cloud sync with Syncthing and rclone.
- VPN support with Wireguard, Tailscale, and ZeroTier.
- Built-in support for scraping and retroachievements.
make docker-SM8550
Images are written to target/. The build wants a container runtime, roughly 100 GB of disk and several hours the first time through.
Two options worth knowing about:
- The Build workflow takes an
incrementalinput. Off, it builds everything, which is what scheduled and release builds always do. On, it restores per-stage state and skips packages whose recipes have not changed. .github/scripts/check-package-deps.pychecks that every package named in aPKG_DEPENDS_*line exists, resolving variable-driven lists such asPKG_EMUSandLIBRETRO_CORES. It runs early in CI so a missing package fails in seconds rather than part-way through a build.
PortareOS uses its own boot partition label, so the first image must be written to the card as a fresh install. An in-place update over an existing ROCKNIX installation will not find its boot partition. Updates between PortareOS builds work normally.
Installation steps are at os.portare.org.
PortareOS is a fork of ROCKNIX, which is a fork of JELOS. All licenses apply, and credit belongs to the ROCKNIX and JELOS teams.
ROCKNIX branding and images are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
You are free to:
- Share: copy and redistribute the material in any medium or format
- Adapt: remix, transform, and build upon the material
Under the following terms:
- Attribution: You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
- NonCommercial: You may not use the material for commercial purposes.
- ShareAlike: If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
Copyright (C) 2024-present ROCKNIX
Original software and scripts developed by the ROCKNIX team are licensed under the terms of the GNU GPL Version 2. The full license can be found in this project's licenses folder.
All other software is provided under each component's respective license. These licenses can be found in the software sources or in this project's licenses folder. Modifications to bundled software and scripts by the ROCKNIX and JELOS teams are licensed under the terms of the software being modified.
Like any Linux distribution, this project is not the work of one person. It is the work of many people all over the world who have developed the open source bits without which this project could not exist. Special thanks to ROCKNIX, JELOS, CoreELEC, LibreELEC, and to developers and contributors across the open source community.
A number of the SM8550 kernel patches carried here were taken from pocknix-os by shuuri-labs, either unchanged or with only the rebasing needed to fit this tree. Authorship is preserved in each patch header; the work is theirs, and any mistakes in adapting it are mine.
| Patch | What it does |
|---|---|
0210, 0211, 0212 |
microSD at UHS-I SDR104 via the downstream sdhci-msm driver, plus the sdhc_2 rebind in the RP6 device tree. Originally from Armbian PR #9546 (Alex Ling). |
1012 |
rsinput MCU version handshake on init, so the gamepad survives an unlucky resume (jaewun). |
1021 |
Expose only the 120Hz mode on the RP6 panel (pocknix). 1022 is this fork's port of it to the Nova panel. |
1050 |
edt,retain-power-in-suspend option for edt-ft5x06 (jaewun). |
1051 |
Lowest A740 GPU operating point, 124.8 MHz (Thorch contributors). |
