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

@tochemey/nodeakt

v0.2.0

Published

Distributed actor framework for TypeScript: typed actors, supervision, mailboxes, behaviors, an event stream, and a multi-core runtime

Readme

NodeAkt is a TypeScript-first distributed actor framework for Node.js, Bun, and Deno. It lets you build responsive, resilient, and elastic systems with typed actor messages, running as a single process or a cluster of nodes behind the same API.

  • Simpler concurrency. Actors process one message at a time; you write plain TypeScript with no locks, channel plumbing, or shared-state bugs.
  • Location transparency. Send a message to a local, remote, or clustered actor with the same API; the framework handles the wire.
  • Resilience by design. Supervision trees and the "let it crash" model, inspired by Erlang/OTP, keep failures contained and recoverable.
  • Production batteries included. Remoting, Clustering, scheduling, passivation, without re-rolling them yourself.
  • Multi-core. Spawn actors across every machine core without touching workers or threads yourself. An actor's address works the same on any core, on Node.js, Bun, and Deno alike.

An actor is a small unit of computation that owns private state and a mailbox. It never shares memory; it communicates only by sending messages, and the runtime delivers those messages to it one at a time. That single rule is what makes actors easy to reason about: inside a handler there is no concurrency, so there are no locks, no races, and no shared-state bugs. You model a system as many actors that each do one thing and talk by message, and the framework runs them safely across cores and across machines. For more depth, watch Carl Hewitt, the father of the actor model, explain it in his own words:

Carl Hewitt on the actor model

The whole runtime, the multi-core layer and the network protocol included, has zero dependencies: installing it brings exactly one package. Every supported runtime is exercised in CI, multi-core placement included.

Install

One package, zero dependencies, ESM only (import, not require). Pick your runtime:

Node.js 22+

npm install @tochemey/nodeakt
pnpm add @tochemey/nodeakt
yarn add @tochemey/nodeakt

Bun 1.3+

bun add @tochemey/nodeakt

Deno 2+

deno add npm:@tochemey/nodeakt

Quick start

import type { Actor, Context, ReceiveContext } from "@tochemey/nodeakt";
import { ActorSystem } from "@tochemey/nodeakt";

class Greet {
  constructor(readonly name: string) {}
}

// An actor implements three lifecycle hooks: preStart, receive, and postStop.
class Greeter implements Actor {
  preStart(_ctx: Context): void {}

  receive(ctx: ReceiveContext): void {
    if (ctx.message instanceof Greet) {
      console.log(`Hello, ${ctx.message.name}!`);
    }
  }

  postStop(_ctx: Context): void {}
}

const system = new ActorSystem("hello");
await system.start();

const greeter = await system.spawn("greeter", new Greeter());
system.noSender().tell(greeter, new Greet("Ada")); // Hello, Ada!

await system.stop();

Head to Getting started to build on this, including ask/request for typed replies, supervision, and more.

Documentation

  • Documentation: getting started, the tour, and the full reference
  • Examples: small programs that match those pages
  • Benchmarks: tell and ask throughput, memory density, multi-core scaling

Community

Ask questions and follow the work in Issues, or on Slack. Feedback on the tracking issue helps shape what we work on next.

Contribution

See the contribution guide for setup, conventions, and what a change needs to merge