Skip to content

An Android companion app — proposing before any PR #241

Description

@KesleyDavid

CONTRIBUTING says big changes should start as an issue. This is that, before
any Android code.

The iOS companion is already in-tree (ios/ + companion/, via #146 / #160 /
#161 / #204). I'd like to add the same OpenMausMobile for Android: a native
Kotlin + Compose client in android/, next to ios/. Same product, same
sidecar — so people can use the companion on either phone.

I have not started a PR. I want agreement on putting it in this repo, and on
the split, first.

What this is (and is not)

The phone is a thin remote client of the existing sidecar, not the desktop UI
on a smaller screen and not a hosted copy of the web app.

  phone ──LAN / Tailscale──▶ companion :8810 ──loopback──▶ harness :8799
                              token, allowlist, Origin refused
  • The computer still owns agents, keys, transcripts, and computers.
  • Pairing stays Settings → Companion (QR / 6-digit / Bonjour / manual /
    MagicDNS). The Android app only redeems openmausbot://pair.
  • Same HTTP + SSE allowlist in companion/src/routes.ts.
  • Same decode/fold contract as ios/Sources/CompanionCore, pinned by
    ios/Tests/CompanionCoreTests/Fixtures.

server/ stays untouched. companion/ stays untouched unless a route the
merged iOS app already uses is missing — I don't think any is.

What I am actually asking

Do you want android/ in this repo?
Native Kotlin + Compose, sitting next to ios/. A fine answer is no — it can
live in a fork.

A Play Store listing can wait. Sideload / Play Internal is enough for a first
merge. Same review note as iOS: a reviewer with no OpenMausBot install still
needs a path that opens (demo/preview).

Proposed v1 (parity with merged ios/ on main)

In: pair, roster, chat, approvals, tasks/search/versions/reactions/share,
computer preview + cloud join, local notifications while connected.

Out of v1: voice/call, keys, connectors, VM, killed-app push, and anything
not yet on main in ios/. Follow the merged iOS app; don't outrun it.

How I would split it

  1. android/core — models, SSE, fold, client, pairing, failover. Tests
    against the existing iOS fixtures. No Activity.
  2. Session + pair + roster + chat + approvals.
  3. Tasks / search / versions / reactions / share.
  4. Computer preview + cloud join + settings + local notifications.
  5. CI: :core:test on Ubuntu; :app:assembleDebug when the SDK job exists.

Each PR stays additive under android/. No dist-server/, no new sidecar
route without its own review.

What I will not do

  • Bind the harness to the LAN
  • Serve src/ in a WebView
  • Widen the allowlist "just in case"
  • Ship push/relay or a hosted copy of local data

If this isn't a direction you want, that's fine — say so and I'll pick
something else.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions