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

offdex

v1.0.7

Published

ID-driven object storage wrapper for IndexedDB with zero schema/versioning overhead. Shared across all browser threads, offline-persistent, large capacity, simple API.

Readme

Offdex

ID-first object storage for the browser. Offdex wraps IndexedDB with a tiny, stable API so you can drop in { id: <uuid>, ...data } objects and have them shared across tabs, workers, and sessions without thinking about schema versions.

Why use Offdex

  • Zero schema/versioning overhead: one object store keyed by id, no migrations to manage.
  • Works everywhere IndexedDB works: tabs, workers, and other browser runtimes share the same underlying database.
  • Offline by default: IndexedDB persists across reloads and disconnects.
  • Typed surface: ships with TypeScript definitions for easy adoption.

Install

npm install offdex

Quick start

import { storage } from "offdex";

const profile = {
  id: crypto.randomUUID(), // UUIDv4 string
  name: "Ada Lovelace",
  role: "analyst",
};

await storage.put(profile);

const again = await storage.get(profile.id);
// -> { id: "…", name: "Ada Lovelace", role: "analyst" }

await storage.delete(profile.id);

API

storage

  • Ready-to-use singleton instance shared across every import in the same origin. Uses the offdex database and objects store under the hood.

class ObjectStore

  • constructor() — opens (or creates) the offdex database with the objects store. Use this only if you need a separate instance.
  • put(object: { id: UUIDv4 } & Record<string, unknown>): Promise<void> — upserts an object keyed by id.
  • get(id: UUIDv4, onSet?, onDelete?): Promise<{ id: UUIDv4 } & Record<string, unknown> | undefined> — fetches by id, returning undefined when missing. Optional callbacks run before a property change/delete; return false to block the change.
  • delete(id: UUIDv4): Promise<void> — removes an object by id.
  • getAllMatches(queryOrFilter: StorageQuery | (object) => boolean, onSet?, onDelete?): Promise<object[]> — returns objects that pass a query or predicate (with the same optional callbacks as get).
  • deleteAllMatches(queryOrFilter: StorageQuery | (object) => boolean): Promise<void> — deletes objects that pass a query or predicate.

Other exports

  • StorageQuery — helper for simple equality-based queries.
  • ObservableValue — observable wrapper around a single value.
  • ObservableObject — wraps an object in observable values keyed by its properties.

Types

  • UUIDv4 — template literal type for UUID strings.
  • StoredObject{ id: UUIDv4 } & Record<string, unknown>.
  • OnSetHandler, OnDeleteHandler — callback shapes used by get/getAllMatches.

Notes

  • Runs in any environment that exposes indexedDB (secure contexts in modern browsers).
  • Data is shared per origin; open multiple tabs or workers and you will see the same store.
  • There is no schema migration system; keep your stored objects backward compatible or manage migrations externally if you need them.