Big release
👥 Group chats
- Conversation-based data model replaces pair-keyed messages.
- Auto-migration on first boot — existing v1.8.1 DMs become proper Conversation records with zero user action.
- New group button on the Messages tab lets you pick 2+ friends and optionally name the group.
- Group chat header shows member count. Gear menu gets Rename and Leave group (swaps out Mute/Block which are DM-only).
- Each "them" message shows the sender's name above the bubble.
🖼 Image attachments
- Paperclip (📎) next to the chat input opens a file picker.
- Accepts PNG / JPG / GIF / WebP up to 8 MB.
- Server verifies the magic bytes — you can't rename a PDF to
.pngand sneak it through. - Attachments render inline with a click-to-zoom lightbox.
- Attachments auto-delete from disk when their message is deleted or the conversation is cleared.
✓✓ Read receipts — finally correct
- Single gray check → delivered.
- Double blue check → read.
- Per-participant readBy map means this works for group chats too.
- Legacy readAt kept for backward compat.
✨ No more flicker
Chat view content-hashes every render and skips paint if nothing's changed. Scroll position is preserved unless you were already at the bottom. Same hash trick on the Messages tab thread list.
🔄 Messages tab auto-updates
- 8-second poll while the tab is active — last-message previews update without needing to reopen a chat.
- The drawer-wide 20s poll also refreshes the tab when visible.
🔧 Message actions repositioned
- Edit / delete buttons now float above the bubble in a pill-shaped tray.
- Delete icon swapped from X to trash.
- Proper hover region, no more "off-center button drifting to the side".
🔔 Toast top-center
Like any normal OS notification. No longer bottom-right.
New endpoints
POST /users/{u}/conversations— create groupGET /users/{u}/conversations/{id}//messagesPOST /users/{u}/conversations/{id}/messagesPOST /conversations/{id}/renamePOST /conversations/{id}/members/{newUserId}/DELETEPOST /users/{u}/attachments— upload imageGET /attachments/{id}— serve image
Upgrade
Safe in-place upgrade from 1.8.x. The legacy conversations map is migrated to the new messages + convMeta layout on first server start — nothing to do.