Glasshouse
루팅된 LG webOS TV용 대시보드·프라이버시 제어·Home Assistant 연동
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Android client for Herdr: follow your coding agents from your phone, with alerts, replies and live terminals over SSH.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗The Android companion to wooloo, built with Kotlin + Jetpack Compose for herdr, the terminal multiplexer for coding agents. wooloo mobile connects over SSH and uses herdr's own protocols to show your agents and workspaces, let you reply to them, and drive any pane from your phone.
| Your spaces | Inside a space | Live pane | Connection states |
|---|---|---|---|
Requires Android 8 or newer and a reachable SSH account with herdr installed.
Google Play (closed test): follow the steps at wooloo.dev/mobile: join the wooloo-mobile-testers group, opt in at play.google.com/apps/testing/dev.wooloo.mobile with the same Google account, and install it from Google Play. Google Play needs 12 testers for 14 days before the app can be public.
No server yet? Tap Try the demo machine on the first screen (also in Settings) to explore a simulated herdr session with agents, terminals and alerts that runs on the phone.
APK: open latest release and choose its
wooloo-mobile-X.Y.Z.apk. If no release is available, distribution is not ready;
do not use a debug or smoke-test APK as a production release. Compare the published
SHA-256 and signer fingerprint, allow installation for your browser when Android asks,
and open the app. In-app updates need a separate installation permission for wooloo mobile.
See update and recovery instructions, including transition from debug installs.
Generate a phone key and authorize its public key as described below. Add a machine manually or import its QR, verify the server fingerprint through a trusted channel, select the authorized key, then Connect → space → agent → terminal. A QR does not grant network access or authorize the key. Keep another working server login for recovery.
Read the privacy policy, also available offline in Settings. Quotas are experimental and require per-identity consent to read remote agent tokens and query providers from the phone. Disabling them does not disable SSH. The project code is MIT licensed; dependencies retain their own licenses (see the resolved inventory). Original third-party notices are available offline in Settings → Third-party notices. See the security and license review for dependency updates, disclosure details and open distribution requirements, including provider restrictions on the current Claude quota integration. The launcher uses the readable name wooloo mobile. Provider names identify interoperability and do not imply endorsement.
Report sanitized bugs through GitHub Issues. Report vulnerabilities privately, as described in SECURITY.md. To contribute, read CONTRIBUTING.md; the project follows the Contributor Covenant. The release checklist tracks production signing, public availability and remaining validation.
Everything runs over one SSH connection (sshj). Nothing needs to be installed on the server besides herdr, and no ports are opened:
| Purpose | Remote command (exec channel) | Protocol |
|---|---|---|
| API calls (snapshot, create/rename/close, split, zoom, prompt…) | herdr --session <s> remote-api-bridge | herdr socket API: newline-delimited JSON, one request per connection |
| Live updates | same bridge, kept open with events.subscribe | lifecycle events + per-pane pane.agent_status_changed |
| Live terminal | herdr --session <s> terminal session control <pane> --cols C --rows R [--takeover] | NDJSON terminal.frame records (base64 ANSI) out; terminal.input / resize / scroll / mouse / release in |
| Watch-only | herdr terminal session observe <pane> | same frames, read-only |
The SSH connection is either a direct TCP port or a Cloudflare Tunnel (e.g. wooloo's Remote Access, or
cloudflared tunnel --url ssh://localhost:22). For a tunnel, wooloo mobile opens a WebSocket to wss://<hostname>/ and
carries the raw SSH stream in binary messages, exactly like cloudflared access ssh, so no cloudflared is needed
on the phone. Hostnames behind Cloudflare Access take a service token (CF-Access-Client-Id / -Secret).
remote-api-bridge is the stdio bridge herdr uses for its own saved SSH machines. As herdr's docs recommend,
events only invalidate state, and the authoritative view always comes from session.snapshot.
Non-interactive SSH sessions often lack ~/.local/bin on PATH, so the app looks for herdr in the usual install
locations, or uses the path you set per host.
API calls and subscription handshakes have a 20-second deadline, including exec-channel acquisition. Cancellation interrupts channel IO; if it remains blocked after 250 ms, the app closes the SSH transport so reconnect can recover it. Graceful channel cleanup runs on an IO thread with a separate 250 ms budget; it can add that cleanup time to a request deadline. A peer that never acknowledges channel closure also causes a transport reset. Cancelling an interruptible subscription normally preserves the shared transport.
Requires a herdr server with terminal session control and remote-api-bridge. Tested end-to-end against
herdr 0.9.3 historically, and herdr 0.9.5 / protocol 22 against an isolated
real SSH fixture on 2026-10-17. See live validation
for executed checks and remaining release gates.
agent.prompt, plus one-tap quick replies (Enter, 1/2/3, y/n, Esc, ⇧Tab, Ctrl-C) for permission prompts.ctrl/alt/shift (tap applies to the next key; double-tap locks), auto-repeating arrows, esc, tab, ^C, symbols,
pgup/pgdn, and bracketed paste.authorized_keys path, then authorize it on that machine.You can also append the copied public key manually to the destination account's ~/.ssh/authorized_keys.
Existing herdroid://add-host links remain compatible, including links without an explicit transport (SSH).
The app and Gradle project are named wooloo mobile (wooloo-mobile in Gradle). The existing Android
application ID and Kotlin namespace (dev.herdroid), encrypted storage identifiers, HERDROID_* test
variables and herdroid://add-host links stay compatible with earlier installs and wooloo's QR codes.
Updating the app keeps saved machines, keys and preferences.
See the technical review from October 11, 2026 for build validation, prioritized reliability findings and improvements required before distribution.
./gradlew assembleDebug # app/build/outputs/apk/debug/app-debug.apk
./gradlew testDebugUnitTest # unit tests (emulator, key encoding, protocol, models)
./gradlew assembleRelease # unsigned, minified APK for distribution signing
Optional checks:
# Ed25519 generation, import and signature rejection on the minified APK in an isolated emulator.
# This flag signs release with the debug key only for the smoke test; do not distribute that APK.
./gradlew connectedReleaseAndroidTest -PreleaseSmoke
# End-to-end against a real herdr over SSH (appends a generated test key to the given authorized_keys)
HERDROID_E2E_HOST=127.0.0.1 HERDROID_E2E_PORT=2222 HERDROID_E2E_USER=herd \
HERDROID_E2E_AUTHORIZED_KEYS=/home/herd/.ssh/authorized_keys ./gradlew testDebugUnitTest --tests '*HerdrEndToEndTest*'
# Through a real Cloudflare quick tunnel (`cloudflared tunnel --url ssh://localhost:22`)
HERDROID_CF_TUNNEL_HOST=name.trycloudflare.com ./gradlew testDebugUnitTest --tests '*CloudflareTunnelSocketTest*'
# Re-render the screenshots above (Robolectric native graphics, no device needed)
./gradlew testDebugUnitTest -Pscreenshots --tests '*ScreenshotsTest*'
Requires JDK 17+ and Android SDK 36. minSdk 26.
The release smoke suite selects only ReleaseCryptoTest from app/src/releaseSmokeTest/.
The debug device suite includes that shared crypto test and the Compose UI tests in
app/src/androidTest/. This keeps the minified crypto check focused without preserving the
entire Compose test framework's target ABI in the release app. Device UI checks against the final
signed APK remain a separate release requirement.
app/src/main/java/dev/herdroid/
ssh/ SshSession: sshj transport, TOFU host keys, key/password/keyboard-interactive auth;
CloudflareTunnelSocket: SSH over a Cloudflare Tunnel WebSocket
herdr/ HerdrApi (socket API over remote-api-bridge), TerminalStream, models, RemoteCommand
connection/ HerdrConnection (lifecycle, reconnect, event-driven refresh, alerts), ConnectionManager, Notifier
terminal/ TerminalEmulator (ANSI → grid), TerminalView (Canvas renderer + IME + gestures), KeyEncoder
data/ host profiles, Keystore-backed secrets, SSH key manager, known hosts
ui/ Compose screens: hosts, host editor, keys, session, terminal, settings
authorized_keys,
herdr missing → set its path).herdroid://add-host?… link opens the host editor
prefilled with the transport, host, SSH port, user, session, herdr path and host key fingerprints. Imported
fingerprints pin the server key; changing a saved machine's destination or pins first requires a trust review.
Review the details and fingerprints, choose an authorized SSH key or password
and tap Connect. The QR carries connection details, not SSH credentials; a link never connects by itself.
Quick tunnel hostnames change on every restart, so scanning a new code updates the matching machine (same
name, user and session) instead of adding a duplicate.user@host:2222 (or a tunnel's https:// URL) are split into separate fields automatically.
Several machines can be connected at once.