Depot is a simple, post-quantum-ready file transfer tool. It favors a clean CLI, strong defaults, and explicit safety:
- Modern cryptography with ML-KEM (KEM), ML-DSA (identity), Argon2 (KDF), BLAKE3 (hashing), and XChaCha20-Poly1305 (AEAD).
- Sandboxed filesystem mode by default (no absolute paths; no escaping the server root).
- Clear, standardized error codes and explicit batch outcomes.
- TOFU identity pinning with ML-DSA; ML-KEM for session keys; Argon2 for key-at-rest and handshake key schedule; XChaCha20-Poly1305 for records.
- Sandboxed filesystem mode by default (no absolute paths; normalized under the server root).
- Atomic write/commit with integrity-on-commit checksums; partials removed on abort.
Requires Rust and Cargo.
cargo build --release- Scaffold a config for stable defaults like named servers, log level, and sandbox:
depot config --initEdit ~/.config/depot/depot.conf to set those defaults if you want them.
The examples below assume client.server = "home" is configured.
- Start the server from the directory you want to share:
cd /srv/media
depot serve --key-pass "change-me"First run requires --key-pass or --key-pass-file to generate an encrypted server identity key. Later runs must use the same passphrase.
Use --root, --listen, or --port only when you want to override the default server behavior.
- Export files and directories from your current directory:
depot export picture.jpg
# Export into a specific remote subdirectory
depot export picture.jpg --dest photos/trips
# Export the contents of the current directory
depot export --all- Import files into your current directory:
depot import movie.mp4
# Pull the entire shared root
depot import --all
# Download into a different local destination
depot import folder --dest ~/Downloads/inbox
# List remote content
depot lsdepot serve [--listen IP] [--port N] [--root DIR] [--log LEVEL]
[--no-sandbox] [--allow-overwrite]
[--key-pass PASS | --key-pass-file PATH]
depot export FILE... [--server NAME] [--host HOST] [--port N]
[--dest DIR] [--all]
[--no-skip | --noskip] [--log LEVEL]
depot import ITEM... [--server NAME] [--host HOST] [--port N]
[--dest DIR] [--all]
[--no-skip | --noskip] [--log LEVEL]
depot ls [PATH] [--server NAME] [--host HOST] [--port N] [--log LEVEL]
depot config --init [--force]
depot --version
Tips:
- In sandboxed mode, the server rejects absolute remote paths and
..traversal. - In no-sandbox mode (
depot serve --no-sandbox), absolute remote paths are allowed. depot serveuses the current directory as the server root unless--rootis provided.depot exportanddepot importuse the current directory by default.- Skip-existing behavior is on by default for export/import; use
--no-skipor--noskipto disable it. - Resolution order is:
client.serverdefault, then--server, then--host/--port. --serverselects a named server from config.--hostand--portare one-command overrides on top of that resolved endpoint.
~/.config/depot/depot.conf:
[server]
# listen = 0.0.0.0
# port = 60006
sandbox = true
[client]
server = "home"
# log = info
[servers.home]
host = "localhost"
port = 60006
# [servers.vps]
# host = "files.example.com"
# port = 60006
Config is only for stable preferences. Server pathing is not configured here. depot serve serves the current directory unless --root is provided.
Named servers:
- Set
client.server = "name"to choose the default named server. - Use
--server nameto select a different named server for one command. --hostand--portoverride the final resolved endpoint directly for one command.- If you do not configure
client.server, you must use--serveror--hoston client commands.
- Depot stores identity and trust material under the Depot config directory.
- The server identity lives under
~/.config/depot/id/and is created lazily on first successfulserve. - The server secret key is encrypted at rest in
DPK1format and requires--key-passor--key-pass-file. - The client uses TOFU pinning and stores pinned server public keys under
~/.config/depot/trust/. - Client identity lives under
~/.config/depot/id/and is always used for client authentication. - Server-side trusted client public keys live under
~/.config/depot/trust/clients/.
- Wire carries only an error code; both sides render standardized messages:
- Client:
[code] <client message> - Server:
[code] <server message>
- Client:
- Success and skip messages are local only and use typed local status rendering.
- Batch runs report transferred, skipped, and failed items explicitly.
- AEAD framing uses typed encrypted records over TCP.
- Nonces use a per-direction prefix and counter.
- The server does not invoke a shell to parse paths; the protocol is structured and binary.
- The Rust implementation uses public crates for its crypto stack:
libcrux-ml-kem,libcrux-ml-dsa,chacha20poly1305,argon2, andblake3.
- Uploads write to
<dest>.partand move into place only after checksum verification. On error, partial files are removed. - Downloads write to
<dest>.partand move into place only after checksum verification. - Metadata preservation: server to client and client to server preserve
mtimeand file permissions. - Directory export/import:
- Exporting a directory includes the top-level directory name.
- Importing a directory includes the top-level directory name.
- Relative remote paths are resolved from the server root.
- Relative local paths are resolved from the client current working directory.
- Exit status is non-zero if any failures occurred in a batch.