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

FlagDefaultEffect
--slideshowoffStart in slideshow mode rather than paused
--fountainoffLT-code symbols instead of sequential chunks
--base64autoForce base64 encoding; auto-enabled for non-UTF-8 input
--verify=<file>Verify the input against an SHA-256 checksum file
--split-awareoffDetect and concatenate .part*.txt / .partaa inputs
--multi=N|autooffRender N QR codes per frame in a grid (1–4)
--ecc=L|M|Q|HLError-correction level
--speed=<seconds>0.5Delay between frames
--buffer=<lines>10Vertical buffer lines, which sets the QR version
--invertoffInvert QR colours
--no-infooffHide the sidebar
--resumeoffPersist slideshow position via .porter_history
--resetoffIgnore a saved position (requires --resume)
--yesoffSkip 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

KeyAction
l k spaceNext frame
h jPrevious frame
Shift+/Scrub ~100 chunks
JJump to chunk
GGap-fill mode — loop only specified indices
+ / -Adjust speed
SToggle slideshow
IToggle sidebar
QQuit

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.

FlagDefault
--host0.0.0.0
--port8080
--output-dirreceived

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.

FlagEffect
--output <path>Write elsewhere than <base>.joined
--forceOverwrite an existing destination
--no-verifySkip 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:

TaskRuns
rust-buildcargo build --release
rust-installBuild, then copy to ~/.local/bin/porter-sender
rust-testcargo test
rust-checkcargo clippy --all-targets -- -D warnings && cargo fmt --check
rust-sendBuild and run the sender
rust-serveBuild and run serve
flutter-buildRelease macOS build, x86_64 half stripped
flutter-installCopy PorterRx.app to /Applications
flutter-testflutter analyze && flutter test
Copyright © 2026