### 2026-04-10 18:00 — Enable Olm E2EE in web build - **Decision:** Re-enabled Olm encryption in index.html with synchronous load + Olm.init() before Flutter boots, graceful fallback if Olm fails - **Rationale:** 45 of 88 rooms have Megolm encryption. MatrixSdkDatabase persists Olm keys in IndexedDB resolving /keys/upload 400 errors - **Files affected:** web/index.html, lib/main.dart, app_config.dart, auth_repository.dart, pubspec.yaml - **Status:** Working — device keys uploaded, messages encrypt/decrypt correctly ### 2026-04-10 17:25 — Deploy target is app2.m8chat.au NOT app.m8chat.au - **Decision:** app.m8chat.au = PRODUCTION (old FluffyChat). app2.m8chat.au = dev/test for m8chat-app2 - **Rationale:** User corrected after accidental production deploy. Production restored from backup. - **Status:** All future deploys to app2.m8chat.au ### 2026-04-10 17:15 — Lazy-load Jitsi external_api.js - **Decision:** Moved from index.html to dynamic load in jitsi_web_service.dart - **Rationale:** Brave blocks cross-origin scripts at page load - **Status:** Done ### 2026-04-10 17:10 — Add MessageType.encrypted with lock icon UX - **Files:** message_model.dart, chat_repository.dart, message_bubble.dart, room_preview.dart - **Status:** Done ### 2026-04-10 17:05 — Fix web metadata to M8Chat branding - **Files:** web/index.html, web/manifest.json - **Status:** Done