Repository navigation
Release 0.34.0
Messaging: private messages, a public room, and a ticket desk — with the Go relay that fans out to all three.
What ships
Private messages. First contact lands in a request queue rather than the inbox, so a stranger cannot put anything in front of you without your say-so. Optional per-conversation encryption, sealed in the browser. Reactions, replies, edits, read receipts, archiving, muting and search across everything the server can actually read.
A public room. Partitioned by day, with slow mode, mutes, pins and staff broadcasts.
A ticket desk. A member writes to the staff as a body rather than to a person — which is the point: somebody who has blocked the moderator on shift can still reach the desk. Assignment happens by answering. Closed is closed in both directions, with a staff-only reopen as the escape hatch.
Live delivery. A Go relay, fanning out over SSE, with per-user channels and a token the API mints.
The rules it holds to
- Nothing is on by default. Each surface has its own switch, and an instance running none of them looks like a build that never had them: 404, not 403.
- Blocking closes every door but the one to the staff.
- What the staff can read is logged. One route reads a reported private message, never a second one, never a ciphertext, and every read is on a page the whole team can see.
- Retention is published and enforced.
/privacyreads the live settings rather than repeating numbers, and each sweep now has tests — which is how the one that had never deleted a row was found.
Verified before the merge
| e2e, clean database | 537 across 13 scenarios |
| Unit | 765 web · 429 API |
| Integration | 463 |
| Typecheck | API and web templates, 0 |
| Migrations | upgrade rehearsal: a database built from main's 49 and brought up on 58 is byte-identical to a fresh one |
Operators
Nine migrations (0049–0057). Everything starts switched off; the messaging settings live in the admin panel. The relay is optional — without it the surfaces work by reloading, which is how they were built.
🤖 Generated with Claude Code
What's Changed
Full Changelog: 0.33.0...0.34.0