How to Install dArkOS and Google Chrome on the R36S WiFi (Tested Guide)
Share
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.
- 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.
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.
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.
/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.