Add a hash column to messages table computed from SHA-256(created_at + content)
to ensure message integrity. Existing messages get backfilled during migration.
All messages now show copy and permalink buttons on hover, with hash-based
URL fragments that auto-scroll and highlight the target message.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add user profile page with custom avatar upload (crop/resize to 256px),
avatar display throughout the app, and MD5-based Gravatar fallback.
Add image paste/attach support in chat with vision model detection via
OpenRouter API. Images can be pasted from clipboard or selected via file
picker, uploaded to the server, and sent alongside messages. The AI
receives images as base64 data URLs for multimodal models. Models with
vision support are indicated with a badge in the model picker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add clickable member count in room header that shows a dropdown with
all room members (AI agent + humans) with role badges
- Give each room's AI agent a random name from 10 options (Nova, Atlas,
Sage, etc.), editable when creating the room
- Replace AI text avatar with a robot SVG icon across all components
- Fix broken invite system: add client-side URL routing for /invite/:token,
handle post-login invite acceptance via sessionStorage, and return
room_id from accept_invite endpoint for auto-navigation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Full-stack real-time group chat with Rust/Axum backend and Riot.js frontend.
Features:
- Auth (register/login/JWT), rooms, invites, WebSocket messaging
- AI responses via OpenRouter with tool calling (Brave Search + web fetch)
- Real-time tool usage indicators (searching/reading page)
- Collapsible tool results in message bubbles
- AI stats bar (model, tokens, speed, response time) persisted to DB
- Room soft-delete, /clear command, dynamic model fetching
- Markdown rendering with code highlighting and copy buttons
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>