Commit Graph

32 Commits

Author SHA1 Message Date
Jeff Emmett 28a051bebe Add sablier override for scale-to-zero
Labels for web/prosody/jicofo/jvb to join jeffsi-meet sablier group.
Disables traefik on web (routing handled by sablier dynamic config).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 23:22:28 -04:00
Jeff Emmett bddd22453c fix(mobile): comprehensive mobile rendering fixes for all platforms
- index.html: add viewport-fit=cover, user-scalable=no, maximum-scale=1,
  apple-mobile-web-app-capable, format-detection meta tags
- close2.html: add missing viewport meta tag and mobile web app tags
- _base.scss: add touch-action:manipulation and -webkit-tap-highlight-color
  on body for 300ms tap delay fix and Android tap flash removal
- _videolayout_default.scss: fix invalid overflow:'hidden' (quoted string),
  add vh fallback before dvh for iOS 14 compat
- _toolbars.scss: move :active states outside hover media query so touch
  devices get visual feedback on hangup button
- _whiteboard.scss: add dvh/dvw fallback for iOS Safari address bar

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 19:32:54 -04:00
Jeff Emmett 2314d7d3f4 fix(base): add missing DialogErrorBoundary component
Required by App.web.tsx for error boundary wrapping of dialogs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 19:04:16 -04:00
Jeff Emmett 8dc9c74c45 feat(shared-video): add video source types, embed URLs, and tile view support
Adds VIDEO_SOURCE_TYPES, getVideoSourceType, getVideoEmbedUrl to
shared-video for multi-platform embed support (Vimeo, Dailymotion,
Twitch). Adds SharedVideoTile and EmbedPlayerManager components.
Updates shared-music with embed player manager and source type helpers.
CSS fixes for meeting intelligence, toolbars, and filmstrip tiles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 18:58:10 -04:00
Jeff Emmett 1706dc47a3 feat(meeting-intelligence): add conference_prefix filter for space-scoped meetings
Adds optional conference_prefix query param to GET /meetings that filters
by conference_id LIKE prefix%. This enables rMeets to scope MI data per space.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 18:37:25 -04:00
Jeff Emmett 2984a2944c feat(shared-video): show shared video in tile view and default to tile layout
Remove auto-exit from tile view when video is shared, stop auto-pinning
the video participant, and render shared videos as embedded tiles in the
filmstrip. Users can still click to pin/maximize the video to stage view.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 16:47:52 -04:00
Jeff Emmett 2fe77055a9 feat(meeting-intelligence): add per-meeting access control
Restrict MI data so only meeting attendees can access their meetings.
Each meeting gets a unique access_token generated at creation time.
Attendees discover their token via conference_id (room name) lookup.

Backend:
- New auth.py with Bearer token validation and multi-token extraction
- Token generation in create_meeting(), backfill on startup
- All endpoints gated: list_meetings filters by X-MI-Tokens header,
  per-meeting endpoints require Authorization: Bearer <token>
- New GET /meetings/token?conference_id=<room> discovery endpoint

Frontend:
- tokenStorage.ts manages tokens in localStorage keyed by room name
- middleware.ts auto-fetches token on CONFERENCE_JOINED
- All API calls in actions.ts now include auth headers

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 10:18:13 -04:00
Jeff Emmett 4efcdfbf36 feat(meeting-intelligence): add toolbar button and close page link
- Add meetingintelligence to toolbarButtons and interface_config on server
- Add "View Meeting Recordings & Transcripts" link to close page
- Fix shared-video TS errors that blocked webpack builds

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 17:54:02 -04:00
Jeff Emmett e53dc5ae97 fix(deploy): tolerate webpack TS warnings when bundles are emitted
The shared-video module has pre-existing TS errors that cause webpack to
exit non-zero even though all bundles are successfully emitted. Split
make all into compile + deploy with a check for the output bundle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 16:16:26 -04:00
Jeff Emmett 57db6da004 feat(mobile): add swipe navigation and tileview button for mobile layout switching
Add Zoom-like layout switching on mobile web: horizontal swipe on video area
toggles between speaker and tile view, tileview button now visible in toolbar
at mobile widths (≤470px), and layout indicator dots show current view mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 16:09:35 -04:00
Jeff Emmett 65c4a1acf0 feat(shared-media): show volume controls to all participants
Previously only the media owner could see playback controls (including
volume). Now all participants see native controls so they can adjust
their local volume independently. Playback sync still overrides
non-owner play/pause/seek actions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 15:29:02 -04:00
Jeff Emmett f40b8bd97d fix(mi-api): handle RunPod vLLM output format and jsonb serialization
Fixes three issues preventing summary generation via RunPod GPU:
- Extract text from vLLM's nested choices/tokens output format
- Strip LLM preamble text before JSON parsing
- Serialize lists to JSON strings for asyncpg jsonb columns

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 10:14:41 -07:00
Jeff Emmett 76d44975cb feat(mi-api): add configurable timeout + AI orchestrator GPU fallback
Increase Ollama timeout from hardcoded 120s to configurable 600s default.
Add optional AI Orchestrator integration for RunPod GPU acceleration with
automatic fallback to direct Ollama when orchestrator is unavailable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 20:08:28 -07:00
Jeff Emmett aa85248a22 fix(mobile): show toolbox controls immediately on mobile browsers
The toolbox was hidden by default on mobile and only appeared on tap,
which users couldn't discover. Now shows controls on conference mount
since the mobile auto-hide timeout is already a no-op.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:31:41 -07:00
Jeff Emmett ec77b5f471 feat(video-layout): make videos fill tiles and remove blurred background
Videos now use object-fit: cover in all thumbnail types, removing dark
bars around portrait videos. Hides the blurred large video background
and makes the large video fill its container edge-to-edge.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 13:28:03 -07:00
Jeff Emmett 325960fa15 feat(reactions,chat): expand emoji features across reactions, chat picker, and message reactions
Add 8 new floating reactions (party, thinking, wave, cry, eyes, mindblown, pray, rocket) in a
two-row grid layout without sounds or shortcuts. Replace the basic SmileysPanel in chat with a
full @emoji-mart/react picker featuring categories, search, and skin tones. Expand message
reaction quick-access from 5 to 8 emojis with a "+" button to open the full picker.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 11:22:48 -07:00
Jeff Emmett ef6a5a1ffe feat(video-layout): default to tile view on conference join
Also add tooltip to Meeting Intelligence button explaining that
recordings are transcribed by self-hosted AI post-recording.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 14:15:27 -08:00
Jeff Emmett 528d8d2962 chore: remove CLAUDE.md from git tracking
CLAUDE.md may contain project context with credentials and is now
covered by global gitignore to prevent accidental secret commits.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 14:41:15 -08:00
Jeff Emmett c835176a80 fix(mobile): enable mobile browser support by disabling deep-linking
Mobile users were being blocked by a deep-linking page prompting them to
download the Jitsi Meet app. Since this is a self-hosted instance with no
native app, disable deep-linking so users join directly in the browser.

- Set deeplinking.disabled: true in config.js
- Set MOBILE_APP_PROMO: false in interface_config.js
- Fix mobile header background to match purple theme

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 11:22:06 -07:00
Jeff Emmett 70a0ca61ec feat(dashboard): add standalone recordings dashboard page
- View all recorded meetings with status indicators
- Display full transcripts with timestamps
- Search/filter meetings
- Export transcripts as JSON
- Copy transcript text to clipboard
- Auto-refresh every 30 seconds
- Purple theme matching Jeffsi Meet branding

Accessible at: https://meet.jeffemmett.com/recordings.html

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 12:58:50 +00:00
Jeff Emmett dd12348da8 fix(meeting-intelligence): fix transcription pipeline bugs
- Fix JSONB serialization in API database.py (json.dumps + ::jsonb casts)
- Fix integer vs UUID job ID handling in transcriber
- Fix UUID-to-string conversion for meeting_id in processor
- Add whisper.cpp shared libraries to Dockerfile (libwhisper, libggml)
- Fix Jibri finalize script log directory path
- Add graceful error handling for speaker diarization
- Support video_path parameter for automatic audio extraction

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 12:25:59 +00:00
Jeff Emmett 0e9c78c86a feat(deploy): add video quality and TURN configuration
- Add .env.example with documented video quality bitrate settings
- Configure VP8/VP9/H264/AV1 codec bitrates for optimal quality
- Add STUN/TURN server configuration for NAT traversal
- Document required firewall rules for media traffic
- Update branding: watermark, variables, interface config

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:36:17 +00:00
Jeff Emmett 68016c30f6 feat(meeting-intelligence): add frontend dashboard for recordings and transcripts
Adds the Meeting Intelligence dashboard UI with:
- Toolbar button to open side panel during meetings
- Recordings list showing past meeting recordings
- Transcript viewer with speaker diarization colors
- AI summary panel with key points, action items, decisions
- Search panel for searching across all transcripts
- Export functionality (Markdown, PDF, JSON)

Frontend components:
- MeetingIntelligenceButton (toolbar integration)
- MeetingIntelligenceDashboard (side panel container)
- RecordingsList, TranscriptViewer, SummaryPanel, SearchPanel

Integrations:
- Redux state management via ReducerRegistry
- Config support via meetingIntelligence settings
- SCSS styles matching Jitsi design system

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 02:24:50 +00:00
Jeff Emmett 9f9bb309bb fix(meeting-intelligence): fix Jibri XMPP connection and transcriber build
- Add wget to builder stage for model download
- Add curl and build-essential to production stage for health check and webrtcvad
- Remove unused whisper_models volume (model baked into image)
- Fix WHISPER_MODEL env var to use full path
- Update Jibri to use Docker internal DNS names (meet.jitsi)
- Connect Jibri to jeffsi-meet_meet.jitsi network for Prosody access

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 20:34:17 +00:00
Jeff Emmett 4cb219db0f feat(meeting-intelligence): add backend infrastructure for transcription and AI summaries
Add complete Meeting Intelligence System infrastructure:

Backend Services:
- PostgreSQL schema with pgvector for semantic search
- Transcription service using whisper.cpp and resemblyzer for diarization
- Meeting Intelligence API with FastAPI
- Jibri configuration for recording

API Endpoints:
- /meetings - List, get, delete meetings
- /meetings/{id}/transcript - Get transcripts with speaker attribution
- /meetings/{id}/summary - Generate AI summaries via Ollama
- /search - Full-text and semantic search
- /meetings/{id}/export - Export as PDF, Markdown, JSON
- /webhooks/recording-complete - Jibri callback

Features:
- Zero-cost local transcription (whisper.cpp CPU)
- Speaker diarization (who said what)
- AI-powered summaries with key points, action items, decisions
- Vector embeddings for semantic search
- Multi-format export

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 19:04:19 +00:00
Jeff Emmett f56986818b feat(shared-music): add support for Vimeo, SoundCloud, Spotify, Dailymotion, Twitch
- Add source type detection for Vimeo, SoundCloud, Spotify, Dailymotion, Twitch
- Create EmbedPlayerManager for iframe-based media players
- Update extractMusicUrl to extract IDs from various platforms
- Update SharedMusicPlayer to route to appropriate player manager
- Update SharedMusicTile to handle video vs audio sources
- Video sources (YouTube, Vimeo, Dailymotion, Twitch) show embedded player
- Audio sources (SoundCloud, Spotify) show embedded widget
- Direct audio files show HTML5 audio player with custom controls

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 16:43:22 +00:00
Jeff Emmett 751a04b950 feat(shared-music): display YouTube video in tile view with controls
- Add SharedMusicTile component for rendering video in filmstrip
- Create fake participant for shared music (shows as tile, not pinned)
- Make YouTube player visible with proper dimensions in tile
- Remove auto-mute behavior when sharing music
- Add SharedMusic to FakeParticipant enum
- Add isSharedMusicParticipant helper function
- Move player rendering from LargeVideo to tile
- Add CSS styles for player wrapper and controls overlay

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 16:29:59 +00:00
Jeff Emmett b6fc0ae0b5 feat(deploy): add Docker build and deployment configuration
- Add Dockerfile based on jitsi/web with custom web client
- Add docker-compose.yml for local testing
- Add deploy.sh script for automated builds and deployment
- Add .dockerignore to optimize Docker builds

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:26:30 +00:00
Jeff Emmett 237f2c5cdf docs(config): add sharedmusic to toolbar buttons documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:13:23 +00:00
Jeff Emmett dfebe26cd1 fix(shared-music): render player and add mobile/native support
- Add SharedMusicPlayer to LargeVideo.web.tsx so audio actually plays
- Handle mobile autoplay restrictions in DirectAudioManager with
  fallback to play on user interaction
- Add native (React Native) components for SharedMusicDialog and
  SharedMusicButton to support iOS/Android apps

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:04:01 +00:00
Jeff Emmett 1c9fed8794 feat(shared-music): add synchronized music playback feature
Add a new shared-music feature that allows users to share YouTube or
direct audio URLs with all participants. Music plays locally on each
device with the host controlling playback (play/pause/seek/volume).

New feature module includes:
- Redux state management (actions, reducer, middleware)
- Conference command sync for real-time playback coordination
- YouTube player (hidden video, audio only) via react-youtube
- HTML5 audio player for direct audio URLs
- Toolbar button with share dialog
- Translation strings for all UI elements

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 18:43:22 +00:00
Jeff Emmett 9f4b09d135 Initial commit: Jeffsi Meet - forked from Jitsi Meet 2026-01-08 19:27:14 +01:00