A self-hosted, one-time file transfer service with optional client-side encryption.
- One-Time Downloads: Files are instantly unavailable once download starts, deleted after completion
- Optional Client-Side Encryption: Client encrypts files by default using
age, but can be disabled - Streaming: No temp files - encryption/upload and download/decryption stream directly
- Word-Based IDs: Human-readable file IDs like
porcupine-rat-forest-experience - Cross-Platform: Works on Linux, macOS, Windows, and Alpine
- Progress Tracking: Real-time progress bars with speed in MB/s
- Simple API: Can be used directly with curl or any HTTP client
docker run -d \
-p 8080:8080 \
-e BYEE_PUBLIC_URL=https://byee.example.com \
-v byee-data:/app/data \
git.juzo.io/juzo/byee:latestOr with docker-compose (see docker/docker-compose.example.yml).
# Linux/macOS - one command install
curl -fsSL https://byee.example.com | sh
# Windows PowerShell
irm https://byee.example.com | iexbyee ./file.zip
# Output: byee receive porcupine-rat-forest-experience A2K8X9M4P1Q7byee --no-encrypt ./file.zip
# Output: byee receive porcupine-rat-forest-experiencebyee receive porcupine-rat-forest-experience A2K8X9M4P1Q7
# Prompts: Download file.zip (1.5 GB)? [y/N]: y-
Sender runs
byee ./file.zip -
Client generates an
ageencryption key -
File is streamed through encryption directly to the server (no temp files)
-
Server stores encrypted file, returns word-based ID
-
Client displays:
byee receive <id> <key> -
Receiver runs the command
-
Server confirms file exists, returns metadata (filename, size)
-
File is instantly claimed - no one else can access it
-
User confirms download
-
File streams from server through decryption directly to disk
-
Server deletes the file
When using --no-encrypt, files are uploaded and downloaded as-is. The server stores the raw file.
The server can be used directly without the client, using curl or any HTTP client:
curl -X POST https://byee.example.com/upload \
-H "Content-Type: application/octet-stream" \
-H "X-Byee-Filename: myfile.zip" \
-H "X-Byee-Size: 1234567" \
--data-binary @myfile.zip
# Response: {"id":"porcupine-rat-forest-experience","command":"byee receive porcupine-rat-forest-experience <KEY>"}curl https://byee.example.com/download/porcupine-rat-forest-experience?info=true
# Response: {"filename":"myfile.zip","size":1234567,"size_human":"1.18 MB","claim_token":"..."}curl -o myfile.zip https://byee.example.com/download/porcupine-rat-forest-experience \
-H "X-Byee-Claim-Token: <token-from-info>"| Variable | Description | Default |
|---|---|---|
BYEE_PUBLIC_URL |
Public URL of the instance (required) | - |
BYEE_STORAGE_PATH |
Path to store files | ./data |
BYEE_MAX_FILE_SIZE |
Maximum file size in bytes | 107374182400 (100GB) |
| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Auto-detect platform, return installer |
/install/{platform} |
GET | Platform-specific installer |
/client/{platform} |
GET | Platform-specific client script |
/upload |
POST | Upload file (encrypted or raw) |
/download/{id} |
GET | One-time download |
/download/{id}?info=true |
GET | Get file info and claim |
/health |
GET | Health check |
- With encryption (default): Server never sees unencrypted content. Encryption key is only known to sender and receiver.
- Without encryption: Server stores raw files. Use HTTPS to protect data in transit.
- Files are deleted immediately after download (or failed/cancelled download)
- No accounts, no content logs
dotnet build src/Byee.Server/Byee.Server.csproj -c ReleaseBSD-3-Clause