How's mydownload?

Your browser downloads, live on your Android phone: progress, speed, time left. Pause, resume or restart from your pocket. Filenames are encrypted on your PC.

Download source
  • Android 8.0+
  • Chrome · Brave
  • no account

v0.3.1free · open source · GitHub Releases

How's My DownloadChrome · toasternow

pop-os_24.04_amd64_generic_28.iso

52.2% · 4.7 MB/s · 4m 26s left

An Android progress notification from How's My Download for a browser download, with its percentage, speed and time left.

Grab it. Pair it.
Pocket it.

Three steps, about two minutes. Both files come from GitHub Releases: the app isn't on the Play Store and the extension isn't on the Chrome Web Store yet.

  1. Install the app

    Open the APK on your phone, allow the install, then allow notifications.

    apk · 33.8 MB

    hows-my-download-v0.3.1.apk

  2. Add the extension

    Unzip it, open chrome://extensions, switch on Developer mode, Load unpacked.

    zip · 102 KB

    hows-my-download-extension-v0.3.1.zip

  3. Scan once

    Click pair device in the extension, tap > scan qr code in the app. Both say PAIRED. Start a download.

    > full setup guide

    default server: hmd-api.duckdns.org

--releasev0.3.1 · checksums in SHA256SUMS.txt · all release files · run your own server

Desk. Relay. Pocket.

Four hops from your browser to your lock screen, and one back. The filename gets sealed on the PC and opened on the phone. Nothing in the middle can read it.

  1. 01desk

    The extension watches

    Every 2 s while something downloads, the extension reads bytes, total and state from the browser. Nothing downloading? It goes quiet. A paused download is reported once.

    filename pop-os_24.04_amd64_generic_28.iso

    The HMD extension popup: ACTIVE, server CONNECTED, client toaster, gta-6.apk at 82.2% and paused, paired with a phone, filenames sealed with AES-256-GCM.
    The extension popup, tracking and paired.
  2. 02desk

    The name gets sealed

    Before anything leaves your PC, the filename and file type are encrypted with AES-256-GCM, using a key made when you paired. Can't encrypt? The update is dropped. Plain text never ships.

    filename enc:v1:q3Rk8w1cZ0pH7mVb:Jx0aT2yN…f9Qe8w==

    # what leaves your PC, per field
    enc:v1:<base64 iv>:<base64 ciphertext + tag>
    
    # AES-256-GCM, a fresh 96-bit IV each time
    # no key, or the crypto throws?
    drop the update. never plain text.
  3. 03relay

    The relay does math, not names

    A small FastAPI server smooths the speed, works out the time left and sends at most one push every 2 s per phone. Paused, complete and failed skip the queue. The name passes through still sealed.

    filename enc:v1:q3Rk8w1cZ0pH7mVb:Jx0aT2yN…f9Qe8w==

    # FCM data message, high priority
    seq       "42"
    pc_name   "toaster"
    browser   "Chrome"
    downloads [{"filename":"enc:v1:…",
                 "percentage":52.2,…}]
    
    # at most one push per 2 s per phone
  4. 04pocket

    Your phone opens it

    A high-priority FCM data message wakes the app for a moment, with no always-on connection. It decrypts the name with the key from the QR and updates the notification. Median delivery: 448 ms.

    filename pop-os_24.04_amd64_generic_28.iso

    Two HMD notifications on an Android lock screen: gta-6.apk at 32.7%, 10.6 MB/s, 3m 34s left, and arch-btw.iso at 29.8%, 10.1 MB/s, 7m 8s left, each with a progress bar.
    The real notifications, right on the lock screen. One per download.
  5. 05back to desk

    And back: tap pause

    Tap Pause on the phone. The server hands the command to the extension on its next update, the browser pauses, and your phone shows PAUSED. Measured round trip: about 1.8 s.

    filename pop-os_24.04_amd64_generic_28.iso

    Two HMD notifications on Android: arch-btw.iso collapsed with a progress bar, and gta-6.apk expanded at 41.7%, 18.4 MB/s, 3m 14s left, with a PAUSE button. Both say Brave · toaster.
    Expand it and tap Pause. Resume and Restart come back the same way.

Six states. Zero chill.

Meet Sammy, a download update with legs. Each pose is a real state, and the card under it is what your phone shows, buttons included.

The server sees bytes. Not names.

Pairing is one QR code. The extension makes a fresh 256-bit key and puts it in that QR, and only there. It goes from your screen to your phone's camera, never through the server.

--server-sees

  • byte counts and states
  • timing
  • your PC name
  • IP addresses
  • your phone's push token

--never-sees

  • filenames
  • file types
  • the encryption key
server's view
POST /v1/samples
{
  "pc_name": "toaster",
  "downloads": [{
    "filename": "enc:v1:q3Rk8w1cZ0pH7mVb:Jx0aT2yN…f9Qe8w==",
    "mime_type": "enc:v1:Lw3kQe81ZpVx0aTn:Yv2Bq…",
    "bytes_downloaded": 1430280000,
    "total_bytes": 2740000000,
    "state": "downloading"
  }]
}
What lands on the relay. The byte count moves. The name never resolves.

Measured, not vibes.

Measured on 24 Oct 2026 against the production server (Oracle Cloud, India region), with a POCO M4 Pro (Android 13) on 4G and Chrome on a Windows 11 laptop. Battery use, Wi-Fi delivery and other phones aren't measured yet, so they aren't here. Methods in docs/metrics.md.

--built-with

extension
JavaScript, Manifest V3, zero dependencies, Web Crypto
server
Python 3.12, FastAPI, Pydantic v2, Firestore
app
Kotlin, Jetpack Compose, CameraX + ML Kit, Android Keystore
push
Firebase Cloud Messaging
deploy
Docker (amd64 + arm64), Nginx
ci
every push: server 128 tests (83% coverage), extension 43, Android 33

Beforeyou ask.

Is it free?

Yes. MIT licensed, no account, no ads. The whole thing is on GitHub.

Can the server see my files?

No. It never sees file contents or filenames. It sees byte counts, timing and your PC name. Self-host to keep even that on your own machine.

Does it drain my battery?

The phone keeps no open connection: Android wakes the app briefly for each update. Battery usage is minimal, but no numbers on that yet.

Which browsers?

Chromium-based ones. Tested on Chrome and Brave. Edge, Opera and Vivaldi use the same extension system and should work, but are untested. Not Firefox or Safari.

iPhone?

When Apple stops being a jerk.