Back to directory
pubkey avatar

rxdb

The local-first database that runs on every JS runtime and replicates with your existing backend - no vendor, no lock-in - https://rxdb.info/. Read more below about its uses, features, and usage.

Clone repository

git clone https://github.com/pubkey/rxdb.git

23,364

Stars

1,175

Forks

203

Watchers

Apache-2.0

License

JavaScript Database

A fast, local-first, reactive Database for JavaScript Applications


rxdb   rxdb   rxdb   rxdb   rxdb

969553741705539624   twitter 40rxdbjs 1DA1F2   linkedin 40rxdb 0e76a8   newsletter subscribe e05b29


logo  What is RxDB?

RxDB (short for Reactive Database) is a local-first, NoSQL-database for JavaScript Applications. Reactive means that you can not only query the current state, but subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop and also has great performance benefits.

Use the quickstart, read the documentation or explore the example projects.

RxDB on Youtube

people  Used by many

RxDB is a proven technology used by thousands of developers worldwide. With its flexibility, RxDB is used in a diverse range of apps and services.

used by many
(add yours)

multiplayer  Multiplayer realtime applications made easy

realtime.gif

replication  Replicate with your existing infrastructure

RxDB provides an easy to implement, battle-tested Sync Engine for realtime replication with your existing infrastructure.
You do not have to use a specific cloud or backend database. The protocol works by implementing three simple HTTP endpoints. There are also production-ready plugins to easily replicate with GraphQL, CouchDB, Websocket, WebRTC (P2P), Supabase, Firestore, NATS or Google Drive.

storage layer  Flexible storage layer

RxDB is based on a storage interface that enables you to swap out the underlying storage engine. This increases code reuse because the same database code can be used in different JavaScript environments by just switching out the storage settings.

You can use RxDB on top of LocalStorage, IndexedDB, OPFS, LokiJS, Dexie.js, in-memory, SQLite, in a WebWorker thread and even on top of FoundationDB and DenoKV.

No matter what kind of runtime you have, as long as it runs JavaScript, it can run RxDB:

chrome 24x24 firefox 24x24 safari 24x24 edge 24x24 Browsers nodejs Node.js react React Native capacitor Capacitor nativescript NativeScript flutter Flutter or as an electron Electron Database

All the features that you need

Since its beginning in 2018, RxDB has gained a huge set of features and plugins which makes it a flexible full solution regardless of which type of application you are building. Every feature that you need now or might need in the future is already there.

Logging
Attachments
ORM
Conflict Handling
Middleware
Signals
TanStack DB
State
Backup
Replication
Server
Storages
Local Documents
Schema Validation
Compression
Migration
Encryption
CRDT
Population

rocket  Quick start

Install

npm install rxdb rxjs --save

Store data

import {
    createRxDatabase
} from 'rxdb/plugins/core';

/**
 * For browsers, we use the localstorage based storage.
 * In other JavaScript runtimes, we can use different storages:
 * @link https://rxdb.info/rx-storage.html
 */
import {
    getRxStorageLocalstorage
} from 'rxdb/plugins/storage-localstorage';

// create a database
const db = await createRxDatabase({
    name: 'heroesdb', // the name of the database
    storage: getRxStorageLocalstorage()
});

// add collections with a schema
await db.addCollections({
  heroes: {
    schema: {
      version: 0,
      primaryKey: 'name',
      type: 'object',
      properties: {
        name: {
          type: 'string',
          maxLength: 100
        },
        healthpoints: {
          type: 'number'
        }
      },
      required: ['name', 'healthpoints']
    }
  }
});

// insert a document
await db.heroes.insert({
  name: 'Bob',
  healthpoints: 100
});

Query data once

const aliveHeroes = await db.heroes.find({
  selector: {
    healthpoints: {
      $gt: 0
    }
  }
}).exec(); // the exec() returns the result once

Observe a Query

await db.heroes.find({
  selector: {
    healthpoints: {
      $gt: 0
    }
  }
})
.$ // the $ returns an observable that emits each time the result set of the query changes
.subscribe(aliveHeroes => console.dir(aliveHeroes));

rocket  Get started

Get started now by reading the docs or exploring the example-projects.

contribute  Support and Contribute

More content

Angular Database, Frontend Database, localStorage, React Database, Browser Database, React Native Database, PWA Database, In-memory NoSQL database, JSON database, Angular IndexedDB, React IndexedDB, Optimistic UI, local database, React Native Encryption, Vue Database, jQuery Database, Vue IndexedDB, Firestore Alternative, Firebase Realtime Database Alternative, Ionic Storage, Electron SQLite, TanStack DB Offline


View llms.txt

Releases

Aug 20, 2026

Download .zip

CHANGE Update the Angular example and the Ionic example from Angular 21 to Angular 22. Both examples now use TypeScript 6.0 because @angular/build v22 requires it. CHANGE Update the @angular/core devD...

Jul 13, 2026

Download .zip

ADD test to ensure awaitDocumentPushed() resolves after a document push first had a conflict that was later resolved. (#8632) ADD replicationState.awaitDocumentPushed(rxDocument) which returns a promi...

May 28, 2026

Download .zip

TEST add reproduction for composite primary key auto-fill when only name and number are set in a preInsert hook without id (#8527) DOCS expand partial-sync.md to fully describe what partial sync is, w...

ADD React useRxDocument(collection, primaryKey) hook for subscribing to a single document by primary key with live updates ADD React useReplicationStatus(replicationState) hook that exposes syncing, e...

FIX CRDT plugin bulkInsert hook not including schema default values in CRDT operations, causing data loss during conflict resolution rebuild when fields rely on schema defaults

FIX RxDocument.get$()...