docs-src/docs/releases/17.0.0.md
import { PerformanceChart } from '@site/src/components/performance-chart'; import { PERFORMANCE_DATA_EXPO, PERFORMANCE_METRICS } from '@site/src/components/performance-data'; import { LinkedinBox } from '@site/src/components/linkedin-box'; import { IconVibeCoding } from '@site/src/components/icons/vibe-coding'; import { IconExperiment } from '@site/src/components/icons/experiment'; import { IconDevicePhone } from '@site/src/components/icons/device-phone'; import { IconQuickstart } from '@site/src/components/icons/quickstart'; import { HeadlineWithIcon } from '@site/src/components/headline-with-icon';
export const PERFORMANCE_METRICS_V17 = [ { key: 'time-to-first-insert', name: 'Time to first insert', color: '#FF8BE0' }, { key: 'insert-documents-500', name: 'Insert 500 docs (bulk)', color: '#ED168F' }, { key: 'find-by-ids-3000', name: 'Find 3000 docs by ID (bulk)', color: '#FFB3DF' }, { key: 'serial-inserts-50', name: 'Insert 50 docs (serial)', color: '#DE48B8' }, { key: 'serial-find-by-id-50', name: 'Find 50 docs by ID (serial)', color: '#b2218b' }, { key: 'find-by-query', name: 'Find 3000 docs by query', color: '#DA93E5' }, { key: 'find-by-query-parallel-4', name: 'Find 3000 docs by query (parallel)', color: '#A94FBE' }, { key: '4x-count', name: 'Count 3000 docs (4x)', color: '#FF59B9' } ];
export const PERFORMANCE_DATA_V17 = [ { name: 'IndexedDB', 'time-to-first-insert': 5.7, 'insert-documents-500': 9.67, 'find-by-ids-3000': 67.7, 'serial-inserts-50': 18.55, 'serial-find-by-id-50': 7.9, 'find-by-query': 58.7, 'find-by-query-parallel-4': 43.45, '4x-count': 18.5, }, { name: 'OPFS (Worker)', 'time-to-first-insert': 27.2, 'insert-documents-500': 10.32, 'find-by-ids-3000': 24.5, 'serial-inserts-50': 7.4, 'serial-find-by-id-50': 8.25, 'find-by-query': 21.2, 'find-by-query-parallel-4': 35.8, '4x-count': 2.95, }, { name: 'SQLite (node:sqlite)', 'time-to-first-insert': 5.2, 'insert-documents-500': 8.62, 'find-by-ids-3000': 26.41, 'serial-inserts-50': 10.84, 'serial-find-by-id-50': 2.67, 'find-by-query': 19.68, 'find-by-query-parallel-4': 20.38, '4x-count': 2.01, } ];
RxDB version 17 focuses on features for Vibe-Coders, better reactivity, improved debugging and DX-for-LLMs, performance and important breaking storage fixes, while also graduating several long-standing plugins out of beta.
Most applications can upgrade easily, but users of OPFS and filesystem-based storages must review the migration notes carefully.
Lets start with the most exciting features...
RxDB 17 introduces two new replication plugins: Google Drive Replication and Microsoft OneDrive Replication.
<div style={{textAlign: 'justify'}}>These replication plugins are the future for vibe-coded applications. They allow developers to create fully functional, cross-device applications without hosting any backend servers or managing database infrastructure. Instead of storing user data on a central server, the application syncs directly to the user's own Google or Microsoft account.
</div>Both plugins provide:
By using these user-provided sync endpoints, you can build and distribute complex offline-first applications that scale to any number of users at zero infrastructure cost. Just host your static page on Github Pages, Vercel, Cloudflare or any other static hosting provider. Read more.
RxDB 17 introduces the WebMCP Plugin to expose RxDB collections to AI Agents via the Web Model Context Protocol.
For years, AI interactions in the browser have relied on two ways: Either the agent renders the page and has to parse the pixels, or it has to guess the html structure. Both methods are expensive and often non-deterministic. Applications supporting WebMCP fix that by telling the Agent exactly what operations are available and how to use them.
WebMCP provides a formalized machine interface alongside the human interface.
WebMCP is highly effective when paired with a local-first database like RxDB. Instead of hardcoding specific WebMCP tools for each user actions, you can expose the local database which gives AI Agents unlimited generic query and mutation options.
</div>:::info Are you a YouTuber or Influencer talking about Web Development, Offline-First, or Local-First software? We are looking for creators to collaborate with! Please reach out to us on Twitter or Discord. :::
To improve vibe-coding with RxDB, we made the following DX-for-LLM improvements:
ERROR-MESSAGES.md to the root of the RxDB package so your LLM knows about all possible errors.cause, fix and docs property which tells your LLM what went wrong and where to find information about possible fixes. This prevents LLMs from reaching dead-ends while debugging.@example tags to TypeScript comments in many parts of the typings so Agents know how to use the API without reading the docs.Also to improve vibe-coding when working with RxDB directly we added the following files:
.claudeignore file to reduce context..claude/settings.json to improve post-generation testing.CLAUDE.mdRxDB 17 introduces the Expo Filesystem RxStorage, a high-performance storage backend for React Native and Expo applications. It is built on expo-opfs and uses the newest Expo Filesystem API. This delivers significant performance gains over SQLite for a wide range of access patterns. Currently I work on making pull requests to the Expo Core repository to further improve the performance of the underlying api. Read more.
<PerformanceChart title="Expo Filesystem vs SQLite (React Native)" data={PERFORMANCE_DATA_EXPO} metrics={PERFORMANCE_METRICS} />RxDB 17 ships with faster reads, faster writes, and lower memory usage across all storage backends. The bulk insert path, query routing, and internal data structures have been reworked to reduce CPU overhead per operation. IndexedDB now stores attachment data in a binary format for smaller on-disk size, and several memory leaks in OPFS and migration code paths have been fixed. Read more.
<PerformanceChart title="IndexedDB, OPFS & SQLite" data={PERFORMANCE_DATA_V17} metrics={PERFORMANCE_METRICS_V17} />reactivity-angular package to use signals in Angular.reactivity-vue and reactivity-preact-signals from premium to corecontext field to all RxDB write errors for easier debugging.devMode, including:
TextDecoder mode.WeakRef TypeScript types so users no longer need to enable ES2021.WeakRef.RxDatabase.collections$ observable for reactive access to collections.using keyword to automatically remove databases in tests.$$ properties and get$$() via HKT-based ReactivityLambda pattern. Signals now carry the document data type (e.g. Signal<number> instead of Signal<any>).maxLength: 2048) because big maxLength values impact performance.The following plugins are no longer in beta and are now considered production-ready:
RxCollection.cleanup() ignoring minimumDeletedTime"database is locked" errorsexclusiveMinimum and exclusiveMaximum TypeScript types corrected from boolean to number to match JSON Schema Draft 6+ #7962find() with $in on the primary key now correctly uses the fast findDocumentsById path instead of falling back to a full storage query #7993DataError / "Start key is greater than end key") on query ranges that yield no results (e.g., $gt and $lt at the same value).waitBeforePersist option to ReplicationPushOptions to delay upstream persistence cycles, enabling write batching across collections and CPU-idle deferral #7872final schema fields no longer need to be marked as requiredappendToArray() with Array.concat() for better browser-level optimizationshasOwnProperty checks, skipping unnecessary cloning on inserts, and using counter-based event IDsNON_PREMIUM_COLLECTION_LIMIT from 16 to 13.extendedLifetime when using the SharedWorker.send() calls, and clean up stale connectionId entries #8042modify(), patch(), incrementalRemove(), and update() write paths, causing the document data and CRDT operation log to diverge silently #8075serverOnlyFields in the RxServer plugin, caused by undefined values in server-only fields creating phantom keys that broke deepEqual comparisons #8212toggleOnDocumentVisible now defaults to true #6810dist files. Install RxDB from npm or run the build scripts locally if you need them.firebasemongodbnatsRxDB 17 is mostly backward-compatible, but please review the following points before upgrading: If you use any of the following storages, you must migrate your data using the storage migrator:
For all other RxStorages, data created with RxDB v16 can be reused directly in RxDB v17 but it is still required to locally test compatibility before upgrading in production.
There are many things that can be done by you to improve RxDB: