Repository navigation
Releases: LinDevHard/wadb
Release list
v1.3.0
wadb v1.3.0 — agent-friendly CLI
This release adds a stable automation contract for AI agents and scripts while keeping the existing interactive workflow intact. Agents can now discover what wadb can do, inspect Android devices, select targets safely, and interpret failures without parsing terminal prose.
Highlights
- Versioned JSON output: use
--output jsonto receive exactly one schema-versioned response object on stdout. Progress and diagnostics stay on stderr. - Safe non-interactive operation:
--non-interactiveandWADB_NON_INTERACTIVEprevent terminal prompts. Pairing codes are accepted through redirected stdin and never need to appear in command arguments. - Machine-readable discovery:
wadb capabilitiesdescribes commands, side effects, interaction requirements, stdin usage, stable error codes, and the response contract. - Published JSON Schema: inspect the embedded schema with
wadb schemaor useschemas/wadb-output-v1.schema.jsonfrom the release archive. - Actionable errors: structured errors include stable codes, a suggestion,
retryable, andrequires_user_actionmetadata. - Safer device selection: structured
connectrefuses to choose silently when multiple devices are found. Pass--deviceor explicitly use--all. - Agent Skill included: release archives contain
skills/wadb/SKILL.md, which teaches compatible agents how to use wadb safely. - Claude Code support: the archive is a valid Claude Code plugin and includes the
/wadb:wadbskill.
Quick start for agents
wadb capabilities --non-interactive --output json
wadb doctor --non-interactive --output json
wadb devices --non-interactive --output json
wadb connect --device <id-or-address> --non-interactive --output jsonFor pairing with Android's six-digit-code dialog:
wadb pair <host:port> --non-interactive --output jsonProvide the six-digit code through redirected stdin, not as a command argument, environment variable, log entry, or chat message. First-time QR pairing remains intentionally interactive.
Claude Code
Extract a release archive and load it for one session:
claude --plugin-dir /path/to/wadbThe skill is available as /wadb:wadb and may also be selected automatically when the request matches its description.
Compatibility
- The v1.2
--jsonarray output remains supported for existingdevices,connect, anddisconnectintegrations. - New integrations should use
--output jsonand accept unknown fields within schema version1. wadbstill delegates the TLS pairing handshake to the locally installed Android platform-toolsadb.- Windows support remains experimental.
Install or upgrade
brew update
brew install lindevhard/tap/wadb
# or, if already installed:
brew upgrade wadbRelease archives are available below for macOS, Linux, and Windows, with SHA-256 checksums in checksums.txt.
Full changelog: v1.2.0...v1.3.0
v1.2.0
What’s new in v1.2.0
This release introduces the new Device Manager, pairing by code, multi-device workflows, and safer pairing-code handling.
Device Manager
- Added
wadb devicesto list connected and discovered Android devices. - Combines
adb devices -l, direct mDNS discovery, and the adb mDNS cache. - Shows device ID, address, status, transport, model, and mDNS instance.
- Merges USB and Wi-Fi entries when they belong to the same device.
- Added machine-readable output with
wadb devices --json.
Connect and disconnect
Connect a specific device by serial, address, host, or mDNS instance:
wadb connect --device RF8M1234ABCConnect every discovered device paired with this host:
wadb connect --allDisconnect one device or every wireless device:
wadb disconnect --device 192.168.1.20:40002
wadb disconnect --allThe connect and disconnect commands also support --json.
Pairing by code
As an alternative to scanning a QR code, use the address and six-digit code displayed by Android:
wadb pair 192.168.1.20:37123
Enter pairing code:After pairing, wadb automatically discovers the device’s separate connection endpoint and connects to it.
Improvements
- Flags can now appear before or after commands.
- Added --scan-timeout for Device Manager discovery.
- Added environment variables for the new options.
- Improved IPv6 support, including scoped link-local addresses.
- Added shell completions and man-page documentation for all new commands.
Security
Pairing codes are now passed to adb pair through standard input instead of appearing in process arguments.
Install or upgrade
brew update
brew upgrade wadbv1.1.1
Pairing a phone was already one command. Now getting it back is too: after the
first pairing, wadb connect reconnects a device without printing a QR code at
all — useful every time a phone reboots and drops off adb devices.
Added
wadb connect— reconnect a device already paired with this host, no QR
code involved. Pairing survives reboots and Wi-Fi changes; the port Android
listens on does not, and this command finds the new one.--iface(envWADB_IFACE) — browse mDNS on a single network interface.
Reach for this when discovery times out on a machine running a VPN, a
container bridge, or a second NIC: they can swallow the multicast traffic
before it gets to your Wi-Fi interface. An unusable name fails immediately
instead of looking like a network timeout.wadb doctornow lists the interfaces worth passing to--iface, and
validates one when given.--qr-invert(envWADB_QR_INVERT) — for terminals with a light
background, where the default rendering comes out inside out and phones
refuse to scan it.--qr-sixel(envWADB_QR_SIXEL) — draw the QR code as an image on
terminals that speak sixel (iTerm2, WezTerm, foot, mlterm). Carries its own
black-on-white palette, so it scans under any color theme.- A man page and shell completions for bash, zsh, and fish, shipped in the
release archives and installed by the Homebrew formula.
Fixed
--qr-asciiproduced an unscannable code. It drew one character per
module, and since a terminal cell is about half as wide as it is tall, the
result was twice as tall as it was wide — the exact shape cameras fail on.
The flag meant for terminals that render half blocks poorly now doubles each
module and stays square.- The Homebrew formula's test block compared
wadb --versionagainst a
v-prefixed string the binary never prints, sobrew test wadbcould not
pass.
Changed
- Discovery falls back to
adb mdns services. A successful pair followed by
a silent connect announce used to end the run with an error, even when adb
itself could already see the device — it runs a separate mDNS implementation
and caches announces from before wadb started. Both the pairing and the
reconnect flow now ask adb before giving up. github.com/miekg/dnsmoved from 1.1.27 (2020) to 1.1.72, and
golang.org/x/netto 0.56.0.- CI gained gofmt, golangci-lint, and govulncheck; Dependabot keeps Go modules
and GitHub Actions current. - Changed name release archives with the version last
No breaking changes — every existing flag, environment variable, and script
keeps working.
Install
brew upgrade wadb # or: brew tap LinDevHard/tap && brew install wadb
go install github.com/lindevhard/wadb@latestPrebuilt archives for macOS, Linux, and Windows are attached below, with
checksums.txt for verification.
Full changelog: v1.0.0...v1.1.0
v1.1.0
Pairing a phone was already one command. Now getting it back is too: after the
first pairing, wadb connect reconnects a device without printing a QR code at
all — useful every time a phone reboots and drops off adb devices.
Added
wadb connect— reconnect a device already paired with this host, no QR
code involved. Pairing survives reboots and Wi-Fi changes; the port Android
listens on does not, and this command finds the new one.--iface(envWADB_IFACE) — browse mDNS on a single network interface.
Reach for this when discovery times out on a machine running a VPN, a
container bridge, or a second NIC: they can swallow the multicast traffic
before it gets to your Wi-Fi interface. An unusable name fails immediately
instead of looking like a network timeout.wadb doctornow lists the interfaces worth passing to--iface, and
validates one when given.--qr-invert(envWADB_QR_INVERT) — for terminals with a light
background, where the default rendering comes out inside out and phones
refuse to scan it.--qr-sixel(envWADB_QR_SIXEL) — draw the QR code as an image on
terminals that speak sixel (iTerm2, WezTerm, foot, mlterm). Carries its own
black-on-white palette, so it scans under any color theme.- A man page and shell completions for bash, zsh, and fish, shipped in the
release archives and installed by the Homebrew formula.
Fixed
--qr-asciiproduced an unscannable code. It drew one character per
module, and since a terminal cell is about half as wide as it is tall, the
result was twice as tall as it was wide — the exact shape cameras fail on.
The flag meant for terminals that render half blocks poorly now doubles each
module and stays square.- The Homebrew formula's test block compared
wadb --versionagainst a
v-prefixed string the binary never prints, sobrew test wadbcould not
pass.
Changed
- Discovery falls back to
adb mdns services. A successful pair followed by
a silent connect announce used to end the run with an error, even when adb
itself could already see the device — it runs a separate mDNS implementation
and caches announces from before wadb started. Both the pairing and the
reconnect flow now ask adb before giving up. github.com/miekg/dnsmoved from 1.1.27 (2020) to 1.1.72, and
golang.org/x/netto 0.56.0.- CI gained gofmt, golangci-lint, and govulncheck; Dependabot keeps Go modules
and GitHub Actions current.
No breaking changes — every existing flag, environment variable, and script
keeps working.
Install
brew upgrade wadb # or: brew tap LinDevHard/tap && brew install wadb
go install github.com/lindevhard/wadb@latestPrebuilt archives for macOS, Linux, and Windows are attached below, with
checksums.txt for verification.
Full changelog: v1.0.0...v1.1.0
v1.0.0
wadb v1.0.0 — first stable release
Pair Android devices over ADB Wi-Fi straight from your terminal: scan a QR with the phone, get an adb connect ready to go.
Highlights
- Smarter discovery — prefers
_adb-tls-connect._tcpendpoints announced by the same host that did the pairing, and prints the connected device name when Android system properties are available. - More UX knobs
--adb— force a specificadbbinary--pair-only— stop after successful pairing, skipadb connect--qr-ascii— fallback QR rendering for terminals that mangle the compact one- Env-var equivalents for every UX flag and timeout
- Releases on rails — switched to GoReleaser for archives, SHA-256 checksums and GitHub Releases; release workflow now updates the Homebrew tap automatically.
Install
brew install lindevhard/tap/wadb
# wadb needs adb on PATH:
brew install --cask android-platform-toolsOr grab a binary from the assets below.
Quick start
wadb # scan the QR on your phone → device is paired & connected
wadb --pair-only # just pair, don't connect
wadb doctor # diagnose adb / mDNS issuesNotes
- Windows support is marked experimental until
adbdiscovery is verified there.
Full changelog: CHANGELOG.md · diff: v0.2.0...v1.0.0
v0.2.0
Improves diagnostics and reliability for Android wireless pairing.
Added
- Added
--pair-timeoutand--connect-timeoutflags. - Added
--verbosemDNS discovery logging. - Added
wadb doctorfor localadband mDNS diagnostics. - Added a platform-tools version warning for older
adbinstallations. - Documented diagnostics options and linked the Android Makers/droidCon 2026 ADB Wi-Fi 2 talk.
Changed
- Try multiple discovered
_adb-tls-connect._tcpendpoints after pairing instead of only the first one. - Improved pairing and connect timeout errors with actionable network and mDNS hints.
- Improved
wadb doctoroutput whenadb mdns servicesreports no discovered services. - Added the demo GIF to the README.
Notes
wadb still delegates the actual TLS pairing handshake to adb pair; the new diagnostics are meant to make Wi-Fi, mDNS, and platform-tools issues easier to spot.
Full Changelog: https://github.com/LinDevHard/wadb/blob/main/CHANGELOG.md