Installation
Porter is two programs. You need the sender on the machine holding the file and the receiver on the device with the camera.
The sender
Homebrew
brew install terrorsquad/tap/porter-sender
porter-sender myfile.pdf
Pre-built binary
Grab an archive for your platform from the
releases page — macOS and
Linux, arm64 and x86_64. Extract it and put porter-sender on your PATH.
The binary is self-contained: copy it to the air-gapped machine and it runs with nothing else installed. That is the point of the move to Rust — the sending machine needs no runtime, which matters most on the machine least likely to have one.
From source
Requires a Rust toolchain (rustup). No other dependencies.
git clone https://github.com/TerrorSquad/porter
cd porter/rust-sender
cargo build --release
./target/release/porter-sender myfile.pdf
Or with mise from the repo root:
mise run rust-install # builds, then copies to ~/.local/bin/porter-sender
porter-sender myfile.pdf
Other tasks: rust-build, rust-test, rust-check, rust-send, rust-serve.
The receiver
Requires Flutter.
cd flutter
flutter pub get
flutter build apk --release
# → build/app/outputs/flutter-apk/app-release.apk
cd flutter
flutter pub get
flutter build macos --release
# → build/macos/Build/Products/Release/PorterRx.app
Or with mise from the repo root:
mise run flutter-build # release build, x86_64 half stripped
mise run flutter-install # copies PorterRx.app to /Applications
flutter build macos produces a universal binary, so a release bundle carries
an x86_64 half that never runs on Apple Silicon — 44.7 MB against 22 MB once
stripped. The flutter-build mise task strips it.Verifying the install
Send a small text file to yourself:
echo "hello from the other side" > test.txt
porter-sender test.txt --slideshow --speed=0.5
Open the receiver, point it at the terminal, and the file should assemble, verify against its SHA-256, and save to Downloads.