LAN drop flow Files drop on a Windows PC, a QR is shown, Bonjour helps the iPhone find the PC, the iPhone pulls the files over Wi-Fi. Windows PC drop files disk + token QR on LAN :17890 /d/token iPhone GET /current Photos / Files Same Wi-Fi � no cloud
How a drop moves: Windows holds the files, the QR is a LAN URL, Bonjour helps the iPhone find the PC, the iPhone pulls it. No cloud.

Architecture

Why not Bluetooth

iOS does not expose classic Bluetooth file profiles (OBEX/OPP). Third-party apps only get BLE, which is too slow and fragile for a typical photo. Eric's Drop to Phone uses Bluetooth’s product idea (nearby, no account) with HTTP on the LAN as the transport.

Roles

Any Drop to Phone device on the same Wi‑Fi can appear in a Nearby list. Connect links and polls GET /current. Send pushes multipart files with POST /upload (Windows also accepts legacy POST /from-phone).

When a device receives a push upload, it remembers the sender (id / name / role / origin) as a saved peer and sets them as the current link, so a return send works without another Connect or QR scan. Clients advertise their LAN origin with X-Drop-Peer-Origin on requests; if that header is missing, the receiver falls back to Bonjour/NSD match or invents http://{remote-ip}:17890.

Phones receive peer uploads only while the app is open (no background HTTP server in v1).

[Windows or phone advertises] _droptophone._tcp  TXT role/name/id
        |
        v
[peer Connect] -> GET /current  (pull drop when ready)
[peer Send]    -> POST /upload  (push files to peer host)
                  headers: X-Drop-Peer-Id/Name/Role/Origin
                  receiver remembers sender for the next send

Trust model (v1)

This is not a substitute for HTTPS on untrusted networks (public café Wi-Fi).

Routes

Method Path Result
GET / Redirect to /iphone (Windows)
GET /iphone Phone-sized preview for Cursor Simple Browser (Windows)
GET /current JSON { ready, preparing, canReceive, role, peerName, peerId, token, items, progress, … }
GET /health ok
GET /d/{token} HTML receiver (gallery when several files) — Windows
GET /d/{token}/file The single file, or a zip of a multi-file drop — Windows
GET /d/{token}/item/{id} One file from a multi-file drop — Windows
POST /d/{token}/clear Clear the session — Windows
POST /d/{token}/save-pc Loopback only — copy into Downloads on this PC
POST /upload Multipart upload to this host (phone or PC)
POST /from-phone Alias of /upload on Windows (legacy clients)

Relative file / item URLs keep the token in the path so Safari and desktop browsers both work.

Process model

WPF (net8.0-windows10.0.17763.0 so unpackaged toasts compile) + Microsoft.AspNetCore.App. WebApplication.StartAsync runs beside the UI thread. Closing the window hides it; tray Quit shuts down Kestrel and wipes the session.

Optional install: %LocalAppData%\Programs\DropToPhone plus a Start menu shortcut (no signed MSIX). Incoming files can show an unpackaged toast (Open / Folder / Undo).

Single instance: mutex Local\DropToPhone.SingleInstance. A second launch signals Local\DropToPhone.ShowWindow.

Version and About

version.json is MAJOR.MINOR.PATCH.REVISION. About shows that build plus website / support / privacy / support@welchsoftware.net. Phone About screens also link the free Windows zip. How-to text is on Support, not duplicated on About. See TESTING.md.

Limits