- Replace VideoConference with custom layout: GridLayout for cameras,
FocusLayout when someone shares screen (carousel + focused view)
- Bottom control bar: mic, camera, screen share, chat, lobby,
moderation, hand raise, leave/end — all as round icon buttons
- Top bar reduced to minimal room name + code badge
- MediaControls: synced with LiveKit track state via RoomEvents
- LeaveButton disconnects and redirects (host → dashboard, guest → home)
- Screen share auto-detected: switches to focus layout with carousel
- Chat: fix race condition where SSE delivers message before POST
response, causing duplicate — now checks if real msg already exists
- LobbyManager: add max-h-72 + overflow-y-auto for long participant lists
- ModerationPanel: hide kick/ban buttons for yourself (useLocalParticipant),
add max-h-80 + overflow scroll, show API errors instead of silencing
- Moderate API: reject kick/ban when targetSessionId === host userId
- Design system: CSS custom properties (surface levels, accent, status colors, scrollbar, focus-visible)
- Landing: hero with gradient title, feature cards with SVG icons
- Auth pages: consistent card layout with design tokens
- Dashboard: sticky top bar, room grid with status dots, empty state
- Create room: toggle switches, form validation with spinners
- Join flow: room info card with status badge, monospace code input
- Room page: top bar with sidebar toggles (chat/lobby/moderation)
- Chat: bubble messages with optimistic UI, empty state
- Moderation: participant list with avatar initials, kick/ban
- Lobby: waiting animation with pulsing rings, approve/reject
- HTTPS: dev:https script, setup.sh auto-configures BETTER_AUTH_URL
- Auth: trustedOrigins now includes both http:// and https://
- Use @prisma/adapter-pg for PrismaClient (Prisma 7 removed datasourceUrl/datasources)
- prisma.config.ts: migrate.url for CLI commands
- schema.prisma: no url in datasource (Prisma 7 requirement)
- Add url = env("DATABASE_URL") back to schema (required by Prisma 7.5)
- Simplify prisma.config.ts
- First registered user auto-promoted to ADMIN via databaseHooks
- Subsequent users get HOST role
- auth.ts: auto-allow localhost:3000-3010 + LAN_HOST for trustedOrigins
- setup.sh: new `dev` command (update + kill old processes + auto LAN IP + launch)
- next.config.ts: allowedDevOrigins for LAN HMR
- Remove hardcoded baseURL from auth-client.ts — better-auth now uses
current window.location.origin, works from any IP/domain
- Add trustedOrigins config to auth.ts — allows requests from LAN IPs
- Add BETTER_AUTH_TRUSTED_ORIGINS env var for configuring allowed origins
- Improve error logging in login/register forms (was silent catch)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>