1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
-- news
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=2 (this is sent as a byte, not 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
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
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
|