Drop a print job from your desk.
PrintDrop plugs into your printer's USB port and appears as an ordinary flash drive — while also serving a web UI over Wi-Fi. No cloud, no account, no firmware changes.
Runs on a 4 MB ESP32-S3. Built for printers that only accept USB media.
bus sdio 4-bit @ 20 MHz · fat32 — projected
wifi printdrop.local · 192.168.1.42
lock idle · printer owns the card
benchy.gcode
20 MB · read by the printer at ~1 016 KB/s
1 016
KB/s read over USB — measured
~535
KB/s write over USB — measured
62
KB web UI, self-hosted
~16 MB/s
raw card throughput — SDIO 4-bit
All measured on hardware — an ESP32-S3 with a 32 GB SDHC card on SDIO 4-bit at 40 MHz. The card sustains ~16 MB/s raw, against ~910 KB/s on the old SPI wiring. Over USB the device reads at 1 016 KB/s and writes at ~535 KB/s (SPI managed 485 / 248).
Reads are now at the ceiling of the ESP32-S3's USB Full-Speed peripheral — 12 Mbit/s, about 1.2 MB/s — so the card has plenty of headroom to spare and further USB gains would need different silicon rather than different firmware. Uploads over Wi-Fi run at ~200 KB/s and downloads at ~500 KB/s, bounded by the HTTP path in firmware rather than by the card or the radio. The old SPI driver remains available as -e printdrop_spi.
The errand the USB stick keeps creating.
Plenty of 3D printers accept jobs only from USB media and have no networking of their own. Every print becomes the same errand: slice at your desk, copy to a stick, carry it across the workshop — then somebody else needs the stick.
Drop. Hand back. Print.
PrintDrop holds the card, serves it to both sides, and never lets them collide. While a file arrives over Wi-Fi the media is withdrawn from the printer; when the write is done it is re-presented, and the new job is simply in the menu.
[desk] drop benchy.gcode → web ui
[device] media withdrawn · writing 20 MB
[device] write done · media re-presented
[printer] FAT re-read · job in the USB menuSmall parts. No surprises.
A 4 MB, no-PSRAM ESP32-S3 drives an SD card over SDIO 4-bit at 20 MHz (40 MHz with short wiring) and presents it through TinyUSB mass storage — ~4× the SPI bandwidth on the same breakout plus two wires, ~6× at 40 MHz. SPI remains available as -e printdrop_spi. The UI is 62 KB of plain HTML, CSS and JavaScript served from a LittleFS partition — no CDN, no external requests, no build step.
One card. Two masters.
A USB host caches the file allocation table. Writing to the card behind its back is how these devices normally corrupt themselves. PrintDrop holds to three rules.
Mass storage callbacks take the lock with a short timeout and fail the transfer rather than block, so a slow upload can never stall a printer mid-job.
Five small pieces, one coherent UX.
Live progress over WebSocket, a heartbeat LED you can read across the room, zero-config discovery that actually works on Windows, a login that lives in NVS, and an OTA path that survives a bad flash — all on the same 4 MB stick.
Every detail, written down.
Support PrintDrop
PrintDrop is free and MIT licensed, built and tested on hardware bought for the purpose. Sponsorship pays for the next printer it gets tested against.