-
Notifications
You must be signed in to change notification settings - Fork 0
Mobile App
blugo is blumi's companion phone app for Android — a Flutter client that mirrors the blumi
terminal UI (TUI) and talks to a blumi serve gateway over your local network. It lets you
drive the same blumi AI coding-agent session from your phone: chat with streaming replies, approve
tool calls, manage sessions, delegate work across a grid of machines, and use voice — all
without anything leaving your Wi-Fi. blumi is a terminal-first AI coding assistant; blugo is how you
carry that assistant in your pocket. It's tuned for the Pixel 9 Pro Fold (single-pane in portrait,
multi-pane unfolded) but runs on any modern Android device.
- blugo is blumi's Android phone app, built with Flutter; it mirrors the blumi TUI.
-
It connects to a
blumi servegateway over your LAN — REST + Server-Sent Events (SSE), same session as the terminal and browser. -
Gateways are auto-discovered over mDNS (multicast DNS) and shown on an interactive network diagram; you can also add one by IP (
host:port). - Tool calls are gated with on-phone permission cards — Allow once / Allow session / Deny (safe commands auto-approve).
- Dispatch gives each node its own chat thread plus a Broadcast channel, with push notifications via Firebase Cloud Messaging (FCM).
- Push is Android-only today and zero-config on the LAN once a Firebase service account is dropped on the gateway.
- Voice: text-to-speech (ElevenLabs / OpenAI) and microphone-to-text (Whisper).
-
Built with Flutter 3.44.1; install a signed release APK via
adb installor build it yourself.
blugo is the official blumi phone app for Android. It is a Flutter client that connects to a
blumi serve gateway running on your computer and renders the exact same blumi session you
see in the terminal — streaming chat, tool approvals, sessions, the grid, and voice. Because it
talks to your own gateway over your LAN, your code and prompts stay on your network.
| Welcome · interactive grid | Chat · streaming | Control center | Command palette |
|---|---|---|---|
| welcome grid diagram | chat | control | command palette |
The whole app rides one design system (Living-Rose tokens + a reusable widget kit), so every screen shares a consistent, animated look — gradient wordmarks, accent-bordered chat bubbles, status colors, pressable cards, and reduced-motion-aware transitions.
When the agent calls a gated tool (and YOLO is off), an inline permission card appears —
Allow once, Allow session, or Deny, right from the phone (safe commands like echo
auto-approve; writes and dangerous commands are gated):
The welcome screen is an interactive network diagram of your blumi grid (drawn natively, no WebView): this device is the hub at the center, your saved gateways orbit it on gradient spokes, and auto-discovered (mDNS) gateways appear as dashed/dotted nodes with a + badge. A radar sweep animates while it scans the LAN.
- Tap a saved node → Connect · Edit · Delete (the forget button sits on the side).
- Tap a dashed (discovered) node → a connect sheet with the password auto-focused; the name, host, and port are pre-filled from discovery.
-
+ Add → add a gateway by IP (
host:port). - A saved gateway whose token went stale prompts for the password again on connect.
Start a blumi serve gateway on your machine, then tap its node on the blugo welcome
diagram (or add it by IP) and enter the gateway password. The same session is then live in the TUI,
the web UI, and the phone.
- On your machine, start a gateway → Gateway:
blumi serve pair blumi serve install --host <LAN-ip>
- Open blugo. Saved + discovered gateways appear as nodes on the welcome diagram — tap a node to
connect, or + to add one by IP (
host:port). - Enter the gateway password. Done — the same session is live in the TUI, web UI, and phone.
You can save multiple gateways by name and switch between them; discovered-but-unsaved ones appear automatically as dashed nodes.
- An interactive grid welcome diagram (above) — connect, edit, forget, or add gateways by tapping nodes.
- A
/command palette (also from the composer) for quick actions: new session, compact, undo, YOLO, control center, speak last reply, switch gateway. - Streaming chat with markdown + syntax-highlighted code, tool cards, and the animated thinking mascot.
- Approval / clarify / plan cards — approve tools (once / session / deny) right from the phone.
- Sessions — new / resume; transcript auto-refreshes after each turn (+ pull-to-refresh).
- Control center — model, persona, theme, YOLO, and tabs for Status, Tasks, Grid, Usage, Skills, Memory, and Voice.
- Grid — delegate a task across your LAN grid right from the phone: pick all peers or one, type a task, and get each machine's result back (hostname + output + latency). It's a direct dispatch, so it works on any model — no tool-calling required. See Grid.
- Voice — TTS (ElevenLabs / OpenAI) and mic→text (Whisper). See Voice.
- Dispatch — a Telegram-style inbox: one isolated quick-chat thread per node + a Broadcast channel, with push notifications so you can fire-and-forget and get the reply back. See below.
Dispatch is a lightweight inbox for talking to your nodes without babysitting a session. Open it from the Dispatch icon on any screen, or from a node's Dispatch action on the welcome diagram.
| Inbox | Thread + push | Broadcast · all nodes |
|---|---|---|
| dispatch inbox | dispatch thread with push | broadcast |
-
A row per node. Each saved gateway gets its own dispatch thread — an isolated session
(stable id
dispatch) that's separate from the workbench chat you see in HomeShell, so dispatching never disturbs whatever you're doing in the main session (and vice-versa). The same thread is live whether you reach it from the inbox or a tapped push. - Fire-and-forget with push. Send a message, background the app, and when the node finishes its turn a push notification lands with a preview of the reply. Tap it to jump straight into that node's thread.
- Broadcast. The top Broadcast row fans one message to every saved gateway at once and shows each node's reply in its own card (with a per-node timeout, so one offline node can't block the rest). Great for "say OK", "what branch are you on?", or a quick health-check across the grid.
Push is on by default and needs no settings in the app. To enable backgrounded delivery, drop a Firebase service account on each gateway machine:
# on the gateway (the machine running `blumi serve`) cp your-firebase-adminsdk.json ~/.blumi/fcm-service-account.json chmod 600 ~/.blumi/fcm-service-account.json
That's it — the gateway auto-detects the file and starts sending turn-complete pushes via FCM HTTP v1 (the project id is read from the file; registered device tokens are pruned automatically when they go stale). Without the file the gateway is a silent no-op — dispatch still works in-app, you just don't get backgrounded pushes. See Configuration for details.
Push is Android-only for now. The app build needs its own
android/app/google-services.json(gitignored); without it the app still builds and falls back to local notifications. Neither the service account norgoogle-services.jsonis ever committed.
blugo is distributed as a signed Android APK that you sideload — it is not (yet) on an app store. Build
the APK with flutter build apk --release and install it over USB with adb.
A signed release APK is produced by flutter build apk --release. Sideload it:
adb install -r build/app/outputs/flutter-apk/app-release.apk
Prereqs: Flutter 3.44.1 stable, Android SDK + JDK 17 (flutter doctor all green).
cd blugo flutter pub get flutter run -d <device> # debug flutter build apk --release # release (signing: see blugo/README.md)
Release signing reads android/key.properties + a keystore (both gitignored). Full steps are in
blugo/README.md.
- The app and gateway must be on the same LAN/Wi-Fi. If discovery fails, add the gateway by
IP and check the gateway is
running(blumi serve status). - Backgrounding the app and returning reconnects automatically (SSE with Last-Event-ID replay).
blugo is Android-only today. It's a Flutter app tuned for the Pixel 9 Pro Fold (single-pane in portrait, multi-pane unfolded) and runs on any modern Android device. Push notifications are also Android-only and rely on Firebase Cloud Messaging (FCM).
No — blugo is sideloaded as a signed APK. Build it with flutter build apk --release and install over
USB with adb install -r build/app/outputs/flutter-apk/app-release.apk. Full signing steps are in
blugo/README.md.
It discovers blumi serve gateways automatically over mDNS (multicast DNS) and draws
them as nodes on an interactive welcome diagram — saved gateways on solid spokes, auto-discovered ones
as dashed nodes with a + badge. If multicast is blocked, tap + to add a gateway by IP
(host:port).
No. blugo talks only to your own blumi serve gateway over your LAN using REST and
Server-Sent Events (SSE), so prompts and code stay on your Wi-Fi. The one optional outbound path is
push notifications, which the gateway sends via Firebase Cloud Messaging (FCM) only if you add a
Firebase service account.
When the agent calls a gated tool and YOLO mode is off, an inline permission card appears with
Allow once, Allow session, or Deny. Safe commands (like echo) auto-approve, while writes
and dangerous commands are always gated.
Yes, on Android. Dispatch sends a push notification with a preview of the reply when a node
completes its turn; tap it to jump into that node's thread. Backgrounded push needs a Firebase service
account on the gateway (~/.blumi/fcm-service-account.json) — without it, dispatch still works in-app
and falls back to local notifications.