Skip to content

Releases: ajithonmain/droidwire

Droidwire 1.4.1 (beta, unsigned)

Pre-release

Choose a tag to compare

@ajithonmain ajithonmain released this 09 Oct 11:36

Droidwire 1.4.1 - update check finds beta releases (beta, unsigned)

This is a beta prerelease. It is built for Apple Silicon Macs only and is not signed or notarized.

What changed from 1.4.0: beta releases can now be discovered by the update checker. 1.4.0 asked GitHub for /releases/latest, which never returns prereleases, so a beta published as a prerelease was invisible. 1.4.1 reads the release list (first page, 30 releases), ignores drafts and tags that are not valid semver, picks the highest version (not the most recently created release), offers it only if it is strictly newer than the running version, and opens that release's page when you click Download. Nothing else in the app changed: same bundled AOSP-built adb and libraries, USB (ADB) and Wi-Fi, no MTP, Apple Silicon only, unsigned, no email registration, no Firebase.

This does not fix 1.4.0 or 1.3.0. Installed copies of those versions keep asking /releases/latest (which still returns 1.3.0), so they will not announce this release. If you run 1.4.0 or 1.3.0, download 1.4.1 from this page.

Browse, transfer and edit the files on an Android phone from a Mac, over USB debugging (ADB) or Wi-Fi (wireless debugging). Free, MIT licensed, no account, no sign-up, nothing collected.

Nothing else to install on the Mac. adb (built from the Android Open Source Project) and the video-thumbnail helper are inside the app: no Homebrew, no Android SDK, no ffmpeg. Nothing is installed on the phone.

Supported connection modes: USB (ADB) and Wi-Fi (wireless ADB). MTP is deferred: it is not part of this release and is absent from the app (no MTP addon, no libmtp, no MTP worker). The connection picker shows MTP as deferred and recommends USB or Wi-Fi.

Before you start (on the phone)

  • USB: turn on Developer options (tap Build number 7 times), then USB debugging. Plug in, and tap Allow on the "Allow USB debugging?" prompt (tick Always allow from this computer). Droidwire tells you if the phone is connected but not yet authorized.
  • Wi-Fi (Android 11+): phone and Mac on the same network; Settings > Developer options > Wireless debugging on; pair once with Pair device with QR code (scan the code Droidwire shows). macOS may ask Droidwire for Local Network access: allow it.

First launch: this build is not signed

It is not signed with an Apple Developer ID and not notarized, so macOS Gatekeeper blocks a downloaded copy the first time, usually with "Droidwire is damaged and can't be opened". Click Cancel (not "Move to Trash"), drag Droidwire to Applications, then run once in Terminal:

xattr -dr com.apple.quarantine /Applications/Droidwire.app

Droidwire never clears this flag for you. If you would rather not run an unsigned app, build it from source and read the code first (README).

What was verified, and what was not

  • GitHub Actions, on commit f5d027858e83085eeccb4432ce5bf2fe97870c45: CI (typecheck, 148 unit tests, production build, offline smoke) and the manual Release build workflow passed. The Release build also ran the package checks (architecture, minimum macOS 12.0, library paths, no MTP addon, libmtp or worker, no unexpected files under out/ in app.asar), the check of the finished DMG and ZIP against the checked app, and an offline smoke test of the packaged app.
  • Re-checked on the downloaded files (not the CI log): SHA256SUMS, the artifact digest GitHub records for the run, DMG and ZIP contents identical, no MTP component, offline smoke test of the app extracted from the DMG with a minimal PATH and a throwaway profile (no outbound connections).
  • Hardware (published files): the attached GitHub-built 1.4.1 app (extracted from the DMG after SHA256SUMS verified it; minimal PATH, throwaway profile, offline) was run against one Google Pixel 4a (Android 13) from an Apple Silicon Mac on macOS 26, using fixtures generated for the run in a dedicated phone folder (removed afterwards) and hashes computed outside the app.
    • USB, IPC level (desktop/driver-hw.mjs): 50 of 50 checks passed: upload and download hashes for 11 files including awkward names, folder zip, previews, rename/copy/move, cancelling active uploads, downloads and folder zips, no stray adb processes. The published 1.4.0 files passed 50 of 50 as well.
    • USB, UI level (desktop/driver-hw-ui.mjs, final harness, one command, all sections): 48 passed, 0 failed. This includes the queue/cancel/pause rows, close and quit during a download, the double-quote rename, and the PDF, audio and HEIC previews. Section K (upload to the storage root and download back, fresh launch at the root, run separately with --section k): 1 of 1 passed.
    • An earlier first pass of the UI harness reported 34 passed and 15 failed on both 1.4.0 and 1.4.1. Those 15 were test-setup problems (missing fixtures, a run-order error, a process-matching bug, a premise violation), not application defects; the diagnosis is in docs/HARDWARE-CHECKLIST.md. The first pass is superseded by the results above.
    • Wi-Fi (desktop/driver-hw-wifi.mjs, QR pairing through the app, USB cable removed so only the wireless device remained): 16 of 16 on the published 1.4.1 files, recorded earlier on 2026-10-09 (32 MB and 300 MB round trips, folder zip, cancels, Wi-Fi switched off and on with automatic reconnect). It was not re-run in the final pass because pairing needs a person at the phone.
    • Not covered by this evidence: the published 1.4.0 files were not re-run on the UI or Wi-Fi harnesses; this evidence is for 1.4.1 only.
  • Earlier hardware testing (1.4.0 release configuration, local build): one Google Pixel 4a, Android 13, Apple Silicon Mac on macOS 26: USB and Wi-Fi transfers with checksums, conflicts, cancel, previews, folder zips, unplug mid-transfer, QR pairing and Wi-Fi reconnect. The runtime code is unchanged except the update check. Details: docs/HARDWARE-CHECKLIST.md.
  • Not verified: macOS versions older than 26, Intel Macs, any phone other than the Pixel 4a or Android version other than 13, installation on a clean Mac, and signing or notarization (the build is unsigned; the signing pipeline has never run with real credentials).

Known limitations

  • Apple Silicon only. Built for macOS 12 and later, but only macOS 26 has been run.
  • Unsigned and not notarized, so the first-launch step above is required.
  • Wi-Fi: Android sometimes switches Wireless debugging off by itself when Wi-Fi drops; turn it on again and Droidwire reconnects. Pairing by 6-digit code and reconnecting after an app restart are unverified (use the Connect field).
  • Pause/resume restarts a download from the start; very large folders list slowly; WebM/MKV/AVI videos show a generic icon.
  • Update check reads only the 30 most recently created releases. That is deliberate and documented; it can hide old releases, never offer one.
  • MTP is deferred and not part of this release.

Files and provenance

The attached files are the unmodified output of GitHub Actions run 37912254192 (workflow "Release build", manual dispatch), built from commit f5d027858e83085eeccb4432ce5bf2fe97870c45. They were not rebuilt or altered afterwards; the artifact digest GitHub records (sha256:52b88c4410b724ffddba29119990d732d36cc993b6c8279af708e8036a57cc7c) matched the download, and SHA256SUMS verifies. The tag v1.4.1 points at a later commit that differs from the build commit only in documentation.

File Size SHA-256
Droidwire-1.4.1-arm64.dmg 123,918,412 bytes 9bb45f66a5ab0a0ba9d517a9dc82687c0951a074518220290fc0615809aa5389
Droidwire-1.4.1-arm64-mac.zip 119,053,698 bytes 664733d2b2e119b4f2ef66c89e53c0281708abeabaa6c2db3871e70836a5d47e

Check a download with shasum -a 256 -c SHA256SUMS in the folder that holds the files. Third-party components and their licences are listed in the app (Droidwire > Licenses) and in docs/third-party-inventory.md.

Droidwire 1.4.0 (beta, unsigned)

Pre-release

Choose a tag to compare

@ajithonmain ajithonmain released this 09 Oct 08:08

Superseded by 1.4.1. 1.4.1 is the same app with a fixed update check that can discover beta releases. The 1.4.0 files below are kept unchanged for history. 1.4.0 and 1.3.0 do not announce 1.4.1 themselves (they ask /releases/latest, which returns 1.3.0), so download 1.4.1 from the link above.

Droidwire 1.4.0 - self-contained build, USB and Wi-Fi (beta, unsigned)

This is a beta prerelease. It is built for Apple Silicon Macs only and is not signed or notarized.

Browse, transfer and edit the files on an Android phone from a Mac, over USB debugging (ADB) or Wi-Fi (wireless debugging). Free, MIT licensed, no account, no sign-up, nothing collected.

Nothing else to install on the Mac. adb (built from the Android Open Source Project) and the video-thumbnail helper are inside the app: no Homebrew, no Android SDK, no ffmpeg. Nothing is installed on the phone.

Supported connection modes: USB (ADB) and Wi-Fi (wireless ADB). MTP is deferred: it is not part of this release and is absent from the app (no MTP addon, no libmtp, no MTP worker). The connection picker shows MTP as deferred and recommends USB or Wi-Fi.

Before you start (on the phone)

  • USB: turn on Developer options (tap Build number 7 times), then USB debugging. Plug in, and tap Allow on the "Allow USB debugging?" prompt (tick Always allow from this computer). Droidwire tells you if the phone is connected but not yet authorized.
  • Wi-Fi (Android 11+): phone and Mac on the same network; Settings > Developer options > Wireless debugging on; pair once with Pair device with QR code (scan the code Droidwire shows). macOS may ask Droidwire for Local Network access: allow it.

First launch: this build is not signed

It is not signed with an Apple Developer ID and not notarized, so macOS Gatekeeper blocks a downloaded copy the first time, usually with "Droidwire is damaged and can't be opened". Click Cancel (not "Move to Trash"), drag Droidwire to Applications, then run once in Terminal:

xattr -dr com.apple.quarantine /Applications/Droidwire.app

Droidwire never clears this flag for you. If you would rather not run an unsigned app, build it from source and read the code first (README).

What was verified, and what was not

  • Hardware testing: USB and Wi-Fi were tested on one phone, a Google Pixel 4a running Android 13, with an Apple Silicon Mac on macOS 26: transfers with checksums, conflicts, cancel, queue, previews, folder zips, unplugging the cable mid-transfer, pairing by QR code, Wi-Fi-only transfers and reconnecting after a Wi-Fi drop. Details: docs/HARDWARE-CHECKLIST.md.
  • The files attached to this release were not run against a phone. The hardware runs used a local build of the same release configuration. Afterwards the app's runtime code was not changed; later commits touched the install and build scripts, CI and documentation. The attached files were then built by GitHub Actions and passed, without a phone: the typecheck, unit tests, the package checks (architecture, minimum macOS 12.0, library paths, no MTP component), the check of the finished DMG and ZIP against the checked app, and an offline smoke test of the packaged app.
  • Not verified: macOS versions older than 26, Intel Macs, any phone other than the Pixel 4a or Android version other than 13, installation on a clean Mac, and signing or notarization (the build is unsigned; the signing pipeline has never been run with real credentials). Wi-Fi pairing by 6-digit code and reconnecting after an app restart are also unverified (use the Connect field).

Known limitations

  • Apple Silicon only. The app is built for macOS 12 and later, but only macOS 26 has been run.
  • Wi-Fi: within a session a dropped phone is reconnected automatically, but Android sometimes switches Wireless debugging off by itself when Wi-Fi drops (it did once in testing). Turn it on again on the phone and Droidwire reconnects.
  • Pause/resume restarts a download from the start; very large folders list slowly; WebM/MKV/AVI videos show a generic icon.
  • Update check: this build asks GitHub for the repository's latest stable release, so it will not announce a newer prerelease. Watch the releases page.

Updating from 1.3.0

1.3.0 is superseded: its bundled libraries required macOS 26 and it shipped no adb.

Files and provenance

The attached files are the unmodified output of GitHub Actions run 37894461207 (workflow "Release build", manual dispatch), built from commit 03b674e60f21e42841427807de8fbe79c7c9a026. They were not rebuilt or altered afterwards; the artifact's digest recorded by GitHub (sha256:91781f5132764fb268c7f6e8e5d1b0e8b2041ca76f6c84afa90ceb9916ffb7c9) matched the download, and SHA256SUMS verifies.

The tag v1.4.0 points at a later commit that differs from the build commit only in documentation and in the release-build workflow (which no longer reacts to tags). The application source is identical.

File Size SHA-256
Droidwire-1.4.0-arm64.dmg 123,912,257 bytes 34aafad956aac8ddc9d3156f3fcfdde16a08ea1212f21b85291cab95d8cb953f
Droidwire-1.4.0-arm64-mac.zip 119,053,417 bytes e2e30c5b5c3e0ecc0707bbffda86f21e8e825f1aefa5a84773e5a7dca4e84a83

Check a download with shasum -a 256 -c SHA256SUMS in the folder that holds the files. Third-party components and their licences are listed in the app (Droidwire > Licenses) and in docs/third-party-inventory.md.

Droidwire 1.3.0

Choose a tag to compare

@ajithonmain ajithonmain released this 07 Oct 07:59

Superseded by Droidwire 1.4.0 (beta prerelease). 1.3.0 shipped without adb and its bundled libraries required macOS 26; 1.4.0 is self-contained (adb included) and supports USB and Wi-Fi. Because 1.4.0 is marked a prerelease, GitHub still lists 1.3.0 as "Latest" and the in-app update check will not announce 1.4.0; download it from the link above. This release and its files are kept unchanged for history.


First open-source release (MIT). Public release builds no longer bundle adb; install it with brew install android-platform-tools for USB and Wi-Fi modes. Updates are announced from this repository's GitHub Releases.

Removed

  • First-launch email registration and everything behind it: the sign-up screen, the beta:* IPC channels, the Firestore requests, the startup retry, the embedded Firebase configuration, and the remote "in-app messages" feature. The app now opens straight into the normal UI and collects no personal information. Update information comes from GitHub releases only.
  • The app no longer reads or writes beta-signup.json. A file left by an earlier beta build stays where it is (~/Library/Application Support/@droidwire/desktop/) and can be deleted by the user.
  • Unused code and configuration: the android workspace entry and script, electron-updater and path-browserify dependencies, a stale vite.config.ts.

Fixed

  • Folder .zip downloads put remote folder names into a shell command without quoting; names with spaces, quotes or shell metacharacters could break the command or run unintended commands on the phone. Names are now quoted, each operation uses its own temporary archive, and the archive and local scratch files are removed on failure and cancellation. Phones without an on-device zip now fall back to pulling the tree and zipping on the Mac.
  • Text previews never displayed: the renderer expected a file:// path while the main process returned a data URL. Previews now use a typed PreviewResult (images/audio as data URLs, text as decoded text, first 64 KiB).
  • MTP cut/paste and drag-to-move only renamed the object instead of moving it between folders. Moves now use MTP MoveObject, with name-change and replace handled safely and a clear message when the phone cannot do it.
  • Uploads could hang forever: a failed, cancelled or dismissed upload left its completion promise unresolved, stalling batches (including "move after upload"). Every upload now settles.
  • Queued work could run against the wrong phone after switching device or connection mode. Device and transport are captured when work is queued and carried through execution, progress polling and cancellation; transports no longer keep a hidden "current device".
  • Edit sessions, previews and video thumbnails could collide when two phones expose the same path; they are now keyed by device identity (previews use a private temp directory per request).
  • Update check treated any different version as newer. Versions are now compared as semantic versions; an older or equal release never prompts. The product version is read from one place and is the same in development and packaged builds (About and update messages previously showed Electron's version in dev).
  • MTP: a transfer whose upload failed could previously delete the existing destination file first; uploads that replace now complete before the old file is removed. Concurrent operations on different MTP devices can no longer interleave on the single libmtp session.
  • A video-thumbnail request served the active device's file regardless of which device the request was for.
  • A failed or cancelled download no longer leaves a partial file or destroys an existing file of the same name: downloads go to a temporary name and are renamed on success.
  • Audio previews were blocked by the page's Content Security Policy.

Security

  • All IPC arguments are validated; persistence keys come from an allowlist (the key used to build file names could previously traverse directories); delete-local-file only deletes files that were just uploaded by the user's "move" choice; read-local-file removed; APK install requires an .apk file.
  • Download, preview, drag and edit file names are reduced to a single safe path component; destination paths are checked to stay inside their directory.
  • Renderer cannot navigate away from the app page or open windows; web permission requests are denied; external links are limited to https://github.com; a strict Content-Security-Policy replaces the stale tethering-era one.
  • Video-thumbnail loopback server: unguessable per-stream tokens bound to one device and path, Host header check, GET only, range validation, connections closed on quit; ffmpeg is restricted to http,tcp input.
  • Executable file types (.command, .app, .sh, ...) are not opened automatically by Open & Edit.
  • MTP worker supervision: startup timeout, failure on exit-before-ready, and a late exit from a killed worker can no longer reject calls of its replacement; the worker exits with its parent.
  • Deleting or moving a storage root is refused; adb/ffmpeg lookup order is explicit; child processes (transfers, range server, QR pairing, MTP worker) are shut down on quit; messages to closed windows no longer throw.

Changed

  • Main process split into modules (ipc/, transports, lib/) with one implementation each of device listing, ls parsing, MIME mapping and shell quoting (previously duplicated across files).
  • Update checks are configurable (Droidwire menu > Check for Updates Automatically) and documented. DROIDWIRE_OFFLINE=1 disables them for tests.
  • Wireless ADB inputs are validated; the folder adb:find escapes glob characters.
  • Build: node scripts/bootstrap.mjs finds libmtp and installs reliably (a plain npm ci failed on a clean Mac when libmtp was not on the linker path); rebuild:mtp detects the libmtp prefix instead of assuming /opt/homebrew; bundle-native.sh verifies relocatability and architecture; the packaged app.asar shrank from about 1.5 GB to under 1 MB by shipping only compiled output.
  • Playwright smoke driver derives paths from its own location and runs against a throwaway profile.

Added

  • MIT LICENSE and license fields in the package manifests.
  • Unit tests (npm test), npm run typecheck, npm run verify, GitHub Actions CI, issue and pull-request templates, CONTRIBUTING, SECURITY, hardware checklist, licensing inventory.

Install

Unsigned build: after dragging to Applications run xattr -dr com.apple.quarantine /Applications/Droidwire.app. For USB and Wi-Fi modes install adb: brew install android-platform-tools (MTP mode does not need it). Apple Silicon only; Intel is untested.

Not tested on real phones in this release (see docs/HARDWARE-CHECKLIST.md). Licensed MIT.

Droidwire v1.0.0 (beta)

Choose a tag to compare

@ajithonmain ajithonmain released this 11 Jul 12:59

First public beta.

  • ADB mode (fast, USB Debugging) and MTP mode (zero setup) transports
  • Multi-device support, wireless ADB pairing, open & edit round-trip
  • Free during beta

Apple Silicon only. Unsigned build — see install guide on the landing page for the Gatekeeper bypass step.