← back to robot-framework

# 📱 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 · DASH BATT 87%
http://192.168.1.100:5174 (change)
Drive
↑ ←◼→ ↓
Head
▲ ◀▶ ▼
Say
hello Say
Server
Pair Dash Drop 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.