Repository navigation
Control Godmode from your phone: iOS and Android app, paired over Tailscale (GODM-33) - #37
Merged
Merged
Conversation
…lscale (GODM-33) - apps/mobile: Expo SDK 57 app (Expo Router, native tabs and headers with Liquid Glass on iOS 26). Home with what agents are doing now, chats that stream as they're written, live browser / shared screen / VM views with tap to take control, agents with their automations, a new-chat sheet, Face ID lock. - Pairing: Settings → Phone shows a one-time QR code (5 minutes, single use, only its hash kept). The phone trades it for its own device key (stored hashed; Keychain / Keystore on the phone). Phones are listed, shown online and can be removed, which disconnects them right away. - Transport: a second listener on this computer's Tailscale address only. It answers /api for paired phones, checks the Host and the decoded path, and a device key opens a fixed set of routes with restricted bodies (no secrets, settings, folders; only screens shared in a chat can be controlled). - The app only sends its key to Tailscale addresses (or https) that prove to be the paired instance, and never retries writes on another address. - Phones get streaming replies only for chats they have open; new sockets get the current activity of every run.
# Conflicts: # .dockerignore # apps/desktop/src/lib/realtime.ts # packages/core/src/db/migrations.ts # packages/core/src/server/ws.ts # packages/shared/src/events.ts # packages/shared/src/index.ts # pnpm-lock.yaml
# Conflicts: # apps/desktop/src/lib/api.ts # apps/desktop/src/lib/queryKeys.ts # packages/core/src/db/migrations.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes GODM-33.
What does this change?
Godmode now has a phone app for iOS and Android (
apps/mobile, Expo SDK 57). It controls the Godmode running on your computer, and nothing else.Connecting (Settings → Phone on the computer)
godmode://pair?d=…opens the app).The settings page shows the Tailscale status, the phone-access switch and port, and paired phones (online state, last seen, remove).
Security
/api/%61uthis refused too).*.ts.net), or over https anywhere, for the planned gateway.Core changes
packages/core/src/mobile/: Tailscale detection (CLI or interface), pairing and devices, the listener, and the phone scope./api/mobile.mobile_devices).conversation.subscribe). New sockets get the current activity of every run, for the desktop too.@godmode/sharedgetsmobile.ts: types, pairing-link encode/parse, URL policy.Tooling
apps/mobilehas its own toolchain (bun) and is excluded from the pnpm workspace. CI, Docker and the desktop build don't install React Native.@godmode/sharedfrom source through Metro.scripts/icons.ts --mobilegenerates the app icons from the logo.How was it tested?
bun testpasses, 757 pass, 0 fail. The newtest/mobile.test.tshas 15 tests. They cover:expo-doctorpasses 21/21.Notes
eas.jsonis included, but no App Store or Play credentials are set up yet.