Replace the once-per-session sessionStorage guard (which suppressed the loading
screen after its first appearance) with entry-aware logic: show on app entry
and reloads, suppress on internal link navigations and back/forward.
Stack time, title, and details vertically in compact cards for the narrow live-room sidebar and agenda views.
Co-authored-by: Cursor <cursoragent@cursor.com>
Teleport modals to body, hide until Alpine is ready, use a single fade transition, and lock scroll on html with stable scrollbar gutter.
Co-authored-by: Cursor <cursoragent@cursor.com>
Link opens an in-page modal on conference and webinar show pages; unlink uses the shared confirm-dialog component.
Co-authored-by: Cursor <cursoragent@cursor.com>
Store programme_snapshot from the link-room response locally and merge existing room settings on service API updates.
Co-authored-by: Cursor <cursoragent@cursor.com>
Service API store now resolves meet_room_uuid before source lookup so programme snapshots apply to pre-linked rooms.
Co-authored-by: Cursor <cursoragent@cursor.com>
Events owns calendar entries for events-sourced rooms so virtual sessions
do not duplicate on the webmail calendar.
Co-authored-by: Cursor <cursoragent@cursor.com>
Use the connected mail calendar mailbox when set, skip API calls when
MAIL_API_KEY_MEET is unset, and call syncRoomUpdated on room edits.
Co-authored-by: Cursor <cursoragent@cursor.com>
Laravel's S3 driver requires this package; without it the meet-recordings
disk fails when completing egress uploads from Contabo Object Storage.
Co-authored-by: Cursor <cursoragent@cursor.com>
Create rooms via the LiveKit API, retry egress when the room is missing, and resume server egress after the host connects when auto-record fell back to browser capture.
Co-authored-by: Cursor <cursoragent@cursor.com>
Use a dedicated meet-recordings S3 disk with path-style endpoints for Contabo, and pass force_path_style through to LiveKit egress uploads.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pass null encoding preset to match the PHP SDK, and register the meet webhook on each egress start so LiveKit Cloud does not need a global webhook URL.
Co-authored-by: Cursor <cursoragent@cursor.com>
Remove icon-only restart buttons on webinar and conference pages; btn-group now carousels on narrow screens when actions overflow.
Co-authored-by: Cursor <cursoragent@cursor.com>
Server-side room composite egress replaces fragile MediaRecorder DOM capture when enabled, with webhook completion and browser fallback when egress is unavailable.
Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the duplicate webinar header button and make the primary purple action
first in the join card, with a mobile rotate icon when restarting.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace restart button text with a compact arrow-path icon on small screens while keeping the full label on desktop.
Co-authored-by: Cursor <cursoragent@cursor.com>
Enforce invite-only room access, validate invite emails on create, assign
attendee role for listener invitations, and add invite UI on the room show
page. Redesign meetings, rooms, conferences, and webinars indexes to match
the Events hero, stats cards, and icon list layout.
Co-authored-by: Cursor <cursoragent@cursor.com>
Space speaker tiles use a different DOM than video tiles; updateParticipantTile
was throwing on missing cam badges. Also stop using the hidden attribute on
toolbar buttons so Alpine can show mic controls after promotion, and let listeners
dismiss the playback banner without needing publish access.
Co-authored-by: Cursor <cursoragent@cursor.com>
Include attendees alongside host, co-hosts, and speakers so everyone in the call gets a card with role and muted state, not just speakers.
Co-authored-by: Cursor <cursoragent@cursor.com>
Use a three-column avatar grid with role labels and speaking/muted indicators, enable chat in audio rooms, and swap the mobile People nav button for Chat since People stays in the header.
Co-authored-by: Cursor <cursoragent@cursor.com>
Render host, co-host, and panelist cards from joined participants instead of LiveKit connections alone so listeners no longer occupy tiles and accepted speakers appear reliably.
Co-authored-by: Cursor <cursoragent@cursor.com>
Bootstrap room-type flags from meet-config before Alpine paints, gate toolbar and banners server-side per room type, and hide Alpine toolbar items until init completes.
Co-authored-by: Cursor <cursoragent@cursor.com>
Use display grid for speaker tiles, show only host/co-host/panelist on stage, and re-layout when roles change so cards stay in separate cells.
Co-authored-by: Cursor <cursoragent@cursor.com>
Remove duplicate host record button on desktop and split invite-to-speak from make co-host so listeners must accept before speaking while co-host is applied immediately.
Co-authored-by: Cursor <cursoragent@cursor.com>
Let hosts promote raised-hand listeners from People, remove the empty More menu in spaces, and put People and recording on the bottom bar.
Co-authored-by: Cursor <cursoragent@cursor.com>
Block breakouts, chat, Q&A, and other meeting-only tools in spaces, hide video controls for audio-only rooms, and stabilize mobile nav and toolbar layout.
Co-authored-by: Cursor <cursoragent@cursor.com>
Switch regular meeting tiles to a 2–3 column scrollable gallery with overlay labels so many participants fit on small screens without stacked full-width cards.
Co-authored-by: Cursor <cursoragent@cursor.com>
Recreate spotlight tiles with video on switch, limit regular meetings to four primary controls before More, and align mobile notification badge with desktop.
Spotlight by participant uuid, add on-stage picker in stage layout, and show who is currently spotlighted in the plenary status bar.
Co-authored-by: Cursor <cursoragent@cursor.com>
Process ?speaker= before registration gate and already-joined redirects so Events speakers get panelist role even when they previously registered as attendees.
Co-authored-by: Cursor <cursoragent@cursor.com>
Upgrade existing participant roles when a verified speaker token is present, and sync panelist access while already in the room so speaker-panel placement and publish rights apply.
Co-authored-by: Cursor <cursoragent@cursor.com>
Verify speaker tokens before room-type role resolution so town-hall sessions get panelist access and speaker-panel placement, and skip the waiting room for panelists.
Co-authored-by: Cursor <cursoragent@cursor.com>
Show ladillmeet-logo-email.png in contact mail and publish a markdown mail header matching the Invoice pattern.
Co-authored-by: Cursor <cursoragent@cursor.com>
The monolith Afia relay requires system_prompt; include it so Meet transcript summaries work through the platform relay.
Co-authored-by: Cursor <cursoragent@cursor.com>
Verify speaker tokens from Events on join, grant panelist role for linked webinars, and point bulk comms links to the attendees page instead of the JSON preview API.
Co-authored-by: Cursor <cursoragent@cursor.com>
Show participant count without labels on phones, cap the title at 40% width, and keep four bottom-nav icons by moving React into More only after speak access is granted.
Co-authored-by: Cursor <cursoragent@cursor.com>
Cap customer-facing logos at 50vw on phones, tighten leave-feedback layout, and show icon-only share plus a blinking record dot on mobile.
Co-authored-by: Cursor <cursoragent@cursor.com>
Attendees register or sign in with a badge before the display-name screen; email is no longer collected on the Meet join form.
Co-authored-by: Cursor <cursoragent@cursor.com>
Server-side auto-record now triggers browser MediaRecorder on connect, and
the end-meeting dialog only warns when capture actually ran but produced no file.
Co-authored-by: Cursor <cursoragent@cursor.com>
Let attendees request host-granted microphone access with LiveKit reconnect,
participant panel controls, and toolbar UI that only shows mic when allowed.
Fix Events create URL, surface API key setup guidance, and align the Webinars
sidebar icon with other nav items using currentColor strokes.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add Events linking UI and service client, remove Meet-native registration and invitation flows for these room types, and redirect attendees to Events registration when joining.
Co-authored-by: Cursor <cursoragent@cursor.com>
Green room poll was racing go-live and sending the host to the ended page; carry participant session into the new live session instead.
Co-authored-by: Cursor <cursoragent@cursor.com>
Drop Connecting/Connected and view-only mode text while keeping the active speaker notification line for everyone.
Co-authored-by: Cursor <cursoragent@cursor.com>
Server-render the speaker pill on load, hide noisy connection status on mobile, and use a single sidebarPanel slot so desktop panels replace in place instead of animating side by side.
Co-authored-by: Cursor <cursoragent@cursor.com>
Use programme.svg for conferences and webinars on mobile and desktop; the panel stays available with an empty state when Events has not linked a lineup yet.
Co-authored-by: Cursor <cursoragent@cursor.com>
Attendees reconnect to breakout rooms with publish access while hosts stay on stage; poll and media-token endpoints drive LiveKit reconnection, and the live room shows Events-linked programme when available.
Co-authored-by: Cursor <cursoragent@cursor.com>
Give attendees reaction buttons instead of media controls, gate applause audio until multiple people clap, show the avatar strip in panel layout, and remove the plenary stage subtitle.
Co-authored-by: Cursor <cursoragent@cursor.com>
Show the current stage mode to everyone, redesign the layout picker with clear descriptions, and apply layout changes only when the host saves.
Co-authored-by: Cursor <cursoragent@cursor.com>
Include speakers and attendees below the stage, resolve avatars with the same fallbacks as video tiles, and refresh the strip when poll data updates.
Co-authored-by: Cursor <cursoragent@cursor.com>
Clip spotlight tiles to the stage border radius and draw the green active-speaker outline on the spotlight container so overflow hidden no longer hides it.
Co-authored-by: Cursor <cursoragent@cursor.com>
Stop registerPresenter from demoting hosts to panelists, recognize room owners as managers, and show stage controls in the green room banner.
Co-authored-by: Cursor <cursoragent@cursor.com>
Move the participant name strip below the speaker area instead of overlaying it, and use Ladill profile photos on no-video tiles before falling back to initials.
Co-authored-by: Cursor <cursoragent@cursor.com>
Templates duplicated create-form settings without edit/delete flows; drop the feature and table. Conference and webinar pages render synced programme snapshots and link back to Ladill Events.
Co-authored-by: Cursor <cursoragent@cursor.com>
Service rooms support town_hall/webinar types with source lookup, update, and cancel; stage poll no longer overwrites layout while the modal is open.
Co-authored-by: Cursor <cursoragent@cursor.com>
RoomController show may redirect to conference/webinar pages; SSO connect honors intended URL when already authenticated.
Co-authored-by: Cursor <cursoragent@cursor.com>
Webinars can enable multi-speaker stage layout at creation or on the details page; plenary view shows 12 attendee avatars before the overflow count.
Co-authored-by: Cursor <cursoragent@cursor.com>
Speakers get a full-screen spotlight with overlapping audience avatars; hosts can configure panels in the green room and switch layouts live.
Co-authored-by: Cursor <cursoragent@cursor.com>
Hosts can assign team speakers and invite panelists by email from the
conference show page, with presenter refs synced to live sessions.
Co-authored-by: Cursor <cursoragent@cursor.com>
Route guests through silent SSO to the Meet product page, fix Afia context
query, add conference green-room UX and copy, and extend service API for
Care/CRM/Invoice calendar integration.
Co-authored-by: Cursor <cursoragent@cursor.com>
Drop the third-party comparison from the Rooms index subtitle and neutralize the SpaceService docblock.
Co-authored-by: Cursor <cursoragent@cursor.com>
Split town_hall into a Conferences sidebar flow and Spaces-style Rooms with host/speaker/listener roles; enforce audio-only LiveKit UI for rooms; show schedule icon on mobile meetings index.
Co-authored-by: Cursor <cursoragent@cursor.com>
Force light color-scheme on app shells while scoping dark UI to the live room; remove join/restart from list cards and consolidate start/join/rejoin on the details action row; route Join meeting through /r/ so participants are registered before entering /room/.
Co-authored-by: Cursor <cursoragent@cursor.com>
Meetings and webinars now share GHS 0.30 per peak participant, with usage UI and plan quotas updated to match.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add restart meeting actions, a dedicated webinar sidebar flow billed at GHS 0.30 per participant, and reserve speaker-line space with a placeholder to prevent layout shift.
Co-authored-by: Cursor <cursoragent@cursor.com>
Highlight speaking participants on video tiles and in the panel, with header copy that names one or multiple speakers at once.
Co-authored-by: Cursor <cursoragent@cursor.com>
Mark legacy zero-byte placeholders as failed, validate files on show/download, and surface upload errors in the meeting room.
Co-authored-by: Cursor <cursoragent@cursor.com>
Capture the meeting in the host browser, upload to Ladill storage on stop, and remove the LiveKit egress placeholder job.
Co-authored-by: Cursor <cursoragent@cursor.com>
Recordings dispatch ProcessRecording to the database queue; without a worker they stay stuck at processing.
Co-authored-by: Cursor <cursoragent@cursor.com>
Handle billing API failures gracefully on session start, add wallet.balance JSON endpoint, and sync Meet into the app launcher.
Co-authored-by: Cursor <cursoragent@cursor.com>
Wallet debits at session end, on recording/file storage, and via daily renewals with grace period before asset deletion.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add meet-icons for leave, end, personal, and schedule; dashboard quick actions sit inline with the Meetings heading on small screens.
Co-authored-by: Cursor <cursoragent@cursor.com>
Shared copy-button component shows Copied state on meeting details; mobile More is icon-only and opens the same panel pattern as chat.
Co-authored-by: Cursor <cursoragent@cursor.com>
Poll and waiting-room clients follow the same redirect when the host ends the call; chat and participants use mobile bottom sheets.
Co-authored-by: Cursor <cursoragent@cursor.com>
Show mic, camera, share, and More on mobile with Leave/End after a divider,
and move reactions, chat, and hand-raise into the More panel on small screens.
Co-authored-by: Cursor <cursoragent@cursor.com>
Show host-visible waiting badges and enable-audio prompts, harden mic
playback with LiveKit attach patterns, and swipe-scroll meeting controls on mobile.
Co-authored-by: Cursor <cursoragent@cursor.com>
Attach remote audio tracks for playback, remove stale participant cards on
leave, and remove the redundant Ladill Meet label from kiosk join pages.
Co-authored-by: Cursor <cursoragent@cursor.com>
Unlock LiveKit audio after user gesture, respect join mute/video settings,
and replace plain links with btn-secondary pills on the meeting details page.
Co-authored-by: Cursor <cursoragent@cursor.com>
Redesign public join flows on the Frontdesk kiosk template, enforce host
admission when waiting room is enabled, and collect star ratings after leave.
Co-authored-by: Cursor <cursoragent@cursor.com>
Initialize REC/Locked state before Alpine paints, and restore the copy-link
share dropdown on desktop instead of trapping users in native share cancel.
Co-authored-by: Cursor <cursoragent@cursor.com>
Guest joins without email were matching any active participant, overwriting
the host row and granting host controls; header now always shows room host.
Co-authored-by: Cursor <cursoragent@cursor.com>
Guests were sent through silent SSO after entering the meeting room because
/room routes required auth; failed SSO fell back to leftover Care config.
Co-authored-by: Cursor <cursoragent@cursor.com>
Build join URLs from meet.ladill.com config instead of APP_URL, which was still inherited from the Care app template.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve participant photos from linked user records for the header host chip and participants panel, with initials as fallback.
Co-authored-by: Cursor <cursoragent@cursor.com>
Show the host initials in the header in-call control and open a live participant list from poll data when it is clicked.
Co-authored-by: Cursor <cursoragent@cursor.com>
Drop header, footer, panel, and tile borders in favor of spacing, shadows, and rounded surfaces for a cleaner borderless layout.
Co-authored-by: Cursor <cursoragent@cursor.com>