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

answering-machine

v0.1.0

Published

Async messaging between Claude Code users across timezones. Encrypted. No accounts.

Downloads

130

Readme

Answering Machine

Send messages between Claude Code users across timezones. Messages sit in an encrypted postbox until the recipient opens Claude Code and asks for them.

No accounts, no background processes. Your private key stays on your machine.

Install

claude mcp add answering-machine -- npx @pavan_nandan/answering-machine

Setup

You: "Set up my answering machine as Pavan"

Claude: "Done. Your invite code is:
         Pavan-OPAL-PEARL-8625::FhBe...
         Share it with anyone you want to message with."

Add a contact

Get their invite code (they share it once, however they want):

You: "Add Hans-Mueller-CLOUD-RIVER-0562::Ccv6..."

Claude: "Added Hans Mueller to your contacts."

Send a message

You: "Send Hans: reviewed the API doc, looks good. One question about the auth section."

Claude: "Sent to Hans Mueller."

Check messages

You: "Any messages?"

Claude: "2 new messages:
         - Hans Mueller (3 hours ago): 'Thanks, let's use JWTs...'
         - Sarah Chen (1 hour ago): 'PR is up for review'"

Messages sync silently when the MCP server starts. You read them when you feel like it.

How it works

You send a message
  → encrypted with recipient's public key (NaCl box)
  → stored in postbox (Cloudflare Worker + KV)
  → postbox can't read it (just encrypted bytes)
  → auto-deletes after 7 days if not picked up

Recipient opens Claude Code
  → MCP server pulls from postbox in background
  → decrypts locally
  → stores in local SQLite
  → shows up when they ask

Architecture

┌─────────────────────┐                    ┌─────────────────────┐
│  Your Claude Code   │                    │  Their Claude Code  │
│  + MCP server       │                    │  + MCP server       │
└─────────┬───────────┘                    └───────────┬─────────┘
          │                                            │
          │ encrypt + POST          GET + decrypt      │
          │                                            │
          ▼                                            ▼
     ┌──────────────────────────────────────────────────────┐
     │            Postbox (Cloudflare Worker)                │
     │                                                      │
     │  Holds encrypted blobs. Can't read them.             │
     │  Deletes after pickup or 7-day expiry.               │
     └──────────────────────────────────────────────────────┘

Security

Encryption is NaCl box (X25519 + XSalsa20-Poly1305). The postbox only sees encrypted bytes and a recipient ID (derived from a public key). It can't read content, identify senders, or correlate messages to real people.

Your private key lives in ~/.config/answering-machine/identity.json and never leaves your machine. Messages are encrypted before they touch the network.

MCP tools

| Tool | What it does | |------|-------------| | setup | Create identity with your display name | | invite | Get your invite code to share | | add_contact | Add someone using their invite code | | remove_contact | Remove a contact | | contacts | List all contacts | | send | Send a message to a contact | | inbox | Check for new messages | | read_message | Read a specific message by ID | | mark_all_read | Mark all messages as read | | all_messages | Show all messages (read and unread) | | reset_identity | Generate new identity (old contacts can't reach you) |

Local storage

Everything lives in ~/.config/answering-machine/:

identity.json   ← your keypair + name (never shared)
contacts.json   ← name → public key mapping
messages.db     ← SQLite inbox

Delete the folder to factory reset.

Self-hosting the postbox

The default postbox is a Cloudflare Worker in postbox/. To run your own:

cd postbox
npm install
wrangler kv namespace create "MAILBOX"
# update wrangler.toml with the namespace ID
wrangler deploy

Custom postbox URL support during setup is coming.

License

MIT