Releases: rootagi/Synapse
Release list
v2.0.0
Changelog
v2.0.0
New Features (Android)
- Home Screen — Added a new landing screen with typewriter hero text, pigeon logo, and Hotspot/WiFi mode selection
- QR Code Scanning — CameraX + ZXing-based QR code scanner for quick peer pairing
- QR Code Generation — Generate QR codes to share connection details
- Wi-Fi Hotspot Direct Share — Android LocalOnlyHotspot manager for programmatic hotspot creation, enabling transfers without an existing WiFi network
- Embedded HTTP File Server — Pure Java ServerSocket-based HTTP file server serves files over the hotspot for browser-based downloads
- Hotspot Share Screen — File picker, hotspot credentials display, and QR code sharing in a single screen
- Curtain Transition Animation — Samsung One UI "Now Bar" style curtain reveal transition component
- Stacked Swipe Mode Selector — Animated stacked swipe pill component with AGSL liquid metal shader effect for switching between Send and Receive modes
Performance Improvements
- Buffered Network I/O — Added 2MB buffered reader/writer on both sender and receiver sides to aggregate writes into fewer, larger TLS records, reducing encryption overhead
- Buffered File Writing — Receiver now wraps destination files in a 256KB buffered writer, with explicit flush at completion
- File Pre-allocation — Received files are pre-allocated on disk (seek to
Size-1) to prevent filesystem fragmentation and incremental allocation during transfer - Per-Connection TLS — Moved from
tls.Listen/tls.Dialto raw TCP with explicit per-connectiontls.Server/tls.Clienthandshakes; cipher suites now explicitly prefer AES-GCM over ChaCha20 for hardware AES-NI acceleration - TCP Socket Tuning —
TCP_NODELAYenabled, read/write socket buffers increased to 2MB - Reduced Allocations —
ChunkedWriternow uses a reusable[4]byteheader buffer instead of allocatingmake([]byte, ...)on every write
Stability & Correctness
- Fixed goroutine leak in
ScanPeers()— Theentrieschannel from the mDNS resolver is now explicitly closed when the scan context expires, preventingScanPeersfrom blocking indefinitely - Fixed data race in history loading —
loadHistory()now creates a defensive copy of the entries slice before returning, preventing race conditions between concurrent Wails JSON serialization andaddHistoryEntrywrites
Downloads
| Platform | File | Notes |
|---|---|---|
| 🐧 Linux | synapse-linux-amd64.tar.gz |
Extract and run ./synapse |
| 🪟 Windows (Installer) | synapse-amd64-installer.exe |
Recommended — setup wizard |
| 🪟 Windows (Portable) | synapse-windows-amd64.zip |
Extract and run synapse.exe |
| 📱 Android | synapse.apk |
Sideload on Android 8.0+ |
Requirements
- Linux:
sudo apt install libgtk-3-0 libwebkit2gtk-4.1-0 - Windows: WebView2 Runtime (pre-installed on Windows 10/11)
- Android: Enable "Install from unknown sources"
v1.2.1
Synapse v1.2.1
Changes Made
1. Typography Standardization
Replaced all references to default fonts, Delius, and Architects Daughter with the single uniform font "Gamja Flower".
PC Frontend: Added the Google Fonts API directly to frontend/index.html. Removed JetBrains Mono, Inter, and Fira Code backups across component CSS files (Sidebar.module.css, TransferOverlay.module.css) and index.css. All components now homogeneously inherit Gamja Flower.
Android App: Deleted local TRF font files (delius.ttf, architects_daughter.ttf) from android/app/src/main/res/font/. Replaced them with a newly downloaded gamja_flower.ttf. Reconfigured Type.kt by eliminating the old FontFamily instantiations and consolidating all Jetpack Compose UI Material Typographies into a single GamjaFlowerTextStyle.
2. Android Transfer Crash Bug (ZSTD Compression mismatch)
Bug Fixed: When the Go Sender (sender.go) sent .txt, .md, or .json files, it arbitrarily compressed them using ZSTD. Android's Jetpack Compose client throws IOException("Compressed transfers (zstd) are not yet supported on Android") thus aborting transfers entirely.
Resolution: Modified internal/transfer/sender.go's getCompressionMethod() method to return CompressionNone statically across the board, guaranteeing full 1:1 functional LAN transfer parity for both platforms.
Peer-to-peer encrypted file transfer with a premium React-powered GUI.
Downloads
| Platform | File | Notes |
|---|---|---|
| 🐧 Linux | synapse-linux-amd64.tar.gz |
Extract and run ./synapse |
| 🪟 Windows (Installer) | synapse-amd64-installer.exe |
Recommended — setup wizard |
| 🪟 Windows (Portable) | synapse-windows-amd64.zip |
Extract and run synapse.exe |
| 📱 Android | synapse.apk |
Sideload on Android 8.0+ |
Requirements
- Linux:
sudo apt install libgtk-3-0 libwebkit2gtk-4.1-0 - Windows: WebView2 Runtime (pre-installed on Windows 10/11)
- Android: Enable "Install from unknown sources"
Synapse v1.0
Synapse v1.0
Peer-to-peer encrypted file transfer with a premium React-powered GUI.
Downloads
| Platform | File | Notes |
|---|---|---|
| 🐧 Linux | synapse-linux-amd64.tar.gz |
Extract and run ./synapse |
| 🪟 Windows (Installer) | synapse-amd64-installer.exe |
Recommended — setup wizard |
| 🪟 Windows (Portable) | synapse-windows-amd64.zip |
Extract and run synapse.exe |
| 📱 Android | synapse.apk |
Sideload on Android 8.0+ |
Requirements
- Linux:
sudo apt install libgtk-3-0 libwebkit2gtk-4.1-0 - Windows: WebView2 Runtime (pre-installed on Windows 10/11)
- Android: Enable "Install from unknown sources"
v1.0.0
LanDrop
LanDrop is a command-line tool for peer-to-peer file transfer over Local Area Networks (LAN) or Hotspots. It allows you to send files and directories between devices without manually entering IP addresses, using mDNS for automatic discovery.
Features
- Interactive TUI: A modern Terminal User Interface built with
bubbleteaandlipglossfor a professional experience. - Directory Transfer: Support for transferring entire directories (automatically zipped and streamed).
- Zero Configuration: Automatically discovers peers on the local network using mDNS.
- Direct Transfer: Streams files directly between devices via TCP (no intermediate server).
- Secure:
- Encryption: All transfers are encrypted using TLS with ephemeral self-signed certificates.
- Connection Approval: Senders must explicitly approve incoming connections via an interactive prompt.
- Reliable:
- Integrity Verification: BLAKE3 checksums are calculated and verified for every transfer to ensure data integrity with minimal CPU overhead.
- Resumable Transfers: Automatically detects partial files and resumes downloads from where they left off.
- Performant:
- Adaptive Compression: Automatically compresses text-based files (e.g., .txt, .json, .go) using zstd for high speed and ratio. Skips compression for already compressed formats (e.g., .jpg, .zip, .mp4).
- Optimized Buffering: Uses large buffers (4MB) and
io.CopyBufferto maximize throughput. - Multi-Receiver Support: Allows multiple receivers to download the same file simultaneously.
- Cross-Platform: Works on any system where Go can act as a CLI (Linux, macOS, Windows).
Installation
Prerequisites
- Go 1.21 or higher.
Build from Source
git clone https://github.com/example/landrop.git
cd landrop
go mod tidy
go build -o landrop .Usage
1. Send a File or Directory
On the sender device, run:
./landrop send <path-to-file-or-directory>Example:
./landrop send my-photo.jpg
# or
./landrop send my-project-folder/The sender will start listening on a random port and broadcast its presence on the network. If a directory is selected, it will be archived on the fly.
Note: When a receiver attempts to connect, you will be prompted to approve the connection:
Incoming connection from 192.168.1.45:54321. Accept? (y/n):
2. Receive a File
On the receiver device (must be on the same WiFi/LAN), run:
./landrop receiveThe receiver will:
- Scan for available senders (showing a spinner).
- Display a list of discovered peers.
- Allow you to select a peer using arrow keys and press Enter.
- Negotiate resume offset (if partial file exists).
- Download, verify integrity, and (if applicable) extract the content.
Architecture
- UI: Built with Charm libraries (
lipgloss,bubbletea). - Discovery: Uses
_landrop._tcpmDNS service viazeroconf. - Transport: TLS over TCP with a custom negotiation protocol:
- Header: Length (8 bytes) + JSON Metadata (
{"name": "...", "size": ..., "compression": "..."}) - Request: Length (8 bytes) + JSON Request (
{"offset": ...}) - Content: Raw or Compressed Stream (Chunked encoding if compressed)
- Footer: BLAKE3 Checksum (32 bytes)
- Header: Length (8 bytes) + JSON Metadata (
- Language: Go (Golang).
- CLI: Built with
cobra.
Troubleshooting
- "No senders found": Ensure both devices are on the same network subnet. Some corporate or public WiFi networks block mDNS (multicast).
- Firewall: Ensure your firewall allows incoming TCP connections and UDP multicast (port 5353).
- Checksum Mismatch: If a transfer fails integrity verification, retry the transfer (it will resume automatically).