11 KiB
Multi-Provider Video Platform Implementation - Coder Briefing
Your Mission
Implement multi-provider video platform support in Reflector, allowing the system to work with both Whereby and Daily.co video conferencing providers. The goal is to abstract the current Whereby-only implementation and add Daily.co as a second provider, with the ability to switch between them via environment variables.
Branch: igor/dailico-2 (you're already on it)
Estimated Time: 12-16 hours (senior engineer)
Complexity: Medium-High (requires careful integration with existing codebase)
What You Have
1. PLAN.md - Your Technical Specification (2,452 lines)
- Complete step-by-step implementation guide
- All code examples you need
- Architecture diagrams and design rationale
- Testing strategy and success metrics
- Read this first to understand the overall approach
2. IMPLEMENTATION_GUIDE.md - Your Practical Guide
- What to copy vs. adapt vs. rewrite
- Common pitfalls and how to avoid them
- Verification checklists for each phase
- Decision trees for implementation choices
- Use this as your day-to-day reference
3. Reference Implementation - ./reflector-dailyco-reference/
- Working implementation from 2.5 months ago
- Good architecture and patterns
- BUT: 91 commits behind current main, DO NOT merge directly
- Use for inspiration and code patterns only
Critical Context: Why Not Just Merge?
The reference branch (origin/igor/feat-dailyco) was started on August 1, 2025 and is now severely diverged from main:
- 91 commits behind main
- Main has 12x more changes (45,840 insertions vs 3,689)
- Main added: calendar integration, webhooks, full-text search, React Query migration, security fixes
- Reference removed: features that main still has and needs
Merging would be a disaster. We're implementing fresh on current main, using the reference for validated patterns.
High-Level Approach
Phase 1: Analysis (2 hours)
- Study current Whereby integration
- Define abstraction requirements
- Create standard data models
Phase 2: Abstraction Layer (4-5 hours)
- Build platform abstraction (base class, registry, factory)
- Extract Whereby into the abstraction
- Update database schema (add
platformfield) - Integrate into rooms.py without breaking calendar/webhooks
Phase 3: Daily.co Implementation (4-5 hours)
- Implement Daily.co client
- Add webhook handler
- Create frontend components (rewrite API calls for React Query)
- Add recording processing
Phase 4: Testing (2-3 hours)
- Unit tests for platform abstraction
- Integration tests for webhooks
- Manual testing with both providers
Key Files You'll Touch
Backend (New)
server/reflector/video_platforms/
├── __init__.py
├── base.py ← Abstract base class
├── models.py ← Platform, MeetingData, VideoPlatformConfig
├── registry.py ← Platform registration system
├── factory.py ← Client creation and config
├── whereby.py ← Whereby client wrapper
├── daily.py ← Daily.co client
└── mock.py ← Mock client for testing
server/reflector/views/daily.py ← Daily.co webhooks
server/tests/test_video_platforms.py ← Platform tests
server/tests/test_daily_webhook.py ← Webhook tests
Backend (Modified - Careful!)
server/reflector/settings.py ← Add Daily.co settings
server/reflector/db/rooms.py ← Add platform field, PRESERVE calendar fields
server/reflector/db/meetings.py ← Add platform field
server/reflector/views/rooms.py ← Integrate abstraction, PRESERVE calendar/webhooks
server/reflector/worker/process.py ← Add process_recording_from_url task
server/reflector/app.py ← Register daily router
server/env.example ← Document new env vars
Frontend (New)
www/app/[roomName]/components/
├── RoomContainer.tsx ← Platform router
├── DailyRoom.tsx ← Daily.co component (rewrite API calls!)
└── WherebyRoom.tsx ← Extract existing logic
Frontend (Modified)
www/app/[roomName]/page.tsx ← Use RoomContainer
www/package.json ← Add @daily-co/daily-js
Database
server/migrations/versions/XXXXXX_add_platform_support.py ← Generate fresh migration
Critical Warnings ⚠️
1. DO NOT Copy Database Migrations
The reference migration has the wrong down_revision and is based on old schema.
# Instead:
cd server
uv run alembic revision -m "add_platform_support"
# Then edit the generated file
2. DO NOT Remove Main's Features
Main has calendar integration, webhooks, ICS sync that reference doesn't have.
When modifying rooms.py, only change meeting creation logic, preserve everything else.
3. DO NOT Copy Frontend API Calls
Reference uses old OpenAPI client. Main uses React Query. Check how main currently makes API calls and replicate that pattern.
4. DO NOT Copy package.json/migrations
These files are severely outdated in reference.
5. Preserve Type Safety
Use TYPE_CHECKING imports to avoid circular dependencies:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from reflector.db.rooms import Room
How to Start
Day 1 Morning: Setup & Understanding (2-3 hours)
# 1. Verify you're on the right branch
git branch
# Should show: igor/dailico-2
# 2. Read the docs (in order)
# - PLAN.md (skim to understand scope, read Phase 1 carefully)
# - IMPLEMENTATION_GUIDE.md (read fully, bookmark it)
# 3. Study current Whereby integration
cat server/reflector/views/rooms.py | grep -A 20 "whereby"
cat www/app/[roomName]/page.tsx
# 4. Check reference implementation structure
ls -la reflector-dailyco-reference/server/reflector/video_platforms/
Day 1 Afternoon: Phase 1 Execution (2-3 hours)
# 5. Copy video_platforms directory from reference
cp -r reflector-dailyco-reference/server/reflector/video_platforms/ \
server/reflector/
# 6. Review and fix imports
cd server
uv run ruff check reflector/video_platforms/
# 7. Add settings to settings.py (see PLAN.md Phase 2.7)
# 8. Test imports work
uv run python -c "from reflector.video_platforms import create_platform_client; print('OK')"
Day 2: Phase 2 - Database & Integration (4-5 hours)
# 9. Generate migration
uv run alembic revision -m "add_platform_support"
# Edit the file following PLAN.md Phase 2.8
# 10. Update Room/Meeting models
# Add platform field, PRESERVE all existing fields
# 11. Integrate into rooms.py
# Carefully modify meeting creation, preserve calendar/webhooks
# 12. Add Daily.co webhook handler
cp reflector-dailyco-reference/server/reflector/views/daily.py \
server/reflector/views/
# Register in app.py
Day 3: Phase 3 - Frontend & Testing (4-5 hours)
# 13. Create frontend components
mkdir -p www/app/[roomName]/components
# 14. Add Daily.co dependency
cd www
pnpm add @daily-co/daily-js@^0.81.0
# 15. Create RoomContainer, DailyRoom, WherebyRoom
# IMPORTANT: Rewrite API calls using React Query patterns
# 16. Regenerate types
pnpm openapi
# 17. Copy and adapt tests
cp reflector-dailyco-reference/server/tests/test_*.py server/tests/
# 18. Run tests
cd server
REDIS_HOST=localhost \
CELERY_BROKER_URL=redis://localhost:6379/1 \
uv run pytest tests/test_video_platforms.py -v
Verification Checklist
After implementation, all of these must pass:
Backend:
cd server && uv run ruff check .passesuv run alembic upgrade headworks cleanlyuv run pytest tests/test_video_platforms.pypasses- Can import:
from reflector.video_platforms import create_platform_client - Settings has all Daily.co variables
Frontend:
cd www && pnpm lintpasses- No TypeScript errors
pnpm openapigenerates platform field- No
@ts-ignorefor platform field
Integration:
- Whereby meetings still work (existing flow unchanged)
- Calendar/webhook features still work in rooms.py
- env.example documents all new variables
When You're Stuck
Check These Resources:
- PLAN.md - Detailed code examples for your exact scenario
- IMPLEMENTATION_GUIDE.md - Common pitfalls section
- Reference code - See how it was solved before
- Git diff - Compare reference to your implementation
Compare Files:
# See what reference did
diff reflector-dailyco-reference/server/reflector/views/rooms.py \
server/reflector/views/rooms.py
# See what changed in main since reference branch
git log --oneline --since="2025-08-01" -- server/reflector/views/rooms.py
Common Issues:
- Circular imports: Use
TYPE_CHECKINGpattern - Tests fail with postgres error: Use
REDIS_HOST=localhostenv vars - Frontend API calls broken: Check current React Query patterns in main
- Migrations fail: Ensure you generated fresh, not copied
Success Looks Like
When you're done:
- ✅ All tests pass
- ✅ Linting passes
- ✅ Can create Whereby meetings (unchanged behavior)
- ✅ Can create Daily.co meetings (with env vars)
- ✅ Calendar/webhooks still work
- ✅ Frontend has no TypeScript errors
- ✅ Platform selection via environment variables works
Communication
If you need clarification on requirements, have questions about architecture decisions, or find issues with the spec, document them clearly with:
- What you expected
- What you found
- Your proposed solution
The PLAN.md document is comprehensive but you may find edge cases. Use your engineering judgment and document decisions.
Final Notes
This is not a simple copy-paste job. You're doing careful integration work where you need to:
- Understand the abstraction pattern (PLAN.md)
- Preserve all of main's features
- Adapt reference code to current patterns
- Think about edge cases and testing
Take your time with Phase 2 (rooms.py integration) - that's where most bugs will come from if you accidentally break calendar/webhook features.
Good luck! You've got comprehensive specs, working reference code, and a clean starting point. You can do this.
Quick Reference
# Your workspace
├── PLAN.md ← Complete technical spec (read first)
├── IMPLEMENTATION_GUIDE.md ← Practical guide (bookmark this)
├── CODER_BRIEFING.md ← This file
└── reflector-dailyco-reference/ ← Reference implementation (inspiration only)
# Key commands
cd server && uv run ruff check . # Lint backend
cd www && pnpm lint # Lint frontend
cd server && uv run alembic revision -m "..." # Create migration
cd www && pnpm openapi # Regenerate types
cd server && uv run pytest -v # Run tests