A lightweight, zero-bloat, self-hosted cross-device clipboard and file drop engine with sub-millisecond latency.
ClipSync allows any device on the same local network (laptops, phones, tablets) to seamlessly share clipboard text, URLs, code snippets, and files in real-time. Built with a modern developer utility aesthetic (Linear / Raycast / Vercel style) and strict dark mode.
+-------------------------------------------------+
| ClipSync Server (Node.js) |
| |
| +-------------------+ +------------------+ |
| | Express REST API | | WebSocket Server | |
| | - /api/v1/upload | | (ws path) | |
| | - /api/v1/download | - sync:new_item | |
| | - /api/v1/info | | - sync:history | |
| | - /api/v1/qr | | - sync:delete | |
| +---------+---------+ | - sync:clear | |
| | | - peer_count | |
| v +--------+---------+ |
| +-------------------+ | |
| | Ephemeral Storage | | |
| | (/uploads) | v |
| +-------------------+ +------------------+ |
| | In-Memory Buffer | |
| | (20-slot ring) | |
| +------------------+ |
+-------------------------------------------------+
โฒ
โ Sub-millisecond LAN Broadcast
โโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโ
โผ โผ โผ
+-----------------+ +-----------------+ +-----------------+
| Desktop PC | | MacBook Pro | | Mobile / Tablet |
| (Windows/Linux) | | (macOS) | | (iOS/Android) |
| [Ctrl + V] | | [Cmd + V] | | [QR Scan & Tap]|
+-----------------+ +-----------------+ +-----------------+
docker compose up -d
Open http://localhost:3000 in your browser.
ws).Ctrl+V or Cmd+V anywhere on the page to instantly broadcast text or images. Press Ctrl+Enter to broadcast typed notes.TEXT, CODE, LINK, IMAGE, or FILE.Copied!).clipsync-data.json).#0a0a0c dark background, #18181b card surfaces, and #27272a borders. Zero marketing fluff, zero bloat.clipsync/
โโโ package.json # Project manifest and scripts
โโโ server/
โ โโโ index.js # Server entrypoint (HTTP + WS + Static SPA fallback)
โ โโโ config.js # Config defaults & environment variable overrides
โ โโโ networkUtils.js # Discovers LAN IPv4 addresses (Wi-Fi / Ethernet)
โ โโโ ringBuffer.js # In-memory FIFO ring buffer with eviction cleanup
โ โโโ wsHandler.js # Real-time WebSocket connection & broadcast manager
โ โโโ routes.js # REST endpoints (/upload, /download, /info, /qr, /history)
โ โโโ test-integration.js # Automated end-to-end integration test suite
โโโ public/
โ โโโ index.html # Single-view developer utility UI
โ โโโ css/
โ โ โโโ style.css # Linear/Raycast dark theme & micro-interactions
โ โโโ js/
โ โโโ app.js # Main state controller & UI bindings
โ โโโ websocket.js # Auto-reconnecting WebSocket client
โ โโโ clipboard.js # Content classifier, device detection & clipboard API
โโโ uploads/ # Ephemeral upload folder (auto-managed)
โโโ .gitignore
โโโ README.md
npm install
npm start
Or run with auto-reload during development:
npm run dev
Upon launching, ClipSync displays the active network URLs in your terminal:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โก ClipSync โ Cross-Device Clipboard & File Drop
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โข Local: http://localhost:4040
โข Network: http://192.168.29.201:4040
โข QR Code: http://192.168.29.201:4040/api/v1/qr
โข Max History: 20 items in memory buffer
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Ready. Press CMD/CTRL+V anywhere or drop files to sync.
ClipSync automatically detects and displays your primary LAN IP when started. If you wish to check manually:
Windows:
ipconfig
Look for IPv4 Address under your active Wi-Fi or Ethernet adapter (e.g., 192.168.1.50).
macOS / Linux:
ipconfig getifaddr en0 # macOS Wi-Fi
hostname -I # Linux
You can customize ClipSync by setting environment variables or running with flags:
| Variable | Default | Description |
|---|---|---|
PORT | 4040 | Port for HTTP & WebSocket server |
HOST | 0.0.0.0 | Bind address (0.0.0.0 listens on all network interfaces) |
MAX_HISTORY | 20 | Maximum number of items in the in-memory ring buffer |
MAX_FILE_SIZE_MB | 100 | Maximum file upload size in megabytes |
PERSIST_TO_DISK | true | Persist clips across restarts via clipsync-data.json |
Example:
PORT=8080 MAX_HISTORY=30 npm start
An automated integration test is included that tests REST endpoints, WebSocket message exchanges, file uploads, file downloads, and history pruning:
node server/test-integration.js
MIT
JavaScript
66.5%
CSS
22.1%
HTML
11.2%
A lightweight, zero-bloat, self-hosted cross-device clipboard and file drop engine with sub-millisecond latency.
ClipSync allows any device on the same local network (laptops, phones, tablets) to seamlessly share clipboard text, URLs, code snippets, and files in real-time. Built with a modern developer utility aesthetic (Linear / Raycast / Vercel style) and strict dark mode.
+-------------------------------------------------+
| ClipSync Server (Node.js) |
| |
| +-------------------+ +------------------+ |
| | Express REST API | | WebSocket Server | |
| | - /api/v1/upload | | (ws path) | |
| | - /api/v1/download | - sync:new_item | |
| | - /api/v1/info | | - sync:history | |
| | - /api/v1/qr | | - sync:delete | |
| +---------+---------+ | - sync:clear | |
| | | - peer_count | |
| v +--------+---------+ |
| +-------------------+ | |
| | Ephemeral Storage | | |
| | (/uploads) | v |
| +-------------------+ +------------------+ |
| | In-Memory Buffer | |
| | (20-slot ring) | |
| +------------------+ |
+-------------------------------------------------+
โฒ
โ Sub-millisecond LAN Broadcast
โโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโ
โผ โผ โผ
+-----------------+ +-----------------+ +-----------------+
| Desktop PC | | MacBook Pro | | Mobile / Tablet |
| (Windows/Linux) | | (macOS) | | (iOS/Android) |
| [Ctrl + V] | | [Cmd + V] | | [QR Scan & Tap]|
+-----------------+ +-----------------+ +-----------------+
docker compose up -d
Open http://localhost:3000 in your browser.
ws).Ctrl+V or Cmd+V anywhere on the page to instantly broadcast text or images. Press Ctrl+Enter to broadcast typed notes.TEXT, CODE, LINK, IMAGE, or FILE.Copied!).clipsync-data.json).#0a0a0c dark background, #18181b card surfaces, and #27272a borders. Zero marketing fluff, zero bloat.clipsync/
โโโ package.json # Project manifest and scripts
โโโ server/
โ โโโ index.js # Server entrypoint (HTTP + WS + Static SPA fallback)
โ โโโ config.js # Config defaults & environment variable overrides
โ โโโ networkUtils.js # Discovers LAN IPv4 addresses (Wi-Fi / Ethernet)
โ โโโ ringBuffer.js # In-memory FIFO ring buffer with eviction cleanup
โ โโโ wsHandler.js # Real-time WebSocket connection & broadcast manager
โ โโโ routes.js # REST endpoints (/upload, /download, /info, /qr, /history)
โ โโโ test-integration.js # Automated end-to-end integration test suite
โโโ public/
โ โโโ index.html # Single-view developer utility UI
โ โโโ css/
โ โ โโโ style.css # Linear/Raycast dark theme & micro-interactions
โ โโโ js/
โ โโโ app.js # Main state controller & UI bindings
โ โโโ websocket.js # Auto-reconnecting WebSocket client
โ โโโ clipboard.js # Content classifier, device detection & clipboard API
โโโ uploads/ # Ephemeral upload folder (auto-managed)
โโโ .gitignore
โโโ README.md
npm install
npm start
Or run with auto-reload during development:
npm run dev
Upon launching, ClipSync displays the active network URLs in your terminal:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โก ClipSync โ Cross-Device Clipboard & File Drop
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โข Local: http://localhost:4040
โข Network: http://192.168.29.201:4040
โข QR Code: http://192.168.29.201:4040/api/v1/qr
โข Max History: 20 items in memory buffer
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Ready. Press CMD/CTRL+V anywhere or drop files to sync.
ClipSync automatically detects and displays your primary LAN IP when started. If you wish to check manually:
Windows:
ipconfig
Look for IPv4 Address under your active Wi-Fi or Ethernet adapter (e.g., 192.168.1.50).
macOS / Linux:
ipconfig getifaddr en0 # macOS Wi-Fi
hostname -I # Linux
You can customize ClipSync by setting environment variables or running with flags:
| Variable | Default | Description |
|---|---|---|
PORT | 4040 | Port for HTTP & WebSocket server |
HOST | 0.0.0.0 | Bind address (0.0.0.0 listens on all network interfaces) |
MAX_HISTORY | 20 | Maximum number of items in the in-memory ring buffer |
MAX_FILE_SIZE_MB | 100 | Maximum file upload size in megabytes |
PERSIST_TO_DISK | true | Persist clips across restarts via clipsync-data.json |
Example:
PORT=8080 MAX_HISTORY=30 npm start
An automated integration test is included that tests REST endpoints, WebSocket message exchanges, file uploads, file downloads, and history pruning:
node server/test-integration.js
MIT
JavaScript
66.5%
CSS
22.1%
HTML
11.2%