Reference
Commands
Every flag, subcommand and keybinding the sender accepts.
porter-sender <file> [options]
porter-sender <file.part*.txt|file.partaa|...> [options]
echo 'data' | porter-sender [options]
Run with no arguments for the built-in usage text.
Send options
| Flag | Default | Effect |
|---|---|---|
--slideshow | off | Start in slideshow mode rather than paused |
--fountain | off | LT-code symbols instead of sequential chunks |
--base64 | auto | Force base64 encoding; auto-enabled for non-UTF-8 input |
--verify=<file> | — | Verify the input against an SHA-256 checksum file |
--split-aware | off | Detect and concatenate .part*.txt / .partaa inputs |
--multi=N|auto | off | Render N QR codes per frame in a grid (1–4) |
--ecc=L|M|Q|H | L | Error-correction level |
--speed=<seconds> | 0.5 | Delay between frames |
--buffer=<lines> | 10 | Vertical buffer lines, which sets the QR version |
--invert | off | Invert QR colours |
--no-info | off | Hide the sidebar |
--resume | off | Persist slideshow position via .porter_history |
--reset | off | Ignore a saved position (requires --resume) |
--yes | off | Skip the confirmation prompt for very long transfers |
--base64 has no effect with --fountain — fountain payloads are always
base64. Higher --ecc costs payload capacity, so L is the default; raise it
only if frames are genuinely failing to decode.Keybindings
| Key | Action |
|---|---|
→ l k space | Next frame |
← h j | Previous frame |
Shift+←/→ | Scrub ~100 chunks |
J | Jump to chunk |
G | Gap-fill mode — loop only specified indices |
+ / - | Adjust speed |
S | Toggle slideshow |
I | Toggle sidebar |
Q | Quit |
serve
porter-sender serve [--host=0.0.0.0] [--port=8080] [--output-dir=received]
An HTTP receiver on axum. POST /upload accepts raw bodies,
multipart/form-data, and QR-scan JSON — sequential, fountain and checksum
frames — reconstructing multi-part and fountain transfers automatically.
| Flag | Default |
|---|---|
--host | 0.0.0.0 |
--port | 8080 |
--output-dir | received |
join
porter-sender join <transfer-dir|file|id> [...] [--output <path>] [--force] [--no-verify]
Reassembles .partaa, .partab, … into the original file, verifying against
<base>.sha256 when present. The target may be a transfer directory, any file
inside one, or a bare transfer id relative to the working directory.
| Flag | Effect |
|---|---|
--output <path> | Write elsewhere than <base>.joined |
--force | Overwrite an existing destination |
--no-verify | Skip the SHA-256 check |
join takes a space-separated --output <path>, unlike the --flag=value
shape everything else uses.mise tasks
From the repo root:
| Task | Runs |
|---|---|
rust-build | cargo build --release |
rust-install | Build, then copy to ~/.local/bin/porter-sender |
rust-test | cargo test |
rust-check | cargo clippy --all-targets -- -D warnings && cargo fmt --check |
rust-send | Build and run the sender |
rust-serve | Build and run serve |
flutter-build | Release macOS build, x86_64 half stripped |
flutter-install | Copy PorterRx.app to /Applications |
flutter-test | flutter analyze && flutter test |