1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="icon" href="/favicon.svg" type="image/svg+xml"/><link rel="mask-icon" href="/favicon.svg" color="#AD3BFF"/><meta property="og:image" content="https://earthstar-project.org/og_image.png"/><meta property="og:description" content="Storage for private, distributed, offline-first applications. Earthstar is a specification and JavaScript library for building connected applications owned and run by their users."/><title>Earthstar</title><meta name="description" content="Storage for private, distributed, offline-first applications. Earthstar is a specification and JavaScript library for building connected applications owned and run by their users."/><meta property="og:description" content="Storage for private, distributed, offline-first applications. Earthstar is a specification and JavaScript library for building connected applications owned and run by their users."/><link rel="stylesheet" href="/build/_assets/global-B5QCRHOU.css"/><link rel="stylesheet" href="/build/_assets/index-6GEQMO3A.css"/></head><body class="grid grid-cols-standard lg:grid-cols-large bg-gray-50"><div class="p-2 text-center bg-yellow-100 lg:col-span-2">Earthstar has a new<!-- --> <a class="underline text-blue-500" href="https://willowprotocol.org/earthstar/spec/">specification</a> <!-- -->powered by <a class="underline text-blue-500" href="https://willowprotocol.org">Willow</a>. <br/><a class="underline text-blue-500" href="https://jsr.io/@earthstar/earthstar/versions">Earthstar v11 is now in beta</a>.</div><div class="hidden lg:block overflow-auto self-start sticky top-0"><h1 class="text-3xl text-display pl-2 md:pl-4 mt-4 mb-2 "><a href="/"><span class="inline-block text-es-purple">Earthstar</span></a></h1><nav class="pl-2 md pl-4"><ul><li class="underline"><a class="text-es-blue visited:text-purple-900" href="/docs/what-is-it">What is it?</a></li><li class="underline"><a class="text-es-blue visited:text-purple-900" href="/docs/how-it-works">How does it work?</a></li><li class="underline"><a class="text-es-blue visited:text-purple-900" href="/docs/future">What's next?</a></li><li class="underline"><a class="text-es-blue visited:text-purple-900" href="/docs/comparisons">Comparisons</a></li><li class="my-3"><span class="font-bold text-gray-700">Tutorials</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 " href="/tutorials/create-a-chat-app">Create a chat app</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/tutorials/run-a-server">Run a server</a></li></ul></li><li class="my-3"><span class="font-bold text-gray-700">JavaScript module</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 " href="/docs/quick-look">Quick look</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/docs/developer-guide">User guide</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/docs/server-guide">Server guide</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/docs/scripting">Writing scripts</a></li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://doc.deno.land/https://deno.land/x/[email protected]/src/entries/universal.ts" target="_blank">Universal APIs</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://doc.deno.land/https://deno.land/x/[email protected]/src/entries/browser.ts" target="_blank">Browser APIs</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://doc.deno.land/https://deno.land/x/[email protected]/src/entries/deno.ts" target="_blank">Deno APIs</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://doc.deno.land/https://deno.land/x/[email protected]/src/entries/node.ts" target="_blank">Node APIs</a> <!-- -->â</li></ul></li><li class="my-3"><span class="font-bold text-gray-700">Specifications</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 " href="/specs/data-s
1pec-es5">es.5 Data Format</a></li></ul></li><li class="my-3"><span class="font-bold text-gray-700">Community</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/application-formats">Application formats</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/contribute">Contribute code</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/donate">Donate</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/code-of-conduct">Code of Conduct</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/our-backers">Our backers</a></li></ul></li><li class="my-3"><span class="font-bold text-gray-700">Links</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://github.com/earthstar-project/earthstar" target="_blank">Github</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://discord.gg/EFJnuyKbTv" target="_blank">Discord</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://opencollective.com/earthstar" target="_blank">Open Collective</a> <!-- -->â</li></ul></li></ul></nav></div><details class="lg:hidden shadow sticky top-0 bg-white"><summary class="text-sm flex items-baseline px-2 md:px-4 pt-1 pb-2 text-gray-600">Navigate<h1 class="text-2xl text-display text-right flex-grow"><a href="/"><span class="inline-block text-es-purple">Earthstar</span></a></h1></summary><nav class="bg-purple-50 px-2 md:px-4 py-1"><ul><li class="underline"><a class="text-es-blue visited:text-purple-900" href="/docs/what-is-it">What is it?</a></li><li class="underline"><a class="text-es-blue visited:text-purple-900" href="/docs/how-it-works">How does it work?</a></li><li class="underline"><a class="text-es-blue visited:text-purple-900" href="/docs/future">What's next?</a></li><li class="underline"><a class="text-es-blue visited:text-purple-900" href="/docs/comparisons">Comparisons</a></li><li class="my-3"><span class="font-bold text-gray-700">Tutorials</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 " href="/tutorials/create-a-chat-app">Create a chat app</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/tutorials/run-a-server">Run a server</a></li></ul></li><li class="my-3"><span class="font-bold text-gray-700">JavaScript module</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 " href="/docs/quick-look">Quick look</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/docs/developer-guide">User guide</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/docs/server-guide">Server guide</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/docs/scripting">Writing scripts</a></li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://doc.deno.land/https://deno.land/x/[email protected]/src/entries/universal.ts" target="_blank">Universal APIs</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://doc.deno.land/https://deno.land/x/[email protected]/src/entries/browser.ts" target="_blank">Browser APIs</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://doc.deno.land/https://deno.land/x/[email protected]/src/entries/deno.ts" target="_blank">Deno APIs</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://doc.deno.land/https://deno.land/x/[email protected]/src/entries/node.ts" target="_blank">Node APIs</a> <!-- -->â</li></ul></li><li class="my-3"><span class="font-bold text-gray-700">Specifications</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 " href="/specs/data-spec-es5">es.5 Data Format</a></li></ul></li><li class="my-3"><span class="font-bold text-gray-700">Community</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/application-formats">Application formats</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/contribute">Contribute code</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/donate">Donate</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/code-of-conduct">Code of Conduct</a></li><li><a class="text-es-blue underline visited:text-purple-800 " href="/community/our-backers">Our backers</a></li></ul></li><li class="my-3"><span class="font-bold text-gray-700">Links</span><ul class="pl-2"><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://github.com/earthstar-project/earthstar" target="_blank">Github</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://discord.gg/EFJnuyKbTv" target="_blank">Discord</a> <!-- -->â</li><li><a class="text-es-blue underline visited:text-purple-800 inline-block" href="https://opencollective.com/earthstar" target="_blank">Open Collective</a> <!-- -->â</li></ul></li></ul></nav></details><div class="px-2 py-1 md:px-4 md:py-2 overflow-auto lg:w-full lg:m-0 transition-opacity"><div><div class="gap-2 flex flex-col items-start my-2"><p class="text-2xl md:text-4xl max-w-prose font-display">A database for private, distributed, offline-first applications.</p><p class="text-gray-700">Earthstar is a specification and JavaScript library for building connected applications owned and run by their users.</p><div class="flex items-stretch md:items-baseline flex-col md:flex-row space-y-2 self-stretch"><a class="text-es-purple border-es-purple border-2 rounded-md p-2 text-md mr-2 text-center " href="/docs/what-is-it">Learn more</a><a class="border-es-blue text-es-blue border-2 rounded-md p-2 text-md mr-2 text-center " href="/docs/quick-look">Check out the JavaScript API</a><a class="border-es-green text-es-green border-2 rounded-md p-2 text-md mr-2 text-center " href="/specs/data-s
1pec-es5">Read the spec</a><a class="border-es-yellow text-es-yellow border-2 rounded-md p-2 text-md mr-2 text-center " href="/tutorials/create-a-chat-app">Create a chat app</a></div><img class="mt-4 lg:max-w-2xl md:max-w-3xl " src="/splash.png"/></div><ul class="pl-0 text-lg lg:text-xl max-w-prose mb-2"><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Works offline.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Store music, photos, video.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Actually delete stuff.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Temporary documents.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Live syncing.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Use one or many identities.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Sneakernets.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Always self-hosted.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Servers optional.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">No blockchain.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">No tokens.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Free forever, in every sense.</li></ul><ul class="pl-0 text-lg lg:text-xl max-w-prose"><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Verification with ed25519.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Works in the browser.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Grant read-only access.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Efficient sync.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Streaming sync.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">One identity across many devices.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Multiwriter.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Storage drivers.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Document write permissions.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Deno.</li><li class="inline-block even:text-gray-1000 odd:text-gray-600 mr-1 last:mr-0">Node.</li></ul><hr class="my-4 md:my-8"/><div><div class="text-gray-600"><a class="underline text-blue-500" href="https://nlnet.nl"><img class="w-24 my-2" src="/nlnet.svg"/></a><p class="text-sm max-w-prose">This project was funded through the<!-- --> <a class="underline text-blue-500" href="https://nlnet.nl/assure">NGI Assure Fund</a>, a fund established by<!-- --> <a href="https://nlnet.nl" class="text-blue-500 underline">NLnet</a> <!-- -->with financial support from the European Commission's<!-- --> <a class="underline text-blue-500" href="https://ngi.eu/">Next Generation Internet</a> <!-- -->programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 957073.</p></div></div></div></div>
1<script> 2 let STORAGE_KEY = "positions"; 3 if (!window.history.state || !window.history.state.key) { 4 window.history.replaceState({ key: Math.random().toString(32).slice(2) }, null); 5 } 6 try { 7 let positions = JSON.parse(sessionStorage.getItem(STORAGE_KEY) ?? '{}') 8 let storedY = positions[window.history.state.key]; 9 if (typeof storedY === 'number') { 10 window.scrollTo(0, storedY) 11 } 12 } catch(error) { 13 console.error(error) 14 sessionStorage.removeItem(STORAGE_KEY) 15 } 16 </script>
16<link rel="modulepreload" href="/build/_shared/chunk-OMMQ6CJA.js"/><link rel="modulepreload" href="/build/_shared/chunk-D2ZSZFE5.js"/><link rel="modulepreload" href="/build/_shared/chunk-P7NZYPKP.js"/><link rel="modulepreload" href="/build/_shared/chunk-EHISG44D.js"/><link rel="modulepreload" href="/build/root-HHREYAKL.js"/><link rel="modulepreload" href="/build/routes/index-QFP2R2PM.js"/>
16<script>window.__remixContext = {'matches':[{'params':{},'pathname':'/','route':{'id':'root','path':'','module':'/build/root-HHREYAKL.js','imports':['/build/_shared/chunk-EHISG44D.js'],'hasAction':false,'hasLoader':false,'hasCatchBoundary':true,'hasErrorBoundary':true}},{'params':{},'pathname':'/','route':{'id':'routes/index','parentId':'root','index':true,'module':'/build/routes/index-QFP2R2PM.js','hasAction':false,'hasLoader':false,'hasCatchBoundary':false,'hasErrorBoundary':false}}],'componentDidCatchEmulator':{'trackBoundaries':true,'trackCatchBoundaries':true,'catchBoundaryRouteId':'root','renderBoundaryRouteId':null,'loaderBoundaryRouteId':'root','error':undefined,'catch':undefined},'routeData':{'root':null,'routes/index':null},'actionData':undefined};</script>
16<script src="/build/manifest-2A2C810F.js"></script>
16<script type="module">import * as route0 from "/build/root-HHREYAKL.js"; 17import * as route1 from "/build/routes/index-QFP2R2PM.js"; 18window.__remixRouteModules = {"root":route0,"routes/index":route1};</script>
18<script src="/build/entry.client-FJMNJJ65.js" type="module"></script>
18</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.