Browser Storage Failure Modes

Browser offline storage is durable enough for serious apps only when you design for quotas, eviction, upgrades, and multiple tabs.

Failure Table

FailureSymptomMitigation
quota exceededwrites failcatch errors, show cleanup/export UX, compress or prune caches
best-effort evictiondata disappears under pressurerequest persistent storage and keep backup/export path
blocked upgradenew app version cannot open DBdetect blocked upgrade and ask user to close other tabs
versionchange in old tabold tab keeps using stale schemalisten for version changes and reload/close old connection
private modedata clears when session endswarn users before storing durable-only data
large exportUI freezesuse worker-backed export/import
background sync unavailablequeued writes stay pendingretry on foreground app open

Persistence Request

export async function requestPersistentStorage() {
  if (!navigator.storage?.persist) return false;
  return navigator.storage.persist();
}

Persistence is not a backup. It only changes eviction behavior when the browser grants it.

Upgrade Blocking

db.on("blocked", () => {
  showReloadOtherTabsMessage();
});

Test this with two tabs open: one old tab holding a connection, one new tab trying to upgrade.