|
10 | 10 | <link rel="preconnect" href="https://www.googletagmanager.com">
|
11 | 11 | <script>window.dataLayer=window.dataLayer||[]</script>
|
12 | 12 | <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.e5fcb770.css">
|
13 |
| -<script src="/assets/js/runtime~main.564f139d.js" defer="defer"></script> |
14 |
| -<script src="/assets/js/main.12cd979d.js" defer="defer"></script> |
| 13 | +<script src="/assets/js/runtime~main.b0db9c51.js" defer="defer"></script> |
| 14 | +<script src="/assets/js/main.b63c220e.js" defer="defer"></script> |
15 | 15 | </head>
|
16 | 16 | <body class="navigation-with-keyboard">
|
17 | 17 | <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PL63TR5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
@@ -40,7 +40,7 @@ <h4 class="anchor anchorWithStickyNavbar_LWe7" id="firebase---cloud-firestore">F
|
40 | 40 | <p>The biggest difference to RxDB is that firebase products are only able to be used on top of the Firebase cloud hosted backend, which creates a vendor lock-in. RxDB can replicate with any self hosted CouchDB server or custom GraphQL endpoints. You can even replicate Firestore to RxDB with the <a href="/replication-firestore.html">Firestore Replication Plugin</a>.</p>
|
41 | 41 | <h3 class="anchor anchorWithStickyNavbar_LWe7" id="meteor">Meteor<a href="#meteor" class="hash-link" aria-label="Direct link to Meteor" title="Direct link to Meteor"></a></h3>
|
42 | 42 | <p align="center"><img src="./files/alternatives/meteor_text.svg" alt="MeteorJS alternative" class="img-padding" height="60"></p>
|
43 |
| -<p>Meteor (since 2012) is one of the oldest technologies for JavaScript realtime applications. Meteor is not a library but a whole framework with its own package manager, database management and replication protocol. |
| 43 | +<p>Meteor (since 2012) is one of the oldest technologies for JavaScript realtime applications. Meteor is not a library but a whole framework with its own package manager, database management and replication. |
44 | 44 | Because of how it works, it has proven to be hard to integrate it with other modern JavaScript frameworks like <a href="https://github.com/urigo/angular-meteor" target="_blank" rel="noopener noreferrer">angular</a>, <a href="/articles/vue-database.html">vue.js</a> or svelte.</p>
|
45 | 45 | <p>Meteor uses MongoDB in the backend and can replicate with a Minimongo database in the frontend.
|
46 | 46 | While testing, it has proven to be impossible to make a meteor app <strong>offline first</strong> capable. There are <a href="https://github.com/frozeman/meteor-persistent-minimongo2" target="_blank" rel="noopener noreferrer">some projects</a> that might do this, but all are unmaintained.</p>
|
@@ -125,17 +125,17 @@ <h3 class="anchor anchorWithStickyNavbar_LWe7" id="apollo">Apollo<a href="#apoll
|
125 | 125 | <p>While it is has different caching features for offline usage, compared to RxDB it is not fully offline first because caching alone does not mean your application is fully usable when the user is offline.</p>
|
126 | 126 | <h3 class="anchor anchorWithStickyNavbar_LWe7" id="replicache">Replicache<a href="#replicache" class="hash-link" aria-label="Direct link to Replicache" title="Direct link to Replicache"></a></h3>
|
127 | 127 | <p>Replicache is a client-side sync framework for building realtime, collaborative, <a href="/articles/local-first-future.html">local-first</a> web apps. It claims to work with most backend stacks. In contrast to other local first tools, replicache does not work like a local database. Instead it runs on so called <code>mutators</code> that unify behavior on the client and server side. So instead of implementing and calling REST routes on both sides of your stack, you will implement mutators that define a specific delta behavior based on the input data. To observe data in replicache, there are <code>subscriptions</code> that notify your frontend application about changes to the state.
|
128 |
| -Replicache can be used in most frontend technologies like browsers, React/Remix, NextJS/Vercel and React Native. While Replicache can be installed and used from npm, the Replicache source code is not open source and the Replicache github repo does not allow you to inspect or debug it. Still you can use replicache for in non-commercial projects, or for companies with < $200k revenue (ARR) and < $500k in funding. (2024: Replicache will be free and Rocicorp are working on a new Zerosync product to succeed Replicache and Reflect.)</p> |
| 128 | +Replicache can be used in most frontend technologies like browsers, React/Remix, NextJS/Vercel and React Native. While Replicache can be installed and used from npm, the Replicache source code is not open source and the Replicache github repo does not allow you to inspect or debug it. Still you can use replicache for in non-commercial projects, or for companies with < $200k revenue (ARR) and < $500k in funding. (2024: Replicache will be free and Rocicorp are working on a new Zerosync product to succeed Replicache and Reflect.)</p> |
129 | 129 | <h3 class="anchor anchorWithStickyNavbar_LWe7" id="instantdb">InstantDB<a href="#instantdb" class="hash-link" aria-label="Direct link to InstantDB" title="Direct link to InstantDB"></a></h3>
|
130 |
| -<p>InstantDB is designed for real-time data synchronization with built-in offline support, allowing changes to be queued locally and <a href="/replication.html">synced</a> when the user reconnects. While it offers seamless <a href="/articles/optimistic-ui.html">optimistic updates</a> and rollback capabilities, its offline-first design is not as mature or comprehensive as RxDB's - the <a href="/articles/offline-database.html">offline data</a> is more of a cache, not a full-database sync. The query language used is Datalog, and the backend sync service is written in Clojure. InstantDB is focused more on simplicity and real-time collaboration, with fewer customization options for storage or conflict resolution compared to RxDB, which supports various storage adapters and advanced conflict handling via CRDTs.</p> |
| 130 | +<p>InstantDB is designed for real-time data synchronization with built-in offline support, allowing changes to be queued locally and <a href="/replication.html">synced</a> when the user reconnects. While it offers seamless <a href="/articles/optimistic-ui.html">optimistic updates</a> and rollback capabilities, its offline-first design is not as mature or comprehensive as RxDB's - the <a href="/articles/offline-database.html">offline data</a> is more of a cache, not a full-database sync. The query language used is Datalog, and the backend sync service is written in Clojure. InstantDB is focused more on simplicity and real-time collaboration, with fewer customization options for storage or conflict resolution compared to RxDB, which supports various storage adapters and advanced conflict handling via CRDTs.</p> |
131 | 131 | <h3 class="anchor anchorWithStickyNavbar_LWe7" id="yjs">Yjs<a href="#yjs" class="hash-link" aria-label="Direct link to Yjs" title="Direct link to Yjs"></a></h3>
|
132 | 132 | <p>Yjs is a <a href="/crdt.html">CRDT-based</a> (Conflict-free Replicated Data Type) library focused on enabling real-time collaboration - particularly for text editing, although it can handle other data types as well. While it provides powerful conflict resolution and peer-to-peer synchronization out of the box, Yjs itself is not a full-fledged database. Instead, you typically combine Yjs with other storage or networking layers to achieve a <a href="/offline-first.html">local-first architecture</a>. This flexibility allows for sophisticated <a href="/articles/realtime-database.html">real-time</a> features, but also means you must handle indexing, queries, and persistence on your own if you need them. Compared to RxDB, Yjs does not offer built-in replication adapters or a query system, so developers who require a more complete solution for conflict resolution, data persistence, and offline-first capabilities may find RxDB more convenient.</p>
|
133 | 133 | <h3 class="anchor anchorWithStickyNavbar_LWe7" id="electricsql">ElectricSQL<a href="#electricsql" class="hash-link" aria-label="Direct link to ElectricSQL" title="Direct link to ElectricSQL"></a></h3>
|
134 |
| -<p>2024: ElectricSQL is being rewritten in a new Electric-Next branch, which focuses on partial syncing of ("shapes") of data from a remote Postgres DB to a local clients written in TypeScript/JS or Elixir. The write path is not yet implemented, neither is client-side reactivity. The ElectricSQL backend is written in Elixir.</p> |
| 134 | +<p>2024: ElectricSQL is being rewritten in a new Electric-Next branch, which focuses on partial syncing of ("shapes", which makes is basically a NoSQL like document database) of data from a remote Postgres DB to a local clients written in TypeScript/JS or Elixir. The write path is not yet implemented, neither is client-side reactivity. The ElectricSQL backend is written in Elixir.</p> |
135 | 135 | <h3 class="anchor anchorWithStickyNavbar_LWe7" id="signaldb">SignalDB<a href="#signaldb" class="hash-link" aria-label="Direct link to SignalDB" title="Direct link to SignalDB"></a></h3>
|
136 | 136 | <p>SignalDB provides a reactive, in-memory local-lirst JavaScript database with real-time sync, bit it doesn't offer the same level of multi-client replication or flexibility with storage backends that RxDB provides, and through a RxDB persistence adapters you can actually use SignalDB for the front-end reactivity while relying on RxDB for backend sync and persistence.</p>
|
137 | 137 | <h3 class="anchor anchorWithStickyNavbar_LWe7" id="powersync">PowerSync<a href="#powersync" class="hash-link" aria-label="Direct link to PowerSync" title="Direct link to PowerSync"></a></h3>
|
138 |
| -<p>PowerSync is a flexible "framework" for implementing local-first solutions. It centralizes business logic and conflict resolution on a central, authoritative server (PostgreSQL or MongoDB), vs RxDB that also supports custom backends. Both RxDB and PowerSync can be used with a variety of storage backends, but PowerSync uses SQLite as the front-end database which has shown to be slow because the WASM-SQLite abstraction increases read and write latency. In terms of client SDKs, PowerSync offers Flutter, Kotlin, and Swift in addition to JS/TypeScript. PowerSync offers man client technologies, PowerSync is under a license that restricts commercial use that competes with PowerSync and the JourneyApps Platform.</p> |
| 138 | +<p>PowerSync is a "framework" for implementing local-first solutions. It centralizes business logic and conflict resolution on a central, authoritative server (PostgreSQL or MongoDB), vs RxDB that also supports custom backends. Both RxDB and PowerSync can be used with a variety of storage backends, but PowerSync uses SQLite as the front-end database which has shown to be slow because the WASM-SQLite abstraction increases read and write latency. In terms of client SDKs, PowerSync offers Flutter, Kotlin, and Swift in addition to JS/TypeScript. PowerSync offers man client technologies, PowerSync is under a license that restricts commercial use that competes with PowerSync and the JourneyApps Platform.</p> |
139 | 139 | <h1>Read further</h1>
|
140 | 140 | <ul>
|
141 | 141 | <li><a href="https://github.com/pubkey/client-side-databases" target="_blank" rel="noopener noreferrer">Offline First Database Comparison</a></li>
|
|
0 commit comments