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

@areev/areev

v1.6.5

Published

Node.js bindings for Areev, the embedded memory engine for AI agents.

Readme

areev-js

Node.js (napi-rs) bindings for Areev, the embedded memory engine for AI agents.

areev-js is the napi-rs native addon that exposes Areev to Node.js, published as @areev/areev — the unscoped areev name is pending an npm similarity-filter exception (npm's spam filter reads it as too close to argv); the scoped package is not a fork, just the current install name. It mirrors the Python binding with the same thin, version-stable FFI convention: scalar arguments in, JSON strings out for anything structured, and errors thrown as JavaScript Errors. Because the underlying engine is native, this is a compiled Node addon rather than WASM. One memory is one file, opened with a namespace, giving JavaScript agents durable add / recall / supersede / forget over content-addressed memory.

const { Areev } = require('@areev/areev')

const mem = new Areev('caller.db', 'caller') // 3rd arg: passphrase for AES-256 at rest
const h = await mem.addFact('john', 'prefers', 'tea', 0.95)
console.log(await mem.recall('john')) // JSON string, newest-first

await mem.setEmbedderCommand('python3 embed.py')   // vector recall via a host command
await mem.migrate('mem0', exportJson, historyJson) // import an existing corpus (docs/migrate.md)
await mem.memoryTool('{"command": "view", "path": "/memories"}') // Anthropic memory-tool backend

Every method returns a promise

Store calls run on libuv's thread pool, not on the thread running your application. They used to run inline: a single migrate or importBundle held the event loop for its whole duration, so timers, sockets and any HTTP server in the same process stopped until it finished. Measured on a 400-record migrate, a 5 ms timer now fires 263 times during the call; before, it could not fire at all.

Two things follow, and the second is the one that bites:

  • The constructor stays synchronous. Opening a file should fail loudly, at the line that opened it.

  • Await your writes. Promises settle in completion order, not call order, and concurrent calls contend for one lock inside the store. This is a race:

    mem.addFact('john', 'prefers', 'tea')  // not awaited
    const rows = await mem.recall('john')  // may or may not see it

    Awaiting the write fixes it. If you want several independent writes to overlap, Promise.all them and await the group.

Errors arrive as rejections, so try/catch around await, or .catch(). An un-awaited call that fails becomes an unhandled rejection, which recent Node versions treat as fatal.

Part of Areev — an embedded memory engine for AI agents. See the architecture overview.

Licensed under MIT OR Apache-2.0.