Show HN: Handsets – A high-performance Android control CLI, built for agents

gaojiuli2 pts0 comments

GitHub - elliotgao2/handsets: A high-performance Android control CLI, built for agents and humans · GitHub

/" data-turbo-transient="true" />

Skip to content

Search or jump to...

Search code, repositories, users, issues, pull requests...

-->

Search

Clear

Search syntax tips

Provide feedback

--><br>We read every piece of feedback, and take your input very seriously.

Include my email address so I can be contacted

Cancel

Submit feedback

Saved searches

Use saved searches to filter your results more quickly

-->

Name

Query

To see all available qualifiers, see our documentation.

Cancel

Create saved search

Sign in

/;ref_cta:Sign up;ref_loc:header logged out"}"<br>Sign up

Appearance settings

Resetting focus

You signed in with another tab or window. Reload to refresh your session.<br>You signed out in another tab or window. Reload to refresh your session.<br>You switched accounts on another tab or window. Reload to refresh your session.

Dismiss alert

{{ message }}

elliotgao2

handsets

Public

Notifications<br>You must be signed in to change notification settings

Fork

Star

main

BranchesTags

Go to file

CodeOpen more actions menu

Folders and files<br>NameNameLast commit message<br>Last commit date<br>Latest commit

History<br>6 Commits<br>6 Commits

.github/workflows

.github/workflows

docs

docs

handsets-cli

handsets-cli

handsets-viewer

handsets-viewer

src/dev/handsets/daemon

src/dev/handsets/daemon

.gitignore

.gitignore

README.md

README.md

build.sh

build.sh

install.sh

install.sh

logo.svg

logo.svg

View all files

Repository files navigation

The device control plane you wished adb was.

$ hs # list devices<br>$ hs use # connect, start daemon, mirror state<br>$ hs info # neofetch-style snapshot (2 ms)<br>$ hs see x.jpg # screenshot — 100× faster than adb<br>$ hs find 'TextView[text~=Login]' # CSS-like selector over the live tree<br>$ hs open com.foo/.MainActivity && hs wait com.foo<br>$ hs type "EditText" "user@example.com" # ACTION_SET_TEXT, no virtual keyboard<br>$ hs do 'EOF' # persistent shell — many cmds, one socket<br>tap_and_dump x=540 y=1500 idle_ms=200<br>EOF

Install

curl -fsSL https://raw.githubusercontent.com/elliotgao2/handsets/main/install.sh | bash

macOS and Linux. Pin a version with HANDSETS_VERSION=v0.1.0 …. Then<br>hs use against a connected device.

Build from source<br>git clone https://github.com/elliotgao2/handsets && cd handsets<br>./build.sh # daemon jar<br>cargo build --release --manifest-path handsets-cli/Cargo.toml # `hs`<br>cargo build --release --manifest-path handsets-viewer/Cargo.toml # `hs see` GUI (macOS)<br>ln -s "$PWD/handsets-cli/target/release/hs" /usr/local/bin/hs

Verbs

Devices

hs list attached devices<br>hs use [SERIAL] connect; auto-spawns the state mirror<br>hs drop [SERIAL] [--keep-jar] disconnect

Inspect

hs info neofetch-style snapshot (2 ms, from local cache)<br>hs see live viewer (Metal + VideoToolbox H.264)<br>hs see foo.{jpg,png,xml,json} capture, format by extension<br>hs ui [-i|--json|--xml] [--all] UI tree dump — `-i` filters to readable<br>interactive elements only (flat columnar)<br>hs find SELECTOR CSS-like: Tag[attr=val]:flag, comma = OR<br>hs show [top | PKG] device state | top activity | package info<br>hs apps [--3rd] installed packages

Activity

hs open COMPONENT start activity<br>hs close PKG force-stop<br>hs install APK [APK …] streamed PackageInstaller, multi-APK<br>hs uninstall PKG

Input

hs tap "Login" | X Y text-lookup or coords<br>hs type TEXT KeyEvents to the focused field<br>hs type SELECTOR TEXT ACTION_SET_TEXT — atomic, bypasses the IME<br>hs go back | home | recents | … key events<br>hs swipe left|right|up|down [DUR_MS] 80% screen swipe (daemon picks coords)<br>hs swipe X1 Y1 X2 Y2 [DUR_MS]

Sync

hs wait idle [Nms] | TEXT | PKG | Nms event-driven, no polling<br>hs cp device:src dst | src device:dst scp-style file transfer

System

hs prop [KEY [VAL]] bare = list all; KEY = get; KEY VAL = set<br>hs settings [NS [KEY [VAL]]] bare = list all 3; NS = list one;<br>NS KEY = get; NS KEY VAL = set

Diagnostics

hs logs [--tail N | --follow] logcat (default last 100)<br>hs events lifecycle stream (am monitor)

Shell

hs shell interactive REPL (history, built-ins,<br>unknown verbs fall through to /system/bin/sh)<br>hs do [WIRE] same REPL, or one-shot raw wire

Docs

Architecture

Benchmark

Sharp edges

About

A high-performance Android control CLI, built for agents and humans

Resources

Readme

Uh oh!

There was an error while loading. Please reload this page.

Activity

Stars

star

Watchers

watching

Forks

forks

Report repository

Releases

v0.1.2

Latest

May 21, 2026

Packages

Uh oh!

There was an error while loading. Please reload this page.

Contributors

Uh oh!

There was an error while loading. Please reload this page.

Languages

Java<br>49.8%

Rust<br>48.8%

Shell<br>1.4%

You can’t perform that action at this time.

handsets reload build github search daemon

Related Articles