Drop a file in a browser tab, grab it from any other device on the same WiFi. No internet required, no cloud, no size cap beyond your disk space.
laptop ──┐
phone ──┼── same WiFi router ── one of you runs LANShare ── everyone gets a link / QR
tablet ──┘
One device on the network runs a small Node server. It serves a web page and accepts uploads, storing files straight to disk (never buffered fully in memory, so multi-GB files are fine even on machines with limited RAM). Every other device on the same WiFi opens the printed URL — or scans the QR code — in any browser, and can upload or download files from there.
Nothing leaves the local network. There's no auth, by design — treat it as a temporary local drop point, not a permanent service.
Requires Node 18+ (works great with the Node 22 / nvm setup most of you already have).
cd lanshare
npm install
npm startYou'll see output like:
LANShare is running
→ http://192.168.1.42:3000
Open one of the addresses above on any device connected
to the same WiFi network. Press Ctrl+C to stop.
Open that address on the host machine to confirm it works, then open the same address (or scan the QR code shown on the page) from any other device on the same network.
- Send a file: drag it onto the drop zone, or click browse. Progress bar shows live upload percentage.
- Get a file: anyone on the network sees it appear in the file list (the page polls every 4 seconds) and can hit download.
- Remove a file: delete button on any row — removes it for everyone.
- Connect a new device: scan the QR code in the top panel, or copy the link and send it however's easiest (AirDrop, text, whatever).
Change the port if 3000 is already taken on your machine:
PORT=4000 npm startDefault per-file upload limit is 10 GB. To change it, edit the fileSize
limit in server.js:
const upload = multer({
storage,
limits: {
fileSize: 10 * 1024 * 1024 * 1024 // change this
}
});If your network drops connections mid-transfer (unstable WiFi cards, AP
isolation, weak signal), a large upload can fail partway through. This
version does plain single-shot uploads — if you need resumable/chunked
uploads for big files over an unreliable link, look at swapping the upload
endpoint for tus-node-server (resumable upload protocol), which is a
drop-in-ish replacement for the /upload route.
Also worth checking once: some routers enable AP / client isolation, which blocks device-to-device traffic on the same WiFi even though everyone's connected to the same network. If a second device can't load the page at all, that's the first thing to rule out (router admin settings, usually under WiFi or guest network options).
lanshare/
├── server.js Express server: upload, list, delete, QR/connection info
├── package.json
├── public/
│ ├── index.html Page structure
│ ├── style.css Dark / neon-green styling
│ └── app.js Drag-drop, upload progress, file list polling
└── uploads/ Files land here (gitignored, kept via .gitkeep)
Vanilla JS frontend, Express + Multer backend, qrcode for the connect QR.
No frameworks, no build step — clone it, npm install, run it.