Koder Eye turns any Android device into a live UI sensor. It exposes the full accessibility tree, real-time events, screenshots, OCR, and gesture injection as a local REST API — securely over ADB, with no cloud calls.
Six capabilities in a single lightweight Android app. No root, no USB shell during a session — just ADB port forwarding.
Complete accessibility tree via GET /screen, flat text via /screen/text, clickables via /screen/buttons. Compose Button labels resolved with DFS fallback.
On-device screenshot via POST /capture and ML Kit Latin-script recognition via POST /ocr. Region crop supported. No cloud calls, no internet.
Accessibility events delivered via SSE stream (GET /events/stream) or long-poll (GET /events?wait=5000). No busy-polling needed.
Tap, scroll, type, back, home, recents via POST endpoints. Gated by an in-app toggle — OFF by default. Every action is logged for audit.
Binds to 127.0.0.1:9876 only. Bearer token required (32-byte random, stored in Android Keystore AES-256-GCM). Rate-limited at 20 RPS (5 RPS for heavy endpoints).
Zero-dependency Python 3 CLI (keye). 18 commands including keye fanout text for multi-device aggregation and keye text --since-last for diff-only output.
Three steps to give your agent eyes: install, forward, call.
Install the APK, grant the Accessibility permission, and start the foreground service. No root required.
Every HTTP call returns structured data your agent can parse and reason about — no image captioning required.
/screen/diff?since=)Close the loop: inject gestures, observe the resulting events, verify the new screen state — all in a tight, auditable loop.
EYE-INJECTED-* eventKoder Eye is the only option designed to be consumed by a long-running AI agent over a persistent HTTP connection.
| Feature | Koder Eye | uiautomator2 | Maestro | Manual ADB |
|---|---|---|---|---|
| Local HTTP API (no USB shell per call) | ✓ | — | — | — |
| Full accessibility tree | ✓ | ✓ | ✓ | — |
| Real-time event stream (SSE) | ✓ | — | — | — |
| Long-poll (no busy-loop needed) | ✓ | — | — | — |
| On-device OCR (no cloud) | ✓ | — | ✓ | — |
| Screen diff / change detection | ✓ | — | — | — |
| Bearer token auth | ✓ | — | — | — |
| Multi-device fanout | ✓ | — | — | — |
| No test framework required | ✓ | — | — | ✓ |
No. Koder Eye uses the standard AccessibilityService API, which requires only the user to enable the service in Settings. No root, no special Android build.
Never. The Eye server binds exclusively to 127.0.0.1:9876 — unreachable from the LAN. Data flows only between the Android device and your laptop over the ADB tunnel. OCR runs fully on-device via ML Kit. There is no outbound HTTP code in the app.
No. A valid Bearer token is required on every request except /healthz. The token is a 32-byte random value stored in EncryptedSharedPreferences (Android Keystore AES-256-GCM) and only delivered to your laptop via the ADB tunnel.
Android 9.0 (API 28) or higher. Screenshot capture (POST /capture) requires API 30+. The app targets API 36 (Android 16).
The built-in rate limiter returns 429 Too Many Requests with a Retry-After header. Default limits: 20 RPS for lightweight endpoints, 5 RPS for /screen, /capture, and /ocr. Use GET /events?wait=5000 instead of polling /screen repeatedly.
No. The "Allow injection" toggle in the app is OFF by default. The agent cannot tap, scroll, or type without the developer explicitly enabling it. Every injection emits an EYE-INJECTED-* event in the log.
Download Koder Eye, run keye setup, and your agent has eyes in seconds.