1<!DOCTYPE html> 2<html lang="en-US" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <title>Unhosted Architecture | remoteStorage</title> 7 <meta name="description" content="An open protocol for per-user storage on the Web"> 8 <meta name="generator" content="VitePress v1.6.3"> 9 <link rel="preload stylesheet" href="/assets/style.D0Ko_m8F.css" as="style"> 10 <link rel="preload stylesheet" href="/vp-icons.css" as="style"> 11 12
12<script type="module" src="/assets/app.8YaI-AOJ.js"></script>
12 13 <link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin=""> 14 <link rel="modulepreload" href="/assets/chunks/theme.DK_kTJeb.js"> 15 <link rel="modulepreload" href="/assets/chunks/framework.Ds6Eueu6.js"> 16 <link rel="modulepreload" href="/assets/unhosted.md.7RF7PEyi.lean.js"> 17
17<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
17 18
18<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
18 19 </head> 20 <body> 21 <div id="app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-fcbfc0e0></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-fcbfc0e0>Skip to content</a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle has-sidebar" data-v-9fd4d1dd data-v-9f43907a><a class="title" href="/" data-v-9f43907a><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.svg" alt data-v-ab19afbb><!--]--><span data-v-9f43907a>remoteStorage</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Home</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/get.html" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Getting started</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/rs.js/docs.html" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>remoteStorage.js</span><!--]--></a><!--]--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://community.remotestorage.io" target="_blank" rel="noreferrer" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Forums</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9fd4d1dd data-v-3f90c1a5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-3f90c1a5 data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/remotestorage" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><a class="VPSocialLink no-icon" href="https://kosmos.social/@remotestorage" aria-label="mastodon" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-mastodon"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-bfe7971f><span class="vpi-more-horizontal icon" data-v-bfe7971f></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><!----><!--[--><!--[--><!----><div class="group" data-v-f953d92f><div class="item appearance" data-v-f953d92f><p class="label" data-v-f953d92f>Appearance</p><div class="appearance-action" data-v-f953d92f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f953d92f data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/remotestorage" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><a class="VPSocialLink no-icon" href="https://kosmos.social/@remotestorage" aria-label="mastodon" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-mastodon"></span></a>
21<!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d8b57b2d data-v-2488c25a><div class="container" data-v-2488c25a><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2488c25a><span class="vpi-align-left menu-icon" data-v-2488c25a></span><span class="menu-text" data-v-2488c25a>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2488c25a data-v-6b867909><button data-v-6b867909>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-d8b57b2d data-v-42c4c606><div class="curtain" data-v-42c4c606></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-42c4c606><span class="visually-hidden" id="sidebar-aria-label" data-v-42c4c606> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0 has-active" data-v-51288d80 data-v-0009425e><!----><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/get.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Getting started</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-1 has-active" data-v-0009425e data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h3 class="text" data-v-0009425e>How it works</h3><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-2 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/unhosted.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Unhosted Web Apps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/protocol.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Protocol</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/apps.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Apps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/servers.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Servers</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/contribute.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Contribute</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/design.html" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Design</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPDoc has-sidebar has-aside" data-v-9a6c75ad data-v-e6f2a212><!--[--><!--]--><div class="container" data-v-e6f2a212><div class="aside" data-v-e6f2a212><div class="aside-curtain" data-v-e6f2a212></div><div class="aside-container" data-v-e6f2a212><div class="aside-content" data-v-e6f2a212><div class="VPDocAside" data-v-e6f2a212 data-v-cb998dce><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-cb998dce data-v-f610f197><div class="content" data-v-f610f197><div class="outline-marker" data-v-f610f197></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-f610f197>On this page</div><ul class="VPDocOutlineItem root" data-v-f610f197 data-v-53c99d69><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-cb998dce></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e6f2a212><div class="content-container" data-v-e6f2a212><!--[--><!--]--><main class="main" data-v-e6f2a212><div style="position:relative;" class="vp-doc _unhosted external-link-icon-enabled" data-v-e6f2a212><div>
21<h1 id="unhosted-architecture" tabindex="-1">Unhosted Architecture <a class="header-anchor" href="#unhosted-architecture" aria-label="Permalink to "Unhosted Architecture"">â</a></h1><p>remoteStorage is the first open protocol to enable truly <a href="https://unhosted.org" target="_blank" rel="noreferrer">unhosted</a> web apps. That means users are in full control of their precious data and where it is stored, while app developers are freed of the burden of hosting, maintaining and protecting a central database.</p><h2 id="traditional-web-apps" tabindex="-1">Traditional Web Apps <a class="header-anchor" href="#traditional-web-apps" aria-label="Permalink to "Traditional Web Apps"">â</a></h2><p>In hosted web stacks such as LAMP, .Net, Ruby on Rails, Django, etcâ¦, the developer hosts the app and data, while the user controls device.</p><div aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" height="160" viewBox="0 0 439 273" font-family="sans-serif" font-size="32" text-anchor="middle" stroke-width="3"> 22 <g fill="#f37943" stroke="#7a3c21"> 23 <rect width="100" height="100" x="60" y="20" rx="10"/> 24 <path d="M370 23h1l5 5 1 9v78c0 5-22 10-50 10s-50-5-50-10V37l1-8v-1l5-5 9-1h70z"/> 25 <ellipse cx="327" cy="27.5" rx="50" ry="10.5"/> 26 </g> 27 <rect width="374.5" height="62.5" x="34" y="188.5" fill="#87c1f7" stroke="#43617c" rx="10"/> 28 <g fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round"> 29 <path d="M188 73h61m-62 0 12-12m-12 12 12 12m51-12-12-12m1 24 11-12"/> 30 <path d="M109 175v-38m0 39-12-12m12 12 12-12m-12-29-12 12m24 0-12-12"/> 31 </g> 32 <text x="110" y="81">App</text> 33 <text x="326" y="86">Data</text> 34 <text x="221.3" y="230.5">Browser</text> 35 <style> 36 .dark g[stroke="#000"] { stroke: #fff } 37 </style> 38</svg></div><h2 id="no-backend-web-apps" tabindex="-1"><a href="https://nobackend.org" target="_blank" rel="noreferrer">No-Backend</a> Web Apps <a class="header-anchor" href="#no-backend-web-apps" aria-label="Permalink to "[No-Backend](https://nobackend.org) Web Apps"">â</a></h2><p>In 100% client-side apps that use CouchDB, Hoodie, Firebase, Parse, Kinto, etcâ¦, the developer provides the app and data, while user controls the device.</p><div aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" height="160" viewBox="0 0 439 273" font-family="sans-serif" font-size="32" text-anchor="middle" stroke-width="3"> 39 <g fill="#f37943" stroke="#7a3c21"> 40 <rect width="100" height="100" x="60" y="20" rx="10"/> 41 <path d="M370 23h1l5 5 1 9v78c0 5-22 10-50 10s-50-5-50-10V37l1-8v-1l5-5 9-1h70z"/> 42 <ellipse cx="327" cy="27.5" rx="50" ry="10.5"/> 43 </g> 44 <rect width="374.5" height="62.5" x="34" y="188.5" fill="#87c1f7" stroke="#43617c" rx="10"/> 45 <g fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round"> 46 <path d="M109 175v-38m0 39-12-12m12 12 12-12"/> 47 <path d="M325 175v-38m0 39-12-12m12 12 12-12m-12-29-12 12m24 0-12-12"/> 48 </g> 49 <text x="110" y="81">App</text> 50 <text x="326" y="86">Data</text> 51 <text x="221.3" y="230.5">Browser</text> 52 <style> 53 .dark g[stroke="#000"] { stroke: #fff } 54 </style> 55</svg></div><h2 id="unhosted-web-apps" tabindex="-1"><a href="https://unhosted.org" target="_blank" rel="noreferrer">Unhosted</a> Web Apps <a class="header-anchor" href="#unhosted-web-apps" aria-label="Permalink to "[Unhosted](https://unhosted.org) Web Apps"">â</a></h2><p>In 100% client-side apps that use remoteStorage, Google Drive, Dropbox, etcâ¦, the developer provides only the app, while the user controls the device and data.</p><div aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" height="160" viewBox="0 0 439 273" font-family="sans-serif" font-size="32" text-anchor="middle" stroke-width="3"> 56 <rect width="100" height="100" x="60" y="20" rx="10" fill="#f37943" stroke="#7a3c21"/> 57 <g fill="#87c1f7" stroke="#43617c"> 58 <path d="M370 23h1l5 5 1 9v78c0 5-22 10-50 10s-50-5-50-10V37l1-8v-1l5-5 9-1h70z"/> 59 <ellipse cx="327" cy="27.5" rx="50" ry="10.5"/> 60 <rect width="374.5" height="62.5" x="34" y="188.5" rx="10"/> 61 </g> 62 <g fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round"> 63 <path d="M109 175v-38m0 39-12-12m12 12 12-12"/> 64 <path d="M325 175v-38m0 39-12-12m12 12 12-12m-12-29-12 12m24 0-12-12"/> 65 </g> 66 <text x="110" y="81">App</text> 67 <text x="326" y="86">Data</text> 68 <text x="221.3" y="230.5">Browser</text> 69 <style> 70 .dark g[stroke="#000"] { stroke: #fff } 71 </style> 72</svg></div></div></div></main><footer class="VPDocFooter" data-v-e6f2a212 data-v-1bcd8184><!--[--><!--]--><div class="edit-info" data-v-1bcd8184><div class="edit-link" data-v-1bcd8184><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/remotestorage/website/edit/master/unhosted.md" target="_blank" rel="noreferrer" data-v-1bcd8184><!--[--><span class="vpi-square-pen edit-link-icon" data-v-1bcd8184></span> Edit this page<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-1bcd8184><span class="visually-hidden" id="doc-footer-aria-label" data-v-1bcd8184>Pager</span><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link prev" href="/get.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>Previous page</span><span class="title" data-v-1bcd8184>Getting started</span><!--]--></a></div><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link next" href="/protocol.html" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>Next page</span><span class="title" data-v-1bcd8184>Protocol</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div> 73
73<script>window.__VP_HASH_MAP__=JSON.parse("{\"apps.md\":\"DZx48GK9\",\"contribute.md\":\"BzhuTkjF\",\"design.md\":\"VWOVeUgQ\",\"get.md\":\"C2HcPjZP\",\"index.md\":\"DKr3vq4J\",\"protocol.md\":\"Sdv0-2aZ\",\"readme.md\":\"eRFaBej7\",\"rs.js.index.md\":\"B5D2tWm9\",\"rs.js_docs_api_access_classes_access.md\":\"DIOGarPE\",\"rs.js_docs_api_access_index.md\":\"DdDgMjUy\",\"rs.js_docs_api_baseclient_classes_baseclient.md\":\"DruhOvs2\",\"rs.js_docs_api_baseclient_index.md\":\"Ba3BVMFG\",\"rs.js_docs_api_caching_classes_caching.md\":\"C6Lxw3vE\",\"rs.js_docs_api_caching_index.md\":\"BHfviZ7-\",\"rs.js_docs_api_eventhandling_index.md\":\"C6XWe-8T\",\"rs.js_docs_api_eventhandling_type-aliases_eventhandler.md\":\"CUgRVrST\",\"rs.js_docs_api_modules.md\":\"D9eq2WvY\",\"rs.js_docs_api_remote_classes_remotebase.md\":\"DmE6CaZ-\",\"rs.js_docs_api_remote_index.md\":\"BStquoRW\",\"rs.js_docs_api_remote_interfaces_remote.md\":\"DqwpA4EA\",\"rs.js_docs_api_remotestorage_classes_remotestorage.md\":\"ByE8Jrko\",\"rs.js_docs_api_remotestorage_index.md\":\"j5Yew2m-\",\"rs.js_docs_api_remotestorage_interfaces_rsmodule.md\":\"DvUkDjyl\",\"rs.js_docs_contributing_building.md\":\"BDA4qHWp\",\"rs.js_docs_contributing_docs.md\":\"DW80CAAo\",\"rs.js_docs_contributing_github-flow.md\":\"BD_6vvpr\",\"rs.js_docs_contributing_index.md\":\"C_-dUg5M\",\"rs.js_docs_contributing_internals_cache-data-format.md\":\"Lz-K0xh1\",\"rs.js_docs_contributing_internals_caching.md\":\"BQpjGa2g\",\"rs.js_docs_contributing_internals_code-overview.md\":\"CPDkBeJZ\",\"rs.js_docs_contributing_internals_discovery-bootstrap.md\":\"LoAtMYUx\",\"rs.js_docs_contributing_internals_index.md\":\"EG-9a3da\",\"rs.js_docs_contributing_release-checklist.md\":\"BN5_L72I\",\"rs.js_docs_contributing_testing.md\":\"BbuWy9rv\",\"rs.js_docs_cordova.md\":\"B1ej1QDb\",\"rs.js_docs_data-modules_defining-a-module.md\":\"DRSq7iTn\",\"rs.js_docs_data-modules_defining-data-types.md\":\"CTHbPcjB\",\"rs.js_docs_data-modules_index.md\":\"DAROcoJH\",\"rs.js_docs_data-modules_publishing-and-finding-modules.md\":\"CTYzbOtp\",\"rs.js_docs_dropbox-and-google-drive.md\":\"DqXGOam7\",\"rs.js_docs_getting-started_connect-widget.md\":\"DQVTsWsj\",\"rs.js_docs_getting-started_events.md\":\"BbUOdevR\",\"rs.js_docs_getting-started_how-to-add.md\":\"DawhzfCc\",\"rs.js_docs_getting-started_index.md\":\"CwTQbKAe\",\"rs.js_docs_getting-started_initialize-and-configure.md\":\"B3TIhswO\",\"rs.js_docs_getting-started_loading-data.md\":\"C9qgS3G8\",\"rs.js_docs_getting-started_read-and-write-data.md\":\"D4aFuBqy\",\"rs.js_docs_getting-started_share-public-data.md\":\"DMksQ03F\",\"rs.js_docs_index.md\":\"DVFigzDZ\",\"rs.js_docs_nodejs.md\":\"hxizTXMf\",\"rs.js_docs_typescript.md\":\"DIQ8N-B3\",\"rs.js_docs_why.md\":\"kYiKjnOQ\",\"servers.md\":\"Ba4lvqDl\",\"unhosted.md\":\"7RF7PEyi\"}");function deserializeFunctions(r){return Array.isArray(r)?r.map(deserializeFunctions):typeof r=="object"&&r!==null?Object.keys(r).reduce((t,n)=>(t[n]=deserializeFunctions(r[n]),t),{}):typeof r=="string"&&r.startsWith("_vp-fn_")?new Function(`return ${r.slice(7)}`)():r};window.__VP_SITE_DATA__=deserializeFunctions(JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"remoteStorage\",\"description\":\"An open protocol for per-user storage on the Web\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.svg\",\"externalLinkIcon\":true,\"outline\":{\"level\":[2,3]},\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Getting started\",\"link\":\"/get\"},{\"text\":\"remoteStorage.js\",\"link\":\"/rs.js/docs\"},{\"text\":\"Forums\",\"link\":\"https://community.remotestorage.io\"}],\"sidebar\":{\"/\":[{\"items\":[{\"text\":\"Getting started\",\"link\":\"/get\"},{\"text\":\"How it works\",\"items\":[{\"text\":\"Unhosted Web Apps\",\"link\":\"/unhosted\"},{\"text\":\"Protocol\",\"link\":\"/protocol\"}]},{\"text\":\"Apps\",\"link\":\"/apps\"},{\"text\":\"Servers\",\"link\":\"/servers\"},{\"text\":\"Contribute\",\"link\":\"/contribute\"},{\"text\":\"Design\",\"link\":\"/design\"}]}],\"/rs.js/\":[{\"text\":\"remoteStorage.js\",\"link\":\"/rs.js/docs/\",\"items\":[]},{\"text\":\"Guide\",\"items\":[{\"text\":\"Why use this?\",\"link\":\"/rs.js/docs/why\"},{\"text\":\"Getting started\",\"link\":\"/rs.js/docs/getting-started/\",\"collapsed\":true,\"items\":[{\"text\":\"Adding rs.js to an app\",\"link\":\"/rs.js/docs/getting-started/how-to-add\"},{\"text\":\"Initialization & configuration\",\"link\":\"/rs.js/docs/getting-started/initialize-and-configure\"},{\"text\":\"Connecting a storage\",\"link\":\"/rs.js/docs/getting-started/connect-widget\"},{\"text\":\"Handling events\",\"link\":\"/rs.js/docs/getting-started/events\"},{\"text\":\"Reading and writing data\",\"link\":\"/rs.js/docs/getting-started/read-and-write-data\"},{\"text\":\"Loading data on launch\",\"link\":\"/rs.js/docs/getting-started/loading-data\"},{\"text\":\"Sharing data with others\",\"link\":\"/rs.js/docs/getting-started/share-public-data\"}]},{\"text\":\"Data modules\",\"link\":\"/rs.js/docs/data-modules/\",\"collapsed\":true,\"items\":[{\"text\":\"Defining a module\",\"link\":\"/rs.js/docs/data-modules/defining-a-module\"},{\"text\":\"Defining data types\",\"link\":\"/rs.js/docs/data-modules/defining-data-types\"},{\"text\":\"Publishing and finding modules\",\"link\":\"/rs.js/docs/data-modules/publishing-and-finding-modules\"}]},{\"text\":\"Usage with Node.js\",\"link\":\"/rs.js/docs/nodejs\"},{\"text\":\"Usage in Cordova apps\",\"link\":\"/rs.js/docs/cordova\"},{\"text\":\"Usage with TypeScript\",\"link\":\"/rs.js/docs/typescript\"},{\"text\":\"Dropbox and Google Drive\",\"link\":\"/rs.js/docs/dropbox-and-google-drive\"}]},{\"text\":\"JavaScript API\",\"items\":[{\"text\":\"RemoteStorage\",\"link\":\"/rs.js/docs/api/remotestorage/classe
73s/RemoteStorage\"},{\"text\":\"BaseClient\",\"link\":\"/rs.js/docs/api/baseclient/classes/BaseClient\"},{\"text\":\"Access\",\"link\":\"/rs.js/docs/api/access/classes/Access\"},{\"text\":\"Caching\",\"link\":\"/rs.js/docs/api/caching/classes/Caching\"}]},{\"text\":\"Contributing\",\"link\":\"/rs.js/docs/contributing/\",\"collapsed\":true,\"items\":[{\"text\":\"Building\",\"link\":\"/rs.js/docs/contributing/building\"},{\"text\":\"Testing\",\"link\":\"/rs.js/docs/contributing/testing\"},{\"text\":\"Documentation\",\"link\":\"/rs.js/docs/contributing/docs\"},{\"text\":\"GitHub workflow\",\"link\":\"/rs.js/docs/contributing/github-flow\"},{\"text\":\"Release checklist\",\"link\":\"/rs.js/docs/contributing/release-checklist\"},{\"text\":\"Library internals\",\"link\":\"/rs.js/docs/contributing/internals/\",\"collapsed\":true,\"items\":[{\"text\":\"Code overview\",\"link\":\"/rs.js/docs/contributing/internals/code-overview\"},{\"text\":\"Discovery bootstrap\",\"link\":\"/rs.js/docs/contributing/internals/discovery-bootstrap\"},{\"text\":\"Caching\",\"link\":\"/rs.js/docs/contributing/internals/caching\"},{\"text\":\"Data format of the local cache\",\"link\":\"/rs.js/docs/contributing/internals/cache-data-format\"}]}]}]},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/remotestorage\"},{\"icon\":\"mastodon\",\"link\":\"https://kosmos.social/@remotestorage\"}],\"editLink\":{\"pattern\":\"_vp-fn_({ filePath }) => {\\n if (filePath.startsWith(\\\"rs.js/\\\")) {\\n if (filePath.startsWith(\\\"rs.js/docs/api/\\\")) {\\n return \\\"/rs.js/docs/contributing/docs\\\";\\n } else {\\n return `https://github.com/remotestorage/remotestorage.js/edit/master/${filePath.slice(6)}`;\\n }\\n } else {\\n return `https://github.com/remotestorage/website/edit/master/${filePath}`;\\n }\\n }\"},\"search\":{\"provider\":\"local\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}"));</script>
73 74 75 </body> 76</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.