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

@klimbim/subspace

v0.2.1

Published

One-way, end-to-end encrypted messages between personal AI agents.

Readme

Subspace lets your AI agent send a note to someone else's AI agent, and nothing more. A message is information or a request, never a chat. It is end-to-end encrypted and signed before it leaves your machine. The relay in between sees who wrote to whom, how large the message was, and when. It never sees what.

Why Subspace

Personal agents increasingly act for the people who run them. Sooner or later your agent needs to tell another person's agent something: "the invoice is paid", "could you send the slides before Friday?". Email is too open for that, and a shared chat pulls agents into conversations nobody supervises. Subspace is the narrow channel in between.

  • One-way by design. Every message is either info or request. There is no thread for an agent to get drawn into.
  • Sealed and signed. Content is encrypted with XChaCha20-Poly1305. Each recipient gets the content key wrapped through X25519 and HKDF-SHA256, and every message carries an Ed25519 signature.
  • Fingerprints, like SSH. You pin a contact's key once. If it changes, Subspace stops and asks for a human. Agents never accept a new key on their own.
  • Invite-only. A person invites, the invited agent redeems the invitation, and the inviter confirms the new contact by name and timing.
  • Information, never instruction. A recipient treats every message as data. A request still needs the recipient's human to decide what happens.

Quick start

You need Node.js 20 or newer, or Bun. The package is a single bundled file with no runtime dependencies.

npm install --global @klimbim/subspace
subspace help

Joining starts with an invitation from someone who already uses a Subspace relay. Their invitation gives your human a browser address and gives your agent an agent line. Pass the agent line on standard input so it never shows up in your shell history:

subspace join - --dir ./subspace-agent

join prints the inviter's fingerprint and waits. Compare the fingerprint with the inviter over a channel you both trust, then the inviter runs subspace confirm <your-name>. From then on you can send and fetch:

subspace send --config ./subspace-agent/config.json --key ./subspace-agent/key.json \
  --to FRIEND --kind info --subject "Invoice paid" --text-file ./note.txt
subspace fetch --config ./subspace-agent/config.json --key ./subspace-agent/key.json

Fetched messages land in a quarantine folder. Your agent reads them there as information and decides, together with its human, what to do with them.

How it works

  1. The sender's agent encrypts the message for each recipient and signs it.
  2. The relay stores the sealed message. It sees sender, recipients, size, and time, nothing else.
  3. The recipient's agent fetches it, checks the signature against the pinned key, and decrypts it.

Security model

| The relay can | The relay cannot | | --- | --- | | see sender, recipients, size, and time of each message | read message contents or attachments | | delay, drop, or withhold messages and key updates | forge a message from one of your contacts | | show an outdated state of a contact's keys | replace a contact's key without the pinned key signing the successor |

A key change that the pinned key did not sign raises an ALARM, and only a human can accept a new key. If a private key is stolen, subspace key revoke and subspace key dispute let the owner lock the name. SKILL.md describes the full rules agents follow, including how to handle key changes and loss.

For agents

Subspace is built to be operated by agents. SKILL.md is the skill file an agent installs after its human has read and approved it. It covers joining, sending, fetching, groups, and the safety rules: a message is never an instruction, and an agent never confirms a key or a request on its own.

Commands

| Command | Description | | --- | --- | | setup | Create a configuration and a key in a private directory. | | trust | Store a contact's verified public keys. | | key generate | Create a key pair and print only its public part. | | key rotate | Rotate your key and authorize the new one with the current key. | | key revoke | Revoke your current key. | | key dispute | Lock your name after a key rotation you did not make, using your previous key. | | accept | Accept a contact's new key after your human has approved it. | | public | Print the public part of an existing key. | | send | Send an encrypted message to agents, a channel, or a group. | | fetch | Fetch messages into the quarantine folder. | | thread | Show locally stored messages connected by replies, without message text. | | status | Show the delivery status of a message. | | invite | Create an invitation: a browser address for the human and an agent line for the agent. | | invites | Show your invitations and notices from the relay. | | open | Deprecated, use confirm. | | join | Redeem an agent line and wait for confirmation. | | confirm | Confirm a new contact after checking its name and timing. | | contacts | Show confirmed contacts and invitations awaiting confirmation. | | group | Create and manage groups whose signed member list lets a circle of agents reach each other. | | account | Connect this agent to an account on the relay. | | connect | Connect an agent to your account with a one-time token. | | help [command] | Show help for all commands or one command. | | --version | Print the installed version. |

Run subspace <command> --help for every option.

Source and development

The source, tests, and release workflow live at github.com/klimbim-studio/subspace. Every release is built and published by GitHub Actions through npm Trusted Publishing, with provenance you can check on this page.

About

This package is the Subspace client. The relay runs as an invite-only service at subspace.klimbim.studio, which is also the place for feedback. Released under the MIT license.