Run Node.js and OpenClaw natively on Android — no Termux, no chroot, no container.
A KernelSU / Magisk / APatch module that ships a minimal glibc runtime, letting you run upstream Linux node binaries directly on Android. Includes built-in OpenClaw gateway management with a beautiful WebUI.
- Native glibc runtime — 21 prebuilt aarch64 libraries (
ld-linux-aarch64.so.1,libc.so.6,libssl.so.3,libstdc++.so.6, etc.) - Node.js any version — Install any Node.js version (v18+) directly from nodejs.org, no compilation needed
- OpenClaw gateway — One-click install, start/stop toggle, auto-start on boot
- WebUI dashboard — KernelSU Manager WebUI with two tabs: Node.js + OpenClaw
- Boot service — Automatic gateway start after boot with network stabilization delay
- Module toggle — Enable/disable via KernelSU Manager, gateway follows automatically via inotifyd
- Action button — Quick toggle gateway from KernelSU Manager's action button
- Maintenance tools — Backup/restore Node.js, clean npm cache, manage logs
- CLI interface — Full CLI for scripting and automation
- Upgrade-safe — Flashing a new module version preserves your node/ directory and data
| Requirement | Details |
|---|---|
| Architecture | ARM64 (aarch64) only |
| Root | KernelSU (≥ 10670), Magisk, or APatch |
| Android | 10+ recommended |
| Storage | ~50MB for module + ~100MB for Node.js + ~1.2GB for OpenClaw |
Download the latest release .zip from Releases, then flash it:
- KernelSU Manager → Modules → Install from storage → select zip
- Magisk Manager → Modules → Install from storage → select zip
Open the module's WebUI in KernelSU Manager:
- Go to Modules → find Glibc Runner → tap the WebUI icon
- In the Node.js tab, enter version (e.g.
v22.15.0) and click Install Node - Wait for installation to complete (~30 seconds)
Switch to the OpenClaw tab:
- Enter version or leave
latest - Click Install / Update
- Toggle the Gateway Power switch to start
Or via CLI:
su -c 'glibc-runner.service start'The WebUI provides a complete management interface accessible from KernelSU Manager.
- Runtime Status — State, Node/npm versions, last action
- Install Node.js — Version input + Install button
- Maintenance — Backup info, Restore Node, Clean All
- Bootstrap Log — Live log with follow/clear
- Gateway Status — Running state, port, version, installed status
- Gateway Power — Toggle switch to start/stop
- Install / Update — Version input + Install button
- Maintenance — npm cache size, package size, logs, Rollback Version, Clean Cache
- OpenClaw Log — Live gateway log with follow/clear
All commands run as root (su -c '...'):
# Start OpenClaw gateway
su -c 'glibc-runner.service start'
# Stop gateway
su -c 'glibc-runner.service stop'
# Restart gateway
su -c 'glibc-runner.service restart'
# Check gateway status
su -c 'glibc-runner.service gateway-status'
# Check Node.js status
su -c 'glibc-runner.service status'
# Fix bin wrappers after manual npm install
su -c 'glibc-runner.service fix-bins'
# Tail logs
su -c 'glibc-runner.service log openclaw' # gateway log
su -c 'glibc-runner.service log service' # service log
su -c 'glibc-runner.service log bootstrap' # bootstrap log
su -c 'glibc-runner.service log runs' # runs log# Install/update Node.js
su -c '/data/adb/glibc-runner/scripts/update.sh node-apply v22.15.0'
# Background install (non-blocking)
su -c '/data/adb/glibc-runner/scripts/update.sh node-apply-bg v22.15.0'
# Check Node.js status
su -c '/data/adb/glibc-runner/scripts/update.sh node-status'
# Rollback to previous version
su -c '/data/adb/glibc-runner/scripts/update.sh node-rollback-last'# Install/update OpenClaw
su -c '/data/adb/glibc-runner/scripts/update.sh openclaw-apply latest'
su -c '/data/adb/glibc-runner/scripts/update.sh openclaw-apply 2026.4.9'
# Check OpenClaw status
su -c '/data/adb/glibc-runner/scripts/update.sh openclaw-status'
# OpenClaw info (version, cache, sizes)
su -c '/data/adb/glibc-runner/scripts/update.sh openclaw-info'# Backup info (Node.js backups, logs, sizes)
su -c '/data/adb/glibc-runner/scripts/update.sh backup-info'
# Clean all backups, staging, logs
su -c '/data/adb/glibc-runner/scripts/update.sh cleanup'
# Clean npm cache and gateway logs
su -c '/data/adb/glibc-runner/scripts/update.sh npm-cache-clean'# Run node
su -c '. /data/adb/glibc-runner/settings.ini && node --version'
# Install a global package
su -c '. /data/adb/glibc-runner/settings.ini && npm install -g <package>'
# Run any node script
su -c '. /data/adb/glibc-runner/settings.ini && node /path/to/script.js'┌─────────────────────────────────────────────────┐
│ Android Device │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ KernelSU / Magisk / APatch │ │
│ │ │ │
│ │ /data/adb/modules/glibc-runner/ │ │
│ │ ├── module.prop │ │
│ │ ├── webroot/ ← WebUI (HTML/JS/CSS) │ │
│ │ ├── action.sh ← Action button │ │
│ │ └── system/bin/ ← CLI symlink │ │
│ │ │ │
│ │ /data/adb/glibc-runner/ │ │
│ │ ├── settings.ini ← Shared config │ │
│ │ ├── scripts/ │ │
│ │ │ ├── glibc-runner.service ← Service │ │
│ │ │ ├── bootstrap.sh ← Installer │ │
│ │ │ ├── update.sh ← Updater │ │
│ │ │ ├── start.sh ← Boot │ │
│ │ │ ├── glibc-runner.inotify ← Toggle │ │
│ │ │ └── npm-fix-bins.sh ← Fixer │ │
│ │ ├── lib/glibc/ ← 21 glibc .so files │ │
│ │ ├── node/ │ │
│ │ │ ├── bin/node.real ← Real ELF binary │ │
│ │ │ ├── bin/node ← glibc wrapper │ │
│ │ │ ├── bin/npm ← glibc wrapper │ │
│ │ │ └── bin/openclaw ← glibc wrapper │ │
│ │ └── home/ ← $HOME for node │ │
│ └────────────────────────────────────────────┘ │
│ │
│ Boot Flow: │
│ service.d → wait boot_completed + 25s │
│ → start.sh │
│ → glibc-runner.service start │
│ → inotifyd (watches disable file) │
└─────────────────────────────────────────────────┘
Android uses Bionic libc, but upstream Node.js binaries are linked against GNU glibc. This module solves that by:
- Shipping prebuilt glibc libraries for aarch64
- Wrapping every binary with a shell script that invokes the glibc dynamic linker:
#!/system/bin/sh
GLIBC="/data/adb/glibc-runner/lib/glibc"
LD="$GLIBC/ld-linux-aarch64.so.1"
REAL="/data/adb/glibc-runner/node/bin/node.real"
exec "$LD" --library-path "$GLIBC" "$REAL" "$@"This lets unmodified Linux ELF binaries run on Android without any patching.
.
├── META-INF/ # Magisk/KSU flash metadata
├── module.prop # Module metadata
├── customize.sh # Flash-time installer
├── service.sh # Boot service (→ service.d/)
├── action.sh # KSU action button handler
├── uninstall.sh # Clean removal
├── glibc.tar.xz # Prebuilt glibc libs (not in git)
├── glibc-runner/
│ ├── settings.ini # Shared configuration
│ ├── config/
│ │ └── bootstrap.default.env
│ └── scripts/
│ ├── bootstrap.sh # Node.js installer
│ ├── glibc-runner.service # Service manager (start/stop/status)
│ ├── update.sh # Node.js/OpenClaw updater
│ ├── start.sh # Boot entry point
│ ├── glibc-runner.inotify # Enable/disable toggle handler
│ └── npm-fix-bins.sh # Fix bin wrappers after npm install
├── system/
│ └── bin/
│ └── glibc-runner.service # CLI symlink (→ PATH)
└── webroot/
├── index.html # WebUI markup
├── scripts.js # WebUI logic
└── styles.css # WebUI styling
- The
glibc.tar.xzblob containing prebuilt aarch64 glibc libraries (not included in git — see Releases)
# Clone the repo
git clone https://github.com/repotitan/glibc-runner-for-openclaw.git
cd glibc-runner-for-openclaw
# Download glibc.tar.xz from releases and place it in the root
# (or build your own — see CONTRIBUTING.md)
# Build zip
zip -r glibc-runner-v1.1.0.zip . \
-x '.git/*' 'glibc-runner/node/*' 'glibc-runner/lib/glibc/*' \
'README.md' 'CONTRIBUTING.md' 'LICENSE' '.gitignore'# Check bootstrap log
su -c 'glibc-runner.service log bootstrap'
# Verify network
su -c 'ping -c 1 nodejs.org'
# Manual install with specific URL
su -c '/data/adb/glibc-runner/scripts/bootstrap.sh install-node v22.15.0'# Check if openclaw is installed
su -c 'ls -la /data/adb/glibc-runner/node/bin/openclaw'
# Check gateway log
su -c 'glibc-runner.service log openclaw'
# Try manual start
su -c 'glibc-runner.service start'Git must be available on the device. Install via Termux:
pkg install gitThe module automatically adds Termux's bin directory to PATH when running as root.
# Check what's using space
su -c '/data/adb/glibc-runner/scripts/update.sh openclaw-info'
su -c '/data/adb/glibc-runner/scripts/update.sh backup-info'
# Clean npm cache (~700MB after openclaw install)
su -c '/data/adb/glibc-runner/scripts/update.sh npm-cache-clean'
# Clean backups and logs
su -c '/data/adb/glibc-runner/scripts/update.sh cleanup'# Force stop
su -c 'glibc-runner.service stop'| Feature | Glibc Runner | Termux proot | Linux Deploy |
|---|---|---|---|
| Root required | Yes (KSU/Magisk) | No | Yes |
| Performance | Native speed | ~10-30% slower | Near native |
| Disk usage | ~10MB + node | ~500MB+ | ~2GB+ |
| Complexity | Flash & go | Manual setup | Complex setup |
| Node.js version | Any (official binaries) | Termux-patched only | Any |
| WebUI management | Yes | No | No |
| Boot auto-start | Yes | No | Manual |
See CONTRIBUTING.md for development guidelines.
MIT — use freely, contribute back if you can.
Made with ❤️ for the Android modding community