-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
Copy pathreplication-appwrite.html
63 lines (61 loc) · 75.9 KB
/
replication-appwrite.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-replication-appwrite" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.7.0">
<title data-rh="true">Appwrite Realtime Sync for Local-First Apps | RxDB - JavaScript Database</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://rxdb.info/img/rxdb_social_card.png"><meta data-rh="true" name="twitter:image" content="https://rxdb.info/img/rxdb_social_card.png"><meta data-rh="true" property="og:url" content="https://rxdb.info/replication-appwrite.html"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Appwrite Realtime Sync for Local-First Apps | RxDB - JavaScript Database"><meta data-rh="true" name="description" content="Leverage RxDB to enable real-time, offline-first replication with Firestore. Cut cloud costs, resolve conflicts, and speed up your app."><meta data-rh="true" property="og:description" content="Leverage RxDB to enable real-time, offline-first replication with Firestore. Cut cloud costs, resolve conflicts, and speed up your app."><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://rxdb.info/replication-appwrite.html"><link data-rh="true" rel="alternate" href="https://rxdb.info/replication-appwrite.html" hreflang="en"><link data-rh="true" rel="alternate" href="https://rxdb.info/replication-appwrite.html" hreflang="x-default"><link rel="preconnect" href="https://www.google-analytics.com">
<link rel="preconnect" href="https://www.googletagmanager.com">
<script async src="https://www.googletagmanager.com/gtag/js?id=G-62D63SY3S0"></script>
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-62D63SY3S0",{})</script>
<link rel="preconnect" href="https://www.googletagmanager.com">
<script>window.dataLayer=window.dataLayer||[]</script>
<script>!function(e,t,a,n){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id=GTM-PL63TR5",g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer")</script><link rel="stylesheet" href="/assets/css/styles.f6b86e97.css">
<script src="/assets/js/runtime~main.58f0d4e6.js" defer="defer"></script>
<script src="/assets/js/main.f05cac64.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PL63TR5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"dark")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/files/logo/logo.svg" alt="RxDB Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/files/logo/logo.svg" alt="RxDB Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">RxDB</b></a></div><div class="navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="/consulting/">Support</a><a class="navbar__item navbar__link" href="/premium/">Premium</a><a class="navbar__item navbar__link" href="/overview.html">Docs</a><div class="navbarSearchContainer_Bca1"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div style="position:fixed;display:block;z-index:10;height:1.5px;background-color:var(--color-top);top:62.5px;border-top-right-radius:2px;border-bottom-right-radius:2px;width:0%"></div><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/overview.html">Getting Started with RxDB</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/overview.html">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/quickstart.html">🚀 Quickstart</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/install.html">Installation</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/dev-mode.html">Development Mode</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/tutorials/typescript.html">TypeScript Setup</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/rx-database.html">Core Entities</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rx-database.html">RxDatabase</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rx-schema.html">RxSchema</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rx-collection.html">RxCollection</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rx-document.html">RxDocument</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/rx-query.html">RxQuery</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/rx-storage.html">💾 Storages</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/schema-validation.html">Storage Wrappers</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/replication.html">🔄 Replication</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/rx-server.html">Server</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/transactions-conflicts-revisions.html">How RxDB works</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/migration-schema.html">Advanced Features</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/rx-storage-performance.html">Performance</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/releases/16.0.0.html">Releases</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/articles/browser-database.html">Articles</a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/contribution.html">Contribute & Innovate with RxDB</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/consulting/">Contact</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" href="/replication-appwrite.html">Pre-Alpha Features</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/replication-appwrite.html">Appwrite Replication</a></li></ul></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>RxDB Appwrite Replication (Pre Alpha)</h1></header>
<p>This replication plugin allows you to synchronize documents between RxDB and an <a href="https://appwrite.io/" target="_blank" rel="noopener noreferrer">Appwrite</a> server. It supports both push and pull replication, live updates via Appwrite's real-time subscriptions, <a href="/offline-first.html">offline-capability</a> and <a href="/transactions-conflicts-revisions.html">conflict resolution</a>.</p>
<br>
<center><div style="width:260px;border-radius:16px;border-style:solid;border-width:0;border-color:black;background-color:black;overflow:hidden;cursor:pointer;box-shadow:0 6px 12px rgba(0, 0, 0, 0.25)"><div style="position:relative;width:100%;height:146px;background-image:url(http://img.youtube.com/vi/L07xPMyL8sY/0.jpg);background-size:cover;background-position:center"><div style="position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center"><svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" style="opacity:0.7;transition:opacity 0.1s ease" viewBox="0 0 24 24" stroke-width="2"><circle cx="12" cy="12" r="10" stroke="white" fill="rgba(255,20,147,0.8)"></circle><polygon points="10 8 16 12 10 16" fill="white"></polygon></svg></div><span style="position:absolute;bottom:8px;right:8px;background-color:rgba(0, 0, 0, 0.8);color:white;font-size:12px;padding:4px 6px;border-radius:4px;z-index:2">2:35</span></div><div style="padding:0px"><span style="font-size:14px;font-weight:bold;color:#333;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;background-color:white;padding:8px;padding-top:4px;height:55px">Appwrite in 100 Seconds</span></div></div></center>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-you-should-use-rxdb-with-appwrite">Why you should use RxDB with Appwrite?<a href="#why-you-should-use-rxdb-with-appwrite" class="hash-link" aria-label="Direct link to Why you should use RxDB with Appwrite?" title="Direct link to Why you should use RxDB with Appwrite?"></a></h2>
<p><strong>Appwrite</strong> is a secure, open-source backend server that simplifies backend tasks like user authentication, storage, database management, and real-time APIs.<br>
<strong>RxDB</strong> is a reactive database for the frontend that offers offline-first capabilities and rich client-side data handling.</p>
<p>Combining the two provides several benefits:</p>
<ol>
<li>
<p><a href="/offline-first.html">Offline-First</a>: RxDB keeps all data locally, so your application remains fully functional even when the network is unavailable. When connectivity returns, the RxDB ↔ Appwrite replication automatically resolves and synchronizes changes.</p>
</li>
<li>
<p><strong>Real-Time Sync</strong>: With Appwrite’s real-time subscriptions and RxDB’s live replication, you can build collaborative features that update across all clients instantaneously.</p>
</li>
<li>
<p><a href="/transactions-conflicts-revisions.html">Conflict Handling</a>: RxDB offers flexible conflict resolution strategies, making it simpler to handle concurrent edits across multiple users or devices.</p>
</li>
<li>
<p><strong>Scalable & Secure</strong>: Appwrite is built to handle production loads with granular access controls, while RxDB easily scales across various storage backends on the client side.</p>
</li>
<li>
<p><strong>Simplicity & Modularity</strong>: RxDB’s plugin-based architecture, combined with Appwrite’s Cloud offering makes it one of the easiest way to build local-first <a href="/articles/realtime-database.html">realtime apps</a> that scale.</p>
</li>
</ol>
<br>
<br>
<p align="center"><img src="./files/icons/appwrite.svg" alt="Appwrite Sync" height="60"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="preparing-the-appwrite-server">Preparing the Appwrite Server<a href="#preparing-the-appwrite-server" class="hash-link" aria-label="Direct link to Preparing the Appwrite Server" title="Direct link to Preparing the Appwrite Server"></a></h2>
<p>You can either use the appwrite cloud or <a href="https://appwrite.io/docs/advanced/self-hosting" target="_blank" rel="noopener noreferrer">self-host the Appwrite server</a>. In this tutorial we use the Cloud which is recommended for beginners because it is way easier to set up. You can later decide to self-host if needed.</p>
<div style="display:flex;flex-direction:column"><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">1<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="set-up-an-appwrite-endpoint-and-project">Set up an Appwrite Endpoint and Project<a href="#set-up-an-appwrite-endpoint-and-project" class="hash-link" aria-label="Direct link to Set up an Appwrite Endpoint and Project" title="Direct link to Set up an Appwrite Endpoint and Project"></a></h3></div><div style="margin-top:0.5rem"><div class="ant-tabs ant-tabs-top css-cdzvx5" color="red"><div role="tablist" aria-orientation="horizontal" class="ant-tabs-nav"><div class="ant-tabs-nav-wrap"><div class="ant-tabs-nav-list" style="transform:translate(0px, 0px)"><div data-node-key="self-hosted-appwrite-instance" class="ant-tabs-tab ant-tabs-tab-active"><div role="tab" aria-selected="true" class="ant-tabs-tab-btn" tabindex="0">Self-Hosted Appwrite Instance</div></div><div data-node-key="appwrite-cloud" class="ant-tabs-tab"><div role="tab" aria-selected="false" class="ant-tabs-tab-btn" tabindex="-1">Appwrite Cloud</div></div><div class="ant-tabs-ink-bar ant-tabs-ink-bar-animated"></div></div></div><div class="ant-tabs-nav-operations ant-tabs-nav-operations-hidden"><button type="button" class="ant-tabs-nav-more" style="visibility:hidden;order:1" aria-haspopup="listbox" aria-controls="null-more-popup" id="null-more" aria-expanded="false"><span role="img" aria-label="ellipsis" class="anticon anticon-ellipsis"><svg viewBox="64 64 896 896" focusable="false" data-icon="ellipsis" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M176 511a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0z"></path></svg></span></button></div></div><div class="ant-tabs-content-holder"><div class="ant-tabs-content ant-tabs-content-top"><div role="tabpanel" tabindex="0" aria-hidden="false" class="ant-tabs-tabpane ant-tabs-tabpane-active"><div style="color:white"><div style="display:flex;flex-direction:column"><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">1<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h5 class="anchor anchorWithStickyNavbar_LWe7" id="docker">Docker<a href="#docker" class="hash-link" aria-label="Direct link to Docker" title="Direct link to Docker"></a></h5></div><div style="margin-top:0.5rem"><p>Ensure docker and docker-compose is installed and your version are up to date:</p></div><div style="margin-top:0.5rem"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">docker-compose -v</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">2<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h5 class="anchor anchorWithStickyNavbar_LWe7" id="run-the-installation-script">Run the installation script<a href="#run-the-installation-script" class="hash-link" aria-label="Direct link to Run the installation script" title="Direct link to Run the installation script"></a></h5></div><div style="margin-top:0.5rem"><p>The installation script runs inside of a docker container. It will create a docker-compose file and an <code>.env</code> file.</p></div><div style="margin-top:0.5rem"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">docker run -it --rm \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> --volume /var/run/docker.sock:/var/run/docker.sock \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> --entrypoint="install" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> appwrite/appwrite:1.6.1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">3<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h5 class="anchor anchorWithStickyNavbar_LWe7" id="startstop">Start/Stop<a href="#startstop" class="hash-link" aria-label="Direct link to Start/Stop" title="Direct link to Start/Stop"></a></h5></div><div style="margin-top:0.5rem"><p>After the installation is done, you can manually stop and start the appwrite instance with docker compose:</p></div><div style="margin-top:0.5rem"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># stop</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">docker-compose down</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># start</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">docker-compose up</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">2<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-an-appwrite-database-and-collection">Create an Appwrite Database and Collection<a href="#create-an-appwrite-database-and-collection" class="hash-link" aria-label="Direct link to Create an Appwrite Database and Collection" title="Direct link to Create an Appwrite Database and Collection"></a></h3></div><div style="margin-top:0.5rem"><p>After creating an Appwrite project you have to create an Appwrite Database and a collection, you can either do this in code with the <a href="https://appwrite.io/docs/products/databases/databases" target="_blank" rel="noopener noreferrer">node-appwrite SDK</a> or in the <a href="https://cloud.appwrite.io/console/" target="_blank" rel="noopener noreferrer">Appwrite Console</a> as shown in this video:</p></div><div style="margin-top:0.5rem"><center><div style="width:260px;border-radius:16px;border-style:solid;border-width:0;border-color:black;background-color:black;overflow:hidden;cursor:pointer;box-shadow:0 6px 12px rgba(0, 0, 0, 0.25)"><div style="position:relative;width:100%;height:146px;background-image:url(http://img.youtube.com/vi/HGlBpna17LQ/0.jpg);background-size:cover;background-position:center"><div style="position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center"><svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" style="opacity:0.7;transition:opacity 0.1s ease" viewBox="0 0 24 24" stroke-width="2"><circle cx="12" cy="12" r="10" stroke="white" fill="rgba(255,20,147,0.8)"></circle><polygon points="10 8 16 12 10 16" fill="white"></polygon></svg></div><span style="position:absolute;bottom:8px;right:8px;background-color:rgba(0, 0, 0, 0.8);color:white;font-size:12px;padding:4px 6px;border-radius:4px;z-index:2">9:47</span></div><div style="padding:0px"><span style="font-size:14px;font-weight:bold;color:#333;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;background-color:white;padding:8px;padding-top:4px;height:55px">Appwrite Database Tutorial</span></div></div></center></div><div style="margin-top:0.5rem"><br></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">3<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="add-your-documents-attributes">Add your documents attributes<a href="#add-your-documents-attributes" class="hash-link" aria-label="Direct link to Add your documents attributes" title="Direct link to Add your documents attributes"></a></h3></div><div style="margin-top:0.5rem"><p>In the appwrite collection, create all <a href="https://appwrite.io/docs/products/databases/collections#attributes" target="_blank" rel="noopener noreferrer">attributes</a> of your documents. You have to define all the fields that your document in your <a href="/rx-schema.html">RxDB schema</a> knows about. Notice that Appwrite does not allow for nested attributes. So when you use RxDB with Appwrite, you should also not have nested attributes in your RxDB schema.</p></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">4<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="add-a-deleted-attribute">Add a <code>deleted</code> attribute<a href="#add-a-deleted-attribute" class="hash-link" aria-label="Direct link to add-a-deleted-attribute" title="Direct link to add-a-deleted-attribute"></a></h3></div><div style="margin-top:0.5rem"><p>Appwrite (natively) hard-deletes documents. But for offline-handling RxDB needs soft-deleted documents on the server so that the deletion state can be replicated with other clients.</p></div><div style="margin-top:0.5rem"><p>In RxDB, <code>_deleted</code> indicates that a document is removed locally and you need a similar field in your Appwrite collection on the Server: You must define a deletedField with any name to mark documents as "deleted" in the remote collection. Mostly you would use a boolean field named <code>deleted</code> (set it to <code>required</code>). The plugin will treat any document with <code>{ [deletedField]: true }</code> as deleted and replicate that state to local RxDB.</p></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">5<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="set-the-permission-on-the-appwrite-collection">Set the Permission on the Appwrite Collection<a href="#set-the-permission-on-the-appwrite-collection" class="hash-link" aria-label="Direct link to Set the Permission on the Appwrite Collection" title="Direct link to Set the Permission on the Appwrite Collection"></a></h3></div><div style="margin-top:0.5rem"><p>Appwrite uses permissions to control data access on the collection level. Make sure that in the Console at <code>Collection -> Settings -> Permissions</code> you have set the permission according to what you want to allow your clients to do. For testing, just enable all of them (Create, Read, Update and Delete).</p></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="setting-up-the-rxdb---appwrite-replication">Setting up the RxDB - Appwrite Replication<a href="#setting-up-the-rxdb---appwrite-replication" class="hash-link" aria-label="Direct link to Setting up the RxDB - Appwrite Replication" title="Direct link to Setting up the RxDB - Appwrite Replication"></a></h2>
<p>Now that we have set up the Appwrite server, we can go to the client side code and set up RxDB and the replication:</p>
<div style="display:flex;flex-direction:column"><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">1<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="install-the-appwrite-sdk-and-rxdb">Install the Appwrite SDK and RxDB:<a href="#install-the-appwrite-sdk-and-rxdb" class="hash-link" aria-label="Direct link to Install the Appwrite SDK and RxDB:" title="Direct link to Install the Appwrite SDK and RxDB:"></a></h3></div><div style="margin-top:0.5rem"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">npm install appwrite rxdb</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">2<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="import-the-appwrite-sdk-and-rxdb">Import the Appwrite SDK and RxDB<a href="#import-the-appwrite-sdk-and-rxdb" class="hash-link" aria-label="Direct link to Import the Appwrite SDK and RxDB" title="Direct link to Import the Appwrite SDK and RxDB"></a></h3></div><div style="margin-top:0.5rem"><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> replicateAppwrite</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'rxdb/plugins/replication-appwrite'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> createRxDatabase</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> addRxPlugin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> RxCollection</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'rxdb/plugins/core'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> getRxStorageLocalstorage</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'rxdb/plugins/storage-localstorage'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> Client </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'appwrite'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">3<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-database-with-a-collection">Create a Database with a Collection<a href="#create-a-database-with-a-collection" class="hash-link" aria-label="Direct link to Create a Database with a Collection" title="Direct link to Create a Database with a Collection"></a></h3></div><div style="margin-top:0.5rem"><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> db </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">createRxDatabase</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> name</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'mydb'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> storage</span><span class="token operator">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">getRxStorageLocalstorage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> mySchema </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> title</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'my schema'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> version</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> primaryKey</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'id'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'object'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> properties</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> id</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'string'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> maxLength</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> name</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> type</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'string'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> required</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">'id'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'name'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">await</span><span class="token plain"> db</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">addCollections</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> humans</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> schema</span><span class="token operator">:</span><span class="token plain"> mySchema</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> collection </span><span class="token operator">=</span><span class="token plain"> db</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">humans</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">4<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="configure-the-appwrite-client">Configure the Appwrite Client<a href="#configure-the-appwrite-client" class="hash-link" aria-label="Direct link to Configure the Appwrite Client" title="Direct link to Configure the Appwrite Client"></a></h3></div><div style="margin-top:0.5rem"><div class="ant-tabs ant-tabs-top css-cdzvx5" color="red"><div role="tablist" aria-orientation="horizontal" class="ant-tabs-nav"><div class="ant-tabs-nav-wrap"><div class="ant-tabs-nav-list" style="transform:translate(0px, 0px)"><div data-node-key="appwrite-cloud-1" class="ant-tabs-tab ant-tabs-tab-active"><div role="tab" aria-selected="true" class="ant-tabs-tab-btn" tabindex="0">Appwrite Cloud</div></div><div data-node-key="self-hosted" class="ant-tabs-tab"><div role="tab" aria-selected="false" class="ant-tabs-tab-btn" tabindex="-1">Self-Hosted</div></div><div class="ant-tabs-ink-bar ant-tabs-ink-bar-animated"></div></div></div><div class="ant-tabs-nav-operations ant-tabs-nav-operations-hidden"><button type="button" class="ant-tabs-nav-more" style="visibility:hidden;order:1" aria-haspopup="listbox" aria-controls="null-more-popup" id="null-more" aria-expanded="false"><span role="img" aria-label="ellipsis" class="anticon anticon-ellipsis"><svg viewBox="64 64 896 896" focusable="false" data-icon="ellipsis" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M176 511a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0z"></path></svg></span></button></div></div><div class="ant-tabs-content-holder"><div class="ant-tabs-content ant-tabs-content-top"><div role="tabpanel" tabindex="0" aria-hidden="false" class="ant-tabs-tabpane ant-tabs-tabpane-active"><div style="color:white"><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> client </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setEndpoint</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'https://cloud.appwrite.io/v1'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setEndpointRealtime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'https://cloud.appwrite.io/v1'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setProject</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'YOUR_APPWRITE_PROJECT_ID'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div></div></div></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">5<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="start-the-replication">Start the Replication<a href="#start-the-replication" class="hash-link" aria-label="Direct link to Start the Replication" title="Direct link to Start the Replication"></a></h3></div><div style="margin-top:0.5rem"><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> replicationState </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">replicateAppwrite</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> replicationIdentifier</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'my-appwrite-replication'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> client</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> databaseId</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'YOUR_APPWRITE_DATABASE_ID'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> collectionId</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'YOUR_APPWRITE_COLLECTION_ID'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> deletedField</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'deleted'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Field that represents deletion in Appwrite</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> collection</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> pull</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> batchSize</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> push</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> batchSize</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/*</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * ...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * You can set all other options for RxDB replication states</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * like 'live' or 'retryTime'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> * ...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"> */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><div style="display:flex;align-items:stretch;margin-bottom:1rem;position:relative;min-width:0"><div style="position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;width:32px;margin-right:1rem;min-width:0"><div style="width:32px;height:32px;border-radius:50%;background-color:var(--color-middle);border:3px solid #391a3b;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:bold">6<!-- -->.</div><div style="position:absolute;top:32px;bottom:0;left:50%;width:1px;background:linear-gradient(to bottom, var(--color-middle) 0%, var(--color-middle) 80%, rgba(0,0,0,0) 100%);transform:translateX(-50%)"></div></div><div style="flex:1;min-width:0;overflow-wrap:break-word"><div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="do-other-things-with-the-replication-state">Do other things with the replication state<a href="#do-other-things-with-the-replication-state" class="hash-link" aria-label="Direct link to Do other things with the replication state" title="Direct link to Do other things with the replication state"></a></h3></div><div style="margin-top:0.5rem"><p>The <code>RxAppwriteReplicationState</code> which is returned from <code>replicateAppwrite()</code> allows you to run all functionality of the normal <a href="/replication.html">RxReplicationState</a>.</p></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="limitations-of-the-appwrite-replication-plugin">Limitations of the Appwrite Replication Plugin<a href="#limitations-of-the-appwrite-replication-plugin" class="hash-link" aria-label="Direct link to Limitations of the Appwrite Replication Plugin" title="Direct link to Limitations of the Appwrite Replication Plugin"></a></h2>
<ul>
<li>Appwrite primary keys only allow for the characters <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, and underscore <code>_</code> (They cannot start with a leading underscore). Also the primary key has a max length of 36 characters.</li>
<li>The Appwrite replication <strong>only works on browsers</strong>. This is because the Appwrite SDK does not support subscriptions in Node.js.</li>
<li>Appwrite does not allow for bulk write operations so on push one HTTP request will be made per document. Reads run in bulk so this is mostly not a problem.</li>
<li>Appwrite does not allow for transactions or "update-if" calls which can lead to overwriting documents instead of properly handling <a href="/transactions-conflicts-revisions.html#conflicts">conflicts</a> when multiple clients edit the same document in parallel. This is not a problem for inserts because "insert-if-not" calls are made.</li>
<li>Nested attributes in Appwrite collections are only possible via experimental <a href="https://appwrite.io/docs/products/databases/relationships" target="_blank" rel="noopener noreferrer">relationship attributes</a>, and compatibility with RxDB is not tested. Users opting to use these experimental relationship attributes with RxDB do so at their own risk.</li>
</ul></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/contribution.html"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Contribute & Innovate with RxDB</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#why-you-should-use-rxdb-with-appwrite" class="table-of-contents__link toc-highlight">Why you should use RxDB with Appwrite?</a></li><li><a href="#preparing-the-appwrite-server" class="table-of-contents__link toc-highlight">Preparing the Appwrite Server</a><ul><li><a href="#set-up-an-appwrite-endpoint-and-project" class="table-of-contents__link toc-highlight">Set up an Appwrite Endpoint and Project</a></li><li><a href="#create-an-appwrite-database-and-collection" class="table-of-contents__link toc-highlight">Create an Appwrite Database and Collection</a></li><li><a href="#add-your-documents-attributes" class="table-of-contents__link toc-highlight">Add your documents attributes</a></li><li><a href="#add-a-deleted-attribute" class="table-of-contents__link toc-highlight">Add a <code>deleted</code> attribute</a></li><li><a href="#set-the-permission-on-the-appwrite-collection" class="table-of-contents__link toc-highlight">Set the Permission on the Appwrite Collection</a></li></ul></li><li><a href="#setting-up-the-rxdb---appwrite-replication" class="table-of-contents__link toc-highlight">Setting up the RxDB - Appwrite Replication</a><ul><li><a href="#install-the-appwrite-sdk-and-rxdb" class="table-of-contents__link toc-highlight">Install the Appwrite SDK and RxDB:</a></li><li><a href="#import-the-appwrite-sdk-and-rxdb" class="table-of-contents__link toc-highlight">Import the Appwrite SDK and RxDB</a></li><li><a href="#create-a-database-with-a-collection" class="table-of-contents__link toc-highlight">Create a Database with a Collection</a></li><li><a href="#configure-the-appwrite-client" class="table-of-contents__link toc-highlight">Configure the Appwrite Client</a></li><li><a href="#start-the-replication" class="table-of-contents__link toc-highlight">Start the Replication</a></li><li><a href="#do-other-things-with-the-replication-state" class="table-of-contents__link toc-highlight">Do other things with the replication state</a></li></ul></li><li><a href="#limitations-of-the-appwrite-replication-plugin" class="table-of-contents__link toc-highlight">Limitations of the Appwrite Replication Plugin</a></li></ul></div></div></div><ul style="margin-top:25px;list-style-type:none"><li style="line-height:4;color:var(--expo-theme-text-secondary)">Was this page helpful?<div style="border-radius:3px;border-color:var(--fontColor-offwhite);border-style:solid;border-width:1px;vertical-align:middle;padding:5px;padding-left:8px;padding-right:8px;text-align:center;justify-content:center;display:inline-flex;margin-left:20px;cursor:pointer"><img src="/img/thumbs-up-white.svg" loading="lazy" height="14"></div><div style="border-radius:3px;border-color:var(--fontColor-offwhite);border-style:solid;border-width:1px;vertical-align:middle;padding:5px;padding-left:8px;padding-right:8px;text-align:center;justify-content:center;display:inline-flex;margin-left:20px;cursor:pointer;transform:scale(1, -1)"><img src="/img/thumbs-up-white.svg" loading="lazy" height="14"></div></li><li><a href="/chat/" target="_blank" style="color:var(--fontColor-offwhite)"><img src="/img/community-links/discord-logo.svg" style="padding-right:16px;height:18px;vertical-align:middle" loading="lazy">Ask a question on the forums about <!-- -->RxDB Appwrite...</a></li></ul></div></main></div></div></div><div class="block footer"><div class="footer-block"><div class="footer-links"><span><a variant="text" href="/" class="footer-logo-button"><img src="/files/logo/logo.svg" alt="RxDB" loading="lazy"><div>RxDB</div></a><div class="footer-community-links"><a variant="text" href="/chat/" target="_blank"><img src="/img/community-links/discord-logo.svg" alt="RxDB Discord" loading="lazy"></a><a variant="text" href="/code/" target="_blank"><img src="/img/community-links/github-logo.svg" alt="RxDB Github" loading="lazy"></a><a variant="text" href="https://twitter.com/intent/user?screen_name=rxdbjs" target="_blank"><img src="/img/community-links/x-logo.svg" alt="RxDB Twitter" loading="lazy"></a><a variant="text" href="https://www.linkedin.com/company/rxdb" target="_blank"><img src="/img/community-links/linkedin-logo.svg" alt="RxDB LinkedIn" loading="lazy"></a><a variant="text" href="https://stackoverflow.com/questions/tagged/rxdb" target="_blank"><img src="/img/community-links/stack-overflow-logo.svg" alt="RxDB Stack Overflow" loading="lazy"></a></div></span><div class="footer-nav-links"><a variant="text" href="/premium/" target="">Premium</a><a variant="text" href="/consulting/" target="">Support</a><a variant="text" href="/overview.html" target="">Documentation</a><a variant="text" href="/chat/" target="_blank">Discord</a><a variant="text" href="/code/" target="_blank">Github</a><a variant="text" href="https://twitter.com/intent/user?screen_name=rxdbjs" target="_blank">Twitter</a><a variant="text" href="https://www.linkedin.com/company/rxdb" target="_blank">LinkedIn</a></div></div><div class="footer-policy"><div><a variant="text" href="/legal-notice/" target="_blank">Legal Notice</a></div><span class="footer-rights">© 2025 RxDB. All rights reserved.</span></div><img class="footer-img desktop-img" src="/img/footer-column.svg" alt="columns" loading="lazy"></div></div><div class="call-to-action-popup"><div class="close"><div class="text">✕</div></div></div></div>
</body>
</html>