Android universal remote control app that lets Wilson control his phone via OpenClaw.
- WebSocket Client - Connects to OpenClaw gateway for command reception
- Accessibility Service - Tap, scroll, and type on any app
- MediaProjection - Screen capture capability
- Notification Listener - Read and reply to notifications
- Task Queue - Sequential command execution
- Kill Switch - Shake phone 5 times to disconnect
- Self-Update - Automatic updates via GitHub releases
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β OpenClaw Gateway β
β (WebSocket Server) β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β JSON Commands
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LobsterRemote Android App β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββ β
β β WebSocket β β Task Queue β β Command Executor β β
β β Client ββββΆβ (Sequential)ββββΆβ (tap/scroll/type) β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββ β
β β β β
β βΌ βΌ β
β βββββββββββββββ βββββββββββββββββββ β
β β Auth β β Accessibility β β
β β Validation β β Service β β
β βββββββββββββββ βββββββββββββββββββ β
β β β β
β β βΌ β
β β βββββββββββββββββββ β
β β β MediaProjection β β
β β β (Screenshot) β β
β β βββββββββββββββββββ β
β β β β
β βΌ βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Notification Listener Service β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Commands are sent as JSON over WebSocket:
{"action": "open_app", "package": "com.foodpanda.android"}
{"action": "tap", "x": 500, "y": 300}
{"action": "type", "text": "pizza"}
{"action": "scroll", "direction": "down"}
{"action": "screenshot"}
{"action": "notification", "title": "Reminder", "text": "Meeting at 3pm"}
{"action": "dial", "number": "+85261234567"}{"id": "cmd_123", "success": true, "data": {"action": "tap"}}
{"id": "cmd_124", "success": false, "error": "App not found"}- Android Studio Arctic Fox or newer
- Android SDK 34 (Target) / 26 (Min)
- Kotlin 1.9.20
- Gradle 8.4
# Clone / download project
cd lobster-remote
# Make gradlew executable
chmod +x gradlew
# Build debug APK
./gradlew assembleDebug
# Build release APK (requires signing config)
./gradlew assembleReleaseThe APK will be at: app/build/outputs/apk/debug/app-debug.apk
- Transfer
app-debug.apkto your Android device - Enable "Install from unknown sources" in Settings
- Install the APK
- Open Lobster Remote app
-
Accessibility Service - Required for tap/scroll/type actions
- Settings > Accessibility > Lobster Remote > Enable
-
Notification Listener - Required to read notifications
- Settings > Apps > Special access > Notification access > Enable
-
Screen Capture - Required for screenshots (requested on first connection)
-
Phone - Required for dial action (optional)
- Open Lobster Remote app
- Enter your OpenClaw gateway URL (e.g.,
ws://192.168.1.100:18789/ws) - Enter your auth token
- Click "Save & Connect"
- Grant all required permissions
- All commands validated against OpenClaw auth token
- Only accepts commands when authenticated
- Shows persistent notification when active
- Kill Switch: Shake phone 5 times rapidly to disconnect
Enable "Auto-start on boot" to have the app reconnect automatically after device restart.
The app checks for updates every 12 hours from GitHub releases. To enable:
- Create a GitHub release at
https://github.com/YOUR_USERNAME/lobster-remote/releases - Upload the APK as a release asset
- Update the
UPDATE_CHECK_URLinUpdateChecker.kt
lobster-remote/
βββ app/
β βββ src/main/
β βββ java/com/lobsterremote/
β β βββ LobsterRemoteApp.kt # Application class
β β βββ MainActivity.kt # Settings UI
β β βββ model/
β β β βββ RemoteCommand.kt # Command models
β β βββ service/
β β β βββ RemoteService.kt # Foreground service
β β β βββ LobsterAccessibilityService.kt
β β β βββ NotificationInterceptorService.kt
β β βββ receiver/
β β β βββ ShakeDetectorReceiver.kt
β β β βββ BootReceiver.kt
β β βββ util/
β β βββ PermissionHelper.kt
β β βββ UpdateChecker.kt
β βββ res/
β βββ layout/activity_main.xml
β βββ xml/accessibility_service_config.xml
β βββ values/
βββ build.gradle.kts
βββ settings.gradle.kts
βββ gradle/wrapper/
Go to Settings > Accessibility > Lobster Remote > Enable
Go to Settings > Apps > Special access > Notification access > Enable
Reconnect and grant the media projection permission when prompted
Check network connectivity and ensure the gateway URL is correct
MIT License - See LICENSE file