Shuttle is a CLI tool and library for peer-to-peer file and directory transfer using WebRTC and short-lived IDs. It supports live synchronization, controlled bidirectional changes, and automatic acceptance of updates.
It is designed for fast bootstrapping, temporary collaboration, and secure transfers without relying on a file server.
- push: exposes files or directories and generates an ID
- pull: connects using the ID and receives data
- server: signaling only, never transfers payloads
- WebRTC: direct peer-to-peer tunnel
npm install -g johankit-shuttle
Or locally:
npm install
The signaling server is required only to establish the peer connection.
node server.js
By default it runs on http://localhost:3000
shuttle push .
Output:
ID: G1946C
shuttle pull G1946C
Files are written to the current directory.
Keeps the connection open and streams file changes.
shuttle push . --live
shuttle pull G1946C --live
The pull side never modifies the push side directly. All modifications are sent as proposals.
shuttle push . --live --allow-changes
shuttle push . --live --allow-changes --auto-accept
With auto-accept enabled, changes proposed by pull are immediately applied on push.
Without auto-accept, proposals are received but ignored.
push:
- --live keeps synchronization active
- --allow-changes allows proposals from pull
- --auto-accept automatically applies proposals
pull:
- --live continuously proposes local changes
- The signaling server never sees files
- All data flows directly via WebRTC
- Push is always authoritative
- No changes are applied without explicit permission
- server.js signaling server
- shuttle.js WebRTC core
- cli.js CLI interface
- example-push.js simple push example
- example-pull.js simple pull example
- Node.js 18 or newer
- UDP connectivity enabled for STUN
Stable and ready for production use