From a custom IndexedDB implementation
If your app already has a hand-rolled IndexedDB layer — a getDb/getCached/setCached trio, maybe some manual TTL logic — this page covers what that code is usually missing by the time it's a year old: Safari eviction recovery, LRU eviction, cross-tab write coordination, and per-user scoping, and how each maps onto a Flux registration.
- An existing hand-rolled IndexedDB caching layer — object stores, manual TTL envelopes, or similar
- A state manager Flux can write into — Zustand, Redux, Jotai, or Stunk — see state_managers/zustand
- Familiarity with api/register on the client side
The pattern, not the specific code
What this tends to cost over time
get/set boilerplate → registration
Safari eviction recovery → built in
Manual eviction → byte-budget LRU
Cross-tab write races → mirrored writes
Retrofitted per-user isolation → scope
A boot-time sweep catches sessions that never call this at all — a crashed tab, a closed laptop lid — see core_concepts/multi_tenant_scoping.
What doesn't move
Migrating without a big-bang cutover
Because custom prefixing partitions new stores away from legacy database structures, you can introduce Flux into high-throughput routes first while leaving existing legacy cache layers untouched until end-to-end verification is complete.
For the full IDB engine internals referenced throughout this page, see core_concepts/idb_ttl. For the offline queue this page does not cover, see core_concepts/offline_queue. For the multi-tenant isolation model in Step 7, see core_concepts/multi_tenant_scoping.