Full Desktop Chromium on Your Phone: Alpine, i3, and Zero Bloat
Most people running Linux desktops on Android install a full XFCE environment with Debian — file managers, screensavers, settings panels, icon themes — all to run a web browser. That's 3GB of desktop overhead for an app you could launch directly.
Here's a different approach: Alpine Linux, i3 window manager, Chromium, and nothing else. About 600MB total. Full DevTools, Chrome extensions, desktop site rendering, GPU acceleration. No root required.
Why Bother?
Android Chrome is not desktop Chrome. On a Samsung DeX setup with a monitor, keyboard, and mouse — or Xreal AR glasses — you're essentially using a desktop, but your browser is still the mobile version:
- No extensions — no uBlock Origin, no Bitwarden, no Vimium, no dev extensions
- No DevTools — you have to remote debug from another machine
- No real tab management — no profiles, no proper multi-window
- Sites serve mobile versions — even with "request desktop site" toggled
If you're a developer using DeX as a workstation, this is the gap. You need a real desktop browser.
The Options We Considered
flowchart TD
A[Need desktop browser on phone] --> B{Which path?}
B -->|Ubuntu Touch| C[Native Linux on phone]
B -->|Firefox Android| D[Best mobile browser]
B -->|Kiwi Browser| E[Chrome extensions on Android]
B -->|Termux + proot| F[Full desktop Chromium]
C --> C1[Limited devices, lose Android entirely]
D --> D1[Has extensions but no DevTools]
E --> E1[Discontinued Jan 2025]
F --> F1[Full DevTools, extensions, desktop rendering]
style F fill:#c8e6c9
style F1 fill:#c8e6c9
style C1 fill:#ffcdd2
style E1 fill:#ffcdd2
| Option | DevTools | Extensions | Desktop Rendering | Status |
|---|---|---|---|---|
| Android Chrome | No | No | Partial | Active |
| Firefox Android | No | Yes (limited) | Better | Active |
| Kiwi Browser | Yes | Yes | Yes | Dead (Jan 2025) |
| Brave / Vivaldi | No | No | Partial | Active |
| Termux + proot + Chromium | Yes (F12) | Yes (full) | Yes | Active |
The proot approach is the only one that gives you everything. The question is how lean you can make it.
Why Alpine + i3 Instead of Debian + XFCE
The popular Termux desktop projects — phoenixbyrd/Termux_XFCE, LinuxDroidMaster/Termux-Desktops, Dextop — all default to Debian with XFCE. They install a full desktop environment: Thunar file manager, XFCE settings, panel, notification daemon, screensaver (that you then have to kill because it locks you out in proot), Whisker menu, icon themes, GTK themes.
You don't need any of that to run a browser.
| Debian + XFCE | Alpine + i3 | |
|---|---|---|
| Base rootfs | ~150MB | ~3MB |
| Total with Chromium | ~3GB | ~600MB |
| RAM overhead of DE | ~200-400MB | ~5MB |
| Launch time | 3-5 seconds | <1 second |
| Window management | Mouse-driven panels | Keyboard-driven tiling |
| Screensaver issues | Yes (locks you out) | N/A |
| Compositor overhead | Yes (disable manually) | None |
i3 tiles Chromium to fill the screen automatically. No panel eating screen space, no compositor burning CPU, no settings daemon running in the background. On DeX with a keyboard, i3's keybindings feel natural — you're already using keyboard shortcuts for everything else.
The Setup
Prerequisites
You need two apps:
- Termux — from F-Droid or GitHub (not Google Play, it's outdated)
- Termux:X11 — download the APK from github.com/termux/termux-x11/releases, plus install the companion package in Termux
Step 1: Termux Packages
pkg update && pkg upgrade -y
pkg install x11-repo
pkg install termux-x11-nightly \
pulseaudio \
proot-distro \
virglrenderer-android
termux-setup-storage
Step 2: Install Alpine
proot-distro install alpine
That's a 3MB download. Compare that to Debian's 150MB or Ubuntu's 200MB.
Step 3: Configure Alpine
proot-distro login alpine --shared-tmp
Inside Alpine:
apk update && apk upgrade
apk add chromium i3wm i3status xterm \
mesa-dri-gallium fonts-noto-core \
dbus ttf-dejavu
exit
That's it. No desktop environment, no file manager, no themes.
Step 4: Create the Launch Script
Back in Termux, create ~/chrome.sh:
#!/bin/bash
# Kill previous sessions
killall -9 termux-x11 pulseaudio virgl_test_server_android 2>/dev/null
sleep 1
# Start X11 display server
termux-x11 :0 -ac &
sleep 2
# Start audio
pulseaudio --start --exit-idle-time=-1
pacmd load-module module-native-protocol-tcp \
auth-ip-acl=127.0.0.1 auth-anonymous=1
# Start GPU renderer
virgl_test_server_android &
sleep 1
# Launch i3 + Chromium inside Alpine
proot-distro login alpine --shared-tmp \
--bind /sdcard/Download:/root/Downloads \
--bind /sdcard/Documents:/root/Documents -- \
bash -c "export DISPLAY=:0 \
PULSE_SERVER=tcp:127.0.0.1 \
GALLIUM_DRIVER=virpipe \
MESA_GL_VERSION_OVERRIDE=4.0; \
dbus-launch i3"
chmod +x ~/chrome.sh
Step 5: i3 Config for Chromium
Create ~/.config/i3/config inside Alpine (login first with proot-distro login alpine --shared-tmp):
set $mod Mod4
# Launch Chromium
bindsym $mod+Return exec chromium-browser --no-sandbox
# Kill focused window
bindsym $mod+Shift+q kill
# Focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
# Move
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
# Splits
bindsym $mod+b split h
bindsym $mod+v split v
# Fullscreen
bindsym $mod+f fullscreen toggle
# Workspaces
bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3
bindsym $mod+Shift+1 move container to workspace 1
bindsym $mod+Shift+2 move container to workspace 2
bindsym $mod+Shift+3 move container to workspace 3
# Auto-launch Chromium on startup
exec chromium-browser --no-sandbox
Step 6: Disable Phantom Process Killing
Android 12+ will kill your proot session in the background. On Android 14+ (which most modern Samsung phones run), there's a simple toggle:
Settings → Developer Options → Disable child process restrictions → Enable
If that toggle doesn't exist on your Samsung, do it from Termux itself:
pkg install android-tools
# Enable Wireless Debugging in Developer Options
adb pair <ip>:<port> # enter pairing code
adb connect <ip>:<port>
adb shell "/system/bin/device_config set_sync_disabled_for_tests persistent"
adb shell "/system/bin/device_config put activity_manager max_phantom_processes 2147483647"
adb shell settings put global settings_enable_monitor_phantom_procs false
Step 7: Launch
bash ~/chrome.sh
Switch to the Termux:X11 app. i3 loads, Chromium opens full-screen. Press F12 for DevTools.
What Works
flowchart LR
subgraph Android["Android Side"]
A1[DeX Desktop]
A2[Samsung Internet]
A3[Steam Link]
A4[All Android Apps]
end
subgraph Linux["Alpine + i3 Side"]
B1[Desktop Chromium]
B2[DevTools F12]
B3[Chrome Extensions]
B4[Desktop Site Rendering]
end
subgraph Shared["Shared Between Both"]
C1[Clipboard]
C2[Downloads Folder]
C3[Documents Folder]
end
Android <--> Shared
Linux <--> Shared
style Android fill:#e1f5fe
style Linux fill:#c8e6c9
style Shared fill:#fff3e0
| Feature | Status |
|---|---|
| DevTools (F12) | Works |
| Chrome Web Store extensions | Works |
| Desktop site rendering | Works |
| Copy/paste between Android ↔ Chromium | Works |
| File downloads to Android Downloads folder | Works |
| File uploads from shared folders | Works |
| GPU acceleration (VirGL) | Works |
| Audio playback | Works |
| Multiple Chromium windows (i3 tiling) | Works |
| Google account sync | No (Chromium limitation) |
What Doesn't (and Workarounds)
No bookmark/password sync — Chromium strips out Google's proprietary sync. Install Bitwarden for passwords and xBrowserSync for bookmarks from the Chrome Web Store. Both sync across all your devices.
No Android share intents — clicking a link in an Android app won't open it in proot Chromium. Copy-paste URLs between the two worlds.
No drag and drop — between Android and the X11 window. Use the shared filesystem instead.
No push notifications — Chromium web notifications don't bubble up to Android's notification shade.
The Alternative: Cloud Browser
If maintaining a local proot setup isn't your thing, you can achieve similar results with a Docker container on a cloud server:
# On Fly.io, DigitalOcean, etc.
docker run --rm -it --shm-size=512m \
-p 6901:6901 \
-e VNC_PW=your-password \
kasmweb/chrome:1.18.0
Open https://your-server:6901 from any Android browser. Full Chrome with DevTools, accessible from anywhere. Tradeoff: network latency on every interaction vs. the local setup's zero latency.
Both can coexist — local for daily use, cloud for when you're away from your phone or need a disposable browser session.
Why This Matters
The XFCE + Debian crowd is recreating a laptop experience on a phone. That's backward. A phone connected to DeX with a keyboard and monitor is already a desktop — it just needs the one app that Android Chrome can't provide.
i3 + Alpine + Chromium is a purpose-built tool, not a general-purpose desktop. It launches in under a second, uses 5MB of RAM for the window manager, and gives you exactly what you need: a real browser with real DevTools. Everything else — file management, settings, media — stays on the Android side where it works better anyway.
Stop installing desktop environments to run a browser. Just run the browser.
Tools referenced in this post:
- Termux — Android terminal emulator
- Termux:X11 — X11 display server for Android
- proot-distro — Linux distribution manager for Termux
- Alpine Linux — Lightweight Linux distribution
- i3 Window Manager — Tiling window manager
- Chromium — Open-source browser
- VirGL — Virtual GPU for 3D acceleration
- Bitwarden — Password manager (Chrome extension)
- xBrowserSync — Bookmark sync (Chrome extension)
- KasmWeb Chrome — Docker image for cloud browser