Dexie.js is a free, open source databases project written in TypeScript and released under Apache-2.0. It has 14,589 GitHub stars, 711 forks and 596 open issues, and was last pushed 8 days ago. On this registry it ranks #53 of 143 tracked projects in Databases, with 5 head-to-head comparisons available.

What is Dexie.js?

Dexie.js is a minimalistic TypeScript wrapper around IndexedDB — the database built into every browser engine — for web developers who want a typed, offline-capable data layer without touching the raw IndexedDB API, in vanilla JavaScript or in React, Svelte, Vue, Angular, Electron, Capacitor, and PWA projects.

What it is

Dexie.js is an Apache-2.0 licensed wrapper library for IndexedDB, written in TypeScript and published from the dexie/Dexie.js repository. It carries 14,589 stars, 711 forks, and 596 open issues, with the last push on 2026-09-10 and documentation hosted at dexie.org. The registry topics describe it as a database, indexeddb, javascript, offline, offline-storage, and storage project, which matches its position: it lives entirely in the browser JavaScript ecosystem and does not run a server of its own.

The concrete problem it solves is the raw IndexedDB API. IndexedDB is the portable database for all browser engines, but its event-driven interface is verbose and inconsistent across implementations. Dexie.js replaces that interface with a declarative schema and a chainable query API, and it also works around bugs in the underlying IndexedDB implementations to give a more stable user experience. A schema is declared once with db.version(1).stores({ friends: '++id, age' }), and application code then reads and writes through normal promise-returning methods. When an application needs more than local storage, Dexie Cloud layers real-time sync, authentication, and collaboration on top of the same library with no backend required.

Key capabilities

  • Declarative schema and versioning through db.version(1).stores({ friends: '++id, age' }), including auto-incrementing primary keys such as ++id.
  • Chainable query API including where('age').below(30).toArray(), plus above, aboveOrEqual, belowOrEqual, between, equals, equalsIgnoreCase, anyOf, anyOfIgnoreCase, distinct, and and.
  • Bulk methods — bulkAdd, bulkPut, and bulkDelete — that use a lesser-known IndexedDB feature allowing records to be stored without listening to every onsuccess event, which pushes write performance to its maximum.
  • Cursor-style iteration with each, eachKey, eachPrimaryKey, and eachUniqueKey, alongside scalar operations such as add, delete, clear, and count.
  • TypeScript entity typing with the EntityTable type, as in new Dexie('FriendDatabase') as Dexie & { friends: EntityTable }.
  • Reactive React queries through useLiveQuery from the separate dexie-react-hooks package.
  • Optional Dexie Cloud for real-time sync, auth, and collaboration on top of Dexie.js.

Who uses it and how

  • Production web sites, apps, and other projects — the README cites 100,000 of them — using Dexie.js as their browser-side database.
  • Progressive web apps and offline-first applications, which the offline and offline-storage topics reflect.
  • Desktop applications built with Electron and mobile applications built with Capacitor for iOS and Android, both supported alongside all browsers.
  • Framework teams following the official tutorials for React, Svelte, Vue, Angular, and vanilla JS, including a React plus TypeScript sample using live queries.
  • Developers needing peer support through the project's Discord server.

Getting started

Install the npm package dexie and declare a database, or for quick prototyping import the ES module directly from https://unpkg.com/dexie/dist/modern/dexie.mjs; Dexie Cloud is the separate hosted option when sync, auth, and collaboration are required.

How it compares

The facts provided name no comparable tools and no list of paid products that Dexie.js replaces. It stands alone in this registry, with no directly comparable entry to measure it against.

When to use it — and when not to

The core library operates nothing on the server: there is no database process, storage service, or SMTP configuration to run, because data lives in the user's browser. Teams that need central data, cross-device sync, authentication, or collaboration must adopt Dexie Cloud on top, so anyone unwilling to add that dependency should look elsewhere. Note also the 596 open issues and the fact that the library exists partly to absorb IndexedDB implementation bugs — useful work, but a layer whose behaviour depends on the browser engines beneath it.

project readme (upstream, from github) — read inline

Dexie.js

[![NPM Version][npm-image]][npm-url] Build Status Join our Discord

Dexie.js is a wrapper library for indexedDB - the standard database in the browser. https://dexie.org.

Why Dexie.js?

IndexedDB is the portable database for all browser engines. Dexie.js makes it fun and easy to work with.

But also:

  • Dexie.js is widely used by 100,000 of web sites, apps and other projects and supports all browsers, Electron for Desktop apps, Capacitor for iOS / Android apps and of course pure PWAs.
  • Dexie.js works around bugs in the IndexedDB implementations, giving a more stable user experience.
  • Need sync? Dexie Cloud adds real-time sync, auth, and collaboration on top of Dexie.js — no backend needed.
Hello World (vanilla JS)
<!DOCTYPE html>
<html>
  <head>
    <script type="module">
      // Import Dexie
      import { Dexie } from 'https://unpkg.com/dexie/dist/modern/dexie.mjs';

      //
      // Declare Database
      //
      const db = new Dexie('FriendDatabase');
      db.version(1).stores({
        friends: '++id, age'
      });

      //
      // Play with it
      //
      try {
        await db.friends.add({ name: 'Alice', age: 21 });

        const youngFriends = await db.friends
            .where('age')
            .below(30)
            .toArray();

        alert(`My young friends: ${JSON.stringify(youngFriends)}`);
      } catch (e) {
        alert(`Oops: ${e}`);
      }
    </script>
  </head>
</html>

Yes, it's that simple. Read the docs to get into the details.

Hello World (legacy script tags)
<!DOCTYPE html>
<html>
  <head>
    <script src="https://unpkg.com/dexie/dist/dexie.js"></script>
    <script>

      //
      // Declare Database
      //
      const db = new Dexie('FriendDatabase');
      db.version(1).stores({
        friends: '++id, age'
      });

      //
      // Play with it
      //
      db.friends.add({ name: 'Alice', age: 21 }).then(() => {
        return db.friends
          .where('age')
          .below(30)
          .toArray();
      }).then(youngFriends => {
        alert (`My young friends: ${JSON.stringify(youngFriends)}`);
      }).catch (e => {
        alert(`Oops: ${e}`);
      });

    </script>
  </head>
</html>
Hello World (React + Typescript)

Real-world apps are often built using components in various frameworks. Here's a version of Hello World written for React and Typescript. There are also links below this sample to more tutorials for different frameworks...

import React from 'react';
import { Dexie, type EntityTable } from 'dexie';
import { useLiveQuery } from 'dexie-react-hooks';

// Typing for your entities (hint is to move this to its own module)
export interface Friend {
  id: number;
  name: string;
  age: number;
}

// Database declaration (move this to its own module also)
export const db = new Dexie('FriendDatabase') as Dexie & {
  friends: EntityTable<Friend, 'id'>;
};
db.version(1).stores({
  friends: '++id, age',
});

// Component:
export function MyDexieReactComponent() {
  const youngFriends = useLiveQuery(() =>
    db.friends
      .where('age')
      .below(30)
      .toArray()
  );

  return (
    <>
      <h3>My young friends</h3>
      <ul>
        {youngFriends?.map((f) => (
          <li key={f.id}>
            Name: {f.name}, Age: {f.age}
          </li>
        ))}
      </ul>
      <button
        onClick={() => {
          db.friends.add({ name: 'Alice', age: 21 });
        }}
      >
        Add another friend
      </button>
    </>
  );
}

Tutorials for React, Svelte, Vue, Angular and vanilla JS

API Reference

Samples

Performance

Dexie has kick-ass performance. Its bulk methods take advantage of a lesser-known feature in IndexedDB that makes it possible to store stuff without listening to every onsuccess event. This speeds up the performance to a maximum.

Supported operations
above(key): Collection;
aboveOrEqual(key): Collection;
add(item, key?): Promise;
and(filter: (x) => boolean): Collection;
anyOf(keys[]): Collection;
anyOfIgnoreCase(keys: string[]): Collection;
below(key): Collection;
belowOrEqual(key): Collection;
between(lower, upper, includeLower?, includeUpper?): Collection;
bulkAdd(items: Array): Promise;
bulkDelete(keys: Array): Promise;
bulkPut(items: Array): Promise;
clear(): Promise;
count(): Promise;
delete(key): Promise;
distinct(): Collection;
each(callback: (obj) => any): Promise;
eachKey(callback: (key) => any): Promise;
eachPrimaryKey(callback: (key) => any): Promise;
eachUniqueKey(callback: (key) => any): Promise;
equals(key): Collection;
equalsIgnoreCase(key): Collection;
filter(fn: (obj) => boolean): Collection;
first(): Promise;
get(key): Promise;
inAnyRange(ranges): Collection;
keys(): Promise;
last(): Promise;
limit(n: number): Collection;
modify(changeCallback: (obj: T, ctx:{value: T}) => void): Promise;
modify(changes: { [keyPath: string]: any } ): Promise;
noneOf(keys: Array): Collection;
notEqual(key): Collection;
offset(n: number): Collection;
or(indexOrPrimayKey: string): WhereClause;
orderBy(index: string): Collection;
primaryKeys(): Promise;
put(item: T, key?: Key): Promise;
reverse(): Collection;
sortBy(keyPath: string): Promise;
startsWith(key: string): Collection;
startsWithAnyOf(prefixes: string[]): Collection;
startsWithAnyOfIgnoreCase(prefixes: string[]): Collection;
startsWithIgnoreCase(key: string): Collection;
toArray(): Promise;
toCollection(): Collection;
uniqueKeys(): Promise;
until(filter: (value) => boolean, includeStopEntry?: boolean): Collection;
update(key: Key, changes: { [keyPath: string]: any }): Promise;

This is a mix of methods from WhereClause, Table and Collection. Dive into the API reference to see the details.

Dexie Cloud

Dexie Cloud is the easiest way to add sync, authentication, and real-time collaboration to your Dexie app. You keep writing frontend code with Dexie.js — Dexie Cloud handles the rest.

What you get:

  • 🔄 Sync across devices — changes propagate in real time, no polling needed
  • 🔐 Authentication — built-in user auth, no identity provider required
  • 🛡️ Access control — share data between users with fine-grained permissions
  • 📁 File & blob storage — store attachments alongside your structured data
  • ✈️ Offline-first — works fully offline, syncs when back online

Getting started is just a few lines:

npm install dexie-cloud-addon
import Dexie from 'dexie';
import dexieCloud from 'dexie-cloud-addon';

const db = new Dexie('MyDatabase', { addons: [dexieCloud] });
db.version(1).stores({ items: '@id, title' });
db.cloud.configure({ databaseUrl: 'https://<your-db>.dexie.cloud' });

That's it. Your existing Dexie app now syncs. Hosted cloud or self-hosted on your own infrastructure. 👋

Quickstart guide

Sample app:

Source: Dexie Cloud To-do app

Live demo: https://dexie.github.io/Dexie.js/dexie-cloud-todo-app/

Legacy Addons (dexie-observable, dexie-syncable)

⚠️ These packages are legacy and no longer maintained.

If you find references to dexie-observable or dexie-syncable in tutorials, blog posts, or old code, be aware that these are deprecated sync solutions. They are not compatible with Dexie Cloud and should not be used in new projects.

For local-first sync, use dexie-cloud-addon instead. It is the modern, actively maintained solution for offline-first apps with real-time sync.

Samples

https://dexie.org/docs/Samples

https://github.com/dexie/Dexie.js/tree/master/samples

Knowledge Base

https://dexie.org/docs/Questions-and-Answers

Website

https://dexie.org

Install via npm

npm install dexie

Download

For those who don't like package managers, here's the download links:

UMD (for legacy script includes as well as commonjs require):

https://unpkg.com/dexie@latest/dist/dexie.min.js

https://unpkg.com/dexie@latest/dist/dexie.min.js.map

Modern (ES module):

https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs

https://unpkg.com/dexie@latest/dist/modern/dexie.min.mjs.map

Typings:

https://unpkg.com/dexie@latest/dist/dex

readme truncated — read the full docs on github

Frequently asked questions

Is Dexie.js free to use?

Dexie.js is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does Dexie.js do?

A Minimalistic Wrapper for IndexedDB

What is Dexie.js written in?

Dexie.js is primarily written in TypeScript. Its source is publicly available at https://github.com/dexie/Dexie.js, and it has 14,589 GitHub stars.