Cryptext v0.3.2
Cryptext v0.3.2
Added
- Conversation intro card above messages showing partner avatar, nickname, and "beginning of history" line
- Self-profile card pinned to the bottom of the Recent Messages panel (avatar, nickname, current status) that opens the edit profile popup
- Friend row three-dot menu with "Copy username" and "Remove friend" (destructive confirm dialog)
- WebSocket server migrated from API Gateway/Lambda onto the Axum server with auth-first-message flow, connection registry, and Redis pub/sub
- Content Security Policy enabled in Tauri config
Changed
- Home screen is now a persistent two-panel layout — Recent Messages stays on the left, and the right pane swaps between the friends list and the active DM (no more full-page navigation when opening a chat)
- Messages now stack from the bottom of the viewport and grow upward instead of filling from the top
- DM message list uses the shadcn ScrollArea for consistent scrollbar styling
- Edit profile is a popup dialog instead of a dedicated page (initial profile setup still uses the full-page flow)
- Removed the redundant DM header; partner info now lives in the sidebar and intro card
- Removed the Profile entry from the left icon sidebar (reachable via the profile card)
- Color palette switched to pure greyscale; destructive red and chart colors kept intact
- Dialog surfaces use a deliberate mid-grey in light mode and a slightly-elevated dark grey above the card in dark mode
Fixed
- Friends list and friend-request rows now show profile pictures and status dots — the
/friendsand/friends/requests/{incoming,outgoing}endpoints were not selectingavatar_urlorstatusfrom theprofilestable, so the client always rendered the initial-letter fallback and a grey "offline" dot - Dark mode palette never activated — a
.darkclass is now toggled on<html>so the dark color tokens (and Tailwind dark variants in portalled content like dialogs) actually apply - SplashPage dev-mode detection uses
import.meta.env.DEVinstead of an unreliable check - MLS initialization RwLock poison errors now propagate instead of panicking silently
Security
- Verify avatar upload magic bytes match the declared content type
- Reject non-https avatar URLs in the Avatar component
- Remove openmls
test-utilsfeature from production builds - Validate that
register_groupmembers are conversation participants - Validate WebSocket payloads at runtime before dispatch
- Cap
get_messagesresponse at 500 messages - Cap
member_idsarray length inregister_group - Cap
user_idsarray length inget_profiles_by_ids - Sanitize Google OAuth errors before returning to the client
- Redact
AppError::Internalmessage before returning to the client - Add
SameSite=Strictflag to the sidebar cookie - Remove debug
println!statements from the deep-link handler - Replace
eprintln!withtracing::debugso user IDs stop leaking to logs - Replace
.unwrap()with proper error handling in profile routes
Commit: 7f97b2f