<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[अक्षत | Akshat Joshi]]></title><description><![CDATA[Tech | Security | Privacy]]></description><link>https://akshatjoshi.com/</link><image><url>https://akshatjoshi.com/favicon.png</url><title>अक्षत | Akshat Joshi</title><link>https://akshatjoshi.com/</link></image><generator>Ghost 5.80</generator><lastBuildDate>Tue, 28 Apr 2026 12:29:49 GMT</lastBuildDate><atom:link href="https://akshatjoshi.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Building a Zero-Knowledge P2P File Sharing System: A Technical Deep Dive]]></title><description><![CDATA[<p></p><p>Traditional file sharing services like Google Drive, Dropbox, and WeTransfer all share a fundamental flaw: your files pass through their servers. Even with &quot;encryption,&quot; these services hold the keys. We built something different&#x2014;a peer-to-peer file sharing system where files transfer directly between browsers, encrypted end-to-end, with</p>]]></description><link>https://akshatjoshi.com/building-a-zero-knowledge-p2p-file-sharing-system-a-technical-deep-dive-2/</link><guid isPermaLink="false">696ff5f6d35cc8eac824e9e1</guid><category><![CDATA[1 - Tech]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Mon, 26 Jan 2026 04:28:06 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1472148083604-64f1084980b9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGNvbm5lY3R8ZW58MHx8fHwxNzY4OTQ1Mzg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1472148083604-64f1084980b9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGNvbm5lY3R8ZW58MHx8fHwxNzY4OTQ1Mzg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Building a Zero-Knowledge P2P File Sharing System: A Technical Deep Dive"><p></p><p>Traditional file sharing services like Google Drive, Dropbox, and WeTransfer all share a fundamental flaw: your files pass through their servers. Even with &quot;encryption,&quot; these services hold the keys. We built something different&#x2014;a peer-to-peer file sharing system where files transfer directly between browsers, encrypted end-to-end, with zero server-side storage. Here&apos;s exactly how it works.</p><h2 id="the-problem-with-traditional-file-sharing">The Problem with Traditional File Sharing</h2><p>When you upload a file to a traditional service, it follows this path:</p><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;      &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;      &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;    Your      &#x2502;      &#x2502;   Provider   &#x2502;      &#x2502;  Recipient   &#x2502;
&#x2502;   Browser    &#x2502; &#x2500;&#x2500;&#x2500;&#x25BA; &#x2502;   Servers    &#x2502; &#x2500;&#x2500;&#x2500;&#x25BA; &#x2502;   Browser    &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;      &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;      &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                            &#x2502;
                            &#x25BC;
                      Files stored,
                      accessible by
                      the provider
</code></pre><p>This architecture creates several vulnerabilities:</p><ol><li><strong>Server Access</strong>: The provider can access your files</li><li><strong>Data Breaches</strong>: Stored files are targets for hackers</li><li><strong>Legal Requests</strong>: Governments can compel providers to hand over data</li><li><strong>Metadata Leakage</strong>: Upload times, file names, and access patterns are logged</li><li><strong>Permanent Storage</strong>: Files may persist indefinitely on their servers</li></ol><h2 id="our-architecture-true-peer-to-peer">Our Architecture: True Peer-to-Peer</h2><p>Private File Share eliminates the server from the file transfer path entirely:</p><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;                              &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;    Your      &#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500; Direct P2P &#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BA;&#x2502;  Recipient   &#x2502;
&#x2502;   Browser    &#x2502;       (WebRTC Data)          &#x2502;   Browser    &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;                              &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
       &#x2502;                                             &#x2502;
       &#x2502;            &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;                 &#x2502;
       &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BA;&#x2502;   Signaling  &#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                    &#x2502;    Server    &#x2502;
                    &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                           &#x2502;
                    Only coordinates
                    the connection,
                    NEVER sees files
</code></pre><p>The server&apos;s sole purpose is to help two browsers find each other. Once the WebRTC connection is established, files flow directly between browsers&#x2014;encrypted before they leave your device.</p><h2 id="technical-architecture-overview">Technical Architecture Overview</h2><h3 id="the-four-pillars-of-our-system"><br>The Four Pillars of Our System</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                        FILE SHARE                                    &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502;   ENCRYPTION    &#x2502;    CHUNKING     &#x2502;    WEBRTC      &#x2502;   SIGNALING     &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; &#x2022; AES-256-CBC   &#x2502; &#x2022; 64KB chunks   &#x2502; &#x2022; P2P connect  &#x2502; &#x2022; Room mgmt     &#x2502;
&#x2502; &#x2022; PBKDF2 keys   &#x2502; &#x2022; Progress track&#x2502; &#x2022; Data channel &#x2502; &#x2022; Peer discovery&#x2502;
&#x2502; &#x2022; SHA256 verify &#x2502; &#x2022; Reassembly    &#x2502; &#x2022; Binary xfer  &#x2502; &#x2022; Auto-cleanup  &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h2 id="encryption-military-grade-protection">Encryption: Military-Grade Protection</h2><p></p><h3 id="why-aes-256-cbc-with-pbkdf2">Why AES-256-CBC with PBKDF2?</h3><p>We chose this combination for maximum security:</p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2026/03/table3.png" class="kg-image" alt="Building a Zero-Knowledge P2P File Sharing System: A Technical Deep Dive" loading="lazy" width="2000" height="1091" srcset="https://akshatjoshi.com/content/images/size/w600/2026/03/table3.png 600w, https://akshatjoshi.com/content/images/size/w1000/2026/03/table3.png 1000w, https://akshatjoshi.com/content/images/size/w1600/2026/03/table3.png 1600w, https://akshatjoshi.com/content/images/size/w2400/2026/03/table3.png 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="the-encryption-flow">The Encryption Flow</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                     ENCRYPTION PROCESS                              &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

Step 1: Key Derivation
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;    &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;    &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; Password &#x2502; +  &#x2502; Random Salt &#x2502; &#x2500;&#x25BA; &#x2502;   PBKDF2     &#x2502; &#x2500;&#x25BA; 256-bit Key
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;    &#x2502;  (128-bit)  &#x2502;    &#x2502; (10K rounds) &#x2502;
                &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;    &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

Step 2: Encryption
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;    &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;    &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;   File   &#x2502; +  &#x2502; 256-bit   &#x2502; +  &#x2502;  Random IV     &#x2502; &#x2500;&#x25BA; Encrypted Data
&#x2502;   Data   &#x2502;    &#x2502;    Key    &#x2502;    &#x2502;  (128-bit)     &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;    &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;    &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

Step 3: Package for Transfer
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;  Salt (16B)  &#x2502;  IV (16B)  &#x2502;  Encrypted Content     &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
         &#x25B2;            &#x25B2;                 &#x25B2;
         &#x2502;            &#x2502;                 &#x2502;
    For key      For decrypt     Your protected
    derivation   initialization       data
</code></pre><h3 id="decryption-receiver-side">Decryption (Receiver Side)</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                     DECRYPTION PROCESS                              &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;  Salt (16B)  &#x2502;  IV (16B)  &#x2502;  Encrypted Content     &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
       &#x2502;             &#x2502;                 &#x2502;
       &#x25BC;             &#x2502;                 &#x2502;
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;     &#x2502;                 &#x2502;
&#x2502;  + Password  &#x2502;     &#x2502;                 &#x2502;
&#x2502;      &#x25BC;       &#x2502;     &#x2502;                 &#x2502;
&#x2502;   PBKDF2     &#x2502;     &#x2502;                 &#x2502;
&#x2502;      &#x25BC;       &#x2502;     &#x2502;                 &#x2502;
&#x2502;  256-bit Key &#x2502;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;     &#x2502;                 &#x2502;
                     &#x25BC;                 &#x25BC;
              &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
              &#x2502;     AES-256 Decryption      &#x2502;
              &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                             &#x25BC;
                    &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
                    &#x2502;  Original File  &#x2502;
                    &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h3 id="cryptographic-properties-summary">Cryptographic Properties Summary</h3><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2026/03/table1.png" class="kg-image" alt="Building a Zero-Knowledge P2P File Sharing System: A Technical Deep Dive" loading="lazy" width="2000" height="1091" srcset="https://akshatjoshi.com/content/images/size/w600/2026/03/table1.png 600w, https://akshatjoshi.com/content/images/size/w1000/2026/03/table1.png 1000w, https://akshatjoshi.com/content/images/size/w1600/2026/03/table1.png 1600w, https://akshatjoshi.com/content/images/size/w2400/2026/03/table1.png 2400w" sizes="(min-width: 720px) 720px"></figure><h2 id="file-chunking-reliable-large-file-transfer">File Chunking: Reliable Large File Transfer</h2><p>WebRTC data channels work best with smaller packets. We split files into manageable pieces:</p><h3 id="why-64kb-chunks">Why 64KB Chunks?</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    CHUNKING STRATEGY                                &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

Original File (e.g., 10 MB)
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                              &#x2502;
                              &#x25BC; Split into 64KB chunks
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;        &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;  1  &#x2502; &#x2502;  2  &#x2502; &#x2502;  3  &#x2502; &#x2502;  4  &#x2502; &#x2502;  5  &#x2502;  ...   &#x2502; 160 &#x2502;
&#x2502;64KB &#x2502; &#x2502;64KB &#x2502; &#x2502;64KB &#x2502; &#x2502;64KB &#x2502; &#x2502;64KB &#x2502;        &#x2502;64KB &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;        &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
   &#x2502;       &#x2502;       &#x2502;       &#x2502;       &#x2502;              &#x2502;
   &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                         &#x2502;
                         &#x25BC;
            Each chunk sent via WebRTC
            with sequence number for
            proper reassembly
</code></pre><h3 id="benefits-of-this-approach">Benefits of This Approach</h3><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2026/03/table2.png" class="kg-image" alt="Building a Zero-Knowledge P2P File Sharing System: A Technical Deep Dive" loading="lazy" width="2000" height="1091" srcset="https://akshatjoshi.com/content/images/size/w600/2026/03/table2.png 600w, https://akshatjoshi.com/content/images/size/w1000/2026/03/table2.png 1000w, https://akshatjoshi.com/content/images/size/w1600/2026/03/table2.png 1600w, https://akshatjoshi.com/content/images/size/w2400/2026/03/table2.png 2400w" sizes="(min-width: 720px) 720px"></figure><h3 id="the-complete-transfer-pipeline">The Complete Transfer Pipeline</h3><pre><code>SENDER BROWSER                                      RECEIVER BROWSER
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;                                  &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; 1. Select File &#x2502;                                  &#x2502;                &#x2502;
&#x2502;       &#x25BC;        &#x2502;                                  &#x2502;                &#x2502;
&#x2502; 2. Encrypt     &#x2502;                                  &#x2502;                &#x2502;
&#x2502;    (AES-256)   &#x2502;                                  &#x2502;                &#x2502;
&#x2502;       &#x25BC;        &#x2502;                                  &#x2502;                &#x2502;
&#x2502; 3. Chunk       &#x2502;                                  &#x2502;                &#x2502;
&#x2502;    (64KB each) &#x2502;                                  &#x2502;                &#x2502;
&#x2502;       &#x25BC;        &#x2502;      WebRTC Data Channel         &#x2502;       &#x25BC;        &#x2502;
&#x2502; 4. Send &#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BA;&#x2502; 5. Receive     &#x2502;
&#x2502;                &#x2502;         (Direct P2P)             &#x2502;       &#x25BC;        &#x2502;
&#x2502;                &#x2502;                                  &#x2502; 6. Reassemble  &#x2502;
&#x2502;                &#x2502;                                  &#x2502;       &#x25BC;        &#x2502;
&#x2502;                &#x2502;                                  &#x2502; 7. Verify      &#x2502;
&#x2502;                &#x2502;                                  &#x2502;    (SHA-256)   &#x2502;
&#x2502;                &#x2502;                                  &#x2502;       &#x25BC;        &#x2502;
&#x2502;                &#x2502;                                  &#x2502; 8. Decrypt     &#x2502;
&#x2502;                &#x2502;                                  &#x2502;       &#x25BC;        &#x2502;
&#x2502;                &#x2502;                                  &#x2502; 9. Download    &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;                                  &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h2 id="webrtc-the-p2p-connection-layer">WebRTC: The P2P Connection Layer</h2><h3 id="what-is-webrtc">What is WebRTC?</h3><p>WebRTC (Web Real-Time Communication) enables direct browser-to-browser connections without plugins. Originally designed for video calls, its data channels are perfect for file transfer.</p><h3 id="the-connection-dance">The Connection Dance</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                  WEBRTC CONNECTION ESTABLISHMENT                    &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

    SENDER                    SERVER                    RECEIVER
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502; 1. Create Room          &#x2502;                          &#x2502;
      &#x2502;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BA;&#x2502;                          &#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502;   Room code: XY7K2M     &#x2502;                          &#x2502;
      &#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2502;                          &#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502;         (User shares code externally)              &#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502;                         &#x2502;        2. Join Room      &#x2502;
      &#x2502;                         &#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502;  3. Peer Joined!        &#x2502;                          &#x2502;
      &#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2502;                          &#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502; 4. WebRTC Offer         &#x2502;                          &#x2502;
      &#x2502;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BA;&#x2502;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BA;&#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502;                         &#x2502;     5. WebRTC Answer     &#x2502;
      &#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502; 6. ICE Candidates       &#x2502;    6. ICE Candidates     &#x2502;
      &#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BA;&#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BA;&#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502;     DIRECT P2P CONNECTION ESTABLISHED              &#x2502;
      &#x2502;&#x25C4;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x25BA;&#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
      &#x2502;     Files transfer directly, server not involved   &#x2502;
      &#x2502;                         &#x2502;                          &#x2502;
</code></pre><h3 id="ice-servers-finding-the-path">ICE Servers: Finding the Path</h3><p>We use STUN servers to help browsers discover their public addresses and find the best path to connect:</p><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                      NETWORK PATH DISCOVERY                         &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;         &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;         &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;  Sender  &#x2502;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x25BA;&#x2502; STUN Servers  &#x2502;&#x25C4;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2502; Receiver &#x2502;
&#x2502;  Browser &#x2502;         &#x2502; (Google/Twilio)&#x2502;         &#x2502;  Browser &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;         &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;         &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
     &#x2502;                      &#x2502;                        &#x2502;
     &#x2502;    &quot;What&apos;s my        &#x2502;      &quot;What&apos;s my       &#x2502;
     &#x2502;    public IP?&quot;       &#x2502;       public IP?&quot;     &#x2502;
     &#x2502;                      &#x2502;                        &#x2502;
     &#x25BC;                      &#x25BC;                        &#x25BC;
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;            ICE candidates exchanged via signaling               &#x2502;
&#x2502;                                                                 &#x2502;
&#x2502;    Browsers find optimal path: direct, STUN-assisted, or TURN   &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h2 id="the-signaling-server-minimal-by-design">The Signaling Server: Minimal by Design</h2><p>Our signaling server is intentionally simple&#x2014;it coordinates connections but never touches file data.</p><h3 id="what-the-server-never-sees">What the Server NEVER Sees</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;               SERVER VISIBILITY COMPARISON                          &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

                    TRADITIONAL              OUR DESIGNED
                    FILE SHARING             FILE SHARING

File Contents       &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; YES           &#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; NO
File Names          &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; YES           &#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; NO
File Sizes          &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; YES           &#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; NO
Encryption Keys     &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; YES           &#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; NO
User Identity       &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; YES           &#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; NO
Transfer Metadata   &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; YES           &#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; NO

Room Code           &#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; N/A           &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; YES
Password Hash       &#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; N/A           &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; YES
Expiration Time     &#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; N/A           &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; YES
</code></pre><h3 id="automatic-cleanup">Automatic Cleanup</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    AUTO-CLEANUP MECHANISMS                          &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

1. EXPIRATION TIMER (per room)
   &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
   &#x2502; Room Created &#x2500;&#x2500;&#x25BA; Timer Started          &#x2502;
   &#x2502;                       &#x2502;                 &#x2502;
   &#x2502;                  15min/30min/1hr/24hr   &#x2502;
   &#x2502;                       &#x2502;                 &#x2502;
   &#x2502;                       &#x25BC;                 &#x2502;
   &#x2502;               Room Auto-Deleted         &#x2502;
   &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

2. PERIODIC CLEANUP (every 5 minutes)
   &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
   &#x2502; Server scans all rooms                  &#x2502;
   &#x2502;         &#x2502;                               &#x2502;
   &#x2502;         &#x25BC;                               &#x2502;
   &#x2502; Removes any expired rooms               &#x2502;
   &#x2502;         &#x2502;                               &#x2502;
   &#x2502;         &#x25BC;                               &#x2502;
   &#x2502; Notifies connected peers                &#x2502;
   &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

3. DISCONNECT CLEANUP
   &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
   &#x2502; All peers disconnect                    &#x2502;
   &#x2502;         &#x2502;                               &#x2502;
   &#x2502;         &#x25BC;                               &#x2502;
   &#x2502; Room immediately deleted                &#x2502;
   &#x2502;         &#x2502;                               &#x2502;
   &#x2502;         &#x25BC;                               &#x2502;
   &#x2502; No trace remains                        &#x2502;
   &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h2 id="security-features-beyond-encryption">Security Features Beyond Encryption</h2><h3 id="rate-limiting-protection">Rate Limiting Protection</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    RATE LIMITING                                    &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; Per IP Address, Per Minute:            &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; &#x2022; Max 30 total requests                &#x2502;
&#x2502; &#x2022; Max 5 failed password attempts       &#x2502;
&#x2502;                                        &#x2502;
&#x2502; Exceeds limit?                         &#x2502;
&#x2502;     &#x25BC;                                  &#x2502;
&#x2502; Request rejected with error            &#x2502;
&#x2502; Prevents brute force attacks           &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h3 id="input-validation">Input Validation</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    INPUT VALIDATION                                 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

Every input is validated before processing:

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; Input           &#x2502; Validation Rule          &#x2502; Purpose               &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; Room Code       &#x2502; Exactly 6 alphanumeric   &#x2502; Prevent injection     &#x2502;
&#x2502; Password Hash   &#x2502; Valid SHA-256 format     &#x2502; Ensure proper hashing &#x2502;
&#x2502; Expiration      &#x2502; Max 7 days               &#x2502; Limit resource usage  &#x2502;
&#x2502; Max Downloads   &#x2502; Predefined values only   &#x2502; Prevent abuse         &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h3 id="download-limits">Download Limits</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    DOWNLOAD LIMIT ENFORCEMENT                       &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

    Receiver attempts to join
              &#x2502;
              &#x25BC;
    &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
    &#x2502; Check download count&#x2502;
    &#x2502; vs. max downloads   &#x2502;
    &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
              &#x2502;
     &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
     &#x2502;                 &#x2502;
     &#x25BC;                 &#x25BC;
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;      &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; Under   &#x2502;      &#x2502; Limit       &#x2502;
&#x2502; Limit   &#x2502;      &#x2502; Reached     &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;      &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
     &#x2502;                  &#x2502;
     &#x25BC;                  &#x25BC;
 Allow join        Reject with
 &amp; increment       error message
 counter
</code></pre><h2 id="how-we-compare-to-alternatives">How We Compare to Alternatives</h2><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    FEATURE COMPARISON                               &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

                    Our Design   WeTransfer   Google     OnionShare
                                            Drive
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; Server sees files &#x2502;    NO    &#x2502;    YES    &#x2502;   YES   &#x2502;     NO     &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; True E2E encrypt  &#x2502;   YES    &#x2502;    NO*    &#x2502;   NO*   &#x2502;    YES     &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; P2P transfer      &#x2502;   YES    &#x2502;    NO     &#x2502;   NO    &#x2502;    YES     &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; Requires software &#x2502;    NO    &#x2502;    NO     &#x2502;   NO    &#x2502;    YES     &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; Auto-delete       &#x2502;   YES    &#x2502;   YES     &#x2502;   NO    &#x2502;    YES     &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; Password protect  &#x2502;   YES    &#x2502;   PAID    &#x2502;   YES   &#x2502;    YES     &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; Download limits   &#x2502;   YES    &#x2502;   PAID    &#x2502;   NO    &#x2502;    YES     &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; No account needed &#x2502;   YES    &#x2502;   YES     &#x2502;   NO    &#x2502;    YES     &#x2502;
&#x251C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x253C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2524;
&#x2502; Max file size     &#x2502;  500MB   &#x2502;  2GB free &#x2502;  15GB   &#x2502; Unlimited  &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

* These services offer encryption but hold the decryption keys themselves
</code></pre><h2 id="real-world-transfer-flow">Real-World Transfer Flow</h2><h3 id="complete-sender-journey">Complete Sender Journey</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    SENDER EXPERIENCE                                &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; STEP 1: Select Files                                             &#x2502;
&#x2502; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;   &#x2502;
&#x2502; &#x2502;     document.pdf (10 MB)                                   &#x2502;   &#x2502;
&#x2502; &#x2502;     photo.jpg (2 MB)                                       &#x2502;   &#x2502;
&#x2502; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;   &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                              &#x2502;
                              &#x25BC;
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; STEP 2: Configure Options                                        &#x2502;
&#x2502; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;   &#x2502;
&#x2502; &#x2502;     Expiration: 30 minutes                                 &#x2502;   &#x2502;
&#x2502; &#x2502;     Max Downloads: 5                                       &#x2502;   &#x2502;
&#x2502; &#x2502;     Password: &#x2022;&#x2022;&#x2022;&#x2022;&#x2022;&#x2022;&#x2022;&#x2022;                                     &#x2502;   &#x2502;
&#x2502; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;   &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                              &#x2502;
                              &#x25BC;
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; STEP 3: Create Share Link                                        &#x2502;
&#x2502; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;   &#x2502;
&#x2502; &#x2502;     Room Created!                                          &#x2502;   &#x2502;
&#x2502; &#x2502;     Code: XY7K2M                                           &#x2502;   &#x2502;
&#x2502; &#x2502;     Waiting for receiver...                                &#x2502;   &#x2502;
&#x2502; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;   &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                              &#x2502;
                              &#x25BC;
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; STEP 4: Transfer (after receiver joins)                          &#x2502;
&#x2502; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;   &#x2502;
&#x2502; &#x2502;     P2P Connected!                                         &#x2502;   &#x2502;
&#x2502; &#x2502;     Sending: document.pdf                                  &#x2502;   &#x2502;
&#x2502; &#x2502;  &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591;&#x2591; 65%                        &#x2502;   &#x2502;
&#x2502; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;   &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h3 id="complete-receiver-journey">Complete Receiver Journey</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    RECEIVER EXPERIENCE                              &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; STEP 1: Enter Room Code                                          &#x2502;
&#x2502; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;   &#x2502;
&#x2502; &#x2502;     Room Code: [ XY7K2M ]                                  &#x2502;   &#x2502;
&#x2502; &#x2502;     Password:  [ &#x2022;&#x2022;&#x2022;&#x2022;&#x2022;&#x2022; ]                                  &#x2502;   &#x2502;
&#x2502; &#x2502;     [Join Room]                                            &#x2502;   &#x2502;
&#x2502; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;   &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                              &#x2502;
                              &#x25BC;
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; STEP 2: View Available Files                                     &#x2502;
&#x2502; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;   &#x2502;
&#x2502; &#x2502;     document.pdf (10 MB)                                   &#x2502;   &#x2502;
&#x2502; &#x2502;     photo.jpg (2 MB)                                       &#x2502;   &#x2502;
&#x2502; &#x2502;  [Download Selected]                                       &#x2502;   &#x2502;
&#x2502; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;   &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                              &#x2502;
                              &#x25BC;
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; STEP 3: Download                                                 &#x2502;
&#x2502; &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;   &#x2502;
&#x2502; &#x2502;     Receiving: document.pdf                                &#x2502;   &#x2502;
&#x2502; &#x2502;  &#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588;&#x2588; 100%                         &#x2502;   &#x2502;
&#x2502; &#x2502;     Checksum verified                                      &#x2502;   &#x2502;
&#x2502; &#x2502;     Decrypted successfully                                 &#x2502;   &#x2502;
&#x2502; &#x2502;     Saved to Downloads                                     &#x2502;   &#x2502;
&#x2502; &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;   &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h2 id="performance-considerations">Performance Considerations</h2><h3 id="transfer-speed-expectations">Transfer Speed Expectations</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    TYPICAL TRANSFER SPEEDS                          &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

Network Scenario                    Expected Speed
&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;
Same local network                  Near wire speed (100+ Mbps)
Same ISP                            50-100 Mbps typical
Cross-country                       10-50 Mbps typical
International                       5-20 Mbps typical

Note: Actual speeds depend on both parties&apos; connections and network path
</code></pre><h3 id="file-size-limits">File Size Limits</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    SIZE CONSTRAINTS                                 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; Per File Maximum:        500 MB        &#x2502;
&#x2502; Per Session Maximum:     1 GB total    &#x2502;
&#x2502; Chunk Size:              64 KB         &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

Why these limits?
&#x2022; Browser memory constraints
&#x2022; WebRTC reliability
&#x2022; User experience (reasonable wait times)
</code></pre><h2 id="the-security-guarantee">The Security Guarantee</h2><h3 id="what-makes-this-truly-zero-knowledge">What Makes This Truly Zero-Knowledge</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;                    ZERO-KNOWLEDGE ARCHITECTURE                      &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

                    SENDER                    RECEIVER
                    BROWSER                   BROWSER
                       &#x2502;                         &#x2502;
    &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
    &#x2502;                                     &#x2502;                           &#x2502;
    &#x25BC;                                     &#x25BC;                           &#x25BC;
&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;                        &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;                 &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502; Encryption&#x2502;                        &#x2502;Signaling&#x2502;                &#x2502; Decryption&#x2502;
&#x2502; happens   &#x2502;                        &#x2502;  Only   &#x2502;                &#x2502; happens   &#x2502;
&#x2502; HERE      &#x2502;                        &#x2502;         &#x2502;                &#x2502; HERE      &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;                        &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;                 &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
                                          &#x2502;
                                          &#x25BC;
                                    &#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
                                    &#x2502;  Server   &#x2502;
                                    &#x2502;  CANNOT:  &#x2502;
                                    &#x2502;           &#x2502;
                                    &#x2502; &#x2022; Read    &#x2502;
                                    &#x2502;   files   &#x2502;
                                    &#x2502;           &#x2502;
                                    &#x2502; &#x2022; Decrypt &#x2502;
                                    &#x2502;   content &#x2502;
                                    &#x2502;           &#x2502;
                                    &#x2502; &#x2022; Access  &#x2502;
                                    &#x2502;   keys    &#x2502;
                                    &#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre><h3 id="even-if-compromised">Even If Compromised...</h3><pre><code>&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2510;
&#x2502;            WHAT AN ATTACKER WOULD FIND                              &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

If our server was completely compromised, an attacker would find:

&#x2717; No files (they never touch our server)
&#x2717; No encryption keys (generated and used only in browsers)
&#x2717; No passwords (only hashes, and only for room authentication)
&#x2717; No user identities (no accounts required)
&#x2717; No transfer history (rooms auto-delete)

Only:
&#x2713; Temporary room metadata
&#x2713; WebRTC signaling data (useless without the actual connection)
</code></pre><h2 id="conclusion-privacy-through-architecture">Conclusion: Privacy Through Architecture</h2><p>The most secure system is one where even the operator cannot access your data. By using:</p><ul><li><strong>Client-side encryption</strong>: Files encrypted before leaving your browser</li><li><strong>P2P transfer</strong>: Files never touch our servers</li><li><strong>In-memory signaling</strong>: No persistent storage</li><li><strong>Automatic cleanup</strong>: Rooms self-destruct</li></ul><p>We&apos;ve built a file sharing system that is&#xA0;<strong>private by design</strong>, not by policy. Even if our servers were compromised, attackers would find only WebRTC signaling data&#x2014;no files, no encryption keys, no metadata.</p><p>This is the future of file sharing:&#xA0;<strong>zero knowledge, zero trust, zero compromise</strong>.</p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Stateless by Design]]></title><description><![CDATA[<p></p><h2 id="why-%E2%80%9Cstateless-by-design%E2%80%9D-is-the-missing-principle-in-browser-security">Why &#x201C;Stateless by Design&#x201D; Is the Missing Principle in Browser Security</h2><p>Modern browser security has improved significantly over the last decade. Sandboxing, site isolation, HTTPS by default, and improved permission models have all reduced the impact of entire classes of attacks. Yet, despite these advances, browsers remain a</p>]]></description><link>https://akshatjoshi.com/stateless-by-design/</link><guid isPermaLink="false">69691ea1d35cc8eac824e9cc</guid><category><![CDATA[1 - Tech]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Thu, 15 Jan 2026 17:12:44 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1694885169342-909981fb408a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGVtcHR5JTIwc3RvcmFnZXxlbnwwfHx8fDE3Njg0OTY5MTJ8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1694885169342-909981fb408a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGVtcHR5JTIwc3RvcmFnZXxlbnwwfHx8fDE3Njg0OTY5MTJ8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Stateless by Design"><p></p><h2 id="why-%E2%80%9Cstateless-by-design%E2%80%9D-is-the-missing-principle-in-browser-security">Why &#x201C;Stateless by Design&#x201D; Is the Missing Principle in Browser Security</h2><p>Modern browser security has improved significantly over the last decade. Sandboxing, site isolation, HTTPS by default, and improved permission models have all reduced the impact of entire classes of attacks. Yet, despite these advances, browsers remain a high-value target for tracking, session abuse, and credential compromise.</p><p>A key reason is that most browser security improvements operate <strong>within fundamentally stateful execution models</strong>. This article argues that <em>statelessness by design-</em>rather than incremental state cleanup-represents a missing architectural principle in browser security.</p><h2 id="the-hidden-cost-of-persistent-browser-state">The Hidden Cost of Persistent Browser State</h2><p>Browsers accumulate state continuously:</p><ul><li>Cookies and authentication tokens</li><li>Cached resources and service workers</li><li>IndexedDB, local storage, and session storage</li><li>Rendering and fingerprinting artifacts</li></ul><p>While much of this state is necessary for usability, it also becomes a long-lived attack surface. Once created, state often persists far beyond the context in which it was required.</p><p>Private browsing modes attempt to reduce this exposure by limiting what is written to disk, but they do not fundamentally change the execution model. Browser processes, profiles, and underlying operating system resources remain long-lived, and cleanup depends on correct behavior across multiple layers.</p><p>Security mechanisms that rely on <em>selective deletion</em> tend to fail at scale.</p><h2 id="cleanup-is-not-the-same-as-statelessness">Cleanup Is Not the Same as Statelessness</h2><p>Most browser privacy controls focus on <strong>what to delete</strong>:</p><ul><li>Clear cookies</li><li>Disable cache</li><li>Block trackers</li><li>Reset profiles</li></ul><p>This approach assumes that:</p><ol><li>All sensitive state can be identified</li><li>Cleanup logic is complete and correct</li><li>No residual artifacts remain elsewhere in the system</li></ol><p>In practice, these assumptions rarely hold. Residual state is difficult to reason about, and incomplete cleanup is common.</p><p>Stateless systems take a different approach:</p><blockquote>Instead of deciding <em>what to remove</em>, they eliminate the environment entirely.</blockquote><h2 id="statelessness-as-a-security-primitive">Statelessness as a Security Primitive</h2><p>In distributed systems, statelessness is widely used to:</p><ul><li>Improve scalability</li><li>Reduce failure modes</li><li>Simplify recovery</li></ul><p>The same principle applies to browser security.</p><p>A stateless-by-design browser execution model enforces:</p><ul><li>A fixed session lifecycle</li><li>No shared persistent execution context</li><li>Deterministic teardown after use</li></ul><p>Rather than trusting cleanup logic, the system guarantees that <strong>nothing survives the session boundary</strong>.</p><p>This shifts security reasoning from <em>best-effort hygiene</em> to <em>structural enforcement</em>.</p><h2 id="ephemeral-execution-as-an-enabler">Ephemeral Execution as an Enabler</h2><p>Statelessness at the browser level is difficult to achieve on traditional desktop environments. However, ephemeral execution environments-such as disposable containers or isolated runtime sandboxes-make this model feasible.</p><p>In an ephemeral browser system:</p><ol><li>A clean execution environment is created per session</li><li>All state is scoped to that environment</li><li>The environment is destroyed when the session ends</li></ol><p>The browser does not &#x201C;forget&#x201D; state - the system <strong>ceases to exist</strong>.</p><p>This model aligns naturally with privacy goals without making claims of anonymity or invulnerability.</p><h2 id="what-statelessness-does-not-solve">What Statelessness Does <em>Not</em> Solve</h2><p>Statelessness is not a silver bullet.</p><p>It does not:</p><ul><li>Prevent phishing during an active session</li><li>Eliminate network-level tracking</li><li>Protect against user-initiated disclosure</li></ul><p>However, it <strong>significantly limits post-session exposure</strong>, credential reuse, and long-term tracking based on accumulated artifacts.</p><p>Security improvements that are honest about their scope tend to age better than those that promise total protection.</p><h2 id="rethinking-browser-security-priorities">Rethinking Browser Security Priorities</h2><p>Browser security discussions often revolve around:</p><ul><li>Better detection</li><li>Smarter blocking</li><li>More permissions</li></ul><p>Stateless-by-design reframes the question:</p><blockquote>&#x201C;What if persistence itself is the vulnerability?&#x201D;</blockquote><p>By treating state as a liability rather than an asset, browser security architectures can reduce entire classes of failure without increasing complexity.</p><h2 id="conclusion">Conclusion</h2><p>Browser security has largely focused on managing persistent environments more carefully. Stateless-by-design systems propose a different direction: eliminating persistence altogether where possible.</p><p>Ephemeral browser execution environments demonstrate that statelessness is not merely theoretical-it is an achievable architectural property. While not a complete security solution, statelessness provides a powerful foundation for reducing long-term exposure in web-based workflows.</p><p>As threats continue to evolve, architectural simplicity may prove more resilient than increasingly complex cleanup mechanisms.</p><h2 id="author-note">Author Note</h2><p>This article reflects ongoing exploration of privacy-preserving execution environments and lifecycle-based security models in modern computing systems.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Security trade-offs in remote and ephemeral execution environments]]></title><description><![CDATA[<p></p><p><strong><u>Introduction</u></strong></p><p>Remote and ephemeral execution environments are increasingly used to isolate sensitive workloads from untrusted endpoints. Examples include remote browsers, disposable development environments, ephemeral CI runners, and short-lived compute sessions for administrative access.</p><p>While these architectures offer strong security properties, they also introduce <strong>non-trivial trade-offs</strong> in performance, cost, usability, and</p>]]></description><link>https://akshatjoshi.com/security-trade-offs-in-remote-and-ephemeral-execution-environments/</link><guid isPermaLink="false">6945bda5785fc6259accc26a</guid><category><![CDATA[1 - Tech]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Fri, 26 Dec 2025 18:06:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1654610285929-a1b63280dd60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGJyb3dzZXJ8ZW58MHx8fHwxNzY2NDQ1NjQ4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1654610285929-a1b63280dd60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGJyb3dzZXJ8ZW58MHx8fHwxNzY2NDQ1NjQ4fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Security trade-offs in remote and ephemeral execution environments"><p></p><p><strong><u>Introduction</u></strong></p><p>Remote and ephemeral execution environments are increasingly used to isolate sensitive workloads from untrusted endpoints. Examples include remote browsers, disposable development environments, ephemeral CI runners, and short-lived compute sessions for administrative access.</p><p>While these architectures offer strong security properties, they also introduce <strong>non-trivial trade-offs</strong> in performance, cost, usability, and operational complexity.</p><p>This article examines the <strong>security trade-offs</strong> inherent in remote and ephemeral execution environments, focusing on:</p><ul><li>What risks are meaningfully reduced</li><li>What new risks are introduced</li><li>Why certain design compromises are unavoidable</li><li>How to reason about these systems realistically</li></ul><p>The goal is not to advocate for a single approach, but to provide a framework for <strong>informed architectural decisions</strong>.</p><h2 id="defining-the-execution-model"><strong><u>Defining the execution model</u></strong></h2><p>At a high level, remote and ephemeral execution environments share three core properties:</p><ol><li><strong>Execution occurs outside the user&#x2019;s local device</strong></li><li><strong>Each session has a defined lifecycle</strong></li><li><strong>State is intentionally discarded</strong></li></ol><p>Instead of treating the endpoint as a trusted execution surface, these systems shift trust to:</p><ul><li>A controlled runtime</li><li>A centralized control plane</li><li>Enforced lifecycle management</li></ul><p>This fundamentally changes where security boundaries exist.</p><h2 id="security-benefits-what-improves-meaningfully"><strong><u>Security benefits: What improves meaningfully</u></strong></h2><h3 id="reduced-endpoint-risk">Reduced Endpoint Risk</h3><p>By executing workloads remotely:</p><ul><li>Sensitive data never touches the local disk</li><li>Malware on the endpoint has limited visibility</li><li>Shared or unmanaged devices become viable</li></ul><p>This is particularly valuable in:</p><ul><li>Contractor workflows</li><li>Public or semi-trusted networks</li><li>Bring-your-own-device environments</li></ul><p><strong>Trade-off accepted:</strong> Reduced offline capability.</p><h3 id="session-level-containment">Session-level containment</h3><p>Ephemeral execution environments are designed around <strong>forced session termination</strong>.</p><p>Security improvements include:</p><ul><li>No long-lived credentials</li><li>No cross-session contamination</li><li>Automatic cleanup of artifacts</li></ul><p>Unlike traditional systems that rely on user behavior (&#x201C;log out&#x201D;, &#x201C;clear cache&#x201D;), ephemerality is <strong>enforced</strong>, not optional.</p><p><strong>Trade-off accepted:</strong> No session continuity or recovery.</p><h3 id="smaller-blast-radius">Smaller blast radius</h3><p>When compromise occurs:</p><ul><li>Impact is limited to a single session</li><li>Persistence mechanisms are ineffective</li><li>Attacks must succeed within a constrained time window</li></ul><p>This shifts the attacker&#x2019;s economics, increasing cost and reducing payoff.</p><p><strong>Trade-off accepted:</strong> Higher infrastructure complexity.</p><h2 id="new-risks-introduced-by-remote-execution"><strong><u>New risks introduced by remote execution</u></strong></h2><p>Security is never free. Moving execution off-device introduces new concerns.</p><h3 id="control-plane-as-a-high-value-target">Control plane as a high-value target</h3><p>Centralized orchestration systems become critical infrastructure.</p><p>Risks include:</p><ul><li>Unauthorized session creation</li><li>Policy bypass</li><li>Abuse of provisioning APIs</li></ul><p>Mitigations require:</p><ul><li>Strong authentication</li><li>Fine-grained authorization</li><li>Audit logging</li><li>Rate limiting</li></ul><p>This creates a <strong>single point of control</strong>, which must be secured accordingly.</p><h3 id="expanded-network-attack-surface">Expanded network attack surface</h3><p>Remote execution relies on:</p><ul><li>Session streaming</li><li>Control channels</li><li>Network connectivity</li></ul><p>These layers introduce:</p><ul><li>Man-in-the-middle risks</li><li>Latency-based attacks</li><li>Availability concerns</li></ul><p>While data exposure is reduced, <strong>availability and integrity</strong> become more prominent risks.</p><h3 id="browser-and-runtime-vulnerabilities-still-matter">Browser and runtime vulnerabilities still matter</h3><p>Isolation reduces persistence, but does not eliminate:</p><ul><li>Zero-day exploits</li><li>Sandbox escapes</li><li>Browser engine flaws</li></ul><p>Ephemerality limits long-term damage, but <strong>does not replace patching, monitoring, or defense-in-depth</strong>.</p><h2 id="performance-vs-security-a-deliberate-tension"><strong><u>Performance vs Security: A deliberate tension</u></strong></h2><h3 id="cold-start-latency">Cold start latency</h3><p>Ephemeral environments often incur:</p><ul><li>Container startup delay</li><li>Browser initialization cost</li></ul><p>Mitigations include:</p><ul><li>Pre-warmed pools</li><li>Lightweight base images</li><li>Optimized startup paths</li></ul><p>However, eliminating cold starts entirely often undermines isolation guarantees.</p><p><strong>Security-first systems accept some latency.</strong></p><h3 id="resource-overhead">Resource overhead</h3><p>Isolated sessions consume:</p><ul><li>Dedicated CPU</li><li>Dedicated memory</li><li>Network resources</li></ul><p>Shared execution models are cheaper but weaken security boundaries.</p><p>This trade-off is architectural, not accidental.</p><h2 id="usability-vs-determinism"><strong><u>Usability vs Determinism</u></strong></h2><h3 id="no-%E2%80%9Cresume-session%E2%80%9D">No &#x201C;Resume Session&#x201D;</h3><p>Ephemeral systems typically do not support:</p><ul><li>Session restoration</li><li>Long-lived personalization</li><li>Persistent local state</li></ul><p>From a security perspective, this is a feature, not a bug.</p><p>From a user perspective, it introduces friction.</p><p>Well-designed systems:</p><ul><li>Make lifecycle expectations explicit</li><li>Optimize workflows around short-lived usage</li><li>Avoid pretending persistence exists when it does not</li></ul><h3 id="explicit-security-boundaries">Explicit Security Boundaries</h3><p>Users must adapt to:</p><ul><li>Intentional session endings</li><li>Clear separation between trusted and untrusted workflows</li><li>Purpose-driven usage</li></ul><p>This encourages <strong>security-aware behavior</strong>, but requires education.</p><h2 id="cost-vs-predictability"><strong><u>Cost vs Predictability</u></strong></h2><p>Ephemeral execution environments trade:</p><ul><li>Lower long-term risk<br>for</li><li>Higher per-session cost</li></ul><p>However, they also offer:</p><ul><li>Predictable cleanup</li><li>Bounded resource usage</li><li>Clear accounting</li></ul><p>For many organizations, <strong>predictability is worth more than raw efficiency</strong>.</p><h2 id="when-this-model-makes-sense"><strong><u>When this model makes sense</u></strong></h2><p>Remote and ephemeral execution environments are well-suited for:</p><ul><li>Administrative access</li><li>Financial and compliance workflows</li><li>Client demos</li><li>Research on untrusted content</li><li>Short-lived, high-risk activities</li></ul><p>They are less suitable for:</p><ul><li>Long-running creative work</li><li>Offline-first workflows</li><li>Highly personalized environments</li></ul><p>Understanding this boundary is critical to correct adoption.</p><h2 id="conclusion"><strong><u>Conclusion</u></strong></h2><p>Remote and ephemeral execution environments do not eliminate security risk &#x2014; they <strong>reshape it</strong>.</p><p>By accepting:</p><ul><li>Higher infrastructure complexity</li><li>Intentional user friction</li><li>Increased per-session cost</li></ul><p>These systems gain:</p><ul><li>Strong containment guarantees</li><li>Reduced persistence risk</li><li>Clear, enforceable security boundaries</li></ul><p>Security architecture is ultimately about <strong>choosing which problems to solve decisively</strong>, and which trade-offs are acceptable. Ephemeral execution environments represent a deliberate shift toward determinism, containment, and recoverability.</p><p>This analysis reflects design decisions applied in the development of a privacy-first, ephemeral browser platform focused on secure professional workflows.</p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Threat modeling disposable browser environments]]></title><description><![CDATA[<p></p><h2 id="introduction"><strong><u>Introduction</u></strong></h2><p>Web browsers have evolved into powerful execution environments, routinely handling authentication tokens, privileged credentials, internal dashboards, and sensitive user data. Yet, most security controls still treat browsers as <strong>long-lived, trusted endpoints</strong>.</p><p>Disposable or ephemeral browser environments challenge this assumption by introducing <strong>session-scoped isolation</strong> and <strong>automatic destruction</strong> as first-class security</p>]]></description><link>https://akshatjoshi.com/threat-modeling-disposable-browser-environments/</link><guid isPermaLink="false">6945b369785fc6259accc235</guid><category><![CDATA[1 - Tech]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Mon, 22 Dec 2025 15:27:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1503596476-1c12a8ba09a9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDExfHx0cmFzaHxlbnwwfHx8fDE3NjYxOTk0MTR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1503596476-1c12a8ba09a9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDExfHx0cmFzaHxlbnwwfHx8fDE3NjYxOTk0MTR8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Threat modeling disposable browser environments"><p></p><h2 id="introduction"><strong><u>Introduction</u></strong></h2><p>Web browsers have evolved into powerful execution environments, routinely handling authentication tokens, privileged credentials, internal dashboards, and sensitive user data. Yet, most security controls still treat browsers as <strong>long-lived, trusted endpoints</strong>.</p><p>Disposable or ephemeral browser environments challenge this assumption by introducing <strong>session-scoped isolation</strong> and <strong>automatic destruction</strong> as first-class security controls.</p><p>This article presents a structured <strong>threat model</strong> for disposable browser environments, analyzing:</p><ul><li>Key threat categories</li><li>Attack surfaces</li><li>Mitigation strategies</li><li>Residual risks and trade-offs</li></ul><p></p><h2 id="security-assumptions-and-scope"><strong><u>Security assumptions and scope</u></strong></h2><h3 id="in-scope">In scope</h3><ul><li>Browser-level threats</li><li>Session persistence risks</li><li>Web-based attacks</li><li>Untrusted networks and endpoints</li><li>Data remanence across sessions</li></ul><h3 id="out-of-scope">Out of scope</h3><ul><li>Host kernel compromise</li><li>Physical attacks</li><li>Hardware-level exploits</li><li>Insider threats with infrastructure access</li></ul><p>The goal is <strong>risk containment</strong>, not absolute security.</p><p></p><h2 id="threat-model-overview"><strong><u>Threat model overview</u></strong></h2><p>Disposable browser environments shift the security boundary from the endpoint to the <strong>session runtime</strong>.</p><h3 id="key-principle">Key Principle</h3><blockquote>A compromised session must never compromise another session.</blockquote><p><strong>Description:</strong></p><ul><li>Users interact through a thin client</li><li>Sessions are provisioned by a control plane</li><li>Browsers run inside fully isolated, short-lived containers</li><li>All state is destroyed at session termination</li></ul><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/12/arch1-1.png" class="kg-image" alt="Threat modeling disposable browser environments" loading="lazy" width="1535" height="351" srcset="https://akshatjoshi.com/content/images/size/w600/2025/12/arch1-1.png 600w, https://akshatjoshi.com/content/images/size/w1000/2025/12/arch1-1.png 1000w, https://akshatjoshi.com/content/images/2025/12/arch1-1.png 1535w" sizes="(min-width: 720px) 720px"></figure><p></p><h2 id="threat-categories"><strong><u>Threat categories</u></strong></h2><h3 id="persistent-tracking-fingerprinting">Persistent tracking &amp; fingerprinting</h3><p><strong>Threat</strong></p><ul><li>Cookies, IndexedDB, local storage</li><li>Browser fingerprint correlation</li><li>Cross-session tracking</li></ul><p><strong>Impact</strong></p><ul><li>Identity correlation</li><li>Behavioral profiling</li><li>Privacy violations</li></ul><p><strong>Mitigation</strong></p><ul><li>Per-session container runtime</li><li>No shared filesystem</li><li>Fresh browser instance per session</li></ul><h3 id="credential-token-leakage">Credential &amp; token leakage</h3><p><strong>Threat</strong></p><ul><li>OAuth tokens cached in browser storage</li><li>Saved credentials</li><li>Session hijacking</li></ul><p><strong>Impact</strong></p><ul><li>Unauthorized account access</li><li>Privilege escalation</li></ul><p><strong>Mitigation</strong></p><ul><li>No persistent storage</li><li>Forced session TTL</li><li>Container destruction guarantees cleanup</li></ul><h3 id="malicious-web-content">Malicious web content</h3><p><strong>Threat</strong></p><ul><li>Drive-by malware</li><li>Cryptomining scripts</li><li>Persistent XSS payloads</li></ul><p><strong>Impact</strong></p><ul><li>Long-term compromise</li><li>Data exfiltration</li></ul><p><strong>Mitigation</strong></p><ul><li>Process isolation</li><li>Network sandboxing</li><li>Non-persistent execution environment</li></ul><h3 id="shared-endpoint-risk">Shared endpoint risk</h3><p><strong>Threat</strong></p><ul><li>Public Wi-Fi</li><li>Shared workstations</li><li>Contractor devices</li></ul><p><strong>Impact</strong></p><ul><li>Session reuse</li><li>Local data leakage</li></ul><p><strong>Mitigation</strong></p><ul><li>Browser runs remotely</li><li>Endpoint receives only rendered output</li><li>No sensitive data stored locally</li></ul><p></p><h2 id="attack-surface-analysis"><strong><u>Attack surface analysis</u></strong></h2><h3 id="reduced-surfaces">Reduced Surfaces</h3><ul><li>Local disk persistence</li><li>Cross-session contamination</li><li>Credential reuse</li></ul><h3 id="remaining-surfaces">Remaining Surfaces</h3><ul><li>Browser engine vulnerabilities</li><li>Control plane misconfiguration</li><li>Session streaming layer</li></ul><p>Disposable environments <strong>reduce blast radius</strong>, not eliminate all risk.</p><h2 id="control-plane-threats"><strong><u>Control plane threats</u></strong></h2><p>The control plane becomes a <strong>high-value asset</strong>.</p><h3 id="threats">Threats</h3><ul><li>Unauthorized session creation</li><li>TTL bypass</li><li>Policy misconfiguration</li></ul><h3 id="controls">Controls</h3><ul><li>Strong authentication</li><li>Session lifecycle enforcement</li><li>Audit logging</li><li>Rate limiting</li></ul><p>Security shifts from endpoint sprawl to <strong>centralized enforcement</strong>.</p><h2 id="trade-offs-and-residual-risks"><strong><u>Trade-offs and residual risks</u></strong></h2><h3 id="performance">Performance</h3><ul><li>Cold start latency</li><li>Resource overhead</li></ul><h3 id="ux">UX</h3><ul><li>No session resume</li><li>No personalization persistence</li></ul><h3 id="cost">Cost</h3><ul><li>Compute per session</li></ul><p>These are <strong>intentional trade-offs</strong> made to achieve deterministic security behavior.</p><h2 id="conclusion"><strong><u>Conclusion</u></strong></h2><p>Disposable browser environments introduce a fundamentally different security model &#x2014; one that assumes compromise is possible and designs for <strong>containment and automatic recovery</strong>.</p><p>By enforcing:</p><ul><li>Isolation by default</li><li>Short-lived execution</li><li>Mandatory destruction</li></ul><p>This architecture significantly reduces the risk of data leakage, session hijacking, and long-term compromise.</p><p>The threat model outlined here informed the design of a browser platform I am currently building, focused on privacy-first, ephemeral browsing for professional use cases.</p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Designing ephemeral browser sessions using container isolation]]></title><description><![CDATA[<p></p><h2 id="why-browser-isolation-is-still-hard"><strong><u>Why browser isolation is still hard</u></strong></h2><p>Modern browsers have become the primary interface to sensitive systems &#x2014; cloud consoles, financial dashboards, internal admin tools, customer data platforms, and third-party SaaS applications.</p><p>Despite this, browsers remain fundamentally stateful:</p><ul><li>Cookies persist across sessions</li><li>Local storage and IndexedDB accumulate data</li><li>Browser fingerprints remain</li></ul>]]></description><link>https://akshatjoshi.com/designing-ephemeral-browser-sessions-using-container-isolation/</link><guid isPermaLink="false">6945a804785fc6259accc1de</guid><category><![CDATA[1 - Tech]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Sat, 20 Dec 2025 04:56:59 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1494961104209-3c223057bd26?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGNvbnRhaW5lcnxlbnwwfHx8fDE3NjYxNzI2OTh8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1494961104209-3c223057bd26?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGNvbnRhaW5lcnxlbnwwfHx8fDE3NjYxNzI2OTh8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Designing ephemeral browser sessions using container isolation"><p></p><h2 id="why-browser-isolation-is-still-hard"><strong><u>Why browser isolation is still hard</u></strong></h2><p>Modern browsers have become the primary interface to sensitive systems &#x2014; cloud consoles, financial dashboards, internal admin tools, customer data platforms, and third-party SaaS applications.</p><p>Despite this, browsers remain fundamentally stateful:</p><ul><li>Cookies persist across sessions</li><li>Local storage and IndexedDB accumulate data</li><li>Browser fingerprints remain stable</li><li>Cached credentials and artifacts survive far longer than intended</li></ul><p>Common mitigations such as incognito mode, VPNs, or endpoint hardening solve only parts of the problem. They do not address session-level contamination, especially when the same machine is used for:</p><ul><li>Client demos</li><li>Administrative access</li><li>Research on untrusted sites</li><li>Work from public or semi-trusted networks</li></ul><p>The core issue is simple:</p><blockquote>Browsers were never designed to be disposable.</blockquote><p>This article explores a practical architecture for ephemeral browser sessions, where each browsing session is isolated, short-lived, and destroyed by design.</p><h2 id="what-are-we-actually-protecting-against"><strong><u>What are we actually protecting against?</u></strong></h2><p>Before discussing architecture, it&#x2019;s important to define a realistic threat model.</p><h3 id="in-scope-threats">In-Scope threats</h3><ul><li><strong>Cross-session data leakage</strong><br>Cookies, tokens, or cached credentials leaking between workflows</li><li><strong>Browser fingerprint persistence</strong><br>Trackers correlating activity across sessions</li><li><strong>Residual artifacts</strong><br>Files, cache entries, clipboard data, and local storage remnants</li><li><strong>Compromised websites</strong><br>Malicious scripts persisting state beyond intended scope</li><li><strong>Shared or semi-trusted endpoints</strong><br>Public Wi-Fi, shared laptops, contractor machines</li></ul><h3 id="out-of-scope-for-this-design">Out-of-Scope (for this design)</h3><ul><li>Kernel-level host compromise</li><li>Hardware-based attacks</li><li>Malicious insiders with host access</li></ul><p>The goal is <strong>risk reduction through isolation</strong>, not absolute security.</p><p></p><h2 id="architectural-overview-disposable-by-design"><strong><u>Architectural overview: Disposable by design</u></strong></h2><p>At a high level, the system treats <strong>each browser session as a short-lived compute workload</strong>, not as an application running on a long-lived device.</p><h3 id="core-principle">Core principle</h3><blockquote><strong>One session = one isolated runtime = zero persistence</strong></blockquote><h3 id="high-level-flow">High-level flow</h3><ol><li>User requests a new browser session</li><li>Backend provisions an isolated container</li><li>Browser runs inside the container</li><li>User interacts via a remote stream</li><li>Session expires or is terminated</li><li>Container and all state are destroyed</li></ol><p></p><h2 id="high-level-architecture"><strong><u>High-level architecture</u></strong></h2><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://akshatjoshi.com/content/images/2025/12/arch1.png" class="kg-image" alt="Designing ephemeral browser sessions using container isolation" loading="lazy" width="1535" height="351" srcset="https://akshatjoshi.com/content/images/size/w600/2025/12/arch1.png 600w, https://akshatjoshi.com/content/images/size/w1000/2025/12/arch1.png 1000w, https://akshatjoshi.com/content/images/2025/12/arch1.png 1535w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Architecture diagram</span></figcaption></figure><p></p><h2 id="isolation-mechanisms-how-containment-is-enforced"><strong><u>Isolation mechanisms: How containment is enforced</u></strong></h2><p></p><h3 id="process-namespace-isolation">Process &amp; namespace isolation</h3><p>Each browser session runs inside its own container with:</p><ul><li>PID namespace isolation</li><li>User namespace isolation</li><li>Dedicated filesystem mount</li></ul><p>This ensures:</p><ul><li>No visibility into other sessions</li><li>No shared process state</li></ul><h3 id="filesystem-isolation">Filesystem isolation</h3><ul><li>Read-only base image</li><li>Ephemeral writable layer</li><li>No persistent volumes</li></ul><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/12/arch3.png" class="kg-image" alt="Designing ephemeral browser sessions using container isolation" loading="lazy" width="709" height="424" srcset="https://akshatjoshi.com/content/images/size/w600/2025/12/arch3.png 600w, https://akshatjoshi.com/content/images/2025/12/arch3.png 709w"></figure><h3 id="network-sandboxing">Network sandboxing</h3><p>Each container receives:</p><ul><li>Isolated network namespace</li><li>Controlled outbound access</li><li>Optional egress filtering</li></ul><p>This prevents:</p><ul><li>Lateral movement</li><li>Session-to-session network correlation</li></ul><h3 id="resource-constraints">Resource constraints</h3><p>Containers enforce:</p><ul><li>CPU limits</li><li>Memory caps</li><li>Hard session TTL</li></ul><p>This guarantees:</p><ul><li>Predictable cost</li><li>Forced termination of stale sessions</li></ul><h2 id="session-lifecycle-management"><strong><u>Session lifecycle management</u></strong></h2><p>Ephemerality must be enforced at the <strong>platform level</strong>, not left to user behavior.</p><h3 id="lifecycle-states">Lifecycle states</h3><ol><li><strong>Provisioning</strong></li><li><strong>Active</strong></li><li><strong>Idle (TTL countdown)</strong></li><li><strong>Termination</strong></li><li><strong>Destruction</strong></li></ol><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/12/arch2.png" class="kg-image" alt="Designing ephemeral browser sessions using container isolation" loading="lazy" width="429" height="543"></figure><p></p><h2 id="design-trade-offs-and-decisions"><strong><u>Design trade-offs and decisions</u></strong></h2><h3 id="cold-start-latency">Cold start latency</h3><ul><li>Container startup adds delay</li><li>Mitigations:<ul><li>Warm pools</li><li>Lightweight images</li><li>Optimized browser builds</li></ul></li></ul><h3 id="performance-vs-isolation">Performance vs isolation</h3><ul><li>Full isolation costs more than shared processes</li><li>Chosen deliberately for:<ul><li>Predictability</li><li>Security clarity</li><li>Easier reasoning about risk</li></ul></li></ul><h3 id="ux-vs-security">UX vs Security</h3><ul><li>No &#x201C;resume session&#x201D;</li><li>No saved state</li><li>Intentional friction to prevent unsafe reuse</li></ul><p>These are <strong>conscious decisions</strong>, not limitations.</p><p></p><h2 id="practical-applications"><strong><u>Practical applications</u></strong></h2><p>This approach is especially useful for:</p><ul><li>Accessing financial or admin dashboards</li><li>Client demonstrations</li><li>Researching untrusted content</li><li>Working from public or semi-trusted networks</li><li>Contractors handling sensitive systems</li></ul><p>In all cases, the goal is to <strong>limit blast radius</strong>.</p><p></p><h2 id="conclusion"><strong><u>Conclusion</u></strong></h2><p>As browser usage increasingly overlaps with sensitive workflows, traditional endpoint-based security models show their limits.</p><p>Ephemeral, isolated browser sessions provide a <strong>practical middle ground</strong>:</p><ul><li>Strong isolation</li><li>Clear lifecycle boundaries</li><li>Predictable security properties</li></ul><p>This architectural approach informed the design of a browser platform I am currently building, focused on privacy-first, disposable browsing for professional use cases.</p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Multiverse , everyday]]></title><description><![CDATA[<p></p><p>Theory :</p><blockquote>After we sleep, we wake up in a new alternative universe. It looks and feels similar but somethings have changed.</blockquote>]]></description><link>https://akshatjoshi.com/multiverse-everyday/</link><guid isPermaLink="false">693ce489785fc6259accc1c8</guid><category><![CDATA[2 - Misc]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Sat, 13 Dec 2025 04:21:10 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1732946734433-bf3f603b24c3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDd8fG11bHRpdmVyc2V8ZW58MHx8fHwxNzY1NTk5NzEyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1732946734433-bf3f603b24c3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDd8fG11bHRpdmVyc2V8ZW58MHx8fHwxNzY1NTk5NzEyfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Multiverse , everyday"><p></p><p>Theory :</p><blockquote>After we sleep, we wake up in a new alternative universe. It looks and feels similar but somethings have changed.</blockquote>]]></content:encoded></item><item><title><![CDATA[512-Byte Boot Sector Pong Game]]></title><description><![CDATA[<p><em>written by - Akshat Joshi </em></p><h2 id="sometime-back-i-set-myself-a-crazy-constraint">Sometime back, I set myself a crazy constraint:</h2><p></p><blockquote><br><strong>Load only one thing at boot - A Pong game that fits in one floppy disk sector &#x2014; 512 bytes.</strong></blockquote><p></p><h2 id="why-would-i-build-this"><strong>Why would I build this?</strong></h2><p>I have played with Operating Systems and their workings by customizing them</p>]]></description><link>https://akshatjoshi.com/i-wrote-a-pong-game-in-a-512-byte-boot-sector/</link><guid isPermaLink="false">69179fc1785fc6259accc11c</guid><category><![CDATA[1 - Tech]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Fri, 14 Nov 2025 22:42:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1701099153587-6f28b448ff0e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGFzc2VtYmx5JTIwbGFuZ3VhZ2V8ZW58MHx8fHwxNzYzMTU3MDk5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1701099153587-6f28b448ff0e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGFzc2VtYmx5JTIwbGFuZ3VhZ2V8ZW58MHx8fHwxNzYzMTU3MDk5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="512-Byte Boot Sector Pong Game"><p><em>written by - Akshat Joshi </em></p><h2 id="sometime-back-i-set-myself-a-crazy-constraint">Sometime back, I set myself a crazy constraint:</h2><p></p><blockquote><br><strong>Load only one thing at boot - A Pong game that fits in one floppy disk sector &#x2014; 512 bytes.</strong></blockquote><p></p><h2 id="why-would-i-build-this"><strong>Why would I build this?</strong></h2><p>I have played with Operating Systems and their workings by customizing them and tweaking their behavior. But this was  about pushing constraints to the extreme. Can I have an OS which just loads one PONG GAME ?</p><h2 id="the-challenge">The challenge</h2><ul><li>No operating system.</li><li>No drivers.</li><li>No libraries.</li><li>Just raw x86 assembly, BIOS interrupts, and the video memory at 0xB800.</li></ul><p>The boot sector is the first 512 bytes a computer loads from disk. It has to end with the magic bytes 0x55 0xAA &#x2014; leaving only <strong>510 bytes</strong> for actual code.<br>I wanted to see if I could fit:</p><ul><li>Player paddle (W/S keys)</li><li>CPU opponent</li><li>Ball with velocity</li><li>Scoring</li><li>Color toggle (C key)</li><li>Full reset (R key)</li></ul><p>After learning about Operating systems and the bootup flow, I finally managed to get a pong game running &#x1F604;</p><h2 id="how-it-works">How it works!</h2><p>The game runs in <strong>80x25 text mode</strong> (VGA mode 03h) using BIOS interrupt 10h.<br>Everything is drawn directly into video memory (0xB800) with stosw &#x2014; of course no graphics libraries here.</p><h2 id="controls"><strong>Controls</strong></h2><p>W / S &#x2014; Move your paddle<br>C &#x2014; Cycle paddle and midline colors<br>R &#x2014; Reset game (reboots the sector)</p><p>It&#x2019;s a <strong>deterministic ball-tracking logic</strong>. It checks the ball&#x2019;s Y position every frame:</p><ul><li>If ball is above paddle &#x2192; move up</li><li>If below &#x2192; move down</li><li>Never goes off-screen</li></ul><p>Simple. Fast. Fits in 510 bytes.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://akshatjoshi.com/content/media/2025/11/pong_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://akshatjoshi.com/content/media/2025/11/pong.mp4" poster="https://img.spacergif.org/v1/1280x720/0a/spacer.png" width="1280" height="720" playsinline preload="metadata" style="background: transparent url(&apos;https://akshatjoshi.com/content/media/2025/11/pong_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:20</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p dir="ltr"><span style="white-space: pre-wrap;">Demo run</span></p></figcaption>
        </figure><h2 id="key-technical-highlights"><strong>Key Technical Highlights</strong></h2><ul><li><strong>Video Memory Direct Access</strong> Used <em><u>ES:DI = 0xB800:0000</u></em> and <em><u>rep stosw</u></em> to clear screen in one instruction.</li><li><strong>Efficient Positioning - </strong><em><u>imul di, [playerY], 160</u></em> &#x2192; converts row to video offset (80 cols &#xD7; 2 bytes per char).</li><li><strong>Real-Time Input</strong> - BIOS int <em><u>0x16 </u></em>with <em><u>ah=1</u></em> (peek) &#x2192; non-blocking keyboard check.</li><li><strong>Physics &amp; Collision -</strong> Ball velocity stored in single bytes (<em><u>ballVeloX, ballVeloY</u></em>). Reversed on wall/paddle hit using <em><u>neg byte</u></em>.</li><li><strong>Delay Loop - </strong> Used BIOS timer at <em><u>0x46C </u></em>for frame pacing &#x2014; no hlt, no busy-wait burn.</li><li><strong>Color Cycling - </strong>C key increments drawColour by <em><u>0x10 </u></em>&#x2192; rotates through 16 background colors.</li></ul><p></p><h2 id="the-full-code"><strong>The Full Code</strong></h2><p>The entire game is in one file: pong.asm<br>Publicly available on GitHub:<br><a href="https://github.com/akshat666/-bootponggame?ref=akshatjoshi.com" rel="noopener noreferrer nofollow">https://github.com/akshat666/-bootponggame</a></p><h2 id="run-it-yourself"><strong>Run It Yourself</strong></h2><ol><li>Clone the repo</li><li>Assemble with NASM</li><li>Run in QEMU (or burn to USB and boot on old hardware)</li></ol><p></p>]]></content:encoded></item><item><title><![CDATA[Writing Performant Software Is More Critical Today]]></title><description><![CDATA[<h1 id></h1><p>Not long ago, most developers could get away with saying <em>&#x201C;<strong>hardware will catch up.</strong>&#x201D;</em> If code wasn&#x2019;t perfectly optimized, faster processors, more memory, and better infrastructure usually masked inefficiencies. But today, things have changed.</p><p>With AI becoming part of nearly every product and workflow, performance is</p>]]></description><link>https://akshatjoshi.com/writing-performant-software-is-more-critical-today/</link><guid isPermaLink="false">68ddf1e9785fc6259accc104</guid><category><![CDATA[1 - Tech]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Thu, 02 Oct 2025 03:43:14 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1546146830-2cca9512c68e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzU5Mzc2MTg0fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h1 id></h1><img src="https://images.unsplash.com/photo-1546146830-2cca9512c68e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIxfHxkZXZlbG9wZXJ8ZW58MHx8fHwxNzU5Mzc2MTg0fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Writing Performant Software Is More Critical Today"><p>Not long ago, most developers could get away with saying <em>&#x201C;<strong>hardware will catch up.</strong>&#x201D;</em> If code wasn&#x2019;t perfectly optimized, faster processors, more memory, and better infrastructure usually masked inefficiencies. But today, things have changed.</p><p>With AI becoming part of nearly every product and workflow, performance is no longer optional&#x2014;it&#x2019;s mission critical.</p><h2 id="ai-brings-power%E2%80%A6-and-latency">AI Brings Power&#x2026; and Latency</h2><p>AI is amazing. It can generate text, analyze images, predict outcomes, and automate tasks at a level we couldn&#x2019;t imagine even a few years ago. But let&#x2019;s be honest&#x2014;AI isn&#x2019;t cheap or instant.</p><p>Running large models takes serious compute. Inference can add seconds where users expect milliseconds. Add in the steps around AI&#x2014;preprocessing data, calling APIs, moving results back and forth&#x2014;and suddenly even a simple action feels heavy.</p><p>Users don&#x2019;t care about <em>why</em> it&#x2019;s slow. They just feel the lag. And in today&#x2019;s world of instant apps and real-time responses, even small delays break trust.</p><h2 id="security-adds-another-layer-of-delay">Security Adds Another Layer of Delay</h2><p>Here&#x2019;s the other piece: security. As companies integrate AI, they can&#x2019;t afford to ignore risks like prompt injection, adversarial attacks, or data leaks.</p><p>The fixes? Extra validation, monitoring, encryption, anomaly detection&#x2014;all absolutely necessary. But all of them add friction.</p><p>So now you&#x2019;ve got AI latency <strong>plus</strong> security latency. If your underlying software is bloated or inefficient, that lag multiplies fast.</p><h2 id="why-performance-is-a-business-advantage">Why Performance Is a Business Advantage</h2><p>This is why performant software matters more than ever. It&#x2019;s not just about cleaner code or faster benchmarks&#x2014;it&#x2019;s about business survival.</p><ul><li><strong>Users stay when apps feel snappy.</strong> A fast, smooth experience beats fancy features that take too long to load.</li><li><strong>Costs drop when systems run efficiently.</strong> AI workloads are expensive. Optimized code means fewer wasted cycles and lower bills.</li><li><strong>Scaling gets easier.</strong> Good performance makes it possible to serve more users without throwing endless hardware at the problem.</li><li><strong>Security feels invisible.</strong> If your systems are efficient, you can add safety checks without the user noticing the overhead.</li></ul><h2 id="building-with-performance-in-mind">Building with Performance in Mind</h2><p>So what can teams do? It doesn&#x2019;t mean going back to hand-optimizing assembly code, but it does mean treating performance as a core design principle, not an afterthought.</p><ul><li>Architect simply&#x2014;don&#x2019;t add unnecessary layers just for the sake of &#x201C;modern design.&#x201D;</li><li>Use model optimization tricks like quantization or distillation to speed up AI inference.</li><li>Profile your systems regularly to catch bottlenecks early.</li><li>Think about parallelization and smart batching where it makes sense.</li><li>Design with both security <em>and</em> performance in mind from the start, not bolted on later.</li></ul><h2 id="the-bottom-line">The Bottom Line</h2><p>Every company wants AI in their stack. But the ones that succeed won&#x2019;t just be the ones who <em>have</em> AI&#x2014;they&#x2019;ll be the ones who deliver it fast, securely, and seamlessly.</p><p>That means writing performant software is no longer just good practice. It&#x2019;s the foundation of great AI products.</p><p>Because in the end, users won&#x2019;t thank you for the smartest model in the world if it feels slow.</p>]]></content:encoded></item><item><title><![CDATA[Scribble objects u see]]></title><description><![CDATA[<p></p><p>Just throwing in objects on my table onto my book.</p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/image-4.jpg" class="kg-image" alt loading="lazy" width="2000" height="1500" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image-4.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image-4.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image-4.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image-4.jpg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></description><link>https://akshatjoshi.com/untitled-2/</link><guid isPermaLink="false">68d5c559785fc6259accc0f2</guid><category><![CDATA[2 - Misc]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Thu, 25 Sep 2025 22:43:36 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1608804375269-d077e2a2adaa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE4fHxza2V0Y2h8ZW58MHx8fHwxNzYzMTc4OTMxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1608804375269-d077e2a2adaa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE4fHxza2V0Y2h8ZW58MHx8fHwxNzYzMTc4OTMxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Scribble objects u see"><p></p><p>Just throwing in objects on my table onto my book.</p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/image-4.jpg" class="kg-image" alt="Scribble objects u see" loading="lazy" width="2000" height="1500" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image-4.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image-4.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image-4.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image-4.jpg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[SF]]></title><description><![CDATA[<p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/image-3.jpg" class="kg-image" alt loading="lazy" width="2000" height="1500" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image-3.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image-3.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image-3.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image-3.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><p></p>]]></description><link>https://akshatjoshi.com/sf/</link><guid isPermaLink="false">68d5c4e9785fc6259accc0e9</guid><category><![CDATA[2 - Misc]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Thu, 25 Sep 2025 22:41:42 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1608804375369-498a4b601e42?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDl8fHNrZXRjaHxlbnwwfHx8fDE3NjMxNzg5MzF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1608804375369-498a4b601e42?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDl8fHNrZXRjaHxlbnwwfHx8fDE3NjMxNzg5MzF8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="SF"><p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/image-3.jpg" class="kg-image" alt="SF" loading="lazy" width="2000" height="1500" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image-3.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image-3.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image-3.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image-3.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><p></p>]]></content:encoded></item><item><title><![CDATA[River side sketch]]></title><description><![CDATA[<p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/image-2.jpg" class="kg-image" alt loading="lazy" width="2000" height="2667" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image-2.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image-2.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image-2.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image-2.jpg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></description><link>https://akshatjoshi.com/untitled/</link><guid isPermaLink="false">68d5c4b2785fc6259accc0e0</guid><category><![CDATA[2 - Misc]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Thu, 25 Sep 2025 22:40:20 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1512445854790-1654cf4b792a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxza2V0Y2h8ZW58MHx8fHwxNzYzMTc4OTMxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1512445854790-1654cf4b792a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxza2V0Y2h8ZW58MHx8fHwxNzYzMTc4OTMxfDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="River side sketch"><p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/image-2.jpg" class="kg-image" alt="River side sketch" loading="lazy" width="2000" height="2667" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image-2.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image-2.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image-2.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image-2.jpg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Calm river - pen]]></title><description><![CDATA[<figure class="kg-card kg-image-card kg-width-wide"><img src="https://akshatjoshi.com/content/images/2025/09/image-1.jpg" class="kg-image" alt loading="lazy" width="2000" height="2667" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image-1.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image-1.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image-1.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image-1.jpg 2000w" sizes="(min-width: 1200px) 1200px"></figure>]]></description><link>https://akshatjoshi.com/calm-river-pen/</link><guid isPermaLink="false">68d5c416785fc6259accc0d5</guid><category><![CDATA[2 - Misc]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Thu, 25 Sep 2025 22:39:09 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1419133203517-f3b3ed0ba2bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fHJpdmVyfGVufDB8fHx8MTc2NzE1MDE5OHww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-width-wide"><img src="https://akshatjoshi.com/content/images/2025/09/image-1.jpg" class="kg-image" alt="Calm river - pen" loading="lazy" width="2000" height="2667" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image-1.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image-1.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image-1.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image-1.jpg 2000w" sizes="(min-width: 1200px) 1200px"></figure>]]></content:encoded></item><item><title><![CDATA[Georgetown - M street]]></title><description><![CDATA[<p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/image.jpg" class="kg-image" alt loading="lazy" width="2000" height="2667" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image.jpg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></description><link>https://akshatjoshi.com/georgetown-m-street/</link><guid isPermaLink="false">68d5ba3f785fc6259accc0cb</guid><category><![CDATA[2 - Misc]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Thu, 25 Sep 2025 21:55:48 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1513364776144-60967b0f800f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHBhaW50fGVufDB8fHx8MTc2MzE4MDE1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1513364776144-60967b0f800f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHBhaW50fGVufDB8fHx8MTc2MzE4MDE1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Georgetown - M street"><p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/image.jpg" class="kg-image" alt="Georgetown - M street" loading="lazy" width="2000" height="2667" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/image.jpg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/image.jpg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/image.jpg 1600w, https://akshatjoshi.com/content/images/2025/09/image.jpg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[3rd Wacker drive]]></title><description><![CDATA[<p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/IMG_4559.jpeg" class="kg-image" alt loading="lazy" width="2000" height="1125" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/IMG_4559.jpeg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/IMG_4559.jpeg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/IMG_4559.jpeg 1600w, https://akshatjoshi.com/content/images/2025/09/IMG_4559.jpeg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></description><link>https://akshatjoshi.com/3rd-wacker-drive/</link><guid isPermaLink="false">68d5b9c7785fc6259accc0c1</guid><category><![CDATA[2 - Misc]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Thu, 25 Sep 2025 21:54:06 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1658303135227-fcdfb0dab396?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIwfHxwYWludHxlbnwwfHx8fDE3NjMxODAxNTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1658303135227-fcdfb0dab396?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIwfHxwYWludHxlbnwwfHx8fDE3NjMxODAxNTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="3rd Wacker drive"><p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/IMG_4559.jpeg" class="kg-image" alt="3rd Wacker drive" loading="lazy" width="2000" height="1125" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/IMG_4559.jpeg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/IMG_4559.jpeg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/IMG_4559.jpeg 1600w, https://akshatjoshi.com/content/images/2025/09/IMG_4559.jpeg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item><item><title><![CDATA[Washington monument]]></title><description><![CDATA[<p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/IMG_4566.jpeg" class="kg-image" alt loading="lazy" width="2000" height="3556" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/IMG_4566.jpeg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/IMG_4566.jpeg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/IMG_4566.jpeg 1600w, https://akshatjoshi.com/content/images/2025/09/IMG_4566.jpeg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></description><link>https://akshatjoshi.com/washington-monument/</link><guid isPermaLink="false">68d5b97a785fc6259accc0b6</guid><category><![CDATA[2 - Misc]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Thu, 25 Sep 2025 21:52:22 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1658303135227-fcdfb0dab396?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIwfHxwYWludHxlbnwwfHx8fDE3NjMxODAxNTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1658303135227-fcdfb0dab396?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIwfHxwYWludHxlbnwwfHx8fDE3NjMxODAxNTl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Washington monument"><p></p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2025/09/IMG_4566.jpeg" class="kg-image" alt="Washington monument" loading="lazy" width="2000" height="3556" srcset="https://akshatjoshi.com/content/images/size/w600/2025/09/IMG_4566.jpeg 600w, https://akshatjoshi.com/content/images/size/w1000/2025/09/IMG_4566.jpeg 1000w, https://akshatjoshi.com/content/images/size/w1600/2025/09/IMG_4566.jpeg 1600w, https://akshatjoshi.com/content/images/2025/09/IMG_4566.jpeg 2000w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item></channel></rss>