Repository navigation
ArchR Linux 3.0
[Action Required] Reflash and copy your saves first: see Upgrading.
Version 1.0 was the start: an attempt to build an operating system for these handhelds from scratch, in a space already full of mature systems. Version 2.0 came after studying ROCKNIX closely, and that is when we began to understand how a well-established distribution is put together. 3.0 is where Arch R starts being its own system. EmulationStation is gone and a launcher written for these devices replaces it. ROMs now sit on a partition any computer can read, and most of the plumbing underneath was rewritten and tested on real hardware.
This release needs a new image. Read Upgrading before you flash: the card layout changed, and the backup made by 2.1.1 does not include your saves.
Highlights
- archr-launcher replaces EmulationStation. Written in Rust with SDL2 for 640x480 screens. It covers games, settings, updates, scraping, netplay, RetroAchievements, Moonlight, themes and modules, and nothing in the system depends on EmulationStation any more.
- ROMs on an exFAT partition. On a new card, the first boot creates
ARCHR_ROMS, which Windows, macOS and Linux open as a normal drive (#37). - Save and exit, switcher and resume. A tap on FN saves the running game and opens a switcher; games can resume at power on; a critical battery saves the game before powering off.
- Saves in the backup. The on-device backup now includes saves, save states and saves kept inside system images, and a restore never overwrites a save newer than the backup's copy.
- N64 at full speed by default on the RK3326 with standalone Mupen64Plus and GLideN64's performance profile.
- Linux 6.12.114 with kernel fixes adapted from ROCKNIX, and a faster boot.
- Volume no longer starts at 100% after boot (#39), and the R36S Clone speaker comes back after unplugging headphones (#35).
New
Launcher
- Systems list and a Showcase carousel view, both described by the theme. Game list with cover art, details (year, players, last played) and an optional muted preview video.
- Start menu hub: recent games, all games, tools, quick buttons (settings, updates, Wi-Fi, sleep, restart, power off) and module widgets.
- Settings for everything EmulationStation used to cover, plus new pages: Network (Wi-Fi list with signal and lock, hidden networks, Bluetooth, USB adapters), Network services (SSH, root password, Samba, HTTP server, netplay, USB function), Sound and display, Controls, Games, Region and language, Appearance, Achievements, Storage and System, plus a System information page.
- Per-system emulator and core, aspect ratio, image filter, autosave, state slot and MangoHud settings. The launcher only imposes options you choose in it; what you save inside RetroArch now stays (see Fixed).
- Saves and screenshots in each game's menu: start a game from a save state, delete states and captures, and convert cartridge saves when you switch emulators (N64, NDS and PlayStation covered by tests with real saves).
- BIOS check per system, with Install free BIOS for PlayStation (OpenBIOS from PCSX-Redux) and MSX (C-BIOS). Proprietary BIOS files are never downloaded.
- RetroAchievements sign-in by token (the password is never stored), hardcore and encore, per-game achievement list. ScreenScraper scraping with media choice. Netplay lobby with relay servers. Moonlight game streaming with PIN pairing.
- Languages: English, Brazilian Portuguese, Spanish and Russian.
- System updates page: packages with size, channel (Stable, Next, Dev), download and install as a separate unit that survives a launcher restart. Sleep and power keys are blocked while packages install.
- Volume and brightness pill (archr-osd). Held buttons speed up, levels follow perceptual curves, and settings sliders apply as you move them.
Themes
- Themes can change colors, fonts, icons, console pictures and sounds, and also where everything sits on the systems and games screens. Settings pages only take colors, fonts and icons from the theme.
- Default theme Grafite. Praia (pixel-art beach with chiptune sounds) and Retro (pixel-art arcade/CRT) are published separately.
- Theme store inside the launcher, custom accent color, font, text size and animations under Appearance.
- Guide:
docs/temas.mdin the launcher repository and the Themes page on arch-r.io.
Modules
- External programs that add Start widgets, menu items, settings pages and event handlers. The launcher draws everything; a module never draws pixels, reads the gamepad or runs as root.
- Each module runs as its own user, cannot see
/storageor the network unless it asks for that permission, and can never reach the device's own addresses. - Module store with a signed list of reviewed modules and automatic updates. API versions 1, 2 and 3.
- Published modules: Detailed battery (charge, power, voltage, health) and CPU profile (suggests a governor per system). Automatic CPU tuning (API 3) learns the lowest CPU ceiling each game needs.
ROMs readable on a PC (exFAT)
- On a new card with room for it, the first boot stops
STORAGEat 8 GiB and creates partition 4,ARCHR_ROMS(exFAT), with the rest of the card, mounted on/storage/roms. ROMs, saves next to them, save states, BIOS and screenshots all live there. - A card without room for at least 2 GiB of ROMs after that keeps the old layout (ROMs on ext4).
- exFAT has no journal, so the system checks a volume left dirty with
fsck.exfatbefore mounting it, mounts it read-only if errors remain, and syncs after every game. The launcher warns in the list footer while the partition is read-only. - Cards made before 3.0 can be converted on the device: Settings › Storage › ROMs on the PC (see Upgrading).
Switcher, resume and battery guard
- Tap FN (a press and release with nothing in between) to save the running game and open the switcher. FN is in no emulator's mapping, so it does not collide with any hotkey.
- RetroArch saves its automatic state; Mupen64Plus saves to slot 9 and goes back to your slot; DuckStation writes its resume state. Emulators that cannot save a state from outside stay open and the overlay says so. Your own save slots are never touched.
- Optional resume of the last game at power on (Games › Resume and switch).
- Battery guard: a warning at 10%; at 3% (two readings in a row) a countdown card, then the game is saved and the device powers off. Plugging a charger cancels it.
- A game left in sleep is saved before the automatic power off.
Backup and restore
- The default backup includes settings, themes, launcher data, saves (including those next to the ROMs),
roms/savestates, the DSi NAND (DSiWare saves), Flycast's writable flash, GameCube memory cards and Dolphin GCI folders, and Wii disc saves. ROMs and BIOS files stay out. - Saved Wi-Fi passwords are left out unless you ask for them.
- Restore is transactional: each archive is checked (paths, sha256 manifest, CRC) before anything is touched, files are staged and swapped in by rename, and any failure or interruption rolls everything back. A save on the device that is newer than the backup's copy is kept, and the backup's copy is placed next to it with a
.backup-<date>suffix. - Older backups still restore.
Shortcuts and diagnostic report
- In-game shortcuts (exit, screenshot, MangoHud, volume, brightness) are configurable under Controls › In-game shortcuts.
- Hold FN + L1 + R1 for 3 seconds anywhere, even in a game or with a frozen launcher, to save a diagnostic report to
roms/relatorios, visible from a PC. It is also under System › Diagnostics. Passwords, tokens, keys and similar values are removed before anything is written.hotkey.report.enabled=0turns the shortcut off. - Debug mode (verbose logs and a persistent journal) under System › Diagnostics.
- Screenshots work inside RetroArch too and are named after the game, so they show up in its menu.
- Inactivity sleep, separately for the menu and for games.
Network, Wi-Fi and USB
- Internet from your PC over the USB cable (Windows connection sharing, NetworkManager "shared", macOS Internet Sharing), with a Windows 10 compatibility switch (RNDIS). Ideas from raoni07/OTG-Over-Windows and ctgl1987/arkos-usb-network-mode; independent implementation.
- USB Wi-Fi and Bluetooth adapter advisor: plug a dongle and the launcher tells you whether it works, based on the driver that actually bound and the firmware that loaded.
- New driver for RTL8733BU dongles (0bda:b733). Firmware added for mt7663u, mwifiex_usb, libertas_tf_usb and ath6kl_usb adapters, whose drivers were in the image without it.
- Tenda AIC8800DC dongles (2604:0013) now work, on 2.4 GHz (the adapter has no 5 GHz radio). AIC8800 driver tree from AveyondFly, firmware from Tenda's official 1.0.1.10 package.
- RTL8851BU driver validated in the field replaces the untested RTL8831 tree. iwd 3.12, wireless-regdb 2026.05.30.
- Second microSD card: listed next to the first in the library, or merged with it into one library (Unified storage, mergerfs). Eject from Settings › Storage.
- SSH host keys persist across boots (PR #48 by K4zoku).
Under the hood
- Standalone emulators carry the
-archsuffix: mupen64plus-arch, drastic-arch, ppsspp-arch, yabasanshiro-arch, gzdoom-arch. Saved emulator choices move to the new names automatically. - The pacman database is seeded from the image's own package list, so an updated device never looks current when it is not. Package versions of git-pinned packages always go up, and run-time dependencies are declared.
- Kernel: TEO cpuidle governor built in, CMA reserve cut from 96 to 32 MiB (64 MiB back to the system), joypads polled on a high-priority workqueue, KSM off, watermark boost off. Kernel image 22.4 MB to 19.3 MB.
- Mesa 26.2.5.
- A ramoops overlay is prepared (not applied) so crashes can leave a record.
Fixed
Fixes for #35, #38, #39, #40, #43 and #46 are included. Those issues stay open until the people who reported them confirm the fix on their own hardware.
Audio
- Volume came up at full level after boot until the first button press: the saved level was sent before the sound card's output existed. It is now re-applied whenever an output appears, sets both channels and reconnects by itself if the audio server restarts (#39).
- R36S Clone: the speaker went silent after unplugging headphones, because the clone profile switched the codec to an unwired output. The speaker path now follows the sound card the overlay enables (#35).
- R36S, R33S and similar boards: the speaker went silent whenever the audio profile re-enabled the Speaker device (a profile switch, the sink recreated, headphones unplugged). The profile now follows each board's wiring.
- Headphone switching recorded a route the mixer had refused, so the setting and the real output disagreed.
hp_detpull-down was never applied to the rk817 sound card (#46, #35).- An audio client could hang for 30 s after the audio server restarted (PipeWire pulse socket mismatch).
Controls
- A/B swapped and Start/Select/D-pad mixed up in RetroArch on GO-Super / Soysauce pads, caused by a colliding upstream autoconfig and a mirrored SDL mapping (#40).
- Right analog stick with limited travel to the right on eeclone boards; stick tuning raised to 300/350 (#43).
- RetroArch hotkeys were rewritten before every game, so hotkeys and binds changed in RetroArch never lasted. They are now written once from the built-in pad, never from a USB pad that happened to be js0.
- PlayStation cores got a digital pad that ignored the sticks (Ape Escape refused to start). A DualShock is now plugged into PCSX-ReARMed and SwanStation.
- DuckStation: the quit hotkey killed nothing; port 1's pad type was read from an ignored section.
- PPSSPP: Select+Start did not quit.
- DraStic: its menu was on FN; it is now on L3, where dArkOS, dArkOSen, ArkOS and AmberELEC put it.
- Atari 800/XL games got the 5200 joystick.
- Plugging or unplugging a USB pad restarted the input service, dropping held buttons and briefly ignoring the power button.
- Device selector: a Soysauce user could switch away and never back.
Emulators
- N64: the standalone emulator never opened zipped ROMs; Mario Kart 64 lost its title screen and item icons with glide64mk2 (now GLideN64, performance profile); R36S hotkeys and a stick deadzone for Mupen64Plus.
- PPSSPP: auto frame skip had stopped skipping, so God of War ran at 15 fps; the vsync setting went to a key PPSSPP never reads; packages from the updater crashed PPSSPP on launch (unfilled placeholders).
- Flycast and PPSSPP crashed at start with MangoHud on.
- Flycast lost its BIOS on exFAT (it relied on a symbolic link).
- RetroArch settings the user never chose (integer scale off, fixed ratios, bezels, rewind off) were forced on every game, and unset options were reset to RetroArch's defaults each launch. Removed; your own RetroArch settings and overrides now win.
- melonDS DS: R2 now cycles through five screen layouts.
- Snes9x 2002, 2005 Plus and 2010 no longer offer achievements, which RetroAchievements does not support on them.
get_settingbroke on ROM names with[ ] + . *or/.
Wi-Fi
wifictlreported a failure while iwd had already connected (it never found iwd under BusyBox).- Networks whose name contains a dot or a space could never be connected (wrong iwd profile name).
- Hidden networks could not be joined; connecting now uses a directed probe.
- An open network was offered the saved password of another network.
- USB dongles timed out as "wrong password" on WPA2 (control port setting) and hung on WPA2/WPA3 transition networks (#19).
- In-kernel drivers raced the vendor drivers for the same dongles; the Edimax EW-7811Un with an RTL8188CU chip was taken off its working driver (#19).
- A spoofed country code in an access point beacon could change the stored regulatory setting.
Display, power and storage
- Panel driver (generic-dsi): init commands were sent twice and in the wrong order,
wait=values were read as hex (a 150 ms step waited 336 ms), and a failed write went unnoticed. Aforce_continuous_clockparameter allows testing #44 without a new overlay. - panfrost corrupted memory on the R36S original (the GPU rail dropped to 0.95 V while the DDR runs at 666 MHz); the GPU now keeps 1.1 V.
- The GPU DRIVER picker was missing, which also turned MangoHud support off (#38, #45).
- Battery read "Not charging" on the R36S while charging (the charger is a separate chip).
- HDMI hotplug did nothing (process lookup under BusyBox).
- A sleep started during a system update could power off in the middle of pacman.
- Second SD card: a card in the dArkOS layout hid every game of both cards; a failing card is now checked read-only and limited to 60 s instead of holding the boot.
- Settings scripts (GPU driver, overlays, suspend mode, turbo, time zone, audio output) now report failures and roll back instead of saving a value that was never applied;
system.cfgis written atomically. - Root password is passed on stdin, never on the command line.
/usr/bin/pastewas linked to pastebinit, so any script that calledpasteuploaded its input to a public pastebin. paste is the coreutils one again, and the scripts that used it no longer do.
Boot
- The UI waited for the network and other services it does not need; the boot now starts it as soon as its own dependencies are ready and runs the rest at idle priority.
- The random number generator was ready only ~8 s into boot, holding up the resolver; a saved seed makes it ready at ~5 s.
- Touchscreen services started on devices without a touchscreen; the hostname and wsdd2 setup woke services for nothing.
Performance
Measured on an R36S (original). "Unthrottled" means the frame limiter was off: a number above the game's target is headroom.
| What | Result |
|---|---|
| Launcher, first frame on the R36S after boot | about 0.5 s (476 and 512 ms on two boots, 4 November 2026) |
| Super Mario 64, standalone Mupen64Plus + GLideN64 performance profile | 114% speed unthrottled |
| Super Mario 64, standalone + glide64mk2 | 110 to 112% |
| Super Mario 64, RetroArch mupen64plus_next / parallel_n64 | 78% / 89% |
| PPSSPP, God of War | 15 fps before the frame skip fix; 78 to 84% speed with it; 100% (30 fps) with skip buffer effects |
| PPSSPP, Tekken 6, Burnout Legends, Death Jr. | 100% |
Build experiments (LTO, -O3, Mesa -O3, PlayStation SPU on its own thread) were measured on 18 game/emulator cases and none gained more than 3%, so none shipped.
Tested on
Hardware: R36S original (main test unit), R36S Soysauce (Wi-Fi and dongle work, over serial), Tenda AIC8800DC USB dongle. Other boards were covered through reporters' stock DTBs in the issues.
Unthrottled speed on the R36S, current default emulators (RetroArch cores unless noted), measured between 26 October and 3 November 2026:
| System | Game | Result |
|---|---|---|
| N64 (standalone) | Super Mario 64 | 114% |
| N64 (standalone) | Mario Kart 64 | correct title screen and item icons, full speed |
| N64 (standalone) | Perfect Dark | 75 fps |
| N64 (standalone) | Conker's Bad Fur Day | 18 fps |
| PlayStation (PCSX-ReARMed) | Tekken 3 / Crash Team Racing / Gran Turismo 2 | 195 / 154 / 164 fps |
| PlayStation | Ape Escape | starts with the DualShock, stick works |
| PlayStation (DuckStation) | Crash Team Racing | quit hotkey returns to the launcher |
| Dreamcast (Flycast 2021) | Soulcalibur / Crazy Taxi | 106 / 80 fps |
| Saturn (YabaSanshiro) | Virtua Fighter 2 / Panzer Dragoon Saga | 21.5 / 16.7 fps |
| SNES (Snes9x) | Star Fox / Yoshi's Island | 60.9 / 82.5 fps |
| SNES | 26 games on Snes9x, 2010 and 2005 Plus | all boot, no picture or sound faults |
| GBA (gpSP) | Golden Sun / V-Rally 3 | 207 / 272 fps |
| PSP (PPSSPP) | Tekken 6 | 146 fps |
| NDS (DraStic) | Mario Kart DS | 56.4 fps with frame skip 0 |
Also on the device: Wi-Fi connect with WPA2 on the AIC8800DC (6 s) and the network list, Samba and SSH toggles, the updates page, the FN + L1 + R1 report, sleep, boot with the GPU on panfrost and on libmali, and save and exit timing (RetroArch writes its state about 1.1 s after the signal, DuckStation in 1.7 s).
Upgrading
3.0 changes the card layout, so reflash to get the exFAT ROMs partition. Reflashing erases the whole card, including the backup ZIP stored on it.
The 2.1.1 backup (EmulationStation › Backup) covers settings only. It does not include your saves. Copy them yourself first.
- On 2.1.1, copy
/storage/romsto your PC: ROMs, the saves next to them,savestates/,bios/,screenshots/andbackup/. Use Samba, SSH (scp -r root@<device-ip>:/storage/roms ~/r36s-backup/) or put the card in a Linux PC (partitionSTORAGE). Optionally make a settings backup first and copyroms/backup/*.ziptoo. - Flash 3.0 with Arch R Flasher 1.3.8, picking the same console and panel as before.
- Boot once. The first boot resizes the card, creates
ARCHR_ROMSif the card has room, and restarts. - Put the card in your PC.
ARCHR_ROMSshows up as a normal drive. Copy your ROM folders, saves,savestates/andbios/back into it, and your backup ZIP intobackup/. Eject before removing the card. - On the device, restore settings from Settings › Storage › Restore backup if you made one.
From 3.0 on, Settings › Storage › Back up includes saves and states. Copy the ZIP off the card before any future reflash.
Keeping your card instead. A device already on 3.0 with ROMs still on ext4 (for example after an in-place update) can move them with Settings › Storage › ROMs on the PC. The device restarts into a maintenance mode, shrinks STORAGE to 8 GiB (or to what it holds plus 1 GiB), creates ARCHR_ROMS with the rest, copies each folder, compares it byte by byte and only then deletes the old copy. It needs free space for roughly a second copy of your ROMs and a charger or 50% battery, it takes about one minute per GB, and an interruption resumes on the next boot. File names exFAT refuses (such as names with :) are renamed and listed, symbolic links are not copied, and anything whose copy does not match stays in /storage/roms-not-migrated. Keep the device on the charger and do not turn it off during the shrink.
Known issues
- R36S Y3506_V04_20250529 (Soysauce) boards: black screen or stripes after the splash. Not fixed; a community workaround is in #44.
- RG351V with the version 2 display does not boot (#47). Some R36S Clone V20 boards (batch 2547) do not boot (#31).
- The overlay generator fixes for #35 and #46 are on arch-r.io. Regenerate your overlay from your own stock DTB to get them.
- Saturn is far from full speed (see Tested on). Star Fox runs on Snes9x with about 1% headroom; Snes9x 2005 Plus is faster but loses achievements.
- Joining a hidden network has only been tested against a network that does not exist. Enterprise (802.1X) Wi-Fi needs a profile placed by hand in
/storage/.cache/iwd. WPA3-only networks may fail with USB dongles, because SAE is off for their drivers. - AIC8800 dongles can log USB
error -71while switching from storage mode to Wi-Fi; the system recovers by itself. - Choosing panfrost on a clone that cannot run it costs one bad boot; the next boot falls back to libmali.
- Deep sleep stays off by default on these SoCs; the power button uses light sleep.
- Translations other than English and Portuguese still need review by native speakers.
Thanks
Kernel fixes adapted from ROCKNIX (SD resume retry, dwc2, rk817 gauge, PX30S/RK3326S series, Mali and panel fixes), AIC8800 driver tree and board tuning from AveyondFly, emulator defaults checked against dArkOS, dArkOSen, dArkOSRE-R36, ArkOS and AmberELEC, OpenBIOS from PCSX-Redux, C-BIOS, and Tenda's official firmware. Thanks to everyone who sent stock DTBs, logs and test results in the issues.
Downloads
Pick the image by bootloader, not by name:
| Image | Bootloader | Consoles |
|---|---|---|
ArchR-R36S.aarch64-20261105-original.img.gz |
Rockchip BSP loader | R36S, R36S Soysauce, R33S, Odroid Go Advance (and the v11 board), Odroid Go Super, Anbernic RG351M, RG351V, GameForce Chi, MagicX XU10, Powkiddy RGB10 |
ArchR-R36S.aarch64-20261105-clone.img.gz |
Mainline U-Boot | Generic R36S clones (K36 and similar), Powkiddy RGB10X, MagicX XU-Mini-M, Odroid Go Advance |
The easiest way is Arch R Flasher 1.3.8: choose R36S Original, R36S Clone or R36S Soysauce and it downloads the right image and adds your panel overlay. 1.3.8 is for Windows and Linux; on macOS use 1.3.6 for now. Windows Defender may flag the installer as Wacatac.B!ml; that is a false positive from the missing code signature.
"BOOT FAILED" on a clone means you flashed the original image; use the clone one. A black screen after the logo usually means a wrong or missing panel overlay: generate one from your console's own stock .dtb at https://arch-r.io/overlay-generator or with the offline script (https://arch-r.io/archr-dtbo-offline.zip).
Checksums
8fa3f4755b508703557736a10c045c1c2823001213bc7e6751a6c240285bbc99 ArchR-R36S.aarch64-20261105-original.img.gz
dc7956e082412befe55b47465d53fff4835b916a2bff87d4ca6e3186cb60e688 ArchR-R36S.aarch64-20261105-clone.img.gz
Always verify the checksum after downloading and before flashing.