Send files directly device-to-device over WebRTC — files never touch NotesQR's servers.
CLI + MCP for NotesQR. Same rooms as the browser app. Both peers stay online; bytes never land on NotesQR disks.
Web app · Donate · Contribute · Docs · Product README
Donation-funded. If this CLI saved you a WeTransfer upload, support the project.
Current release: 2.1.0 — same transfer engine as the NotesQR web app (adaptive chunks up to 1 MiB, zip_batch DataChannel reuse, outbound concurrency 5→32).
Needs Node.js 18+. If npx github:… fails with EALLOWGIT, run npm config set allow-git all once, or clone this repo.
Prefer a fresh npx pull after upgrades so you are not stuck on an old cached checkout:
# Terminal A — sender (exits after successful delivery with --once)
npx -y github:NotesQR/notesqr-share send ./file.pdf --once
# Terminal B — or open the printed URL in a browser
npx -y github:NotesQR/notesqr-share recv https://notesqr.com/xxx-xxxx-xxx -o ./outFrom a clone:
npm install
node cli/notesqr.mjs send ./file.pdf --once
node cli/notesqr.mjs recv <url> -o ./outsend accepts directories (recursive). Peers only see share-relative paths (never absolute disk paths). recv recreates the tree under -o. Same folder flow exists on the web app, desktop installers, and browser extensions.
npx -y github:NotesQR/notesqr-share send ./project/ README.md --once
npx -y github:NotesQR/notesqr-share recv <room|url> -o ./outAgent tools notesqr_p2p_send / notesqr_p2p_recv — same P2P rooms, no store-and-forward API.
{
"mcpServers": {
"notesqr": {
"command": "npx",
"args": ["-y", "-p", "github:NotesQR/notesqr-share", "notesqr-mcp"]
}
}
}Docs: notesqr.com/docs · Agent hints: notesqr.com/llms.txt
- WeTransfer — uploads to their servers; free tiers cap size and expiry. This CLI never parks a copy on NotesQR disks.
- Dropbox — account + cloud folder/quota. NotesQR needs no account; sender stays online instead.
- Google Drive — share a hosted copy. NotesQR is a live WebRTC handoff, not a drive.
Full write-up: notesqr.com/cloud-alternatives
flowchart LR
S[Sender CLI / browser]
N[NotesQR<br/>signaling]
R[Receiver CLI / browser]
S -->|create room| N
R -->|join room| N
S <-->|WebRTC DataChannel<br/>file bytes — never stored| R
TURN is a fallback only when a direct path is blocked.
- Sender hosts a room and stays online
- Prints
https://notesqr.com/{room}(and a terminal QR) - Receiver joins while the sender is still running
- Bytes go peer-to-peer (signaling + optional TURN only)
This is not an HTTP store-and-forward upload API. If the sender process exits before the download finishes, the transfer stops.
- Adaptive chunks — probe SCTP
maxMessageSize, send up to 1 MiB, step down if the peer rejects zip_batch— folder / multi-file transfers reuse one DataChannel (critical when a web guest downloads a folder from a CLI host)- Outbound concurrency — base 5, grow toward 32 while in-flight bytes stay under ~10 MiB
- Large rooms — file list sent in ~180 KiB JSON batches
- Recv — multi-file downloads largest-first; stall watchdog instead of a hard wall-clock timeout from t=0
| Surface | Path |
|---|---|
| Grok | grok-plugin/ — also listed on the xAI Plugin Marketplace as notesqr |
| Cursor | cursor-plugin/ |
| Gemini CLI | gemini-extension.json · gemini extensions install https://github.com/NotesQR/notesqr-share |
| Claude / Codex | claude-plugin/ · codex-plugin/ |
MIT. Product: notesqr.com · Donate · Changelog

