IndexedDB supports Chrome 23+, Edge 79+, Firefox 10+, Safari 10+, Opera 15+, Samsung Internet 4+, and Android Browser 4.4+. Learn IndexedDB browser support.

Prince Dewani
May 6, 2026
IndexedDB is a W3C JavaScript API that provides a transactional, asynchronous NoSQL database for client-side storage of structured data inside the browser. It works in Chrome 23+, Edge 79+, Firefox 10+, Safari 10+, Safari on iOS 10+, Opera 15+, Samsung Internet 4+, and Android Browser 4.4+, while Internet Explorer 10 and 11 ship a partial implementation only.
This guide covers what IndexedDB is, the browsers that support it, the key features, storage limits, differences from localStorage, and known issues.
IndexedDB is a low-level JavaScript API maintained by W3C and WHATWG for storing significant amounts of structured data, including files and blobs, inside the browser. The window.indexedDB property exposes the entry point, and every read or write happens inside a transaction against an object store keyed by an index.
IndexedDB ships by default in every modern browser engine, including Blink, Gecko, and WebKit, covering Chrome, Edge, Firefox, Safari, Opera, Samsung Internet, and the Android Browser.
Chrome supports IndexedDB from Chrome 23 on Windows, macOS, Linux, ChromeOS, and Android. Chrome 11 to 22 shipped the API behind the webkitIndexedDB prefix, so production code targeting that range needed feature detection on both window.indexedDB and window.webkitIndexedDB. Chrome 4 to 10 did not support IndexedDB at all.
Edge supports IndexedDB from Edge 79 on Windows, macOS, Linux, and Android, the version that switched to the Chromium engine. Legacy Edge 12 to 18, built on the EdgeHTML engine, shipped a partial implementation that lacked compound indexes and full IDBObjectStore.getAll behavior. Behavior on Edge 79 and later matches Chrome on the same Chromium version.
Firefox supports IndexedDB from Firefox 10 on Windows, macOS, Linux, and Android. Firefox 4 to 9 shipped the moz-prefixed implementation under window.mozIndexedDB. Firefox is the only major browser that disables IndexedDB inside Private Browsing, so indexedDB.open() rejects with InvalidStateError in a Private window and apps must fall back to in-memory storage.
Safari supports IndexedDB from Safari 10 on macOS and Safari 10 on iOS. Safari 8 and 9 shipped an early implementation with significant bugs that made it unreliable for production. Safari iOS Private Browsing still rejects IndexedDB writes in some configurations, and Safari evicts IndexedDB data after seven days of no user interaction under Intelligent Tracking Prevention.
Opera supports IndexedDB from Opera 15 on Windows, macOS, Linux, and Android, the version that adopted the Blink engine. Opera Mobile supports IndexedDB from Opera Mobile 80 on Android. Opera 10.5 to 12.1, built on the Presto engine, did not support IndexedDB.
Samsung Internet supports IndexedDB from Samsung Internet 4 on Android. The implementation tracks Chromium upstream, so quota and behavior match Chrome on the same Chromium version. Samsung Internet 21 and later expose navigator.storage.persist() for persistent storage requests.
The Android Browser supports IndexedDB from Android Browser 4.4, the WebView shipped with Android KitKat. Android 2.1 to 4.3 used the older WebKit-based WebView and did not support IndexedDB. Modern Android phones ship Chrome for Android, Samsung Internet, or Firefox for Android instead of the legacy stock browser.
Internet Explorer ships only a partial IndexedDB implementation in IE 10 and IE 11. The implementation lacks compound indexes, IDBObjectStore.getAll(), and several other parts of the spec. IE 5.5 to 9 do not support IndexedDB at all. Microsoft has retired Internet Explorer, so use Edge instead.
Note: IndexedDB behaves inconsistently across Safari Private Browsing, Firefox Private Browsing, and legacy Internet Explorer. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
IndexedDB is built around five design choices that separate it from cookies, localStorage, and sessionStorage. Each one shapes how you should structure code that reads or writes data.
IndexedDB uses a percentage of the user's free disk space, not a fixed cap. The exact percentage depends on the browser, the storage pressure, and whether the origin is marked as persistent.
Call navigator.storage.persist() to mark the storage as persistent so the browser does not evict your data under pressure. Call navigator.storage.estimate() to read the current usage and quota at runtime.
IndexedDB and localStorage both store data inside the browser, but they target different jobs. The table below shows where each one fits.
| Dimension | IndexedDB | localStorage |
|---|---|---|
| Storage capacity | Up to 50 to 60 percent of free disk space per origin (multi-GB on most browsers) | 5 MB per origin in most browsers |
| Data types | Any structured-clone value: objects, arrays, Blobs, Files, ArrayBuffers | Strings only; non-string values must be JSON-serialized |
| API style | Asynchronous, event-driven, off the main thread | Synchronous, blocks the main thread on every read or write |
| Transactions | Built-in, atomic, automatic rollback on error | None; every write is independent |
| Indexes and queries | Multiple indexes per object store, range queries, cursors | None; lookup by exact key only |
| Use case fit | Offline-first apps, large datasets, file caching, structured records | Small key-value preferences (theme, last route, feature flags) |
IndexedDB has shipped in every major browser for over a decade, but several long-standing bugs and quirks still surprise teams. In my experience, the Safari Private Browsing rejection and the Firefox Private Browsing block account for most of the cross-browser bug reports a QA team will see on storage-heavy apps.
All IndexedDB version numbers and platform notes in this guide come from these primary sources:
Did you find this page helpful?
More Related Hubs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance