1:"$Sreact.fragment"
8:X
d:X
d:C
0:{"buildId":"-ZRYTkkZFp7tUVb5wt0Ju","data":[{"rsc":["$","$1","c",{"children":[["$","div",null,{"className":"px-5 py-16","children":["$","article",null,{"className":"mx-auto max-w-3xl","children":[["$","h1",null,{"className":"font-display text-4xl font-extrabold tracking-tight text-balance text-ink sm:text-5xl","children":"How LumiHop actually works"}],["$","p",null,{"className":"mt-4 text-lg leading-relaxed text-ink-2","children":"The short version: your devices shout on the local network, agree on a shared secret face to face, and then stream encrypted bytes straight at each other. There is no server in the middle holding your files, because there is no server."}],["$","section",null,{"id":"discovery","className":"scroll-mt-24 border-t border-line/70 py-12","children":[["$","p",null,{"className":"font-mono text-xs font-semibold tracking-widest text-accent uppercase","children":"Step one"}],["$","h2",null,{"className":"mt-3 font-display text-3xl font-bold tracking-tight text-balance text-ink","children":"Finding each other"}],["$","div",null,{"className":"mt-5 space-y-4 leading-relaxed text-ink-2","children":[["$","p",null,{"children":["Every device sends a small beacon on UDP multicast"," ",["$","code",null,{"className":"rounded bg-surface px-1.5 py-0.5 font-mono text-sm text-ink","children":"239.77.85.77:54545"}],", and on the subnet broadcast address as a fallback. The beacon carries a name, a platform, a port and a public key — never a file, never a filename."]}],["$","p",null,{"children":"Some networks pass multicast in one direction only, which produces the maddening case where your laptop sees your phone but not the reverse. So a device that hears a beacon also replies directly to the sender, with a flag that stops the two of them bouncing replies at each other forever."}]]}]]}],["$","section",null,{"id":"pairing","className":"scroll-mt-24 border-t border-line/70 py-12","children":[["$","p",null,{"className":"font-mono text-xs font-semibold tracking-widest text-accent uppercase","children":"Step two"}],["$","h2",null,{"className":"mt-3 font-display text-3xl font-bold tracking-tight text-balance text-ink","children":"Agreeing who you are"}],["$","div",null,{"className":"mt-5 space-y-4 leading-relaxed text-ink-2","children":[["$","p",null,{"children":["Each device generates an ",["$","strong",null,{"className":"text-ink","children":"Ed25519"}]," identity key once and keeps it. To connect, the two sides perform an"," ",["$","strong",null,{"className":"text-ink","children":"X25519"}]," key exchange, each signing their half so an attacker cannot sit in the middle and substitute their own."]}],["$","p",null,{"children":"The shared secret is run through HKDF-SHA256 to produce session keys, and — this is the part you see — a six-digit code. Both screens show that code. If they match, nobody is in the middle. If they do not, something is."}],["$","p",null,{"children":"After that first pairing the device is remembered, and you are not asked again."}]]}]]}],["$","section",null,{"id":"transfer","className":"scroll-mt-24 border-t border-line/70 py-12","children":[["$","p",null,{"className":"font-mono text-xs font-semibold tracking-widest text-accent uppercase","children":"Step three"}],["$","h2",null,{"className":"mt-3 font-display text-3xl font-bold tracking-tight text-balance text-ink","children":"Moving the bytes"}],["$","div",null,{"className":"mt-5 space-y-4 leading-relaxed text-ink-2","children":[["$","p",null,{"children":["Files are split into 256 KiB chunks, each sealed with"," ",["$","strong",null,{"className":"text-ink","children":"ChaCha20-Poly1305"}],". The receiver writes into a"," ",["$","code",null,{"className":"rounded bg-surface px-1.5 py-0.5 font-mono text-sm text-ink","children":".lhpart"}]," ","file and only renames it into place once the whole item’s SHA-256 matches what the sender promised. A file that appears in your downloads folder is a file that arrived intact."]}],"$L2"]}]]}],"$L3","$L4","$L5"]}]}],null,"$L6"]}],"isPartial":"$@7","staleTime":"$8","varyParams":null},{"rsc":"$L9","isPartial":"$@a","staleTime":"$8","varyParams":null},{"rsc":"$Lb","isPartial":"$@c","staleTime":"$8","varyParams":"$d"},{"rsc":"$Le","isPartial":"$@f","staleTime":"$8","varyParams":null}],"isUpgradeableISRFallback":false,"a":"$@10","rootVaryParams":null,"needsRuntimeRequest":"$@11"}
12:I[22016,["/app/_next/static/chunks/116is3w7ryjtu.js"],""]
13:I[97367,["/app/_next/static/chunks/116is3w7ryjtu.js"],"OutletBoundary"]
14:"$Sreact.suspense"
16:I[97367,["/app/_next/static/chunks/116is3w7ryjtu.js"],"ViewportBoundary"]
17:I[97367,["/app/_next/static/chunks/116is3w7ryjtu.js"],"MetadataBoundary"]
18:I[27201,["/app/_next/static/chunks/116is3w7ryjtu.js"],"IconMark"]
19:I[39756,["/app/_next/static/chunks/116is3w7ryjtu.js"],"default"]
1a:I[37457,["/app/_next/static/chunks/116is3w7ryjtu.js"],"default"]
1b:I[73478,["/app/_next/static/chunks/116is3w7ryjtu.js"],"SiteNav"]
:HL["/app/_next/static/chunks/37d-v1x98fsy6.css","style"]
2:["$","p",null,{"children":"If the connection drops, the partial stays on disk. The sender reconnects on its own, re-offers the same transfer, and continues from the byte it stopped at — you are not asked to approve it again, and nothing already transferred is sent twice."}]
3:["$","section",null,{"id":"browser","className":"scroll-mt-24 border-t border-line/70 py-12","children":[["$","p",null,{"className":"font-mono text-xs font-semibold tracking-widest text-accent uppercase","children":"On the web"}],["$","h2",null,{"className":"mt-3 font-display text-3xl font-bold tracking-tight text-balance text-ink","children":"Two browsers, no app"}],["$","div",null,{"className":"mt-5 space-y-4 leading-relaxed text-ink-2","children":[["$","p",null,{"children":"A web page cannot broadcast on a network — there is no UDP in a browser. So two browsers need something to introduce them, and that introduction is the one piece that cannot happen purely on your Wi-Fi."}],["$","p",null,{"children":["LumiHop’s signaling server does that introduction and nothing else. Once the two browsers know about each other they open a"," ",["$","strong",null,{"className":"text-ink","children":"WebRTC data channel"}]," and the file goes directly between them, over the local network."," ",["$","strong",null,{"className":"text-ink","children":"File contents never reach the signaling server."}]]}],["$","p",null,{"children":"Peers are grouped by a salted hash of their public IP address, which is how two phones behind the same router end up in the same room. The raw address is never stored, and the salt rotates daily."}],["$","p",null,{"children":"If you want zero contact with the internet, run the desktop app: it can do the introducing itself, on your own network, and the browser app will use it instead."}]]}]]}]
4:["$","section",null,{"id":"limits","className":"scroll-mt-24 border-t border-line/70 py-12","children":[["$","p",null,{"className":"font-mono text-xs font-semibold tracking-widest text-accent uppercase","children":"Honestly"}],["$","h2",null,{"className":"mt-3 font-display text-3xl font-bold tracking-tight text-balance text-ink","children":"What this does not protect you from"}],["$","div",null,{"className":"mt-5 space-y-4 leading-relaxed text-ink-2","children":[["$","p",null,{"children":"A security page that only lists strengths is marketing. These are the real edges:"}],["$","ul",null,{"className":"space-y-3","children":[["$","li",null,{"className":"rounded-xl border border-line bg-surface/60 p-4","children":[["$","strong",null,{"className":"text-ink","children":"Anyone on your Wi-Fi can see your device name."}]," ","Discovery beacons are unencrypted by design — that is how discovery works. They contain no file information, but they do announce that you exist."]}],["$","li",null,{"className":"rounded-xl border border-line bg-surface/60 p-4","children":[["$","strong",null,{"className":"text-ink","children":"Public-IP grouping can put strangers in your room."}]," ","Behind carrier-grade NAT — common on mobile networks and in some apartment buildings — people who are not your neighbours can share your public address. Nothing is ever received without you tapping accept, and you can switch to a private room code at any time."]}],["$","li",null,{"className":"rounded-xl border border-line bg-surface/60 p-4","children":[["$","strong",null,{"className":"text-ink","children":"Some networks stop devices talking to each other at all."}]," ","Guest Wi-Fi and “client isolation” settings deliberately block devices on the same network from reaching one another, so the direct channel between two browsers can never form there. Nothing LumiHop can do fixes that — it is the router doing exactly what it was configured to do."]}],["$","li",null,{"className":"rounded-xl border border-line bg-surface/60 p-4","children":[["$","strong",null,{"className":"text-ink","children":"The installers are unsigned."}]," Neither Apple nor Microsoft has vouched for these builds, and your operating system will say so. Code signing costs money we have not spent yet. Building from source is the alternative that requires trusting nobody."]}],["$","li",null,{"className":"rounded-xl border border-line bg-surface/60 p-4","children":[["$","strong",null,{"className":"text-ink","children":"Pairing codes only work if you actually read them."}]," ","The six digits are the entire defence against a machine-in-the-middle. Tapping Pair without looking defeats it."]}]]}]]}]]}]
5:["$","section",null,{"id":"source","className":"scroll-mt-24 border-t border-line/70 py-12","children":[["$","p",null,{"className":"font-mono text-xs font-semibold tracking-widest text-accent uppercase","children":"Verify it"}],["$","h2",null,{"className":"mt-3 font-display text-3xl font-bold tracking-tight text-balance text-ink","children":"Read the code"}],["$","div",null,{"className":"mt-5 space-y-4 leading-relaxed text-ink-2","children":[["$","p",null,{"children":"The core has no third-party dependencies — no framework, no crypto library beyond what the JDK ships, nothing pulled from a package registry. That is partly a security position and partly a maintenance one: there is no supply chain to compromise because there is no supply chain."}],["$","p",null,{"children":"The protocol is documented separately from the implementation, and the two are checked against each other by the test suite, so the spec cannot quietly drift away from the code."}],["$","$L12",null,{"href":"/download#build","className":"inline-block font-semibold text-accent hover:underline","children":"Build it yourself →"}]]}]]}]
6:["$","$L13",null,{"children":["$","$14",null,{"name":"Next.MetadataOutlet","children":"$@15"}]}]
9:["$","$1","h",{"children":[null,["$","$L16",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","2",{"name":"theme-color","content":"#0d1017"}],["$","meta","3",{"name":"color-scheme","content":"dark"}]]}],["$","div",null,{"hidden":true,"children":["$","$L17",null,{"children":["$","$14",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"How it works · LumiHop"}],["$","meta","1",{"name":"description","content":"The protocol, the cryptography and the threat model behind LumiHop — including what it does not protect you from."}],["$","meta","2",{"property":"og:title","content":"LumiHop — move anything, anywhere nearby"}],["$","meta","3",{"property":"og:description","content":"Send files between your devices over your own Wi-Fi. No account, no cloud, no upload limit."}],["$","meta","4",{"property":"og:type","content":"website"}],["$","meta","5",{"name":"twitter:card","content":"summary"}],["$","meta","6",{"name":"twitter:title","content":"LumiHop — move anything, anywhere nearby"}],["$","meta","7",{"name":"twitter:description","content":"Send files between your devices over your own Wi-Fi. No account, no cloud, no upload limit."}],["$","link","8",{"rel":"icon","href":"/app/icon.png"}],["$","link","9",{"rel":"apple-touch-icon","href":"/app/apple-touch-icon.png"}],["$","$L18","10",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}]
b:["$","$1","c",{"children":[null,["$","$L19",null,{"parallelRouterKey":"children","template":["$","$L1a",null,{}]}]]}]
e:["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/app/_next/static/chunks/37d-v1x98fsy6.css","precedence":"next"}],["$","script","script-0",{"src":"/app/_next/static/chunks/116is3w7ryjtu.js","async":true}]],["$","html",null,{"lang":"en","className":"bricolage_grotesque_9d91b8bf-module__4pkBmW__variable public_sans_8c174c21-module__egI0ba__variable ibm_plex_mono_2bf20008-module__lZonfG__variable h-full antialiased","children":["$","body",null,{"className":"flex min-h-full flex-col","children":[["$","$L1b",null,{}],["$","main",null,{"className":"flex-1","children":["$","$L19",null,{"parallelRouterKey":"children","template":["$","$L1a",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","footer",null,{"className":"border-t border-line/70 px-5 py-10","children":["$","div",null,{"className":"mx-auto flex max-w-6xl flex-col gap-6 sm:flex-row sm:items-start sm:justify-between","children":[["$","div",null,{"className":"max-w-sm","children":[["$","p",null,{"className":"font-display text-base font-bold text-ink","children":["LumiHop",["$","span",null,{"className":"text-accent","children":"."}]]}],["$","p",null,{"className":"mt-2 text-sm text-ink-3","children":"Files move directly between your devices, over your own network. Built by Luminara Software Solutions. MIT licensed."}]]}],["$","nav",null,{"className":"flex flex-col gap-2 text-sm","children":[["$","$L12",null,{"href":"/download","className":"text-ink-2 hover:text-ink","children":"Download"}],["$","$L12",null,{"href":"/how-it-works","className":"text-ink-2 hover:text-ink","children":"How it works"}],["$","$L12",null,{"href":"/share","className":"text-ink-2 hover:text-ink","children":"Share in the browser"}]]}]]}]}]]}]}]]}]
15:null
11:true
8:300
8:C
10:0
a:"$undefined"
c:"$undefined"
f:"$undefined"
7:"$undefined"
