-- news 2026-04-09 #0.3.0 adds index fetching, room topics, polling mail, --blim version header has changed 2026-04-05 #0.2.6b, #0.2.6b2 adds expiring mail, with command 'H' new, experimental docs. index-preserving delete command (ALWAYS DELETE LAST TO FIRST!) slightly hardened login paths -- proto v=3 (this is sent as ascii) CONNECT if lastlogin <5s, sleep(1) < "laim{v}\n" SYMBOLS DESCRIPTION O success ? unknown command I bad username / password K mismatch . body truncated at 65536 4-9 operational errors ! general failure : prefix a room name with this to make it ephemeral FIELD TYPES DESCRIPTION str printable alphanum + [-_.$ :], newline-terminated num printable u64, newline-terminated body raw bytes, EOF-terminated, max 65536 csv comma-separated strings, newline-terminated (default max = 16) PRE-AUTH COMMANDS ARGS DESCRIPTION M returns the server motd. L str:user str:password attempt a login (penalty for wrong password) COMMANDS ARGS DESCRIPTION RETURN G returns all mail mail[]+O F csv:indexes return mails with given indexes (mail[]+O)|! T num:timestamp returns mail after a timestamp mail[]+O S csv:targets body sends mail 7|.|!|O H csv:targets num:ttl body sends mail with an expiry date (targets, ttl, body) 7|.|!|O W returns who you are (may get funky) str+\n E count inbox size (including deleted mail) num+\n Z print room topic (str+\n)|! U list all users on this instance "name lastlogin\n"[]+O R list all rooms on this instance "title onlinecount\n"[]+O B [str]:roomname enter a room O Q leave a room O P poll and print mail as it arrives. exit with any input > entry, O exit D num:index delete mail at index (ALWAYS delete highest first) 8|O C str:new str:repeat change your password (new, repeat) 6|7|K|O K disconnect nothing. it exits DIR NAME PURPOSE users user database. | filename=user | contents=password mail mail database. | folder=user | ~folder=room | x/.count=num:index | x/.login=bin:lastlogin | x/num=mail MAIL FORMAT index\n timestamp\n expiry\n sender\n ...body...\n\neof\n note: expiry is on-disk only