R36S WiFi handheld on a workbench running a web browser, laptop in the background

How to Install dArkOS and Google Chrome on the R36S WiFi (Tested Guide)

We tested every step below on an R36S WiFi from our own stock, on 5 September 2026. Where something did not work, we say so. Do all of this on a spare SD card so the card your console shipped with stays exactly as it is.

What you get at the end
  • dArkOS on your R36S WiFi: the same games menu you know, but running on Debian 13 underneath, with a full package manager.
  • Google Chrome 152 for ARM64, launched from the games menu, with the analog stick as a mouse and an on-screen keyboard.
  • GeForce NOW that actually signs in and streams. It works. It also runs hot and is limited by the console's hardware, and we explain exactly how.

Why bother? A short, honest version

The stock ArkOS on the R36S is built on Ubuntu 19.10. That was fine for emulators, but the newest browser it can install is Firefox 78 from 2020, and cloud gaming services refuse it outright. On our test unit GeForce NOW loaded, let us sign in, then failed to start every game with error 0xC0F22210, and network monitoring showed the stream never even began.

dArkOS replaces the Ubuntu base with current Debian while keeping the console's own kernel and drivers. Debian 13 is new enough that Google's official ARM64 build of Chrome installs on it, and GeForce NOW accepts Chrome 152 without complaint. That single change is what turns the R36S WiFi into a device that can stream PC games.

Before you start

  • A spare microSD card, 16 GB or larger. The image itself is 7.7 GB. Keep your original card in a drawer; if anything goes wrong you swap it back and nothing has changed.
  • A Windows PC with a card reader, Rufus, and 7-Zip.
  • The R36S WiFi on a charger. First boot does two automatic reboots and you do not want the battery dying mid-way.
  • Genuine unit check. dArkOSen is built for genuine R36 boards. Every R36S WiFi we ship selected correctly under the R36S list in step 4 below. If you bought a console elsewhere and its board is a K36 or "Soy Sauce" clone, this build does not support it.
Back up your display files first. Put your original card in the PC. Copy everything from its small BOOT partition, especially every .dtb file and the ScreenFiles folder, somewhere safe. These describe your exact screen panel. You may need them to pick the right model in step 4, and they are your recovery if a screen setting ever goes wrong.

Part 1: Install dArkOS

Step 1: Download the image

Get the latest release of dArkOSen for the R36S. It comes as two 7-Zip parts, roughly 1.45 GB and 1.3 GB. Put both in the same folder and extract the first one with 7-Zip; it produces a single .img file of about 7.7 GB.

Step 2: Flash with Rufus, and only Rufus

Select your spare card in Rufus, choose the .img, and write it. The developer is explicit that other flashing tools tend to corrupt the system files on this image, and that re-flashing with Rufus fixes most odd behaviour. We used Rufus and had no problems.

Step 3: Do not boot yet

After flashing, Windows shows a small drive called BOOT. Leave the card in the PC.

Step 4: Select your model

On that BOOT drive, run SELECT MODEL.bat. It lists board revisions such as R36S-V21 2024-12-18 2550. Open your console's battery cover or look at the board photo from when you took it apart, if you ever did: the version, date and a four-digit code are printed on the board.

The four-digit code matters more than it looks. Several entries share the same version and date but drive completely different screen panels. On our test unit the board read R36S-V21 2024-12-18 and the correct entry was 2547. Two entries in that list use a 29 MHz panel; all the others use a 57.8 MHz panel, and picking the wrong family gives you a console that boots perfectly with a black screen.

If you are unsure, pick your best guess. A wrong panel is not permanent: put the card back in the PC and run the selector again with another entry.

Step 5: First boot

Insert the card in slot 1 and power on. The console reboots twice on its own while it expands the storage partition, then lands in the familiar games menu. Give it two to three minutes and do not touch the power button.

Step 6: Connect WiFi and enable remote access

In the games menu open Options, then NETWORK SETTINGS. This build folds the Wi-Fi Manager into that one menu. Turn WiFi on, pick your network and type the password with the on-screen keyboard. In the same menu turn on REMOTE SERVICES; that enables SSH, which you need for Part 2.

The login is user ark, password ark. Change it if your network is shared.

One hardware fact worth knowing. The R36S has a single USB port inside, and on the WiFi model the WiFi module lives on it. Plugging a USB keyboard or mouse into the Type-C socket puts a second device on that same port and knocks WiFi offline. We confirmed this the hard way. Use SSH from a PC instead, or a powered USB-C hub if you really need both.

Part 2: Install Google Chrome

Everything from here is typed into an SSH session from your PC. On Windows, PuTTY or the built-in ssh command both work: ssh ark@<console IP>. The address is shown in the network menu.

Step 7: Install Chrome

sudo apt-get update
cd /tmp
sudo curl -L -o chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_arm64.deb
sudo apt-get install -y ./chrome.deb

Step 8: Fix the graphics library conflict

If you try to run Chrome now it fails with undefined symbol: gbm_bo_get_modifier. dArkOS points the standard graphics library at the Mali GPU driver, which does not provide that function. Do not replace the system library, because the emulators need it. Give Chrome its own private copy instead:

cd /tmp
sudo apt-get download libgbm1
sudo mkdir -p /opt/chrome-libs /tmp/gbmx
sudo dpkg-deb -x libgbm1_*_arm64.deb /tmp/gbmx
sudo cp -a /tmp/gbmx/usr/lib/aarch64-linux-gnu/libgbm.so.1* /opt/chrome-libs/
LD_LIBRARY_PATH=/opt/chrome-libs google-chrome-stable --version

The last line should print Google Chrome 152 or newer.

Step 9: Install a display server

The games menu draws straight to the screen without a desktop, so Chrome needs a minimal X server to appear on the panel.

sudo apt-get install -y --no-install-recommends \
  xserver-xorg-core xserver-xorg-video-modesetting xserver-xorg-input-evdev \
  xserver-xorg-input-joystick xinit x11-xserver-utils xdotool xvkbd xinput openbox

Step 10: Configure the display and the controller

Create /etc/X11/xorg.conf. The modesetting driver is the one that works; the framebuffer driver fails on this hardware.

Section "Device"
    Identifier "scrn"
    Driver "modesetting"
    Option "kmsdev" "/dev/dri/card0"
    Option "AccelMethod" "none"
    Option "ShadowFB" "true"
EndSection
Section "Monitor"
    Identifier "mon"
EndSection
Section "Screen"
    Identifier "scr"
    Device "scrn"
    Monitor "mon"
EndSection
Section "ServerFlags"
    Option "AutoAddDevices" "true"
    Option "DontVTSwitch" "true"
EndSection

Create /etc/X11/xorg.conf.d/50-joystick.conf. This turns the left stick into a mouse pointer, the right stick into a scroll wheel, and the face buttons into clicks.

Section "InputClass"
    Identifier "joystick pointer"
    MatchIsJoystick "on"
    MatchDevicePath "/dev/input/event*"
    Driver "joystick"
    Option "StartKeysEnabled" "False"
    Option "StartMouseEnabled" "True"
    Option "MapAxis1" "mode=accelerated axis=+3x deadzone=4000"
    Option "MapAxis2" "mode=accelerated axis=+3y deadzone=4000"
    Option "MapAxis3" "mode=relative axis=+1zx deadzone=9000"
    Option "MapAxis4" "mode=relative axis=+1zy deadzone=9000"
    Option "MapButton1" "buttonmap=1"
    Option "MapButton2" "buttonmap=3"
    Option "MapButton3" "buttonmap=2"
    Option "MapButton5" "buttonmap=4"
    Option "MapButton6" "buttonmap=5"
EndSection

Create /root/openbox-rc.xml. A window manager is required: without one Chrome never repaints after a resize and half the screen stays black.

<?xml version="1.0" encoding="UTF-8"?>
<openbox_config xmlns="http://openbox.org/3.4/rc">
  <theme><titleLayout></titleLayout><keepBorder>no</keepBorder></theme>
  <applications>
    <application class="*"><decor>no</decor></application>
  </applications>
</openbox_config>

Step 11: Fix audio

Chrome runs as root here and the sound server refuses root by default. The sound card also starts on an input-only profile when nothing is plugged into the headphone jack. Two commands fix both permanently:

sudo gpasswd -a root pulse-access
sudo systemctl enable --now pulseaudio 2>/dev/null || true

The session script below sets the card profile each time it starts, so you do not need to touch it again.

Step 12: The session script

Create /home/ark/xsession.sh. It starts the sound, the window manager, an on-screen keyboard on the lower half of the screen, and Chrome in the upper half, pointed at GeForce NOW. Change the URL to anything you like.

#!/bin/bash
export HOME=/root
export DISPLAY=:0
export LD_LIBRARY_PATH=/opt/chrome-libs
URL="${1:-https://play.geforcenow.com/}"

pulseaudio --system --daemonize --disallow-exit --exit-idle-time=-1 >/dev/null 2>&1
sleep 3
export PULSE_SERVER=unix:/run/pulse/native
pactl set-card-profile 0 'output:stereo-fallback+input:stereo-fallback' 2>/dev/null
pactl set-sink-volume alsa_output.platform-rk817-sound.stereo-fallback 100% 2>/dev/null
amixer -c 0 sset 'Playback Path' 'SPK_HP' >/dev/null 2>&1

openbox --config-file /root/openbox-rc.xml &
sleep 3
xvkbd -no-keypad -no-functionkey -geometry 640x230+0+250 &
sleep 2
google-chrome-stable --no-sandbox --disable-dev-shm-usage \
  --user-data-dir=/root/chromedata --window-position=0,0 --window-size=640,248 \
  --no-first-run --no-default-browser-check "$URL" &
CPID=$!
for i in $(seq 1 40); do
  CW=$(xdotool search --class -- chrome 2>/dev/null | tail -1)
  [ -n "$CW" ] && break
  sleep 2
done
sleep 8
KBW=$(xdotool search --class -- xvkbd 2>/dev/null | tail -1)
[ -n "$KBW" ] && xdotool windowsize --sync $KBW 640 230 && xdotool windowmove $KBW 0 250
[ -n "$CW" ] && xdotool windowsize --sync $CW 640 248 && xdotool windowmove $CW 0 0 && xdotool windowfocus $CW
wait $CPID

Create /home/ark/ffx.sh, which pauses the games menu and hands the screen to X:

#!/bin/bash
export HOME=/root
systemctl stop emulationstation
for i in $(seq 1 20); do systemctl is-active --quiet emulationstation || break; sleep 1; done
sleep 6
xinit /home/ark/xsession.sh -- /usr/bin/Xorg :0 vt1 -nolisten tcp -logfile /home/ark/xorg.log

Make both executable, then create the service /etc/systemd/system/ffx.service. The last line is what brings the games menu back when you quit Chrome, so you are never left at a black screen.

[Unit]
Description=Chrome browser session on console display
[Service]
Type=simple
ExecStart=/home/ark/ffx.sh
ExecStopPost=/bin/systemctl start emulationstation
TimeoutStopSec=20
chmod +x /home/ark/xsession.sh /home/ark/ffx.sh
sudo systemctl daemon-reload

Step 13: Add it to the games menu

Create /opt/system/Web Browser.sh so a "Web Browser" entry appears under Options:

#!/bin/bash
sudo systemctl reset-failed ffx 2>/dev/null
sudo systemctl start ffx
sudo chmod +x "/opt/system/Web Browser.sh"

That is it. Pick Web Browser from Options and Chrome appears on the console. To quit, open Chrome's menu at the top right and choose Exit; the games menu returns within a few seconds.

Two things that trip people up. First, do not put scripts on the ROMs partition; it is exFAT and cannot hold them reliably, which is why the launcher lives in /opt/system. Second, the games menu name is truncated in process lists, so always check it with systemctl is-active emulationstation rather than searching for the process by name.

Part 3: GeForce NOW, and what to expect

Open Chrome, sign in to GeForce NOW as normal and it works: the service accepts the browser, the library loads, and launching a title starts a real stream on the console screen. We verified the stream end to end; how well a given game plays depends on the limits listed further down. Before you play, open the menu, go to Settings, then Gameplay, and set Streaming quality to Custom with these values. They halved the CPU load on our unit compared with the defaults.

Setting Value Why
Resolution 1024 × 768 (4:3) The smallest the service offers, and fewer pixels than 720p. It matches the 4:3 screen.
Frame rate 30 FPS Halves the decoding work.
Max bit rate 10 Mbps The internal WiFi measured about 15 Mbit/s on our unit; this leaves headroom.
Codec H.264 Leave as it is.

Controller in games

With the setup above the stick is a mouse, which is what you want for menus and not what you want in a game. GeForce NOW needs the browser to see a real gamepad. The reliable way is xboxdrv, which presents the R36S pad to Chrome as an Xbox 360 controller that games map automatically. Install it with sudo apt-get install -y xboxdrv, and once a game is streaming run this from SSH, then disable the mouse mapping with xinput disable on the "GO-Super Gamepad" pointer device:

sudo xboxdrv --evdev /dev/input/event2 --mimic-xpad --silent \
  --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RX=x2,ABS_RY=y2 \
  --evdev-keymap BTN_A=a,BTN_B=b,BTN_X=x,BTN_Y=y,BTN_TL=lb,BTN_TR=rb,BTN_TL2=lt,BTN_TR2=rt,BTN_TRIGGER_HAPPY1=back,BTN_TRIGGER_HAPPY2=start,BTN_DPAD_UP=du,BTN_DPAD_DOWN=dd,BTN_DPAD_LEFT=dl,BTN_DPAD_RIGHT=dr

Note that this build swaps A and B globally, so if a button feels reversed in a game, swap BTN_A=a,BTN_B=b to BTN_A=b,BTN_B=a. We automated the switch between mouse mode and gamepad mode with a small script bound to Start + B; ask us if you want it.

The honest limits

  • Video is decoded on the CPU, not the GPU. The Mali graphics driver on this system only supports one display mode, and it is not the one browsers use, so Chrome cannot reach it. We tested newer Mali drivers and they refuse the console's kernel. Under a stream all four cores run flat out.
  • It gets hot and throttles. Within a couple of minutes of streaming the chip reaches its thermal limit and drops from 1.5 GHz to 1.0 GHz. That is physics, not a setting; raising the thermal limit only makes it run hotter for the same speed. Expect it to be playable for slower games and rough for anything twitchy.
  • The screen is 640 × 480 and the service's smallest stream is larger, so everything is scaled down.
  • You need to own the games. If a launch drops you on the Steam store instead of the game, that title is not in your linked library.
  • Only genuine R36 boards. Clones are not supported by this build.

Going back

Power off, swap your original card back into slot 1, power on. Nothing on it was touched. The spare card keeps dArkOS and Chrome ready for whenever you want them.

Questions about any step? Message us on WhatsApp from the product page and mention this guide. We tested it on the exact console we sell, so we can usually tell you what went wrong from a photo of the screen.

Back to blog