- Serial over Bluetooth & USB (#21) — New
serialnode capability with 5 commands (list,connect,disconnect,write,read). Supports USB serial devices viausb_serialand BLE devices via Nordic UART Service (flutter_blue_plus). Device IDs prefixed withusb:orble:for disambiguation - Gateway Log Timestamps (#54) — All gateway log messages (both Kotlin and Dart side) now include ISO 8601 UTC timestamps for easier debugging
- ADB Backup Support (#55) — Added
android:allowBackup="true"to AndroidManifest so users can back up app data viaadb backup
- Check for Updates (#59) — New "Check for Updates" option in Settings > About. Queries the GitHub Releases API, compares semver versions, and shows an update dialog with a download link if a newer release is available
- Node Capabilities Not Available to AI (#56) —
_writeNodeAllowConfig()silently failed when proot/node wasn't ready, causing the gateway to start with noallowCommands. Added direct file I/O fallback to writeopenclaw.jsondirectly on the Android filesystem. Also fixednode.capabilitiesevent to send bothcommandsandcapsfields matching the connect frame format
| Capability | Commands |
|---|---|
| Serial | serial.list, serial.connect, serial.disconnect, serial.write, serial.read |
- Duplicate Gateway Processes (#48) — Services now guard against re-entry when Android re-delivers
onStartCommandviaSTART_STICKY, preventing duplicate processes, leaked wakelocks, and repeated answers to connected apps - Wakelock Leaks — All 5 foreground services release any existing wakelock before acquiring a new one
- Orphan PTY Instances — Terminal, onboarding, configure, and package install screens now kill the previous PTY before starting a new one on retry
- Notification ID Collisions — SetupService and ScreenCaptureService no longer share notification IDs with other services
- Setup State Detection (#44) —
openclawx onboardno longer says setup isn't done after a successful setup. Replaced slow proot exec check with fast filesystem check for openclaw detection, with a longer-timeout fallback - DNS / No Internet Inside Proot (#45) — resolv.conf is now written to both
config/resolv.conf(bind-mount source) androotfs/ubuntu/etc/resolv.conf(direct fallback) at every entry point: app start, every proot invocation, gateway start, SSH start, and all terminal screens. Survives APK updates - NVIDIA NIM Config Breaks Onboarding (#46) — Provider config save now falls back to direct file write if the proot Node.js one-liner fails (e.g. due to DNS issues)
- Screenshot Capture — All terminal and log screens now have a camera button to capture the current view as a PNG image saved to device storage
- Custom Model Support (#46) — AI Providers screen now allows entering any custom model name (e.g.
kimi-k2.5) via a "Custom..." option in the model dropdown - Updated NVIDIA Models (#46) — Added
meta/llama-3.3-70b-instructanddeepseek-ai/deepseek-r1to NVIDIA NIM default models
- resolv.conf at Every Entry Point —
MainActivity.configureFlutterEngine()ensures directories and resolv.conf exist on every app launch.ProcessManager.ensureResolvConf()guarantees it before every proot invocation. All Kotlin services and Dart screens have independent fallbacks writing to both paths - APK Update Resilience — Directories and DNS config are recreated on engine init, so the app recovers automatically after an APK update clears filesDir
- AI Providers — New "AI Providers" screen to configure API keys and select models for 7 providers: Anthropic, OpenAI, Google Gemini, OpenRouter, NVIDIA NIM, DeepSeek, and xAI. Writes configuration directly to
~/.openclaw/openclaw.json - SSH Remote Access — New "SSH Access" screen to start/stop an SSH server (sshd) inside proot, set the root password, and view connection info with copyable
sshcommands. Runs as an Android foreground service for persistence - Configure Menu — New "Configure" dashboard card opens
openclaw configurein a built-in terminal for managing gateway settings - Clickable URLs — Terminal and onboarding screens detect URLs at tap position (joining adjacent lines, stripping box-drawing characters) and offer Open/Copy/Cancel dialog
- Ctrl Key with Soft Keyboard (#37) — Ctrl and Alt modifier state from the toolbar now applies to soft keyboard input across all terminal screens (terminal, configure, onboarding, package install). Previously only worked with toolbar buttons
- Ctrl+Arrow/Home/End/PgUp/PgDn (#38) — Toolbar Ctrl modifier now sends correct escape sequences for arrow keys and navigation keys (e.g.
Ctrl+LeftsendsESC[1;5D) - resolv.conf ENOENT after Update (#40) — DNS resolution failed after app update because
resolv.confwas missing. Now ensured on every app launch (splash screen), before every proot operation (getProotShellConfig), and in the gateway service init — covering reinstall, update, and normal launch
- Added "AI Providers" and "SSH Access" quick action cards
- DNS Breaks After a While (#34) —
resolv.confis now written before every gateway start (in both the Flutter service and the Android foreground service), not just during initial setup. This prevents DNS resolution failures when Android clears the app's file cache - Version Mismatch (#35) — Synced version strings across
constants.dart,pubspec.yaml,package.json, andlib/index.jsso they all report1.7.3
- Config Snapshot (#27) — Added Export/Import Snapshot buttons under Settings > Maintenance. Export saves
openclaw.jsonand app preferences to a JSON file; Import restores them. A "Snapshot" quick action card is also available on the dashboard - Storage Access — Added Termux-style "Setup Storage" in Settings. Grants shared storage permission and bind-mounts
/sdcardinto proot, so files in/sdcard/Download(etc.) are accessible from inside the Ubuntu environment. Snapshots are saved to/sdcard/Download/when permission is granted
- node-gyp Python Error — Fixed
PlatformException(PROOT_ERROR)during setup caused by npm's bundled node-gyp failing to find Python. Now installspython3,make, andg++in the rootfs so native addon compilation works properly - tzdata Interactive Prompt — Fixed setup hanging on continent/timezone selection by pre-configuring timezone to UTC before installing python3
- proot-compat Spawn Mock — Removed
node-gypandmakefrom the mocked side-effect command list since real build tools are now installed
Requires Android 10+ (API 29)
- Lifecycle-Aware Reconnection — Handles both
resumedandpausedlifecycle states; forces connection health check on app resume since Dart timers freeze while backgrounded - Foreground Service Verification — Watchdog, resume handler, and pause handler all verify the Android foreground service is still alive and restart it if killed
- Stale Connection Recovery — On app resume, detects if the WebSocket went stale (no data for 90s+) and forces a full reconnect instead of silently staying in "paired" state
- Live Notification Status — Foreground notification text updates in real-time to reflect node state (connected, connecting, reconnecting, error)
- Immediate Camera Release — Camera hardware is now released immediately after each snap/clip using
try/finally, preventing "Failed to submit capture request" errors on repeated use - Auto-Exposure Settle — Added 500ms settle time before snap for proper auto-exposure/focus
- Flash Conflict Prevention — Flash capability releases the camera when torch is turned off, so subsequent snap/clip operations don't conflict
- Stale Controller Recovery — Flash capability detects errored/stale controllers and recreates them instead of failing silently
Requires Android 10+ (API 29)
- New Color System — Replaced default Material 3 purple with a professional black/white palette and red (#DC2626) accent, inspired by Linear/Vercel design language
- Inter Typography — Added Google Fonts Inter across the entire app for a clean, modern feel
- AppColors Class — Centralized color constants for consistent theming (dark bg, surfaces, borders, status colors)
- Dark Mode — Near-black backgrounds (#0A0A0A), subtle surface (#121212), bordered cards
- Light Mode — Clean white backgrounds, light borders (#E5E5E5), bordered cards
- Zero-Elevation Cards — All cards now use 1px borders with 12px radius instead of drop shadows
- Pill Status Badges — Gateway and Node controls show pill-shaped badges (icon + label) instead of 12px status dots
- Monochrome Dashboard — Removed rainbow icon colors from quick action cards; all icons use neutral muted tones
- Uppercase Section Headers — Settings, Node, and Setup screens use letterspaced muted grey headers
- Red Accent Buttons — Primary actions (Start Gateway, Enable Node, Install) use red filled buttons; destructive/secondary actions use outlined buttons
- Terminal Toolbar — Aligned colors to new palette; CTRL/ALT active state uses red accent; bumped border radius
- Fade-In Animation — 800ms fade-in on launch with easeOut curve
- App Icon Branding — Uses ic_launcher.png instead of generic cloud icon
- Inter Bold Wordmark — "OpenClaw" displayed in Inter weight 800 with letter-spacing
- Log Colors — INFO lines use muted grey (not red); WARN uses amber instead of orange
- Installed Badges — Package screens use consistent green (#22C55E) for "Installed" badges
- Capability Icons — Node screen capabilities use muted color instead of primary red
- Input Focus — Text fields highlight with red border on focus
- Switches — Red thumb when active, grey when inactive
- Progress Indicators — All use red accent color
- Removed OpenClaw Node app build from workflow (gateway-only CI now)
Requires Android 10+ (API 29)
- 7 Node Capabilities (15 commands) — Camera, Flash, Location, Screen, Sensor, Haptic, and Canvas now fully registered and exposed to the AI via WebSocket node protocol
- Proactive Permission Requests — Camera, location, and sensor permissions are requested upfront when the node is enabled, before the gateway sends invoke requests
- Battery Optimization Prompt — Automatically asks user to exempt the app from battery restrictions when enabling the node
- WebSocket Keep-Alive — 30-second periodic ping prevents idle connection timeout
- Connection Watchdog — 45-second timer detects dropped connections and triggers reconnect
- Stale Connection Detection — Forces reconnect if no data received for 90+ seconds
- App Lifecycle Handling — Auto-reconnects node when app returns to foreground after being backgrounded
- Exponential Backoff — Reconnect attempts use 350ms-8s backoff to avoid flooding
- Gateway Config — Patches
/root/.openclaw/openclaw.jsonto cleardenyCommandsand setallowCommandsfor all 15 commands (previously wrote to wrong config file) - Location Timeout — Added 10-second time limit to GPS fix with fallback to last known position
- Canvas Errors — Returns honest
NOT_IMPLEMENTEDerrors instead of fake success responses - Node Display Name — Renamed from "OpenClaw Termux" to "OpenClawX Node"
| Capability | Commands |
|---|---|
| Camera | camera.snap, camera.clip, camera.list |
| Canvas | canvas.navigate, canvas.eval, canvas.snapshot |
| Flash | flash.on, flash.off, flash.toggle, flash.status |
| Location | location.get |
| Screen | screen.record |
| Sensor | sensor.read, sensor.list |
| Haptic | haptic.vibrate |
- Initial release with gateway management, terminal emulator, and basic node support