Skip to content

Repository files navigation

DropLocal logo

DropLocal

Drop it local. Pick it up anywhere.

droplocal.app

npm version CI status MIT license Buy me a coffee

DropLocal shares text snippets and files across devices on the same local network, with no accounts and no cloud.

Install

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+)

Features

  • 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/Bonjourhttp://drop.local instead 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)

Quickstart (CLI)

npx droplocal

Common 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 --version

Without -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.local via Bonjour. Everything still works via the IP URL / QR code if you decline.

Desktop App (Local Dev)

npm run desktop:install
npm run desktop:check
npm run desktop:test
npm run test:e2e
npm run desktop:dev

Build installers/bundles:

npm run desktop:build

Desktop details live in apps/desktop/README.md.

Release Strategy

  • 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

Repository Structure

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/

API

REST

  • GET / - UI
  • GET /api/info - app version and share URLs
  • GET /api/diagnostics - local network diagnostics
  • POST /api/invites - create a short-lived invite link for PIN-protected sessions
  • GET /api/snippets - list snippets
  • POST /api/snippets - create snippet
  • DELETE /api/snippets/:id - delete snippet
  • GET /api/files - list files
  • POST /api/files - upload files
  • GET /api/files/:id - download file
  • DELETE /api/files/:id - delete file
  • GET /api/files.zip?ids=a,b - download selected files as a zip
  • DELETE /api/drops?type=all|notes|files&olderThanMinutes=60 - bulk cleanup
  • GET /api/status - runtime status

WebSocket

Endpoint: /ws

Events:

  • snippet:new
  • snippet:delete
  • file:new
  • file:delete
  • device:count

Security Model

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.

Support

If DropLocal saves you a trip across the room, you can buy me a coffee ☕.

License

MIT (LICENSE)

About

Share files, screenshots and notes between your devices over Wi-Fi — no cloud, no accounts. CLI (npx droplocal) + desktop app.

Topics

Resources

Contributing

Stars

82 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages