Android
A native client in Kotlin and Compose, package net.varyen.clauder. Every screen is its own rather than the web UI in a webview: the home screen with the dashboard, projects, chats, the session feed, the agent chat, subagents, the agents screen, spend, the file browser, git, the terminal, the opencode chat, the settings.
Connecting
By scanning a QR code on the intro screen: no typing the address and the key by hand. The code is shown by the "This connection" card in the server settings.
Moved to another address — the code is rebuilt, and the phone picks it up with the same scan.
Notifications
Held by a foreground service with its own SSE stream. There is no Firebase at all: that means notifications come straight from your machine and depend on nobody's cloud — but it also means the phone has to let the service live in the background.
They arrive about everything happening on the machine, not only about chats started from the phone: a question from claude in the terminal gets through the same way — provided hooks are connected.
How this differs from Web Push is in Notifications.
Where the session will run
The new-chat form starts with the "Where" line — with a machine rather than a folder: directories, models and commands differ from machine to machine. A machine here is a server profile, and there are four slots: home, spare, one more and the phone itself.
The app brings the server up on the phone by itself — with root through su, without root through the Termux command service — and shows which stage it is on. A chat started on the phone never moves away automatically, even if the phone server goes quiet: silence there is a normal state, not a failure.
In detail — Where the session runs.
Where it differs from the web UI
The terminal — without full emulation: the output is shown as text cleaned of ANSI sequences, the input is a line sent by Enter, and the keys the on-screen keyboard lacks are buttons: Ctrl+C, Tab, history arrows, Esc, Ctrl+D. Cursor programs (vim, top) belong in the web UI.
Installation — a signed APK from the releases page. The app is not in any store.
Everything else is kept at parity on purpose: a feature that appeared in the web UI arrives on Android as its own change, not "some day".