How it works Inside The build Questions Source on GitHub Get the APK
v1.0.14 · native Android

Run your agent
from the sofa.

OpenCode Mobile is the Android client for the OpenCode server on your own machine. The reply streams in as it is written, and when the agent stops to ask you something, the question arrives on the phone in your hand.

24 MB signed build · Android 8.0+ · 271 unit tests
adb install -r opencode-mobile-v1.0.14.apk

The chat screen: a streamed answer with reasoning and tool rows above it

A live turn, one card per step

What changes on your phone

Four things stop requiring a walk back to the desk. Each one exists because the phone can do it and a terminal window cannot.

Approve the edit before it lands

A permission request is a card that names the command and the exact pattern that "Always allow" would remember. You see the shape of the permission, not just a yes or no.

Watch a turn land as it happens

The stream keeps running while the app is in the background, so you come back to the answer rather than to a spinner. Long runs stay compact: one panel for every step, with the prose left readable.

Answer the blocking question

When the agent needs a decision the turn stops and waits. The card carries the real choices, so you pick one and the turn carries on from where it paused.

Keep the password off the wire

The server password is sealed with AES-256-GCM under a key held in the Android keystore. The key never leaves the device, and the plaintext never reaches disk.

Your machine keeps doing the work. The phone only decides what happens next.

Three steps to the first turn

The app is a client, so the server comes first. It takes about a minute, and you only do it once per device.

1

Start the server

It prints a URL, a password and a pairing code for this session.

# on the machine that runs the agent
opencode serve --hostname 0.0.0.0 --port 4096
2

Point the app at it

Scan the QR and the host and token are set at once, or type the LAN address and password by hand. Codes are good for one use, for five minutes.

3

Pick a session

Sessions open at the newest turn. Scroll up to page back through history, filter to what is running, or start a new one in a chosen project.

Two screens carry the app

Everything else is either the chat or a sheet that closes. No tabs to learn, no dashboard, nothing to configure twice.

The session list, grouped by recency, with group and filter chips above it
Sessions, grouped and filtered. By project or by when you last touched it, with a count per group and the running ones a tap away.
Settings: the connected server, the dark theme switch and the disconnect action
Settings that fit on one screen. The server you are on, the theme, and a disconnect that forgets the sealed password.
  • No account. Pairing is a code your own server mints, not a sign up.
  • No traffic of its own. It talks to the host you gave it, on your LAN or through a tunnel you control.
  • No model of its own. The agent, the model and the reasoning effort all come from your server.
  • No plaintext credential. The password is sealed at rest and sent only to your server.

The build is the proof

There are no customers to quote, because nobody is a customer. What you can check instead is what the pipeline does on every release.

  • 271unit tests on the data and reducer layers
  • 7themes, each a generated Material 3 scheme
  • 24 MBrelease APK, minified and signed in CI
  • 0analytics or crash SDKs in the dependency list

The release workflow refuses to publish an APK whose version code disagrees with version.properties, or one that apksigner will not verify. See the workflow

Questions before you sideload

The honest answers, including the one about the update that will not install.

Do I need a server running already?

Yes. OpenCode Mobile is a client. It talks to an OpenCode server you run yourself, on a laptop, a desktop or a home machine. Start it with opencode serve and the app has something to connect to.

Does it work away from my home network?

Yes, if you expose the server yourself through a tunnel or a VPN. The app only ever talks to the host you give it, so there is nothing in the middle to configure.

Where does the server password go?

It is sealed with AES-256-GCM under a key that lives in the Android keystore and never leaves it. The sealed value sits in app storage, and the password is only sent to your own server as Basic auth over the connection.

Is there a Play Store version?

No. Every release publishes a signed APK on the Releases page and you sideload it. A store listing would not help an app that is only useful if you already run the server.

Why will the new APK not install over the old one?

The signing key was rotated at 1.0.7, so older builds carry a different certificate and Android refuses the update. Uninstall the old app once, then install normally.

Which Android versions are supported?

Android 8.0 (API 26) and newer. The app is Kotlin and Jetpack Compose, built against API 36.

Does it send telemetry?

No analytics SDK, no crash reporting, no account, no push service. The only network traffic is to the server you configured.

What happens when the connection drops?

The event feed is live only, so the client does not pretend it can repair a gap. It applies the deltas it has, then refetches the message history when the turn ends or the stream reconnects.

Your agent is already running. It is just at the wrong distance.

One signed APK, about 24 MB, no account and nothing to sign up for. If the server is up, you are one pairing code away.

Download the APK