AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Native Android client for CLIque: pair to your own panel, drive tmux-backed CLI sessions, and answer a permission prompt from the notification.
저장소 README에서 가져옴
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.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.