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-chatNode 20 or newer, nothing else to install. To keep it around:
npm install -g outis-chat
outisThe 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 codeFor 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-chatThe 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, written0600cache.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@latestnpx 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 🎵
