Play
ssh -p 2222 tof.az-1.raasepori-central-1.fi.possu.org
Any user name, no password. You get a token: the only key to your character. Write it down.
Information / bit rate
The web sends megabytes to say one sentence. This game sends a screen.
| a move | a few hundred bytes. The whole screen is 1,920 characters. |
|---|---|
| the client | 927 KB: OpenSSH's ssh, which you already have. GTA VI is 212 GB for roughly the same features: crime, debt, a city that wants you dead. That's 229,000 copies of ssh, or 2.1 million of telnet. |
| the world | 290 KB: the beta's entire database today, every character, item and price in it. |
| the words | Every one on the screen is something you can act on, or a joke. Usually both. |
The screen
Rustbelter HP:24/24 Energy:110/110 $20 Debt:$200 Lv:1 Load:0.0/20kg @....................................... ..........................s............. ...............##....................### ...............##..K.................### ...............##....................### ...........###.......................... Where the factories closed and the factory outlet opened. Streets stretch out around you: D goes down to the dungeon, K is Kingmac, P the pawn shop. [hjkl] move go in [x] leave items character mend [.] wait [?] help
Under the hood
A proof of concept for one question: can a text game hold a real-time multiplayer world? Monsters move every 3 seconds whether you're watching or not, crews fight the same boss on the same tick, and the answer runs in 22 MB of RAM.
| post-quantum ssh | The first key exchange offered is mlkem768x25519-sha256: ML-KEM, the lattice crypto NIST standardised for the day quantum computers arrive, welded to X25519 in case the lattices crack first. Your terminal roguelike is safe from 2035's adversaries. No password, no account, no keys to manage: SSH only encrypts, and your token is the login. |
|---|---|
| BaudWall™ | Temporal Authentication Hardening: the login runs at 300 bits per second, a start bit, eight data bits and a stop bit per character, timed in software, the echo of your typing included. Once you're in, the game goes at full speed. Anyone guessing tokens stays in 1962. A token is 128 random bits, one connection gets five guesses, and we timed it: 22.7 seconds for five wrong tokens, single thread.
tokens 2128 = 3.4 × 1038
one guess 4.5 s at 300 bps
on average 2127 guesses × 4.5 s = 7.7 × 1038 s
= 2.4 × 1031 years
= 1.8 × 1021 ages of the universe
Without BaudWall™, at 10,000 guesses a second, it would only take 5 × 1026 years. BaudWall™ makes it 45,000 times worse. |
| RAM-resident world | Streets, monsters, fights and markets live in memory. A move updates a pointer, not a database; the disk hears about it afterwards. The 3-second world tick, the shared fights and the chat never wait on a query. Sam Altman says the RAM in your home PC is used "5% of the time" and that this is "quite terrible" from "a global allocation perspective". We agree: your terminal needs almost none, and our 22 MB is in use 100% of the time. Keep yours. |
| SQLite, abused | Characters are JSON documents in SQLite, written through after every single action and queried with json_extract, a document database that never asked to be one. The rest of the world is one row: id 1, four JSON columns, overwritten every five minutes in a few milliseconds. Pull the plug: your character is exactly where you left it, and the world at most five minutes behind. |
| TOFnet | Servers federate the FidoNet way: addresses like 1:3/1, store and forward, no hub. Every message is Ed25519-signed over its exact bytes, so it survives any transport: a live link on port 2324, an HTTP POST, or a file you carry yourself. A character changes server as a passport sealed to the destination with X25519 and AES-256-GCM, redeemed once, receipted. Nuclear-war-resistant player migration: no live link is ever required, so when the backbone is glowing your character still travels, as a file, by any means, IPoAC (RFC 1149) included. The chemcomputer-guided, grain-fuelled, self-replicating biotech carrier can't read it, and can't sell it twice. A server that sells the same character twice has signed two passports, which is proof: every node cuts it off on its own authority. No blockchain was harmed. The beta runs alone, for now. |
| one binary | One static Go binary, 25 MB. No Docker, no Kubernetes, no JavaScript, no cloud database, no microservices, no accounts. The beta box has 949 MB of RAM; the game uses 22 of them. |
Requirements
| computer | Whatever runs a terminal. The server does the thinking. |
|---|---|
| client | An SSH client that knows Ed25519 host keys: OpenSSH 6.5 (2014) or later, PuTTY 0.68 or later, and anything that ships with a current OS. |
| terminal | 80×24. ANSI colour if you have it; /skin plain if you don't. |
| network | TCP/IP. A move sends a few hundred bytes: 9600 bps keeps up, 2400 bps is playable, 300 bps is a lifestyle. |
| a 386? | The game speaks telnet too, and a 386 with a TCP/IP stack plays it over telnet just fine. The beta opens only SSH, so the 386 needs a current SSH client, which means compiling one, and patience: it will solve a post-quantum lattice problem before it shows you a sewer rat. |
Keys
| hjkl ←↓↑→ | move; walk into a monster to fight it |
|---|---|
| g · Enter | go in: a city, a shop, a dungeon |
| i c m | your stuff, you, heal |
| ? | the keys that work here, on every screen |
| / | a command from anywhere: /equip /trade /team /token /feedback |
80×24 and up. Colour if your terminal has it; /skin plain if it shows junk.
Influences
Drug Lord, the single-player DOS game; the roguelikes Angband, NetHack and Spurgux; BBS door games like LORD; and the MUDs and MMOs of the last century.
Fine print
- Adult satire, and dark. If something here offends you, it was probably aimed at someone else. Probably.
- No accounts, no email, no password reset.
/tokenshows your token again while you're logged in. - What we keep: your character, anything you send with
/feedback, and a log of what the admins do. Nothing else. - A beta. Things break:
/bugor/feedbackfrom anywhere in the game.