npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

zustand-indexeddb

v0.1.1

Published

Persist Zustand stores in IndexedDB.

Downloads

902

Readme

zustand-indexeddb

Persist Zustand stores in IndexedDB.

Motivation

I like Zustand. I also like storing non-serializable data in my state (think FileSystemFileHandle or any other non-serializable objects). It so happened that IndexedDB is one of the few storages that is able to persist such data. I built this package to make it easier to create and manage Zustand stores with non-serializable data.

Usage

npm i zustand zustand-indexeddb

This package is meant to be used in combination with the persist() middleware.

import { createStore } from 'zustand'
import { persist } from 'zustand/middleware'
import { createIndexedDBStorage } from 'zustand-indexeddb'

const userStore = createStore(
  persist(() => initialUserState, {
    name: 'user',
    version: 0.1,
    storage: createIndexedDBStorage('my-app', 'refs')
  })
)

Since IndexedDB transactions are asynchronous, make sure to await any Zustand operations as well:

await userStore.setState(() => ({ name: 'John' }))

Note: You don't have to await .getState() because it's synchronous by design (the store asynchronously hydrates, then keeps its state in-memory, exposing you its latest values).

API

createIndexedDBStorage(databaseName, storeName)

  • databaseName (string), the name of the IndexedDB database to open;
  • storeName (string), the name of the IndexedDB store to create. Do not confuse it with Zustand's store—these have nothing to do with each other.

Calling this function returns an asynchronous Zustand storage that retrieves, writes, and deletes state in the respective IndexedDB database.

The name option of your persist() middleware is used as the row name in the created store. This allows you to persist multiple different Zustand stores within the same database+store compartment. This also means that each row has its own individual rehydration and migration logic, which is neat.

FAQ

Why not idb-keyval?

idb-keyval is a great library that simplifies working with IndexedDB. You can use it to implement your own custom storage, but there's one important limitation that idb-keyval has that prevented me from adopting that approach:

But createStore won't let you create multiple stores within the same database. Nor will it let you create a store within an existing database.

"Custom stores"

This means you have to use unique databases for different Zustand stores, which I find unappealing.

How do I combine it with createJSONStorage?

You don't. The whole purpose of storing your state in IndexedDB is to persist non-serializable data. The kind that doesn't make sense to pass to JSON.stringify() because an empty string (or worse) will come out of it. If you can serialize your data, store it in any available web storage (localStorage, sessionStorage, etc).