A HeadSpin device farm, driven from your terminal — lock a phone, record a session, crawl an app for defects, pull performance reports. Live-validated on 34 real devices. No mocks.
List every phone, tablet, TV in the farm — status, model, OS. 34 Android/iOS/Roku online.
Lock a device, open an Appium session, tap / swipe / type / launch apps in real time.
Full lifecycle: lock → record → drive → stop → download the MP4, HAR, logs.
Crawl the app and surface real UI / accessibility bugs from its live a11y tree.
Pull HeadSpin's issue cards — page-load, frame rate, audio — plus network waterfalls.
Turn exploration findings into standardized, redacted bug reports with full evidence.
One command, every device, real-time status.
/headspin:devices --platform android
# → hs_list_devices (GET /v0/devices, Bearer auth)
SAMSUNG SM-G991U android 14 status 3 · ready
GOOGLE Pixel 6 android 12 status 3 · ready
SAMSUNG SM-G973W android 12 status 3 · ready
ROKU Streaming Stick+ 15.2.4 status 3 · ready
…
34 devices online · 20 android · iOS · Roku
Lock a device, open a session, send real input.
/headspin:connect android locks the device and opens a real Appium wd/hub session against the target app — routed automatically for Android, iOS, or Roku.
/headspin:control — screenshot, tap, swipe, keypress, launch. Backed by hs_adb_shell: input tap, input swipe, am start.
Lock → record → drive → stop → download — six real REST calls.
HeadSpin's own performance analysis, surfaced as issue cards.
Page-load, low frame rate, audio-too-quiet, and more — HeadSpin's Waterfall verdicts on the session.
Discover up to 31 device signals — memory, battery, network, video-quality MOS — then hs_session_timeseries_download pulls any series to CSV.
Full HAR of every request, plus pcap and TLS exceptions for gap analysis.
MP4 metadata, capture start/stop marks, analysis-ready status polling.
Crawl the app, read its accessibility tree, flag real UI defects.
page_source + a screenshot at every screen.A system "isn't responding" / "has stopped" dialog on top of the target app.
criticalA control whose entire subtree has no text or content-desc — TalkBack can't announce it.
mediumA clickable ImageButton leaf with empty content-desc and no labelled child.
An on-screen control below 48 dp — the Material / WCAG 2.5.8 minimum.
lowOn the Security screen, the Dismiss (✕) button on the "Update this device" banner is 63×63 px ≈ 24.5 dp — half the Material minimum. Package-scoped, source-cited, screenshot-corroborated.
Standardized reports, full evidence, tokens redacted.
{
"session_id": "59d2da99-…",
"target_app": { "package": "com.android.settings",
"screen": "Security" },
"defect": {
"class": "A5_undersized_touch_target",
"element": "banner_dismiss_btn",
"bounds": "[922,1174][985,1237]", # 63×63px = 24.5dp
"evidence": { "source": "vg3-s7.xml",
"screenshot": "vg3-s7.png" }
}
}
| Area | Tools |
|---|---|
| Devices | hs_list_devices · hs_idevice_info · hs_installer_list · hs_login_details |
| Lock / drive | hs_adb_lock · hs_adb_unlock · hs_adb_shell · hs_lock_device · hs_unlock_device |
| Capture | hs_start_capture · hs_stop_capture · hs_list_sessions |
| Analysis | hs_session_issues · hs_session_timeseries_info · hs_session_timeseries_download · hs_analysis_status |
| Artifacts | hs_session_download · hs_session_video_metadata · hs_session_timestamps · hs_session_tls_exceptions |
| Command | What it does |
|---|---|
/headspin:setup | Verify config & onboard the plugin |
/headspin:login | Authenticate — mint an API token (env only) |
/headspin:devices | List the live device roster |
/headspin:connect | Lock a device & open a control session |
/headspin:control | Drive it — tap, swipe, type, screenshot |
/headspin:capture | Full lock → record → drive → stop → download |
/headspin:explore | Crawl the app for real UI / a11y defects |
/headspin:report | File standardized bug reports |
/headspin:sessions · :waterfall | Pull performance reports & network waterfalls |
# 1 · onboard + authenticate (token stays in env, never on disk)
/headspin:setup
/headspin:login
# 2 · pick a live device
/headspin:devices
# 3 · crawl an app for real defects
/headspin:explore com.android.settings
# 4 · file what it found
/headspin:report
github.com/krzemienski/headspin-control