v150 · storage · indexeddb · browser internals
IndexedDB: SQLite backend
Chrome 150 rewrites Chromium's IndexedDB storage layer on top of SQLite, replacing the previous hybrid of LevelDB and flat files. There is no API change — existing IndexedDB code continues to work unchanged — but the new backend improves reliability and, to a lesser extent, performance.
at a glance
| Shipped in | Chrome 150 (Enabled by default for new databases) |
|---|---|
| Status | Enabled by default |
| API change | None — transparent to web code |
| Spec | W3C IndexedDB |
| Standards position (Firefox) | Already uses SQLite |
| Standards position (Safari) | Already uses SQLite |
| ChromeStatus | 5161589557821440 — IndexedDB: SQLite backend |
why it exists
Chrome's previous IndexedDB storage engine used LevelDB (a log-structured merge-tree) as its key-value core, with separate flat files for large blobs. This combination had known reliability issues: crashes or power failures during writes could leave the database in an inconsistent state that required the entire database to be wiped and rebuilt from scratch, causing silent data loss for users.
Firefox and Safari have always stored IndexedDB data in SQLite, which has decades of battle-tested crash-recovery code (write-ahead logging). The new Chrome backend aligns with them, inheriting SQLite's ACID guarantees. Chrome 150 applies the SQLite backend to new databases; existing databases are migrated gradually in later releases. The W3C IndexedDB specification remains unchanged, so all IndexedDB APIs behave identically from a developer's perspective.
Source: chromestatus feature summarywhat this means for developers
| Area | Before Chrome 150 | Chrome 150+ |
|---|---|---|
| API surface | Full IndexedDB API | Identical — no changes |
| Crash recovery | LevelDB — inconsistent state possible | SQLite WAL — ACID, consistent on crash |
| Blob storage | Separate flat files | Stored in SQLite (new databases) |
| Existing data | LevelDB format | Migrated lazily in future releases |
| Storage quota | As before | Unchanged |
example
No code changes are needed. Existing IndexedDB patterns continue to work:
// This code works identically before and after the backend change.
const request = indexedDB.open('myDB', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
db.createObjectStore('notes', { keyPath: 'id', autoIncrement: true });
};
request.onsuccess = (event) => {
const db = event.target.result;
const tx = db.transaction('notes', 'readwrite');
tx.objectStore('notes').add({ title: 'Hello', body: 'World' });
tx.oncomplete = () => console.log('Saved — now on SQLite backend in Chrome 150+');
};
Source: W3C IndexedDB specification
browser support
| Browser | Backend |
|---|---|
| Chrome 150+ | SQLite (new databases); LevelDB (existing, migrated later) |
| Firefox | SQLite (has always used SQLite) |
| Safari | SQLite (has always used SQLite) |