[{"data":1,"prerenderedAt":225},["ShallowReactive",2],{"navigation_docs":3,"-docs-getting-started-introduction":59,"-docs-getting-started-introduction-surround":222},[4,25,40],{"title":5,"path":6,"stem":7,"children":8,"page":24},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[9,14,19],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Using Porter","\u002Fdocs\u002Fgetting-started\u002Fusing-porter","docs\u002F1.getting-started\u002F3.using-porter","i-lucide-terminal",false,{"title":26,"path":27,"stem":28,"children":29,"page":24},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002F2.architecture",[30,35],{"title":31,"path":32,"stem":33,"icon":34},"Overview","\u002Fdocs\u002Farchitecture\u002Foverview","docs\u002F2.architecture\u002F1.overview","i-lucide-layers",{"title":36,"path":37,"stem":38,"icon":39},"Receiver internals","\u002Fdocs\u002Farchitecture\u002Freceiver","docs\u002F2.architecture\u002F2.receiver","i-lucide-smartphone",{"title":41,"path":42,"stem":43,"children":44,"page":24},"Reference","\u002Fdocs\u002Freference","docs\u002F3.reference",[45,49,54],{"title":46,"path":47,"stem":48,"icon":23},"Commands","\u002Fdocs\u002Freference\u002Fcommands","docs\u002F3.reference\u002F1.commands",{"title":50,"path":51,"stem":52,"icon":53},"Wire format","\u002Fdocs\u002Freference\u002Fwire-format","docs\u002F3.reference\u002F2.wire-format","i-lucide-binary",{"title":55,"path":56,"stem":57,"icon":58},"Decisions","\u002Fdocs\u002Freference\u002Fdecisions","docs\u002F3.reference\u002F3.decisions","i-lucide-file-text",{"id":60,"title":10,"body":61,"description":215,"extension":216,"links":217,"meta":218,"navigation":219,"path":11,"seo":220,"stem":12,"__hash__":221},"docs\u002Fdocs\u002F1.getting-started\u002F1.introduction.md",{"type":62,"value":63,"toc":201},"minimark",[64,73,76,81,131,135,138,145,149,197],[65,66,67,68,72],"p",{},"Porter moves a file between two machines with ",[69,70,71],"strong",{},"no network between them",". The\nsending machine renders the file as a slideshow of QR codes in a terminal; a\nphone camera scans them and reassembles the original bytes.",[65,74,75],{},"That's the entire transport. No pairing, no accounts, no server, no cloud.",[77,78,80],"h2",{"id":79},"principles","Principles",[82,83,85,90,93,97,105,109,112,116,119,123],"steps",{"level":84},"3",[86,87,89],"h3",{"id":88},"the-air-gap-is-the-feature","The air gap is the feature",[65,91,92],{},"Porter is not a faster way to send a file — it is a way to send one when no\nother path exists. A machine with no network interface, an isolated lab\nnetwork, a device you will not plug a USB stick into.",[86,94,96],{"id":95},"no-back-channel-so-no-retries","No back-channel, so no retries",[65,98,99,100,104],{},"The receiver cannot ask for a frame again. Fountain coding removes the need:\nevery frame is an XOR of a random subset of the file's blocks, so ",[101,102,103],"em",{},"any","\nsufficient pile of frames reconstructs it and no individual frame matters.",[86,106,108],{"id":107},"one-binary-on-the-sending-side","One binary on the sending side",[65,110,111],{},"The sending machine is often not the one you keep a runtime on. The sender is a\nsingle static Rust binary — no Node.js, no Python, nothing to install first.",[86,113,115],{"id":114},"two-implementations-one-wire-format","Two implementations, one wire format",[65,117,118],{},"A Rust sender and a Dart receiver must derive fountain symbols identically from\nthe frame's sequence number. The format is specified normatively and checked\nagainst shared fixtures, not by trusting the two to stay in step.",[86,120,122],{"id":121},"nothing-written-unless-asked","Nothing written unless asked",[65,124,125,126,130],{},"No telemetry, no analytics, no history file by default. ",[127,128,129],"code",{},"--resume"," opts into\npersisting slideshow position; without it, the sender leaves no disk trace.",[77,132,134],{"id":133},"when-to-use-something-else","When to use something else",[65,136,137],{},"Porter is honest about being slow. QR codes are a low-bandwidth, line-of-sight,\nlossy link, and a 109 MB file is around 26,000 chunks — a real transfer that has\nbeen run, and also a long time holding a phone at a screen.",[65,139,140,141,144],{},"If the two machines can see each other over a network, use a network.\n",[127,142,143],{},"porter-sender serve"," is in the box for exactly that case: an HTTP receiver that\naccepts uploads and QR-scan JSON alike, so you can start with the camera and\nfinish over a wire when one turns out to be available.",[77,146,148],{"id":147},"the-pieces","The pieces",[150,151,152,165],"table",{},[153,154,155],"thead",{},[156,157,158,162],"tr",{},[159,160,161],"th",{},"Component",[159,163,164],{},"Role",[166,167,168,187],"tbody",{},[156,169,170,176],{},[171,172,173],"td",{},[127,174,175],{},"rust-sender\u002F",[171,177,178,179,182,183,186],{},"The QR slideshow sender, plus ",[127,180,181],{},"serve"," and ",[127,184,185],{},"join",". Single static binary.",[156,188,189,194],{},[171,190,191],{},[127,192,193],{},"flutter\u002F",[171,195,196],{},"The receiver app for Android and macOS. Scans, decodes, verifies, saves.",[198,199,200],"note",{},"The sender was TypeScript until ADR-0004 and ADR-0006 moved it to Rust and\ndeleted the Node package outright. The repo now contains no JavaScript.",{"title":202,"searchDepth":203,"depth":203,"links":204},"",2,[205,213,214],{"id":79,"depth":203,"text":80,"children":206},[207,209,210,211,212],{"id":88,"depth":208,"text":89},3,{"id":95,"depth":208,"text":96},{"id":107,"depth":208,"text":108},{"id":114,"depth":208,"text":115},{"id":121,"depth":208,"text":122},{"id":133,"depth":203,"text":134},{"id":147,"depth":203,"text":148},"What Porter is, what it deliberately isn't, and when it's the right tool.","md",null,{},{"icon":13},{"title":10,"description":215},"De4SviZaGqfQu8M9IAg2GqFccGkDCOzJ2PjSNyCckbw",[217,223],{"title":15,"path":16,"stem":17,"description":224,"icon":18,"children":-1},"Build the sender binary and install the receiver app.",1786360986182]