Use localStorage for small saves (settings, level number, simple JSON under a few hundred KB) and IndexedDB for larger or structured data (inventories, replay data, many records). Both are per-origin, live in the browser, and can be cleared by the user or the browser itself – they are not backup or cross-device storage.
At a glance
| Fact | Value | Source |
|---|---|---|
| localStorage persists across sessions | until user clears it | developer.mozilla.org |
| Web Storage total browser quota | typically around 10 MiB | developer.mozilla.org |
| Web Storage API operations run | synchronously, blocking JS | developer.mozilla.org |
For a small save (settings, current level, a JSON blob of a few dozen KB), use window.localStorage: localStorage.setItem('save', JSON.stringify(state)) and JSON.parse(localStorage.getItem('save')) on load. It is per-origin and “the stored data is saved across browser sessions”, unlike sessionStorage which clears when the tab closes. For larger or structured data – many records, inventories, level editors, replay logs – use IndexedDB, a low-level async API built for significant amounts of structured data with indexed lookup; Unity WebGL builds already store PlayerPrefs in IndexedDB under the hood.
Playgama Bridge’s Storage module replaces direct localStorage calls with one API that picks cloud saves when a platform supports them, or local storage otherwise – no per-platform save code.
Two things trip up most browser game developers. First, Web Storage calls are synchronous and block JS execution, so don’t call localStorage on every frame – save on meaningful events (level complete, checkpoint, settings change). Second, both localStorage and IndexedDB are local to one browser on one device: a user can clear site data, switch browsers, or move devices and lose everything, and total Web Storage is capped around 10 MiB per browser.
Next step: implement local save/load first, test what survives a private-browsing session and a manual site-data clear, then decide whether you need a portal’s sync system or your own back-end for real cross-device saves.
Sources
- Web Storage API – MDN
- Window: localStorage – MDN
- IndexedDB API – MDN
- Storage quotas and eviction criteria – MDN
- Automatic progress save – CrazyGames Documentation
- Playgama Bridge – Storage
Related questions
Is localStorage safe for saving purchases or currency?
No – it is local to one browser and user-clearable, so it is not reliable for anything tied to real value; use a back-end or a platform’s account-linked save system for purchases.
Will localStorage data survive private/incognito mode?
No. Data written during a private browsing session is cleared once the last private tab closes, per MDN’s documentation on the localStorage property.
Should I use IndexedDB instead of localStorage by default?
Only if you need large or structured data with lookups; for a simple save blob, localStorage’s simple synchronous API is usually enough and easier to debug.
Last updated: 30 September 2026