<?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>Mon, 10 Aug 2026 16:01:28 GMT</lastBuildDate><atom:link href="https://akshatjoshi.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Your prompt needs an SBOM]]></title><description><![CDATA[<p></p><p>Ask any team running AI in production a simple question:&#xA0;<strong>what exactly did your model see?</strong></p><p>Not &quot;what was the user&apos;s question.&quot; What was the&#xA0;<em>full context</em>&#xA0;&#x2014; the retrieved chunks, the agent memory, the tool outputs, the system prompt, the ticket text</p>]]></description><link>https://akshatjoshi.com/your-prompt-needs-an-sbom/</link><guid isPermaLink="false">6a55ba817e864d04ea39031e</guid><category><![CDATA[1 - Tech]]></category><dc:creator><![CDATA[Akshat Joshi]]></dc:creator><pubDate>Tue, 14 Jul 2026 04:32:05 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1745674684468-b9fc392fda3f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGxsbXxlbnwwfHx8fDE3ODQwMDM0NDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1745674684468-b9fc392fda3f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGxsbXxlbnwwfHx8fDE3ODQwMDM0NDl8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Your prompt needs an SBOM"><p></p><p>Ask any team running AI in production a simple question:&#xA0;<strong>what exactly did your model see?</strong></p><p>Not &quot;what was the user&apos;s question.&quot; What was the&#xA0;<em>full context</em>&#xA0;&#x2014; the retrieved chunks, the agent memory, the tool outputs, the system prompt, the ticket text that got pasted in. The complete input that produced the output you&apos;re now trying to explain.</p><p>Almost nobody can answer. The context was assembled at runtime from half a dozen sources, concatenated into a string, sent to the model, and discarded. The provenance died at assembly time.</p><h2 id="weve-solved-this-problem-before">We&apos;ve solved this problem before</h2><p>Software had the same blind spot with binaries. A deployed artifact was an opaque blob of vendored dependencies until supply-chain attacks &#x2014; Heartbleed, log4shell, SolarWinds &#x2014; made &quot;what&apos;s inside this thing?&quot; a question with regulatory force behind it. The answer was the&#xA0;<strong>SBOM</strong>: a machine-readable bill of materials for every build. Boring, structured, and now mandated in US federal procurement.</p><p>AI context is today where dependencies were in 2010. Every prompt is a build artifact assembled from unvetted inputs, and there is no manifest.</p><p>Consider what flows into a single agent&apos;s context window: RAG chunks from a vector store, conversation memory, MCP tool responses, file contents, other agents&apos; outputs. Each has different ownership, sensitivity, and trustworthiness. Prompt injection via tool output is a top-ten LLM risk precisely because nobody inspects that boundary. When something goes wrong &#x2014; a leak, a hallucinated policy, an agent following instructions that arrived inside a webpage &#x2014; the investigation starts with reconstructing what the model saw, from logs that were never designed to answer that question.</p><p>And the regulatory clock is running: the EU AI Act&apos;s record-keeping obligations for high-risk systems require demonstrating what your AI processed. A concatenated string in a debug log does not demonstrate that.</p><h2 id="a-bill-of-materials-for-every-prompt">A bill of materials for every prompt</h2><p><strong>CBOM &#x2014; the Context Bill of Materials</strong>&#xA0;&#x2014; is an open spec that gives every model call a manifest: for each segment of context, its source URI, a content hash, the ordered list of transforms applied (redactions, truncations, summarizations &#x2014; each hash-chained), a sensitivity label, and optionally a signature.</p><p>One deliberate design choice does most of the work:&#xA0;<strong>manifests contain hashes and metadata, never content.</strong>&#xA0;A CBOM manifest can&apos;t leak what it describes. That&apos;s what makes it safe to log every call, retain for years, and hand to an auditor &#x2014; even when the context itself was full of PII.</p><p>The reference SDK is three lines around your existing code:<br></p><pre><code>import contextbom as cbom

ctx = cbom.Context()
ticket = ctx.add(fetch_ticket(id), source=&quot;https://jira.co/T-42&quot;,
                 sensitivity=&quot;pii&quot;, transforms=[cbom.redact_pii])
# ...build your prompt, call your model as usual...
ctx.manifest.to_json(&quot;call.cbom.json&quot;)
</code></pre><p>And&#xA0;<code>cbom view</code>&#xA0;renders any logged call as a color-coded breakdown &#x2014; which segment came from where, what was redacted, whether the hash chain verifies.</p><p></p><h2 id="what-cbom-is-not">What CBOM is not</h2><p>It&apos;s not a gateway, a proxy, an agent framework, or a hosted service. There&apos;s nothing to deploy. It&apos;s a JSON format plus a small library &#x2014; deliberately, because the goal isn&apos;t to be another tool in the stack. It&apos;s to be the format the existing stack emits.</p><p>Gateways, memory layers, RAG frameworks, and MCP middleware all touch context assembly, and some already produce their own ad-hoc audit records. Each has its own format, which means none of them compose. That&apos;s the moment a neutral spec is useful &#x2014; the same moment logging libraries converged on OpenTelemetry.</p><p>The spec (v0.1, deliberately tiny, breaking changes welcome) and reference implementation are here:&#xA0;<strong>github.com/contextbom/contextbom</strong>. If you build anything that assembles LLM context, the RFC thread is open &#x2014; I&apos;d like to know what would make emitting CBOM trivial for you.</p><p>Every token that enters a model should have a verifiable origin. That shouldn&apos;t be a feature. It should be a default.</p><figure class="kg-card kg-image-card"><img src="https://akshatjoshi.com/content/images/2026/07/demo.gif" class="kg-image" alt="Your prompt needs an SBOM" loading="lazy" width="1100" height="620" srcset="https://akshatjoshi.com/content/images/size/w600/2026/07/demo.gif 600w, https://akshatjoshi.com/content/images/size/w1000/2026/07/demo.gif 1000w, https://akshatjoshi.com/content/images/2026/07/demo.gif 1100w" sizes="(min-width: 720px) 720px"></figure><p>La elecci&#xF3;n de <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">camisetas de f&#xFA;tbol para el d&#xED;a de partido</a> mejora al comparar la talla, el material y el uso previsto. Antes de pagar, es &#xFA;til verificar las instrucciones de cuidado y cualquier l&#xED;mite aplicable a la personalizaci&#xF3;n.</p>]]></content:encoded></item><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/2026/03/table3.png 2000w" 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/2026/03/table1.png 2000w" 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/2026/03/table2.png 2000w" 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>The fit of the chest can affect how the shirt feels and looks. A shirt with a printed inner neck label can be softer against the skin. The phrase <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">football shirts for casual outfits</a> can frame a useful section on everyday wear, matchday use and collecting without making unsupported claims. The fit of the back should allow for easy movement.</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>A shirt with a relaxed fit is often easier to put on and take off. A shirt with a durable fabric is a good investment for frequent use. Information about <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">Tottenham Hotspur football shirts</a> is easier to compare when version differences and practical trade-offs are presented as separate decision points. A shirt with a comfortable fabric is a wise investment.</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>]]></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>]]></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><p>Una comparaci&#xF3;n &#xFA;til de <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">camisetas de f&#xFA;tbol para regalo</a> comienza por la posibilidad de a&#xF1;adir nombre o dorsal. Tambi&#xE9;n ayuda revisar que la ficha incluya una gu&#xED;a de tallas clara antes de completar el pedido.</p><blockquote>After we sleep,</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><p>Una comparaci&#xF3;n &#xFA;til de <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">camisetas de f&#xFA;tbol para regalo</a> comienza por la posibilidad de a&#xF1;adir nombre o dorsal. Tambi&#xE9;n ayuda revisar que la ficha incluya una gu&#xED;a de tallas clara antes de completar el pedido.</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><p>Para valorar <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">c&#xF3;mo elegir una camiseta de portero</a> con criterios claros, es recomendable revisar el tejido, la ventilaci&#xF3;n y los refuerzos disponibles. Como comprobaci&#xF3;n final, conviene asegurarse de la gu&#xED;a de tallas y el espacio previsto para capas.</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><p>A shirt intended for framing or display may not need the same size accuracy as one for wearing. Care advice should avoid universal claims when labels and print methods can differ. A page focused on <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">Napoli football shirt</a> can answer</p>]]></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><p>A shirt intended for framing or display may not need the same size accuracy as one for wearing. Care advice should avoid universal claims when labels and print methods can differ. A page focused on <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">Napoli football shirt</a> can answer practical questions about fit, design and intended use in a compact, readable format. The feel of the fabric can make a shirt feel premium.</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><p>Regular fit shirts generally allow easier layering, whereas slim fit shirts provide a more athletic silhouette. A shirt with a classic sponsor logo can remind fans of a particular era in the club&apos;s history. Information about <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">Barcelona football shirts</a> is easier to compare when measurement checks and size-chart</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><p>Regular fit shirts generally allow easier layering, whereas slim fit shirts provide a more athletic silhouette. A shirt with a classic sponsor logo can remind fans of a particular era in the club&apos;s history. Information about <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">Barcelona football shirts</a> is easier to compare when measurement checks and size-chart reading are presented as separate decision points. The fabric&apos;s ability to dry quickly is a great feature.</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><p>Para valorar <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">camisetas hist&#xF3;ricas de f&#xFA;tbol</a> con criterios claros, es recomendable revisar el tipo de tejido y el corte propio de la &#xE9;poca. Antes de pagar, es &#xFA;til verificar el estado indicado y la claridad de las fotograf&#xED;as.</p>]]></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><p>Para valorar <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">camisetas hist&#xF3;ricas de f&#xFA;tbol</a> con criterios claros, es recomendable revisar el tipo de tejido y el corte propio de la &#xE9;poca. Antes de pagar, es &#xFA;til verificar el estado indicado y la claridad de las fotograf&#xED;as.</p>]]></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><p>A shirt with a durable print will look better for longer. The design of the back can be a feature in itself. Research into <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">Chelsea retro football shirt</a> becomes more useful when the content addresses measurement checks and size-chart reading with specific, checkable details. The fit of the shoulder is</p>]]></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><img src="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" alt="Calm river - pen"><p>A shirt with a durable print will look better for longer. The design of the back can be a feature in itself. Research into <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">Chelsea retro football shirt</a> becomes more useful when the content addresses measurement checks and size-chart reading with specific, checkable details. The fit of the shoulder is important for overall comfort.</p>]]></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><p>Una comparaci&#xF3;n &#xFA;til de <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">camiseta de portero de f&#xFA;tbol</a> comienza por el corte de las mangas y la libertad de movimiento. Las fotograf&#xED;as y la ficha del producto deber&#xED;an confirmar que las fotograf&#xED;as muestren mangas, pu&#xF1;os y</p>]]></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><p>Una comparaci&#xF3;n &#xFA;til de <a href="https://www.camisetatienda.com/?ref=akshatjoshi.com">camiseta de portero de f&#xFA;tbol</a> comienza por el corte de las mangas y la libertad de movimiento. Las fotograf&#xED;as y la ficha del producto deber&#xED;an confirmar que las fotograf&#xED;as muestren mangas, pu&#xF1;os y parte trasera.</p>]]></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></channel></rss>