Releases: archr-linux/Arch-R
Release list
ArchR Linux 2.1.1
ArchR Linux 2.1.1
Maintenance release. It is delivered as a new image because the 2.1
updater could not reach the package repository on its own (it looked
for a channel tag that does not exist and started from an empty package
database), so 2.1 users need to flash this once. From 2.1.1 on, updates
arrive normally through EmulationStation > Updates, kernel included.
Fixed
- System updater: 2.1 reported "no updates available" even when
updates existed. The channel is now validated (unknown values fall
back to stable) and the package database is seeded on the first
check, so the updater works. - Update no longer breaks input and WiFi: installing the kernel
through the updater used to overwrite the module index with a version
that predated the out-of-tree drivers, so after a reboot the gamepad
and USB WiFi dongles stopped working while their files were still
present. The module index is now rebuilt over the full driver set
after every update, and the packages no longer carry the stale index. - Updater plumbing now ships through updates too: the update
scripts and hooks themselves were image-only and could never be
updated in place; they are now part of the package set.
Added
- WiFi 6 dongles: the MediaTek MT7921U driver is enabled, and the
Realtek RTL8852BU and RTL8852CU drivers are bundled, on top of the
existing coverage.
Everything from 2.1
DDR at 666MHz, power LED control on every board, the RTL8188EUS dongle
fix, the R36S Clone speaker fix, Soysauce input and PMIC-interrupt
fixes, power-button light sleep, and kernel/device-tree delivery through
the updater. See the 2.1 notes for the full list.
Checksums
035b58c446e0ffc7f6e23d1c8ef574fd0970307af6c3a41817abe82239aaf577 ArchR-R36S.aarch64-20260709-original.img.gz
3ea0b970595e0086bd7478e0d17acf71adf1368499b45f1bba21ef6ab63660e2 ArchR-R36S.aarch64-20260709-clone.img.gz
Always verify the checksum after downloading and before flashing.
ArchR Linux 2.1
ArchR Linux 2.1
Performance, hardware compatibility and quality-of-life release for the R36S family (Original, Clone, R33S and Soysauce). Flashing the new image is the recommended path; from this release on, most fixes (including kernel and device trees) can also be delivered through the built-in updater (EmulationStation > Updates) thanks to the new boot-partition sync.
Performance
- Memory clock doubled: the DDR now trains at 666MHz at boot (previous releases were locked at 333MHz). This was the single largest performance gap against BSP-based systems and translates directly into higher and more stable FPS across emulators.
- Emulators now run with elevated CPU scheduling priority, and the default audio latency was tuned to eliminate audible crackling.
Fixed
- USB WiFi dongles (RTL8188EUS family): dongles could scan networks but never completed the WPA2 handshake. The driver hand-off rule was rewritten and now moves the adapter to the correct driver deterministically. Covers the common TP-Link, Edimax EW-7811Un and generic 8188EUS adapters (#19).
- R36S Clone V20 speaker: no sound from the built-in speaker while headphones worked. The V20-era boards route the speaker through an external amplifier; the audio profile now configures it, and headphone plug/unplug switching was fixed along the way (#35).
- Power LED: the POWER LED COLOR menu now actually drives the LED on every board (on/off/heartbeat), the DISABLE POWER LED switch is visible and applies immediately, and the menu default matches the real boot state. On the Soysauce the LED polarity was inverted; on the Original the bicolor LED (green/red) is now fully described.
- Soysauce PMIC interrupt: the power button, headphone detection and charger events were dead on Soysauce boards because the PMIC interrupt line differs from the rest of the family. All of them work now.
- Soysauce gamepad in ports and standalone emulators: SDL-based titles now recognize the built-in controller without manual mapping.
- Internet Status in Network Settings no longer clips, and the network menu no longer freezes while checking connectivity.
- Second SD card: booting with a card in TF2 no longer breaks boot (partitions are resolved by label) (#34).
Sleep
- Pressing the power button now puts the console into a light sleep: screen and backlight fully off, audio muted, CPU at minimum, instant wake on the next press. Kernel deep suspend is disabled by default because the SoC cannot reliably wake from it on mainline kernels (it remains available for experimentation under SUSPEND MODE).
Updater
- Kernel and device-tree updates now flow through the package updater: after an update transaction the boot partition is synchronized automatically, with per-file checksums and verified writes. User overlays and bootloader files are never touched. Only the low-level bootloader (TPL/U-Boot, e.g. the DDR frequency change in this release) still requires reflashing the image.
Overlay generator (website)
- The DTBO generator extracts more board-specific data from your stock DTB: speaker amplifier wiring, headphone-detect wiring (including legacy layouts), battery/charge LED wiring on clones and the PMIC interrupt pin. If a variant board misbehaves on the generic image, regenerating your overlay on the website now fixes considerably more cases without reflashing.
Checksums
bad4def59fb8b6d9964b325e2b768029ff8014790d7d43a09084575211888d52 ArchR-R36S.aarch64-20260708-original.img.gz
05ef38790b2f7269575db22d78299ca543734912ae51b0c39d1aacfa937e9f92 ArchR-R36S.aarch64-20260708-clone.img.gz
Always verify the checksum after downloading and before flashing.
Arch R v2.0
ArchR Linux 2.0
ArchR Linux 2.0: Release Notes
Open-source Linux distribution for the R36S and RK3326-based clones.
Kernel 6.12 LTS, Mesa 26 Panfrost, CPU 1.4 GHz default (optional 1.5 GHz overclock), 43 supported panels.
Highlights
- Pacman as a real update mechanism: future updates become
pacman -Syuinstead of reflashing the SD card, with signed repositories and the ArchR master key embedded inarchr-keyring. - Audio fixed across all three families: R36S Original, R36S Clone (V20/V21/V22, GR36, G80C/D) and Y3506 Soysauce (V03/V04/V05).
- WiFi finally reliable: passwords with special characters (
$%#@&!*()-_=+çetc.) connect; a new out-of-tree RTL8188EUS driver fixes the authentication failure on the TP-Link/RTL8188EUS chip. WiFi also reconnects to the saved network automatically at boot. - Two inserted SD cards no longer break boot:
boot.iniusesLABEL=instead of/dev/mmcblk${devnum}p1, eliminating the mismatch between the U-Bootdevnumand the kernelmmcblkenumeration. - Overlay generation moves out of the OS build and into the online generator:
https://arch-r.io/overlay-generator/. The/flash/overlays/folder now carries only a multilingualREADME.txtexplaining how to generate themipi-panel.dtboon the site. - USB WiFi dongle works on the Soysauce and clones: the overlay generator now translates the vbus power supply of the OTG port from the stock DTB (the
vcc_host+GPIO regulator in the R36S style, or the rk817 PMICOTG_SWITCHon the Soysauce), tied as thevbus-supplyof&usb20_otg. The 6.12 dwc2 enables the regulator on demand when entering host mode (USB set to "disabled"), with no coil whine. - PortMaster/CFW compatibility layer: the Debian 11/darkOS SONAMEs that ports expect (
libjpeg.so.62,libcodec2.so.0.9,libx264.so.160,libx265.so.192,libtheoradec.so.1) now resolve, andsudo,vmstatandperf(withperf_event_paranoid=1) are present per the official guide.
By category
Pacman as a real update client
gen-pacman-repofixed for the pacman 7 layout (signing only thedb, not per package).repo-stableandrepo-devrepositories on GitHub Releases.archr-keyringcarries the ArchR production public master key.pacmaninstalled with/var/lib/pacmanas a symlink (compatible with read-only squashfs +/storageoverlay)./usr/sbin/bashshebangs rewritten to/usr/bin/bash(issue #36).- GnuPG bumped to 2.4.8 with updated
libksba/npth/pinentry.
Bootloader and partitioning
clone_boot.iniandoriginal_boot.ininow useroot=LABEL=@DISTRO_BOOTLABEL@instead of/dev/mmcblk${devnum}p1. Inserting a second SD card in any order no longer breaks boot (issue #34).- The
busyboxinit resolvesLABEL=/UUID=via util-linuxblkidscanning/proc/partitions(with amknodfallback), because busyboxvolume_iddoes not read FAT32 labels (symptom: "Unable to find LABEL=ARCHR, powering off").mount/umount/findfsare symlinked to busybox andPATHis exported at the top of init. - R36S Clone DTS (eeclone) aligned with the clean config of the other variants:
&emmcdisabled (the board has no eMMC chip; the controller kept recycling init for an absent card: "Timeout sending command" / "Failed to initialize a non-removable card") and&uart5(console ttyS2) muxed with onlyuart5_xfer(theuart5_ctson gpio3 RK_PA3 conflicted and the kernel reverted the whole group). - The FAT partition keeps
BOOT_SIZE=256,mkfs.vfat -s 32,fsck.fat -n. Cosmeticdosfsckwarnings are deliberately ignored (they previously caused a boot loop when "fixed").
Base system, systemd and FHS
- New
tmpfiles.d/z_02_archr-fhs-bridges.confcreates/var → /storagebridges viasystemd-tmpfiles, eliminating refs inherited from ROCKNIX/JELOS. 001-functionsandarchr-automountrevised: inherited refs pointing to Batocera/JELOS paths were corrected.- systemd units fixed: zero warnings in
systemd-analyze. - Symlink renamed:
rocknix-report-stats.timernow points toarchr-report-stats.timer.
Network drivers
- RTL8188EUS (aircrack-ng/rtl8188eus): new out-of-tree package at
projects/ArchR/packages/linux-drivers/RTL8188EUS/to fix the WiFi authentication failure on RTL8188EUS adapters when the upstreamrtl8xxxudriver does not complete the handshake (issue #19). - wifictl gained:
encode_iwd_name(): encodes non-alphanumeric chars as=XXin the profile name, the standard iwd requires.- WPA-PSK validation (8-63 printable bytes or 64 hex).
umask 077before writing profiles (no key leak to other users).- Cleanup of old profiles before creating a new one (no profile leak).
- Auto-reconnect at boot: when WiFi is enabled, the saved network is reconnected automatically at boot. Previously a unit rebooted with WiFi on came back with the toggle showing active but no connection, until the user toggled it off and on.
Security
- setrootpass: replaces the SHA-256 fingerprint file with
sha512cryptsalt comparison, reusing the existing entry in/storage/.cache/shadow. No new sensitive artifact on disk. - WiFi profile permissions with
umask 077.
Audio
- A new
SDCLONEflag in the web generator forces therk817-sound-amplifiedfallback when the clone DTB does not expose the amplifier GPIO. Fixes the "no soundcards" result inaplay -lon R36S Clone V20/V21/V22, GR36, G80C/D (issue #35). - Y3506 Soysauce (V03/V04/V05) loudspeaker is on the analog headphone output (HPOL/HPOR) behind an external amplifier gated by the rk817 codec's
spk-ctl-gpios. A new kernel patch adds rk817use_ext_amplifiersupport: it routes the speaker mux through the headphone DACs and togglesspk-ctl-gpiosvia a DAPM event. The web overlay generator now keeps the baserk817-soundcard enabled for the Soysauce (the NAm flag means "keep the base card"). It no longer swaps tork817-sound-spko-direct, which on the Soysauce base produced an empty card and a silent speaker (issue #29).
Controls / joypad (Soysauce / Y3506)
es_input.cfgnow ships aGO-Super Gamepadentry so both analog sticks navigate the EmulationStation menu (mapped as leftanalog/rightanalog). This fixes the previous behavior where the right stick changed the volume and the left stick did nothing (the auto-generated entry mapped them as joystick1/joystick2, and joystick2 is hardcoded to volume in ES).- The RetroArch
GO-Super Gamepadautoconfig button layout was corrected (select, start and D-pad indices were on the RGB20S layout; now on the R36S layout). This fixes in-game Start, Select and the exit-game hotkey combo. - Analog stick sensitivity tuned for the Y3506 potentiometers (the sticks only reached about 76 percent of range; the gain was raised so full deflection saturates the axis and menu navigation is responsive).
PortMaster / CFW: compatibility layer
- Per-SONAME compat libs: ports built against Debian 11/darkOS expect SONAMEs that ArchR does not ship by default. New packages
compat-codec2(libcodec2.so.0.9),compat-x264(libx264.so.160),compat-x265(libx265.so.192) andcompat-libjpeg62(libjpeg.so.62, IJG v6b ABI via libjpeg-turbo withWITH_JPEG8=OFF) install into/usr/lib/compat. archr-compat-libs.service: since ArchR has nold.so.cache, the service symlinks the*.so*from/usr/lib/compatto the linker's default path at boot, resolving the missinglibtheoradec.so.1for LÖVE runtimes (46 SONAMEs linked, without shadowinglibogg).sudoshim: the guide listssudo/doasas required; ArchR is single-user root, so the shim strips the sudo options and runs the command directly (the ROCKNIX/dArkOS pattern).vmstatadded toprocps-ng, andperfenabled for profiling withkernel.perf_event_paranoid = 1(userspace CPU sampling without full root context).ltraceis the only nice-to-have item from the guide intentionally absent: the maintained fork fails autoreconf on the ArchR toolchain; ports usegdborperf trace.
EmulationStation: System Information and quirks
- The
archr-infoquirks chain fixed: the word-splitting bug on "Game Console R36S" (with spaces) brokefor QDIR in ${QUIRK_DIRS}. Replaced with a bash array. - Temperature in System Information on Clone and Soysauce: the quirks loader matches the
quirks/devices/<name>folder against the exactmodelstring, and folders for "R36S Clone" and "Game Console R36S Soysauce" were missing, soDEVICE_TEMP_SENSORwas empty and only the Original showed temperature. Added folders with thethermal_zone0(CPU) andthermal_zone1(GPU) sensors. The DTBs/tsadc of the three variants are identical and worked: the gap was only per-device config in userspace. - Mesa version, Arch and full kernel string appear in System Information.
archr-config: Batocera paths replaced with the ArchR equivalents in the audio output selection command.- ES fork:
getArchString()readsHW_DEVICEfrom the env, scripts are also searched in/run/emulationstation/scripts, locale.moloaded from/usr/config/locale.
Performance and CPU
- CPU default is 1.4 GHz; the 1.5 GHz turbo OPP is opt-in via the EmulationStation "Enable CPU Overclock" switch (off by default to favor thermals and battery; gameplay still uses the performance governor).
- Inherited JELOS bugs in the boot path fixed.
- Cleanups in Emulators and PortMaster scripts (broken links, divergent paths).
Strategy: overlay generator leaves the OS build
config/mipi-generator/(generator.sh + archr-dtbo.py) andconfig/archr-dts/(23 DTSes and ~120 vendor DTBs) removed from the tree. Net: -8,503 LOC + ~120 binaries.u-boot/package.mkno longer callsgenerator.sh; no longer installsoverlays_{original,clone,soysauce}/.bootloader/mkimagesimplified: theRK3326branch dropped the per-SUBDEVICE copy.- The
/flash/overlays/folde...
Arch R v2.0 RC-4
Arch R v2.0 RC-4
Release candidate focused on panel overlay coverage, joypad compatibility, GPU driver robustness, Soysauce audio and boot time. Built as official image on 2026-05-26, follows the v2.0 RC-3 line.
MIPI panel overlay generator (major)
The internal archr-dtbo.py script that produces panel overlays from a stock vendor DTB was rewritten end to end. It now extracts every hardware knob we have seen vary across the 44 vendor DTBs we ship, not just panel timings:
- Joypad wiring propagation:
amux-a-gpios,amux-b-gpios,amux-en-gpiospin numbers (vendor wiring differs between original, clone and soysauce boards), per-buttongpiosforsw1..sw22, plusbutton-adc-deadzone,button-adc-fuzz,button-adc-flatwhen the vendor diverges from our defaults rumble-gpiopropagation for the clone batches that expose it explicitly (the R36S V20 2025-05-18 batch and the GR36). Without this the motor defaults to "on" on those boards and vibrates continuously through every boot- Panel LED GPIO handlers wired up (
led-red-gpios,led-green-gpios,led-blue1-gpios,led-blue2-gpios) and whitelisted. No vendor DTB in the current ship set declares these yet, so the path is dormant for now but in place for the next board revision that needs them - Tier 3 auto-discovery walks any vendor property that is not on a known whitelist, propagates safely if it looks safe, logs a skip otherwise. The PMIC regulators are explicitly blacklisted so vendor settings cannot override our
vdd_armregulator-max raise (1.45 V) that the 1.5 GHz CPU OPP depends on - Original vs clone odroidgo3 detection: DTBO generation now picks the right joypad driver binding based on board topology, not a hardcoded compat string. Several clone vendor DTBs (G80CA V1.2 batches) ship with the
rockchip,rk3326-odroidgo3-linuxcompat string from the BSP despite being clones; the audit logic now disambiguates by topology
The generator also ships as a free in-browser tool at https://arch-r.io/overlay-generator. Users with an unsupported clone can upload their stock DTB, the page extracts everything via Pyodide and gives back a mipi-panel.dtbo ready to drop into the SD card. Nothing leaves the browser.
Cross-distro panel and joypad compatibility
Two new kernel-side accept patches let an ArchR image consume overlays produced by ROCKNIX out of the box:
panel-generic-dsi.caccepts botharchr,generic-dsiandrocknix,generic-dsicompatible strings. ROCKNIX-generated panel overlays bind on ArchR without modification, and vice-versa for any overlay declaring our compatarchr-joypaddriver acceptsrocknix,joypadvia a small accept patch, so ROCKNIX joypad overlays enumerate the buttons through our driver
This is symmetric on purpose: overlays move freely between the two distros for the same hardware.
New hardware support
- Y3506 V04 2528 (soysauce variant): full device tree (
Y3506_V04_20250529 2528), panel overlay set (6 dtbos covering JPk36/JPmm and SRs combos) and verification on real silicon - Micro-gamepad compatibility added to the
archr-joypaddriver vialinux/0002-accept-micro-gamepad-compatible.patch; handheld variants with the reduced micro-gamepad button layout now enumerate correctly - GamePark GP32: emulator added to EmulationStation. ROMs land in
/storage/roms/gp32(.smc,.zip,.7z); the libretromamecore handles the system
Soysauce audio: speaker now actually works
Reported by the community on the V05 batches but applies to every Y3506 board we ship (V03, V04, V05). The Y3506 family has no external speaker amplifier on the PCB: the rk817 SPKO line drives the mono speaker directly. The vendor BSP 4.4 hid this by hardcoding the DAPM widgets and routes inside rk817_codec.c, but mainline ASoC respects the DT strictly. Under previous releases the kernel saw a sound card declaring an amp aux-dev and no Speaker widget, so it kept the speaker muted no matter what userspace tried.
Three new sound card variants now live in rk3326-gameconsole-r36s.dts:
rk817-sound-amplified: external amp gated by an enable GPIO. R36S original, K36, and most clone batches.rk817-sound-simple: external amp on a regulator without a GPIO gate. A handful of clone batches.rk817-sound-spko-direct: speaker driven straight from rk817 SPKO with no external amp. Every Y3506 Soysauce board.
The overlay generator (archr-dtbo.py) was extended with:
- A new
NAm(No Amplifier) flag that forcesrk817-sound-spko-direct. The build pipeline appendsNAmto every overlay produced under thesoysauce/family, so the V03/V04/V05 boards Just Work without any user interaction. - Acceptance of
simple-audio-card,hp-det-gpioas a fallback to the legacy BSP-stylehp-det-gpioname. Without this the audio block was silently skipped on every V05 vendor DTB. - Defensive handling of vendor DTBs that omit
/pinctrl/headphone/hp-det(a handful of soysauce batches bind the headphone detect line through the codec phandle instead). - The short-circuit path for boards with
rockchip,rk3326-odroidgo3-linuxcompatible now still switches the active sound card to spko-direct whenNAmis set, so the six Soysauce batches that go through that early return still get the fix.
All 264 panel overlays were regenerated against the new variant logic. Audit:
- 18 clone boards: default amp routing kept (unchanged behaviour)
- 15 original boards: default amp routing kept (unchanged behaviour)
- 11 Soysauce boards:
rk817-sound-spko-directenabled (speaker now works)
Joypad and rumble fixes
- Single-ADC driver for Y3506 soysauce boards: the multi-ADC code path was reading the wrong channels on these clones. The fix flips
rk3326-gameconsole-soysauce.dtsto the single-ADC binding that matches vendor wiring and adjusts the mipi-generator post-processing accordingly - Continuous rumble vibration fix: some R36S revisions leave the rumble enable GPIO (gpio0 PB7, shared with the pwm0 function) in a high-impedance state at gpiolib probe time, latching the motor on through boot. A
rumble-en-hold-lowgpio-hog was added to the R36S DTS to drive the pin LOW before any other consumer probes. Trade-off: a handful of boards that did have working rumble lose it via the hog (the alternative was every board vibrating non-stop). The right long-term fix is gating the hog with a per-board compat check, which a future RC will land - Rumble TOC ("rumble travado") on the clone batches with a dedicated
rumble-gpiois resolved by the overlay generator change above (Tier 3 propagation)
GPU driver and graphics stack
- Mesa bumped to 26.1.1 (up from 26.0.5 in RC-3). The seven drm-panfrost patches backported from mainline in RC-3 (SYSTEM_TIMESTAMP, cycle counter, BO labelling) carry through unchanged
mali_kbaserepository moved togithub.com/archr-linux/mali_kbase(the oldgithub.com/archr/...was 404). The bifrost kernel module is pinned at commit422e192b7e3aa3140f34de34765b798817c1f749gpudriverruntime script hardened (~136 lines added):- Boot-loop sentinel at
/storage/.config/gpudriver.attempting: if a previous boot kernel-panicked while loading the configured driver, the next boot silently forces libmali and rewrites the setting so the device boots into a working UI - Async
modprobe panfrostwith timeout so a stuck probe never blocks the boot path. The 8-step trace lands in/storage/.config/gpudriver.logfor after-the-fact triage without a serial console - More robust bind check: presence of
/sys/class/drm/cardNalone is not enough (rockchip-vop createscard0even with no GPU driver). The new check verifies the driver-specific sysfs node (panfrost:/sys/bus/platform/drivers/panfrost/*.gpu; libmali:/dev/mali0) AND that at least one DRM connector reportsconnected - Clean reverse-binds when switching to the other driver: panfrost path now correctly undoes the
/usr/lib/malioverlay, restoreslibGL.soon both archs and unmasks the panfrost Vulkan ICD
- Boot-loop sentinel at
- GPU Driver picker hidden in EmulationStation: the
gpudriverbinary now installs at/usr/lib/archr/gpudriver(was/usr/bin/gpudriver); ES surfaces the picker only when the/usr/bin/path exists, so this hides the option while panfrost on RK3326 silicon is still unstable. The autostart hook (003-gpudriver) calls the binary by full path. This is documented inline in the package and is reversible by moving the file back
Boot and runtime
- Two-phase autostart: critical-path quirks run first, optional ones (network bring-up, scrapers, telemetry) run in parallel after EmulationStation is interactive. Cold boot is noticeably faster on the same hardware
- Service dependency graph cleaned up so quirks load in parallel where there is no ordering dependency
- Internal storage automount logic adjusted: edge cases where the device booted before
STORAGEwas mounted no longer corrupt the gamelist cache - RTL8188EU firmware upload chunk fix backported from mainline (
0050-wifi-rtl8xxxu-Fix-RTL8188EU-firmware-upload-block-size.patch). Some users were seeing intermittent WiFi-init failures on this radio because the firmware blob refused to upload in 128-byte chunks
Software updates
- DuckStation standalone bumped to
0.1-10998(libretro core kept on its prior stable tag) - Commander file manager updated to the ROCKNIX modern fork (
github.com/ROCKNIX/commander, pinned atb3c008cac3bff9de54a3542cecc53cc271058744): dark theme by default, path fixes, build fix baked in - PortMaster compatibility libraries added as explicit dependencies; the GUI no longer fails on
import lzmaor on consoles that lack the olderxzuserspace tools - InputPlumber service hardened for HID device management (`inpu...
Arch R v2.0 RC-3
Arch R v2.0 RC-3
Major release focused on CPU performance, graphics stack maturity, and system reliability. Built as official image on 2026-04-29, validated on real R36S hardware (V21 board) across the full v2-v27 internal build series.
CPU Overclock toggle — 1.4 GHz → 1.5 GHz on demand
A new Enable CPU Overclock switch in the ES menu (System Settings → Performance) lifts the cap from 1416 MHz to 1512 MHz when you need it. Default is OFF — cooler, longer battery life. Flip it on for PSP / Dreamcast / box86 ports that want every Hz.
Behind the scenes:
- DT OPP 1512 MHz validated stable at 1.4 V (BSP default 1.35 V was unreliable on some chips)
vdd_armregulator-max raised 1.35 V → 1.45 V (RK817 DCDC_REG2 spec is 0.7-1.5 V) — without this the kernel rejects the OPP silentlyset_cpu_max_freq highestreads scaling_available + scaling_boost frequencies — turbo OPPs hide in the second file even aftercpufreq/boost=1/usr/bin/turbomoderewritten — no longer forces governor=performance on every toggle
GPU stack
- Mesa 26.0.5 with
+speed +ltobuild flags - 7 drm-panfrost patches backported from mainline (SYSTEM_TIMESTAMP, cycle counter, BO labelling) — required by Mesa 26 for
GL_TIMESTAMPandVK_KHR_calibrated_timestamps - GPU OPP 650 MHz turbo at 1.150 V (same voltage as 600 MHz — the BSP value of 1.175 V was triggering reboots on some chips)
mali_kbasePM patch (002-fix-unbalanced-regulator-clk-pm) — eliminatesunbalanced disables for vdd_logicandEnabling unprepared clk_gpuwarnings, fixes audio crackle in Mario 64gpudriver --startauto-fallback — if Panfrost or libmali fails to bind, the script switches to the other driver so you always get a graphical systemMESA_GLTHREADper-emulator whitelist — enabled on Flycast and PPSSPP standalone (GPU-bound + multi-threaded internally), kept off elsewhere to avoid regressing fence-heavy 2D libretro cores
Performance
zlib-ng 2.2.4as drop-in forzlib(libz.so.1ABI preserved) — NEON SIMD inflate/deflate, ~10-30 % faster ROM zip extraction on Cortex-A35- CMA raised 64 → 96 MB —
CmaFreewas 8 MB at idle on 64 MB (87 % used), V4L2 and Mali surface allocations were tight; now ~30 MB free - KSM paused during gameplay —
runemu.shsaves/sys/kernel/mm/ksm/run, sets to 0, restores on exit. Eliminates p99 frametime spikes from KSM scanning on Cortex-A35 in-order - CPU governor + boost restore on game exit —
quit()is defensive (falls back toondemandifsystem.cpugovernoris empty); turbo state is persisted per the user's switch
Boot reliability
archr-autostart.serviceTimeoutStartSec=60s— if any quirk script hangs, emustation comes up anyway instead of blocking foreverdrm_tool listwith 10 s timeout in055-hdmi-check— was a known cause of intermittent boot stalls on slow microSDs- Persistent boot trace at
/storage/.boot_last_stepand/storage/.boot_last_hang— if your device ever hangs at boot, after the next successful bootcat /storage/.boot_last_hangnames the script that hung. Useful for bug reports.
Emulator tuning
- GBA:
gpspdefault on RK3326 (was mGBA — too heavy for A35); mGBA stays as accuracy alternative - GameCube / Wii / Wiiware hidden from ES on RK3326 — Cortex-A35 doesn't run them at usable framerates, the menu now reflects that honestly
gptokeybkill made defensive in 5 standalone start scripts (drastic, flycast, melonds, dolphin_gc, dolphin_wii) — no more spurious errors whenpidofreturns empty- PPSSPP, Flycast, DuckStation, Mupen64Plus defaults retuned per RK3326 — see docs.archr.io/configure for the full matrix
Network
- VPN service auto-pause during gameplay — Tailscale, ZeroTier, WireGuard, simple-http-server all suspended on game launch, resumed on exit. No CPU contention, no WiFi airtime competition
ConditionPathExists=added tosyncthing,tailscaled,zerotier-one,simple-http-server— opt-in services don't accidentally start without the toggle filesystemd-timesyncdpoll preguiçoso —PollIntervalMaxSec=86400(24 h), daemon idles after first sync and gets paged out of RAM
PortMaster
Python3+xzas explicit dependencies — PortMaster GUI (harbourmaster) needsimport lzma; previously implicit and could failstart_portmaster.shmade idempotent —rm -rf+ existence guards, no more "directory not empty" errors on second run- udev rule
91-uinput.rules—/dev/uinputmode 0666, sogptokeybworks under thearchruser without manual chmod per port
Bug fixes
fs-resizecorruption — earlier RC3 internal builds tried to "modernize" the BOOT FAT (4 KB clusters,fsck.fat -a -wafterfatlabel) and ended up triggering "Filesystem corruption has been detected!" on the device. Reverted to the v22 baseline that ships clean- gpudriver typo (
DTB_OVERLAY=""→DTB_OVERLAY_LOAD="") caused brick when the user picked Panfrost on devices without an overlay runemu.shexit governor — was leaving CPU pinned atperformanceafter game exit whensystem.cpugovernorwas unset- DT patch hunk count corrected — a wrong
@@header was makingpatchsilently drop subsequent hunks (thedmcnode was missing in v10 builds)
Documentation
- Website (https://arch-r.io) reorganised: 17 docs across 5 sections, including new guides for ROMs, Controls, PortMaster, SSH, Samba, Netplay, RetroAchievements, Cloud Sync (Syncthing + rclone + NFS), VPN, Themes, Shaders, HDMI, CPU Overclock, GPU driver
- Light theme added to the website (toggle in the nav bar)
- SEO baseline — sitemap, robots.txt, OG images, JSON-LD (Organization + WebSite + SoftwareApplication)
Installation
Download the image for your R36S variant and flash it using Arch R Flasher v1.3.0 or any SD card imaging tool.
- R36S Original:
ArchR-R36S.aarch64-20260429-RC3-original.img.gz - R36S Clone (K36, EE Clone, Powkiddy RGB10/RGB10X/RGB20S, MagicX XU-Mini-M, BatLexp G350):
ArchR-R36S.aarch64-20260429-RC3-clone.img.gz - R36S Soysauce (Y3506-based hardware): use the original image; the Flasher selects the correct soysauce panel overlay automatically
Checksums (SHA-256)
ArchR-R36S.aarch64-20260429-RC3-original.img.gz
ArchR-R36S.aarch64-20260429-RC3-clone.img.gz
Report issues at https://github.com/archr-linux/Arch-R/issues
Arch R v2.0 RC-2
Arch R v2.0 RC-2
Major update with battery fixes, performance optimizations, R36S Soysauce support improvements, and PortMaster compatibility. Built as official image on 2026-04-02.
Battery
- Fixed battery percentage dropping rapidly to 0%: Backported two upstream kernel patches (from Linux 6.13) for the RK817 charger driver. The coulomb counter calibration was being corrupted by invalid voltage readings during suspend/resume, causing the SOC to plummet. The driver now validates voltage readings (2.7V-4.45V range) before any calibration, cancels the monitoring thread during suspend, and removes the problematic automatic FCC recalibration.
- Battery full charge capacity (
CHARGE_FULL) is now writable from userspace for degraded battery support.
CPU and GPU Frequency
- Restored full CPU frequency table: 408 / 816 / 1008 / 1416 / 1512 MHz. The previous build only had 1008 / 1296 / 1416 / 1512 MHz, which prevented the CPU from entering low-power states and increased battery drain during idle.
- 408 MHz suspend OPP: New lowest frequency point at 950mV for deep sleep, replacing the previous 600 MHz.
- GPU OPP voltage correction: Fixed GPU 600 MHz operating point from 1175mV to 1150mV. The previous value exceeded the
vdd_logicregulator maximum (1150mV) per the RK3326 datasheet. - All voltages verified against the RK3326 datasheet (CPU_VDD: 0.95V-1.35V range).
R36S Soysauce Variant
- Fixed volume buttons: Mapped to correct GPIOs (GPIO3_PC5 for volume down, GPIO3_PC6 for volume up). Previously inherited wrong GPIOs from the original R36S device tree.
- Automatic extlinux switching: Flasher now correctly switches
extlinux.confto the soysauce variant (explicit FDT pointing tork3326-gameconsole-soysauce.dtb).
PortMaster Compatibility
- Python3 lzma module enabled: PortMaster GUI (harbourmaster) requires
import lzma. Previously disabled in the build. - dos2unix added: Required by ~37 PortMaster ports.
- xdelta3 added: Required by ~30+ PortMaster ports for binary delta patching.
- innoextract added: For extracting GOG Inno Setup installers (3 ports).
- squashfs-tools on target:
mksquashfsandunsquashfsnow installed on the device (previously host-only). Required by PortMaster for runtime squashfs mounting. - loop.max_loop=16: Added to kernel cmdline. PortMaster ports can mount multiple squashfs runtimes simultaneously.
- R36S device detection: Added R36S entries to PortMaster control.txt (
param_device=oga,ANALOG_STICKS=2). - /etc/os-release: Added standard
NAMEandIDfields for PortMaster CFW detection.
Emulator Performance Optimizations
Focused on extracting maximum performance from the RK3326 (Cortex-A35 + Mali-G31).
Global (all emulators):
PAN_MESA_DEBUG=forcepackenabled globally for Mali-G31: reduces draw call overhead by packing vertex attributesMESA_NO_ERROR=1enabled globally: skips GL error checking (~5-10% gain)
RetroArch:
- Video driver changed from
glcoretogl(less overhead on GLES2) - Swapchain images reduced from 3 to 2 (less VRAM pressure on 1GB RAM)
- Auto frame delay enabled (reduces input lag)
- Menu driver changed from XMB to Ozone (lighter on GPU)
PPSSPP (PSP):
- Anisotropy disabled (Mali-G31 has no hardware AF)
- High quality depth disabled, bloom hack removed
- Duplicate frame rendering disabled
- Inflight frames reduced from 3 to 2
- Audio latency increased to prevent stuttering
DuckStation (PSX):
- Renderer changed from Software to OpenGL: Major performance improvement, offloads rendering to GPU
- CD read/seek speedup enabled (faster loading)
- Readahead sectors doubled
Flycast (Dreamcast):
- Resolution set to 480p (matches R36S screen)
- Threaded rendering and dynamic recompiler enabled
- Auto frame skip enabled
- Idle skip enabled
Mupen64Plus (N64):
- GLideN64 defaults optimized for performance (legacy blending, inaccurate texcoords, LOD disabled)
- Rice fast texture loading enabled
- Audio buffers tuned to reduce latency while preventing drops
Installation
Download the image for your R36S variant and flash it using Arch R Flasher v1.2.0 or any SD card imaging tool.
- R36S Original:
ArchR-R36S.aarch64-20260402-original.img.gz - R36S Clone:
ArchR-R36S.aarch64-20260402-clone.img.gz - R36S Soysauce: Use the original image and select "Soysauce" in the Flasher. The flasher will configure the correct device tree and panel overlay.
Checksums (SHA-256)
84434e1762886ebbb90332d80ae914a9aa5054901d37b8d875059647f2320b73 ArchR-R36S.aarch64-20260402-original.img.gz
a39b8e0ee8b9f5056abc3e02e8851826dc7c74f9605932424d8a25d3ca1d2b9e ArchR-R36S.aarch64-20260402-clone.img.gz
Report issues at https://github.com/archr-linux/Arch-R/issues
Arch R v2.0 RC-1
Arch R v2.0 RC-1
Complete architectural rewrite. Arch R is now built on the ROCKNIX/LibreELEC embedded Linux build system instead of custom shell scripts. Every layer of the stack has been rebuilt, from the toolchain to the boot flow.
This is a release candidate. Core functionality (boot, display, controls, emulation, WiFi) has been tested on real R36S original and clone hardware. Report issues at https://github.com/archr-linux/Arch-R/issues.
Architecture Change
The entire build system has been replaced. v1.0 used a collection of shell scripts (build-all.sh, build-kernel.sh, build-rootfs.sh, etc.) that sequentially compiled each component and assembled the image. v2.0 uses the ROCKNIX/LibreELEC package build system, where every component is a declarative package with automatic dependency resolution, incremental builds, and full Docker containerization.
| v1.0 Beta 2 | v2.0 RC-1 | |
|---|---|---|
| Build system | Shell scripts (build-all.sh) | ROCKNIX/LibreELEC package system |
| Total packages | ~15 major components | 669 packages |
| Libretro cores | 18+ (manually built) | 78 (individually packaged) |
| Docker builds | Not supported | make docker-RK3326 |
| Build environment | Native cross-compile + QEMU chroot | Arch Linux Docker container |
| Incremental builds | Timestamp stamps | Deep hash stamps |
The practical difference: adding a new package, patching an emulator, or updating the kernel is now a single .mk file change instead of editing build scripts. Reproducible builds work out of the box with Docker.
Kernel
Still Linux mainline LTS (6.12 series), but now compiled through the package system instead of a standalone script. Device tree sources are managed as kernel patches with automatic Makefile registration. The initramfs is generated by the build system from BusyBox with mdev, blkid, and findfs built in.
U-Boot
Original R36S boards still use BSP U-Boot 2017.09 (required by the Rockchip boot ROM), but the build now patches board.c and hwrev.c at compile time to load DTBs from the dtbs/ directory and support FAT32 long filenames (CONFIG_SUPPORT_VFAT=y).
Clone boards use mainline U-Boot v2025.10.
Root Filesystem
Changed from SquashFS (read-only compressed, loopback mounted) to ext4 (read-write). The old SYSTEM image loopback mount has been removed. The init script now mounts the root partition directly as ext4.
Partition layout:
| Partition | Filesystem | Label | Size |
|---|---|---|---|
| 1 | FAT32 | ARCHR | 256 MB |
| 2 | ext4 | ARCHR_ROOT | 4.6 GB |
| 3 | ext4 | STORAGE | Expands to fill card |
systemd
Fully integrated. v1.0 ran systemd in a minimal configuration with most services disabled. v2.0 has proper service ordering, dependency chains, and RequiresMountsFor directives on all services that access /storage. Key services:
machine-id.service(generates on first boot, before dbus)systemd-timesyncd(NTP sync)systemd-resolved(DNS resolution with fallback servers)connman.service(network management with iwd WiFi backend)archr-autostart.service(quirks, governors, audio setup)save-sysconfig.service(settings persistence)
dbus reliability issues from v1.0 (machine-id symlink to unmounted /storage) have been resolved.
Network and WiFi
Replaced NetworkManager with Connman + iwd. iwd handles WiFi management (scanning, connecting, DHCP) while Connman provides the network abstraction layer.
New WiFi drivers included:
- AIC8800: WiFi + Bluetooth USB dongle (with firmware and udev modeswitch)
- RTL8831: WiFi 6 USB dongle
- Kernel built-in: RTW88 USB variants, RTL8192DU, RTL8XXXU
WiFi passwords with special characters ($, #, !) now work correctly. The ES WiFi menu uses single-quoted passphrase handling to prevent shell expansion.
EmulationStation
Updated to a patched fork with:
- Security hardening: shell argument escaping on all 26
executeScript()calls - Memory improvements: smart pointers for font textures, single-pass VRAM cleanup, weak_ptr race condition fix, SVG malloc replaced with std::vector
- Performance: 70+ copy-by-value loops converted to const references across SystemData, FileData, and GuiComponent
- Locale support: glibc built-in gettext detection fixed (was silently disabled in v1.0)
- Branding: all ROCKNIX references replaced
Mesa / GPU
Mesa 26.0.3 Panfrost, compiled as a package with proper sysroot handling. GLES 3.1 on the Mali-G31. No proprietary blobs.
Display Panels
Expanded from 20 to 24 panels:
- 12 original R36S panels (added Panel 6, R35S Rumble, R36S Plus, RGB20S)
- 12 clone panels (unchanged)
Panel overlays are pre-generated and included in both images. Panel selection is done via the Arch R Flasher or by manually copying the correct .dtbo to overlays/mipi-panel.dtbo.
Joypad Driver
The archr-joypad driver now uses archr-singleadc-joypad as its compatible string (matching the device tree). This was a silent breakage in v1.0 Beta 2 that caused controls to not work on some clone boards.
ZRAM
Enabled by default at 512 MB. Provides swap space without wearing the SD card.
Emulators
78 libretro cores pre-installed, covering:
NES, SNES, Game Boy, GBA, Genesis/Mega Drive, Master System, Game Gear, TurboGrafx-16, Neo Geo, Neo Geo Pocket, Atari (2600/5200/7800/Lynx/Jaguar), ColecoVision, Intellivision, MSX, Amstrad CPC, ZX Spectrum, Commodore 64, Amiga, DOS (DOSBox), ScummVM, PlayStation, N64, Dreamcast (Flycast), PSP (PPSSPP), Nintendo DS, Saturn (Yabause), Arcade (MAME, FBNeo), Wonderswan, Virtual Boy, PC Engine, and more.
32-bit ARM compatibility layer included for cores that require it (pcsx_rearmed, box86).
What Changed from v1.0 Beta 2
For users coming from v1.0 Beta 2:
- Clean flash required. The partition layout, root filesystem type, and boot flow have all changed. There is no upgrade path from v1.0.
- Panel selection is the same. Copy your panel DTBO to
overlays/mipi-panel.dtboon the BOOT partition, or use the Flasher app. - ROMs and saves from v1.0 can be copied to the STORAGE partition after flashing.
- WiFi now uses iwd instead of NetworkManager. Saved networks will need to be re-entered.
Known Issues
- Storage partition auto-expansion runs on first boot (may take a few seconds depending on SD card size).
- Some WiFi dongles may require re-plugging after first boot.
Downloads
| File | Description |
|---|---|
ArchR-R36S.aarch64-20260320-original.img.gz |
For genuine R36S, OGA, OGS, RG351V/M, Chi, R33S, XU10 |
ArchR-R36S.aarch64-20260320-clone.img.gz |
For K36 clones, RGB10/RGB10X/RGB20S, XU-Mini-M, R36Max, EE clone, G350 |
Flash with the Arch R Flasher (v1.1.0) or manually:
gunzip ArchR-R36S-*-original.img.gz
sudo dd if=ArchR-R36S-*-original.img of=/dev/sdX bs=4M status=progress
syncCredits
Built on ROCKNIX, which is built on JELOS, CoreELEC, and LibreELEC. Thanks to Hardkernel, Rockchip, Mesa, RetroArch, Libretro, and EmulationStation.
Arch R v1.0 Beta 2
Arch R v1.0 Beta 2
The biggest Arch R update yet. Kernel fully migrated to mainline, new board + overlay architecture, and the entire build pipeline rewritten from scratch.
Mainline Kernel 6.12.61 LTS
Moved from BSP kernel 6.6 (proprietary fork) to Linux 6.12.61 mainline LTS. Cross-compiles directly from x86 host — no more ARM chroot needed to build the kernel.
- 8 device patches (panel, input, wifi, USB, DTS)
- 7 Panfrost patches (performance counters, BO labelling)
- ntsync patch (future Wine/Proton support)
panel-generic-dsidriver built-in witharchr,generic-dsicompatible
Board + Overlay Architecture
Fundamental change in how hardware is detected:
- Board DTB = hardware profile (GPIOs, PMIC, joypad, audio). 16 boards supported. Auto-selected by U-Boot via ADC reading (SARADC ch0).
- Panel Overlay = display init sequence. 20 panels supported. Applied at boot via
fdt applyin boot.ini. - Two images: Original (R36S, OGA, OGS, RG351V/M, Chi, R33S, XU10) and Clone (K36, RGB20S, RGB10X, XU-Mini-M, R36Max, EE clone, G350).
- Same image works on all boards of a variant — only the panel overlay needs to match your display.
Initramfs Boot Splash
SVG splash rendered directly to framebuffer at ~0.7s after power-on, before systemd starts. Static aarch64 binary embedded in the kernel initramfs.
System Scripts
- Hotkeys: volume and brightness via gamepad (FN + D-pad)
- Automount: SD/USB auto-detection via udev
- Bluetooth agent: pairing without terminal
- Memory manager: OOM prevention
- Sleep/Suspend: deep sleep and freeze modes
- USB gadget: file transfer mode
- Save-config: settings persistence
- gptokeyb: gamepad-to-keyboard mapper via uinput
ES Tools (WIP)
Interactive scripts in EmulationStation's OPTIONS menu: System Info, WiFi, Bluetooth, Performance Mode, Sleep Mode, USB Mode, Factory Reset. Uses fbcon + gptokeyb for gamepad navigation. Still being tested.
Build Pipeline
Full build rewritten with cross-compilation:
build-all.sh
├── build-initramfs.sh # Boot splash SVG
├── build-kernel.sh # Kernel 6.12.61 cross-compile (~10 min)
├── build-rootfs.sh # Arch Linux ARM chroot (~45 min)
├── build-mesa.sh # Mesa 26 Panfrost
├── build-emulationstation.sh # ES-fcamod
├── build-retroarch.sh # RetroArch + cores
├── generate-panel-dtbos.sh # 20 panel overlays
├── build-uboot.sh # BSP U-Boot (original)
├── build-uboot-clone.sh # Mainline U-Boot (clone)
└── build-image.sh # SD card image (×2 variants)
Panel Selection
Use the Arch R Flasher (v1.0.0) to flash and select your panel automatically. Or manually:
# Mount BOOT partition
sudo mount /dev/sdX1 /mnt
# Copy your panel overlay (example: Panel 4 V22, the most common)
sudo cp /mnt/overlays/panel4-v22.dtbo /mnt/overlays/mipi-panel.dtbo
sudo umount /mnt && syncSupported Boards
| Board | DTB | Image |
|---|---|---|
| R36S (original) | rk3326-gameconsole-r36s | Original |
| Odroid Go Advance | rk3326-odroid-go2 | Original |
| Odroid Go Advance v1.1 | rk3326-odroid-go2-v11 | Original |
| Odroid Go Super | rk3326-odroid-go3 | Original |
| Anbernic RG351V | rk3326-anbernic-rg351v | Original |
| Anbernic RG351M | rk3326-anbernic-rg351m | Original |
| GameForce Chi | rk3326-gameforce-chi | Original |
| R33S | rk3326-gameconsole-r33s | Original |
| MagicX XU10 | rk3326-magicx-xu10 | Original |
| K36 / R36S clone | rk3326-gameconsole-r36max | Clone |
| EE clone | rk3326-gameconsole-eeclone | Clone |
| Powkiddy RGB10 | rk3326-powkiddy-rgb10 | Clone |
| Powkiddy RGB10X | rk3326-powkiddy-rgb10x | Clone |
| Powkiddy RGB20S | rk3326-powkiddy-rgb20s | Clone |
| MagicX XU-Mini-M | rk3326-magicx-xu-mini-m | Clone |
| BatLexp G350 | rk3326-batlexp-g350 | Clone |
Full changelog: v1.0-beta1.3...v1.0-beta2
Arch R v1.0-beta1.2
Arch R v1.0-beta1.2
What's new since beta1.1
- Arch R Flasher — Desktop app (Linux/macOS/Windows) for flashing SD cards. Select your console type and panel, and the Flasher does the rest. Available at archr-linux/archr-flasher.
- Pre-merged panel DTBs — Eliminates U-Boot
fdt applycorruption. Each panel gets its own complete kernel DTB, loaded directly at boot. - Accumulated small fixes from continued testing.
Download
| Image | Console | Description |
|---|---|---|
ArchR-R36S-20260302.img.xz |
R36S Original | 6 panel variants pre-merged |
ArchR-R36S-clone-20260302.img.xz |
R36S Clone | 12 panel variants pre-merged |
ArchR-R36S-no-panel-20260302.img.xz |
Universal | All panels, for use with Arch R Flasher |
Flashing
With Arch R Flasher (recommended):
Download from archr-flasher releases, select your console + panel, flash.
Manual:
xz -d ArchR-R36S-20260302.img.xz
sudo dd if=ArchR-R36S-20260302.img of=/dev/sdX bs=4M status=progress
syncPanel selection
On first boot, if your screen is garbled or blank, hold X during the panel wizard to cycle through panels. The selected panel persists across reboots.
Default user: archr / password: archr
Arch R v1.0-beta1.1 — Pre-merged Panel DTBs
What's new in beta1.1
Fix: Non-default panel selection now uses pre-merged DTBs
Users reported that selecting a non-default panel (via the panel wizard) resulted in broken display, audio, or controls. The root cause was BSP U-Boot's fdt apply command corrupting the DTB when replacing properties with different-sized data.
How it's fixed
Panel overlays are now applied at build time using fdtoverlay (verified working on host), instead of at boot time via U-Boot's buggy fdt apply. Each panel gets its own pre-merged kernel-*.dtb. The boot script simply loads the correct DTB by name — no overlay application at boot.
What to test
If your R36S has a non-default panel (not Panel 4-V22 for original, not Clone 8 ST7703 for clone):
- Flash this image
- Run through the panel wizard (beeps + A/B buttons)
- Select your panel → press A → press RESET
- Verify: display, audio, and controls all work correctly
Default panel users: No change — boots exactly as before.
Downloads
| Image | SHA256 |
|---|---|
ArchR-R36S-20260227.img.xz (Original) |
d1af7b12...14497fd |
ArchR-R36S-clone-20260227.img.xz (Clone) |
8e16c2cb...56f1c7bb |
Full checksums
d1af7b1206e666986e307a323afa51882679090e3f4c897f58618751e14497fd ArchR-R36S-20260227.img.xz
8e16c2cb380b0d4b04e0f9615a54a011bbae0a7a93b92aea056f1c7bb91d4aac ArchR-R36S-clone-20260227.img.xz
Flash with: xzcat ArchR-R36S-20260227.img.xz | sudo dd of=/dev/sdX bs=4M status=progress
Report issues at: https://github.com/dgateles/Arch-R/issues