Logo variant race condition, defaultLobbyEnabled ignored, and whoCanRecord not passed to config
- Defer logoUrl resolution in overrides.js until org config loads to prevent flashing the wrong logo variant (SIMPLE vs FULL) - Fire kamo-branding-loaded even...
Allow avatar photos when disableThirdPartyRequests is true and redesign virtual background settings layout
Avatar URLs from the JWT context are first-party theme CDN URLs, not third-party requests. The disableThirdPartyRequests guard was preventing them from loading,...
Use correct table name 'avatars' instead of 'avatar' in session SQL query
Redesign close pages to match welcome page styling
- Background slideshow with fade/scale animation (8s interval) - 15% primary color overlay + gradient atmosphere overlay - Glass morphism card (rgba(255,255,255...
Branded close pages and correct avatar URL construction
- Close pages (close.html, close2.html) now use org background image, logo, favicon, and glassmorphism styling matching the welcome page - Changed close messa...
Store full avatar relative path in session instead of bare file hash
The login SQL now also fetches avatar_type and file_extension from avatar_photos so the session stores a complete relative path like **************** or *******...
Double org logo watermark size and force white text in embed dialog
- Double watermark base dimensions (71x32 → 142x64) in _variables.scss - Double .leftwatermark max constraints (140x70 → 280x140) in _base.scss - Force white co...
Handle meetReturn redirect to send users back to meeting after login
- Detect meetReturn query param on home page (from KamoMeet auth redirect) - Generate OTK and redirect authenticated users back to meet with token - Use session...
Resolve org theme backgrounds not appearing in meet virtual backgrounds
- Add domain-based theme URL resolution for internal K8s service-to-service calls - getPublicBackgrounds now accepts optional domain param to derive correct the...
Resolve OTK auth failure and login redirect issues in KamoMeet
- Fix Redis key lookup in validate-otk (was missing *** prefix, causing all OTK validations to fail) - Map SecurityService session field names correctly (member...
Upload meet backgrounds to public MinIO bucket with hash-based naming
Was uploading to private 'imaging-meet-recordings' bucket via **************** which caused: - MinIO region mismatch errors on the primary node - Connection tim...
Replace Meet's native login dialog with org portal redirect for KamoMeet auth
KamoMeet uses OTK → JWT authentication exclusively. When Meet's auth middleware would normally show a username/password login dialog, redirect to the org's inte...
Bypass forwardToApi for background upload, use direct fetch with step-by-step logging
Reorder NavTop icon buttons to Email, Text, Phone, Calculators, AI, Support
Remove client-side OTK from multipart upload, add upload debug logging
The client was generating a wasted OTK before upload (the Next.js route generates its own server-side OTK for the backend). Removed the client OTK to simplify t...
Return serialization-safe Maps instead of raw JPA entities in MeetConfigController
All config/background endpoints were returning raw JPA entities with @ManyToOne(fetch=LAZY) Organization references. Jackson failed to serialize the Hibernate p...
Remove stock Meet virtual backgrounds, use only org-level backgrounds
- Removed hardcoded IMAGES array from constants.ts (7 stock Meet backgrounds) - VirtualBackgrounds component now uses dynamic branding backgrounds directly wi...
Simplify NavTop display name lookup and correct MediaService URL scheme
- Remove usernameAlias lookup from getDisplayName, use member record directly - Fix MediaService K8s URL from https:8443 to http:80
Serve virtual backgrounds through Meet's native dynamic branding system
Added /api/branding endpoint that returns org backgrounds in Meet's expected format. Set dynamicBrandingUrl in config so Meet fetches backgrounds natively on st...
Use forwardToApi for meet background uploads instead of manual fetch
The manual fetch with FormData forwarding was breaking multipart boundaries. Now reconstructs FormData and uses forwardToApi which handles headers correctly.
Use subquery to find org theme backgrounds by user membership instead of direct member join
The previous INNER JOIN on tb.member excluded backgrounds where member was NULL, which is most user-level backgrounds. Now uses a subquery through User→Member→O...
Remove duplicate endpoints from MeetController, add org-themes to MeetConfigController
MeetConfigController already handled config/background endpoints. The duplicate endpoints in MeetController caused ambiguous mapping. Added org-theme background...
Force light mode and prevent dark mode from being applied by OS or dynamic themes
Fetch signature template directly from EmailService with OTK auth, add debug logging
forwardToApi for /api/email/signature-templates went through APIService gateway instead of the Next.js email proxy. Now fetches directly from EmailService with ...
Read session from Redis directly (same as /api/user-info), use forwardToApi for all service calls
Root cause: the sender profile showed 'Your colleague' because the session fetch called a non-existent SecurityService endpoint. Signature was malformed because...
Replicate exact email composer data flow for meeting invite emails
The previous implementation only filled 8 of 20+ SignatureContent fields, causing malformed signatures with no images, name, or contact info. Now replicates th...
Clean up meeting invite email — remove logo, fix subject/host, embed custom message properly
Template changes: - Removed logo image (signature template header handles branding) - Removed 'Hi, Your colleague has invited you' — replaced with custom mess...
Use correct SignatureContent field names (headerImageUrl, signatureImageUrl)
Wrap meeting invite emails with org signature template (header/footer/signature) and include custom message
Now replicates the exact same email wrapping as the email composer: 1. Fetches signature template from EmailService (USER scope, COMPANY fallback) 2. Fetches se...
Update health probes to HTTP port 80 to match new server config
Startup, readiness, and liveness probes were still pointing to port 8443 with HTTPS scheme, causing pod restart loops.
Send meeting invite emails DIRECTLY to EmailService, not through APIService gateway
Root cause: forwardToApi routes through APIService's Java gateway which doesn't preserve multipart FormData boundaries correctly. The email composer works becau...
Use subtle background tints on calendar page header and sidebar
Match the leads/allotments page styling with light color-mix backgrounds instead of heavily saturated primary colors.
Switch MediaService to HTTP port 80 — TLS termination at Traefik
Internal cluster traffic doesn't need HTTPS. Traefik handles TLS for external clients. This aligns MediaService with all other services.
Load org CSS/favicon immediately on every page load, widen settings to 800px, force dark text/icons in all dialogs, shrink video preview
1. Branding: loadThemeAssets() now runs FIRST before any auth flow, so org CSS (--navpri, --color-primary), favicon, and logo data are set even during the...
Branding overrides, settings dialog layout, and display name lock via source modifications
- PreMeetingScreen: use CSS variable cascade for left column background color (--navpri/--color-primary fallback) - PreMeetingScreen: add favicon override from ...
Clear stale hexheads on page refresh instead of restoring orphaned state
Minimized tool windows don't survive refresh, so restoring hexhead positions created orphaned heads with missing icons and non-functional click handlers. Now cl...
Add comprehensive logging to email invite route for debugging, handle multiple email field formats
Make readOnlyName override more aggressive so Meet cannot overwrite it
Meet can replace window.config entirely during bootstrap, clearing the readOnlyName flag. Add Object.defineProperty trap on window.config to re-inject readOnlyN...
Listen for async branding load event so logo and org colors render
PreMeetingScreen, Watermarks, and WelcomePage were reading window.__KAMO_MEET_BRANDING once during render, missing the data when the async loadBranding() comple...
Resolve settings dialog quality issues — height, tab overflow, and white-on-white text
Change fixed 560px height to auto with 85vh max so content fits without scroll bars. Add flexWrap to tab bar so tabs wrap instead of clipping. Override white th...
Hide member-specific tabs when memberID is "new" to prevent BAD_REQUEST errors
The /settings/member/new URL (from "Add Team Member" button) is caught by the [memberID] dynamic route, causing AccountActivityTab, MembershipPermissionsTab, an...
Validate OTK FIRST before loading any theme assets to prevent expiry
ROOT CAUSE: branding/overrides.js was loading org config, CSS, favicon BEFORE validating the OTK. These network requests took 10+ seconds, causing the OTK to ex...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.