📱 Dash Remote — the Android app
Yes, it got made. It's an Expo / React-Native phone remote that drives the Dash robot by talking to the laptop control server at :5174 over LAN. This is the separate page for it (per Jake's 6/13 ask). Source of truth: android/App.tsx (the whole app) + android/README.md.
The two screens (rendered from App.tsx — not a screen-grab)
No real screenshot exists in the repo. The mockups below are drawn faithfully from the actual App.tsx styles + layout. To replace them with a real photo, run the app on the Pixel and grab a frame (see "How to run it" below).
Dash Remote
Point me at the laptop control server.
Server URL
http://192.168.1.100:5174
Connect
Laptop and phone must be on the same LAN. Find the laptop's IP with ipconfig getifaddr en0. Last-used URL persists via AsyncStorage.
CONNECTED · DASHBATT 87%
http://192.168.1.100:5174 (change)
Drive
↑
←◼→
↓
Head
▲
◀▶
▼
Say
helloSay
Server
Pair DashDrop Dash
Server picker → Control screen. Polls /health every 2s for the status pill + battery.
What it is
| the idea | A thin phone-side remote for the laptop control server that owns the BLE link to Dash. The phone never BLE-talks to Dash directly in v1 — Dash allows one BLE peer at a time, and that peer is the laptop. The app drives entirely over HTTP. |
|---|---|
| why Expo | Expo managed workflow picked over bare-native Kotlin so it ships in hours, hot-reloads over a tunnel, and reuses Jake's Expo muscle memory. Going bare-native later is one expo prebuild away. |
| two screens | Server picker (URL input + Connect, persists via AsyncStorage) → Control screen (drive pad ↑←◼→↓, head-tilt cross ▲◀▶▼, Say text+button, status pill + battery %, Pair/Drop Dash). |
| API it speaks | GET /health · POST /connect · /disconnect · /command {cmd,params} · GET /telemetry · WS /ws. Commands: forward · backward · turn_left · turn_right · head_up/down/left/right · say · stop. |
| how to run it | bash android/run.sh → npx expo start --tunnel → either scan the QR in Expo Go, or adb-press a with the phone plugged in (USB debugging on). JS changes hot-reload live. |
| stack | android/package.json: Expo SDK 54, RN 0.81.5, React 19.1, @react-native-async-storage/async-storage. Package id com.jakesimonds.dashremote. |
| v1 limits | HTTP polling only (WS consumer is v1.1) · no camera stream back to laptop · no on-device BLE to Dash · plaintext http:// on LAN (basement-fine, not open-internet-fine). |
Direction note: this app is commands DOWN (phone → laptop → robot). The sibling
phone-head/ build is the opposite — sensors UP (Pixel taped to Dash's head streams camera/IMU/compass to the Mac). Different jobs, same robot. See the parent node for phone-head.