Drop it local. Pick it up anywhere.
DropLocal shares text snippets and files across devices on the same local network, with no accounts and no cloud.
Desktop app (macOS · Windows · Linux) — grab it from droplocal.app or the latest release.
CLI — nothing to install:
npx droplocal(or npm install -g droplocal for a permanent droplocal command — needs Node 18+)
- One shared drop stream — notes and files interleaved, synced live to every device,
persistent across restarts (opt out with
--ephemeral) - Search the drop stream by note text or file name
- Optional PIN protection (
--pin 4471) and auto-expiry (--expire 60) - Short-lived invite links for PIN-protected sessions
- Drag-and-drop or paste-to-upload (screenshots paste straight from the clipboard)
- Connect card in the web UI: QR code + address so any device can onboard the next one
- Connection Doctor: interface, URL, mDNS, and local listener diagnostics with copyable debug info
- Installable web shell with service-worker caching where the browser allows it
- Per-file upload progress, copy/download/delete actions, plus bulk clear controls
- Multi-select → .zip/delete: tap file icons to select several, download as one archive or delete them together
- Markdown notes: headings, lists, bold, links, and code blocks render properly
- English, 简体中文, 日本語, 한국어, Español, Deutsch, and Français UI (auto-detected, switchable)
- Light/dark theme, mobile-first layout
- Friendly address via mDNS/Bonjour —
http://drop.localinstead of an IP (the QR code keeps using the IP so Android works too) - Automatic port: tries 80 first (portless URL), falls back to 3000+
- LAN URL + terminal QR code (CLI)
- Native tray controls and dashboard Drop Clipboard (Desktop app)
npx droplocalCommon options:
droplocal -p 8080
droplocal --dir ./shared # default: ~/Downloads/DropLocal
droplocal --pin 4471 # other devices must enter this PIN
droplocal --expire 60 # auto-delete drops after 60 minutes
droplocal --ephemeral # wipe everything when the server stops
droplocal --interface en0 # prefer a network interface name or IP
droplocal --help
droplocal --versionWithout -p, DropLocal tries port 80 first (so the share URL is just
http://drop.local) and falls back to 3000+.
macOS note: the first run may trigger a Local Network permission prompt. Allow it — that's what lets other devices find
drop.localvia Bonjour. Everything still works via the IP URL / QR code if you decline.
npm run desktop:install
npm run desktop:check
npm run desktop:test
npm run test:e2e
npm run desktop:devBuild installers/bundles:
npm run desktop:buildDesktop details live in apps/desktop/README.md.
- Tagged releases (
v*) trigger cross-platform desktop builds via GitHub Actions. - Built artifacts are uploaded to GitHub Releases.
- CLI distribution remains via npm (
npx droplocal).
See:
docs/release/desktop-release.md.github/workflows/release-desktop.yml
droplocal/
├── index.js # CLI app entrypoint/server
├── ui.html # Shared browser UI served by CLI + desktop backend
├── test/ # Node CLI and integration tests
├── e2e/ # Playwright browser smoke tests
├── apps/desktop/ # Tauri desktop app
│ ├── src/ # Desktop dashboard UI
│ └── src-tauri/ # Rust backend + tray + bundling config
├── landing/ # droplocal.app landing page (Vercel)
├── docs/
│ ├── droplocal-prd.md
│ ├── droplocal-distribution-prd.md
│ └── release/desktop-release.md
└── .github/workflows/
GET /- UIGET /api/info- app version and share URLsGET /api/diagnostics- local network diagnosticsPOST /api/invites- create a short-lived invite link for PIN-protected sessionsGET /api/snippets- list snippetsPOST /api/snippets- create snippetDELETE /api/snippets/:id- delete snippetGET /api/files- list filesPOST /api/files- upload filesGET /api/files/:id- download fileDELETE /api/files/:id- delete fileGET /api/files.zip?ids=a,b- download selected files as a zipDELETE /api/drops?type=all|notes|files&olderThanMinutes=60- bulk cleanupGET /api/status- runtime status
Endpoint: /ws
Events:
snippet:newsnippet:deletefile:newfile:deletedevice:count
DropLocal assumes trusted LAN usage.
- No account system — optional PIN gate (
--pin) - No TLS by default
- Binds to your local network only
Do not expose DropLocal directly to the public internet.
If DropLocal saves you a trip across the room, you can buy me a coffee ☕.
MIT (LICENSE)