Fast, frictionless file transfer for your local network. Send files, text, and messages between computers on the same WiFi with zero setup.
🚀 Performance
- Parallel SHA-256 hashing (all CPU cores via rayon)
- Auto-compression for 10+ files (zips before send, auto-unzips on receive)
- Live telemetry: speed, ETA, per-file and overall progress
💬 Communication
- Transfer notes — attach messages to any send
- Incoming transfer prompt with sender name, file list, size
- Device groups — send to multiple devices in one click
🎯 Control
- Bandwidth throttling (1–50 MB/s or unlimited)
- Transfer filters: All / Active / Done / Failed with live badges
- Trusted devices — auto-accept from known peers
- Watch folders — auto-send new files to a target device
- Cancelable transfers with partial cleanup
🎨 UI/UX
- Windows 11 Fluent design (Mica blur, Segoe UI Variable, amber accent)
- System tray — minimize to background, receives while hidden
- File explorer with list/grid views, inline rename, keyboard shortcuts
- Session stats: aggregate speed, bytes sent/received
🔄 Reliability
- SHA-256 integrity verification (both ends)
- Conflict handling: rename / overwrite / skip
- Auto-update from GitHub releases
- Transfer history and replay
- Cross-platform: Windows, macOS, Linux
- Windows:
.msiinstaller or portable.exe - macOS: Universal
.dmg(arm64 + x86) - Linux:
.AppImageor.deb
Auto-updates when new versions are available.
- Install Beam on 2+ machines on the same local network
- Open Beam — nearby devices appear automatically
- Drag files onto the send panel or use the file explorer
- Pick a device (or group) and hit Send
- Receiver accepts → files land in Downloads/Beam
Drag & drop: Drag files/folders onto the send panel.
File browser: Click the Explorer tab, browse folders, right-click → Send with Beam.
Watch folder: Settings → Watch Folders → pick a folder and target device. Auto-sends new files.
Before sending, click "Add note for recipient" and type a message (max 280 chars). The recipient sees it in the accept prompt.
Create a group: Settings → Device Groups → type a name, select devices, click "Create group".
Send to group: In the send panel, click "+ Add device", select your group. All online members are added.
Settings → Send bandwidth limit: cap upload speed to avoid network congestion.
When receiving a transfer, toggle "Always auto-accept from [device]". They'll never prompt again—transfers auto-accept to your default save folder.
Close the window → Beam keeps running in the background ready to receive. Left-click the tray icon to toggle the window.
- Filter transfers: All / Active / Done / Failed tabs with live counts
- View file list: Expand any transfer card to see all files + sizes
- Retry failed sends: Click the Retry button on failed transfers
- Clear completed: Bulk-dismiss done/failed transfers with one click
- Session stats: See aggregate speed (Zap icon) and total bytes sent/received
Requirements:
- Node.js 18+ (LTS recommended)
- Rust 1.70+
- Platform-specific:
- Windows: Microsoft Visual C++ Build Tools
- macOS: Xcode Command Line Tools
- Linux:
libwebkit2gtk-4.1-dev,libappindicator3-dev,librsvg2-dev,patchelf
Setup:
git clone https://github.com/SawcyD/Beam.git
cd Beam
npm install
# Development (hot reload)
npm run dev
# Production build
npm run build
# Package installer
npm run tauri buildInstallers appear in src-tauri/target/release/bundle/.
src/
├── components/ UI components
│ ├── Explorer/ File browser (list, grid, context menu, sidebar)
│ ├── DeviceList.tsx Nearby devices
│ ├── TransferList.tsx Transfer filtering + stats
│ ├── TransferItem.tsx Per-transfer progress (expandable file list, retry)
│ ├── SendDropzone.tsx File staging + device/group picker + note field
│ ├── IncomingPrompt.tsx Accept/reject with note display
│ ├── Settings.tsx Device name, save dir, theme, bandwidth, groups
│ └── ui/ Primitives (button, dialog, progress, etc.)
├── store.ts Zustand state, device groups, bandwidth limit
└── types.ts Protocol types, DeviceGroup, FsEntry, etc.
src-tauri/src/
├── lib.rs Setup, tray menu, command handlers, bandwidth/groups
├── transfer.rs Send/receive, hashing, compression, bandwidth throttle
├── discovery.rs mDNS peer discovery
├── protocol.rs Wire format (Control, Offer with note, etc.)
├── state.rs AppState, Settings (bandwidth_limit, groups)
├── explorer.rs File browser commands
├── watch.rs Folder monitoring + auto-send
├── updater.rs Update check/install
└── history.rs Transfer log
.github/workflows/
├── release.yml Build & sign on git tag, create GitHub release
└── ci.yml Type-check & cargo check on push
Discovery:
- mDNS advertises
_beam._tcpservice with device name + ID + port - Peers resolved via DNS-SD, shown in Nearby list
Transfer Protocol:
- Sender → Receiver: TCP connection, sends
Offer(files, SHA-256, optional note, compress flag) - Receiver → Sender:
Response { accept: bool } - If accepted: Sender streams file bytes in order, receiver hashes & writes
- Both emit
transfer-progress(speed/ETA) andtransfer-done(status) - If compressed: receiver unzips archive and cleans up
Bandwidth Throttle:
- Per-chunk sleep: if limit is 10 MB/s, sleeps to stay within that rate
Device Groups:
- Stored in
settings.jsonas{ id, name, device_names: ["Device A", "Device B"] } - Matched by device name (stable for LAN peers)
- When sent to, resolves group names → online devices with those names
- Frontend: React 18, TypeScript, Tailwind CSS, Zustand, Framer Motion, Lucide icons
- Backend: Tauri 2, Rust, Tokio async
- Protocols: mDNS (mdns-sd), TCP with length-framed JSON (serde), SHA-256 (sha2), ZIP (zip v2)
- Utilities: Rayon (parallel hashing), Trash (safe deletes), Window Vibrancy (Mica), Notify (watch folders)
- CI/CD: GitHub Actions (auto-release on git tag)
- Clipboard sync (live bidirectional sharing)
- Screenshot → send (global hotkey, auto-stage PNG)
- File request (ask peer for a file)
- Transfer queue reordering (drag to prioritize)
- Bidirectional folder sync
- Beam Link (temporary HTTP download URL for non-Beam clients)
Devices not appearing?
- Both machines must be on the same local network/subnet
- Check firewall (mDNS port 5353, your listening port)
- Restart Beam on both sides
Transfer stalls or is slow?
- Check network congestion/WiFi signal
- Enable bandwidth throttling in Settings
- Try a smaller file to isolate the issue
Update check fails?
- Repo must be public (auto-update requires no auth)
- Check internet connection
- Manually download from Releases if needed
Report issues: GitHub Issues
Submit code:
- Fork the repo
- Create a feature branch (
git checkout -b feature/my-idea) - Test locally
- Open a pull request
MIT License — free to use, modify, distribute.
Made with ❤️ for frictionless local file transfer.
GitHub · Issues · Releases