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

outis-chat

v0.1.2

Published

A terminal chat app with no accounts. Your identity is a recovery code you carry anywhere.

Readme

outis

A terminal chat app with no accounts. You pick a name and start talking. Your identity is a 12 word recovery code you can carry to any machine, and there is no email, no password, and nothing to sign up for.

The name comes from the Odyssey. Odysseus tells the Cyclops his name is "Outis", which means "nobody", so that when the Cyclops cries out that "Nobody" is attacking him, the other Cyclopes hear "nobody is attacking me" and leave him alone. A name that identifies you while giving nothing away. That is the whole idea here: you are a keypair, and the recovery code is the key.

Install

npx outis-chat

Node 20 or newer, nothing else to install. To keep it around:

npm install -g outis-chat
outis

The installed command is outis. The package is outis-chat only because npm will not accept the shorter name.

First run

It asks whether you are starting fresh or restoring. Pick fresh, choose a display name, and it shows your recovery code once. Write those 12 words down somewhere real. They are the only way back into your identity, and nobody can reset them for you.

That is the entire signup.

To talk to someone, one of you creates a room and shares the join code:

/new weekend-plans        creates a group, then /code shows its join code
/join plum-otter-4417     the other person joins with that code

For a direct message you need their public key. They run /whoami and send you the long string, then you run /dm <that key>.

Commands

| | | |---|---| | /new <name> | start a group | | /join <code> | join a group by its code | | /dm <pubkey> | open a direct message | | /code | show the current room's join code | | /whoami | your display name, fingerprint, and full public key | | /name <name> | change your display name | | /delete | ask to delete the room, everyone has to agree | | /approve /decline | vote on a pending deletion | | /clear | dismiss notices and close help | | /help | toggle the help panel, esc closes it | | /quit | exit |

Arrow keys move through the room list, and enter on an empty input opens the selected room. The dot in the top right is your connection: yellow connecting, green online, red offline. Anything you type while offline queues up and sends itself when the socket comes back.

Using your own server

npx outis-chat --server=https://chat.example.com
# or
OUTIS_SERVER=https://chat.example.com npx outis-chat

The server is open source and runs as two Docker containers. See the project repository if you would rather host your own than use the default.

Where your data lives

Everything the client stores is under ~/.config/outis/<server-host>/:

  • identity.json, your keystore, written 0600
  • cache.db, a SQLite copy of your rooms and messages

Deleting cache.db is safe and it rebuilds on the next sync. Deleting identity.json loses that identity unless you have the recovery code. Identities are keyed by server host, so pointing at a different server gives you a separate identity.

Worth knowing before you rely on it

The recovery code is a bearer credential. Anyone who reads your 12 words is you. Not "can request a reset", is. Treat it like an SSH private key.

Lose the code and the identity is gone. There is no reset, no support email, no recovery flow. That is a property of the model rather than a missing feature.

Message content is not end to end encrypted yet. TLS protects it in transit, but the server operator can read it. The message envelope already has room for a ciphertext field, so this can be added without breaking the protocol.

Display names are not unique. Impersonating a name is trivial, which is why the client always shows a short key fingerprint next to it, like ari#k7q2mx, and why invites work by code and never by name lookup.

"Delete for everyone" is not erasure. It removes the room from the server and tells connected clients to purge their local copy. It cannot un-screenshot anything.

Updating

npx outis-chat@latest

npx reuses a cached version otherwise. The server also enforces a minimum client version, so if yours is too old to connect it will tell you exactly what to run.

License

MIT


Created by @rbayuokt, made with love ❤️ and music 🎵