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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@drwyn/memory

v0.2.0-alpha.1

Published

Per-user adaptive memory for drwyn — IndexedDB-backed local memory + optional cloud sync.

Downloads

252

Readme

@drwyn/memory

Per-user adaptive memory + the first adaptive primitive (surface) for @drwyn/react. IndexedDB-backed local memory, optional cloud sync via @drwyn/client.

bun add @drwyn/react@alpha @drwyn/memory@alpha

What's in the box

  • createMemoryStore — per-user store with synchronous reads, fire-and-forget writes, debounced cloud sync (5 s) when a DrwynClient is provided. Anonymous UUID per device via localStorage; setUserId('real') overrides for authed users with backend migration.
  • memory plugin — always-on event observer that auto-records every <Action name="..."> click. Zero config; just include the plugin.
  • surface plugin — render-phase visibility decider. Returns 'full' | 'collapsed' | 'hidden' via render-prop child based on use-count thresholds. Mount-snapshot semantics — decisions freeze at mount, adapt on next route navigation. Zero hydration flash.

Quick start

'use client'
import { ActionProvider } from '@drwyn/react'
import { memory, surface, createMemoryStore } from '@drwyn/memory'

const memoryStore = createMemoryStore()

export function Providers({ children }: { children: React.ReactNode }) {
  return (
    <ActionProvider plugins={[memory, surface]} services={{ memory: memoryStore }}>
      {children}
    </ActionProvider>
  )
}
import { Action } from '@drwyn/react'

<Action
  name="pricing-cta"
  surface={{ defaultVisibility: 'collapsed', promoteAfter: 5 }}
>
  {(visibility) =>
    visibility === 'full' ? <HeroPricingCard /> : <SmallPricingLink />
  }
</Action>

The CTA stays subtle by default. After five clicks (tracked automatically), surface returns 'full' on the next route navigation — for that user only.

Where you'd use it

  • Pricing CTA that promotes itself — expand the CTA only for users who've already clicked it N times (promoteAfter: 3).
  • Dashboard panels that hide when ignored — each user's dashboard distills to the panels they actually use.
  • Contextual docs feedback — render the "did this help?" widget only on pages a user engaged with.
  • Settings tour that self-dismisses — after N dismissals (hideAfter: 3), the tooltip stops rendering for that user. Forever.

Full use-cases catalog →

Cloud sync (optional)

Pass a DrwynClient to enable cross-device sync to a hosted backend:

import { DrwynClient } from '@drwyn/client'
import { createMemoryStore } from '@drwyn/memory'

const drwyn = new DrwynClient({ projectKey: 'pk_...' })
const memoryStore = createMemoryStore({ cloud: drwyn })

Local IndexedDB stays the source of truth for reads. Writes hit IDB immediately and debounce-batch to the cloud every 5 s (and on pagehide). Initial cloud pull merges by max(local, cloud) per action.

Without cloud, memory is local-only — the OSS package works standalone.

Subpath import

For consumers of @drwyn/react who want one fewer dep line:

import { memory, surface, createMemoryStore } from '@drwyn/react/memory'

Same module, re-exported via subpath.

Documentation

Full docs at drwyn.dev.

License

MIT