AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
A browser panel for every coding CLI on the box. Self-host is free. Paid later if you don't want to run it yourself.
Developer toolsKotlin · HTMLGitHub @thejdubb02OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Native Android client for CLIque: pair to your own panel, drive tmux-backed CLI sessions, and answer a permission prompt from the notification.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A native Android client for CLIque, the self-hosted panel that runs folder-organised coding sessions in tmux.
The prompt is a real Android EditText. That is the point of the app. The panel's website types into a field inside a WebView, and Android keyboards fight that field. This client does not wrap the website. Native chrome, native input, and the panel's xterm.js pane for the terminal.
MIT, matching the server. Built to go on F-Droid: no Play Services, no Firebase, no analytics.Read the full README ↗A native Android client for CLIque, the self-hosted panel that runs folder-organised coding sessions in tmux.
The prompt is a real Android EditText. That is the point of the app. The panel's website types into a field inside a WebView, and Android keyboards fight that field. This client does not wrap the website. Native chrome, native input, and the panel's xterm.js pane for the terminal.
MIT, matching the server. Built to go on F-Droid: no Play Services, no Firebase, no analytics.
The panel it drives is CLIque, a Python standard-library server that keeps CLI sessions alive in tmux. This app talks to its HTTP API and nothing else, so it works against any panel you can reach.
On the laptop, ask the panel for a pairing code (POST /api/pair, or the button in the web UI). On the phone: add the panel URL, tap Pair, type the code. Case and the dash are ignored. The token is stored in EncryptedSharedPreferences, one per server.
Add our F-Droid repository once and updates arrive on their own:
https://fdroid.useclique.dev/repo
The /repo matters. Detail, including the one-time uninstall if you already
sideloaded a build: docs/fdroid-repo.md.
GET /healthz.GET /api/sessions/<id>/wait. When it stopped to ask permission, that notification carries Approve and Deny, which send Enter and Escape without opening the app. That indirection is the point: opening a session attaches a tmux client, the pane repaints, and the panel reads output-after-a-signal as the session having carried on, so the signal is gone in under three seconds.A foreground service (dataSync) runs while the app is waiting on /wait. That call holds a connection for up to 300 seconds, and a backgrounded app will not keep it. The service stops when nothing is being watched.
HTTPS still validates certificates. A private CA can be installed in Android's user CA store (this app trusts user CAs) or pasted as PEM on the server row. There is no "trust all" switch. HTTP is allowed because a panel on a Tailscale or WireGuard tailnet is often http://.
SDK 35, build-tools 35.0.0, JDK 21. Gradle wrapper is in the tree.
export ANDROID_HOME=/opt/android-sdk
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
./gradlew assembleDebug
The APK lands at app/build/outputs/apk/debug/app-debug.apk.
Each one had to earn its place:
| Library | Why |
|---|---|
| AndroidX AppCompat, Fragment, RecyclerView, SwipeRefresh, ConstraintLayout, Core, Lifecycle, Activity | Platform UI. |
androidx.security:security-crypto | Named in the spec for the token store. |
| OkHttp | REST and the /ws terminal stream. HttpURLConnection cannot do WebSockets, and one client carries the per-server CA for both. No Retrofit. |
| kotlinx-coroutines | lifecycleScope for UI work off the main thread. |
| xterm.js (built from source, MIT) | The panel's terminal renderer. Display only; stdin is disabled. |
org.json:json (tests only) | android.jar's org.json throws Stub! on the JVM, so the response parsers could not be tested at all. Test classpath only, never in the APK. |
The JS under app/src/main/assets/vendor/ is not committed. ./gradlew assembleDebug
runs tools/build-xterm.sh when those files are missing: it clones xterm.js
at tag 5.5.0 (the same pin as the CLIque server), builds core plus the fit,
unicode11 and canvas addons, and copies the UMD bundles into vendor/. A later
build that already has the files does not use the network, so --offline still
works.
F-Droid does the same in the recipe (sudo: apt-get install -y npm, then the
script as prebuild). xterm.LICENSE stays in the tree.
It pairs, lists sessions, opens a terminal, and sends a prompt. It does not reimplement the rest of the web panel (files, artifacts, broadcast, notes, settings). Those stay on the laptop.
MIT. See LICENSE. xterm.js is MIT; see app/src/main/assets/vendor/xterm.LICENSE.