

warp is a command-line tool for transferring files between devices on local networks.

Modern file transfer tool for local networks with interactive TUI, resumable transfers, and secure PAKE encryption.
warp is a high-performance, secure file transfer tool designed for local networks. It features both an interactive Terminal User Interface (TUI) and a traditional CLI, with support for resumable transfers, end-to-end encryption, and automatic service discovery.
go install github.com/zulfikawr/warp/cmd/warp@latest
Requires Go 1.25 or higher:
git clone https://github.com/zulfikawr/warp.git
cd warp
go build -o warp ./cmd/warp
warp offers two distinct modes of operation to suit different workflows:
Default mode when you run warp without arguments. Provides a beautiful, interactive terminal interface built with Bubble Tea.
# Launch interactive TUI
warp
Features:
Navigation:
β/β or j/k - Navigate menu itemsEnter - Select/confirmEsc or q - Go back/quitCtrl+C - Exit application? - Show helpCommand-line mode for scripting, automation, and CI/CD pipelines. Explicit and scriptable.
# Force CLI mode (required for text output)
warp --cli <command> [args...]
# Examples:
warp send myfile.zip --cli
warp receive --code 7-apple-velocity --cli
warp host -d ./uploads --cli
warp history --cli
Start server to share file, directory, or text.
| Flag | Short | Type | Default | Required | Description |
|---|---|---|---|---|---|
--port | -p | int | random | No | Server port |
--interface | -i | string | auto | No | Network interface to bind |
--text | string | No | Share text instead of file | ||
--stdin | bool | false | No | Read text from stdin | |
--rate-limit | float | 0 | No | Bandwidth limit in Mbps (0 = unlimited) | |
--cache-size | int | 100 | No | File cache size in MB | |
--no-qr | bool | false | No | Skip QR code display | |
--no-encrypt | bool | false | No | Disable encryption (not recommended) | |
--verbose | -v | bool | false | No | Verbose logging |
Arguments:
<path> - File or directory to share (required unless --text or --stdin)Start server to receive file uploads.
| Flag | Short | Type | Default | Required | Description |
|---|---|---|---|---|---|
--interface | -i | string | auto | No | Network interface to bind |
--dest | -d | string | . | No | Destination directory for uploads |
--rate-limit | float | 0 | No | Bandwidth limit in Mbps | |
--no-qr | bool | false | No | Skip QR code display | |
--no-encrypt | bool | false | No | Disable encryption (not recommended) | |
--verbose | -v | bool | false | No | Verbose logging |
Access the /upload endpoint in any browser for a terminal-styled upload interface.

Features:
[||] / [>] buttons[x] buttonDownload file from warp server using a URL or PAKE code.
| Flag | Short | Type | Default | Required | Description |
|---|---|---|---|---|---|
--output | -o | string | No | Output filename or directory | |
--force | -f | bool | false | No | Overwrite existing files |
--workers | int | 3 | No | Parallel download workers | |
--chunk-size | int | 2 | No | Chunk size in MB | |
--no-checksum | bool | false | No | Skip SHA256 verification | |
--decrypt | bool | false | No | Decrypt with password | |
--verbose | -v | bool | false | No | Verbose logging |
Arguments:
<code|url> - Pake code or Server URLDiscover warp servers on local network via mDNS.
| Flag | Short | Type | Default | Required | Description |
|---|---|---|---|---|---|
--timeout | duration | 3s | No | Discovery timeout |
View transfer history. Defaults to TUI mode.
| Flag | Short | Type | Default | Required | Description |
|---|---|---|---|---|---|
--cli | bool | false | No | Output in text mode |
Manage interrupted transfers. Defaults to TUI mode.
| Flag | Short | Type | Default | Required | Description |
|---|---|---|---|---|---|
--cli | bool | false | No | Output in text mode |
Arguments:
<session-id> - (Optional) Session ID to resume immediatelyManage configuration file.
Subcommands:
init - Initialize configuration interactivelyshow - Display current configurationedit - Open config in $EDITOR (defaults to vi)path - Show config file locationPrint version information.
Location: ~/.config/warp/warp.yaml
| Setting | Type | Default | Description |
|---|---|---|---|
default_interface | string | auto-detect | Network interface to bind |
default_port | int | 0 (random) | Server port |
buffer_size | int | 1048576 (1MB) | I/O buffer size in bytes |
max_upload_size | int64 | 10737418240 (10GB) | Maximum upload size in bytes |
rate_limit_mbps | float | 0 (unlimited) | Bandwidth limit in Mbps |
cache_size_mb | int64 | 100 | File cache size in MB |
chunk_size_mb | int | 2 | Chunk size for parallel uploads |
parallel_workers | int | 3 | Number of parallel workers |
no_qr | bool | false | Skip QR code display |
no_checksum | bool | false | Skip SHA256 verification |
upload_dir | string | . | Default upload directory |
Example:
default_interface: ""
default_port: 0
buffer_size: 1048576
max_upload_size: 10737418240
rate_limit_mbps: 0
cache_size_mb: 100
chunk_size_mb: 2
parallel_workers: 3
no_qr: false
no_checksum: false
upload_dir: "."
Override config with WARP_ prefix:
export WARP_DEFAULT_PORT=9000
export WARP_RATE_LIMIT_MBPS=10
export WARP_CACHE_SIZE_MB=200
warp send file.zip
| Method | Path | Description |
|---|---|---|
| GET | /d/{token} | Download file |
| POST | /upload/chunk | Upload file chunk |
| GET | /api/info | Server and file info |
| GET | /ws/progress | WebSocket progress updates |
| GET | /metrics | Prometheus metrics |
| GET | /upload | Web upload interface |
| GET | /health | Health check endpoint |
Download (GET /d/{token}):
X-Checksum-SHA256 - File SHA256 hashUpload (POST /upload/chunk):
X-Upload-Session - Session IDX-Chunk-Index - Chunk index (0-based)X-Chunk-Offset - Byte offsetX-Total-Chunks - Total chunksX-File-Name - FilenameDownload:
/d/{token}Upload:
/api/info/upload/chunk (parallel)βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β warp CLI β
β βββββββββββββββββββββ ββββββββββββββββββββββ β
β β TUI Mode β β CLI Mode β β
β β (Bubble Tea) β β (Traditional) β β
β β β β β β
β β β’ Interactive UI β β β’ Direct commands β β
β β β’ File picker β β β’ Scriptable β β
β β β’ Resume manager β β β’ Automation β β
β βββββββββββ¬ββββββββββ βββββββββββ¬βββββββββββ β
β β β β
β ββββββββββββββββ¬ββββββββββββββββββββ β
β β β
β ββββββββΌβββββββ β
β β Core β β
β β Commands β β
β ββββββββ¬βββββββ β
βββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββΌββββββββββββββββ
β β β
βββββββββΌβββββ ββββββββΌββββββ βββββββΌβββββββ
β Client β β Server β β Resume β
β β β β β System β
β β’ Upload β β β’ HTTP/3 β β β
β β’ Download β β β’ PAKE β β β’ Checkpnt β
β β’ PAKE β β β’ Chunks β β β’ Encrypt β
β β’ Progress β β β’ Progress β β β’ Recover β
ββββββββββββββ ββββββββββββββ ββββββββββββββ| Component | Location | Purpose | Lines |
|---|---|---|---|
| TUI | cmd/warp/tui/ | Interactive terminal UI with Bubble Tea (16 files) | ~6000 |
| CLI | cmd/warp/cli/ | Traditional command-line interface (7 files) | ~1500 |
| Core | internal/core/ | Business logic executors for commands (6 files) | ~1200 |
| Resume | internal/resume/ | Resumable transfer system (15 files, 22 test files) | ~4000 |
| Server | internal/server/ | HTTP/QUIC server, chunks, PAKE, progress (18 files) | ~4500 |
| Client | internal/client/ | HTTP client, parallel uploads/downloads, PAKE (6 files) | ~1800 |
| BufPool | internal/bufpool/ | Intelligent buffer pooling for memory optimization | ~100 |
| Crypto | internal/crypto/ | AES-256-GCM encryption, SPAKE2 PAKE, token generation (7 files) | ~900 |
| Discovery | internal/discovery/ | mDNS/DNS-SD service advertisement and browsing | ~350 |
| Protocol | internal/protocol/ | Transfer metadata, constants, handshake definitions (4 files) | ~600 |
| Metrics | internal/metrics/ | Prometheus metrics (modular: upload, download, cache, etc.) (8 files) | ~700 |
| Config | internal/config/ | YAML configuration with environment variable support | ~250 |
| Logging | internal/logging/ | Structured logging with zap (lazy initialization) | ~150 |
| Network | internal/network/ | IP discovery and network utilities | ~120 |
| UI | internal/ui/ | Progress bars, QR codes, formatting utilities | ~200 |
| Errors | internal/errors/ | User-friendly error types with suggestions | ~150 |
# All tests
go test ./...
# With race detector (recommended)
go test -race ./...
# With coverage
go test -cover ./...
# Specific package
go test -v ./internal/crypto
# Leak detection tests
go test -v -run TestServer_NoGoroutineLeaks ./internal/server/
# Nonce exhaustion tests
go test -v -run TestEncryptReader_NonceExhaustion ./internal/crypto/
# Coverage report
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
Test Suite:
go fmt ./... # Format
go vet ./... # Vet
go mod tidy # Clean dependencies
See CONTRIBUTING.md.
go test ./...MIT License - see LICENSE.