- Switch frontend from nginx to caddy for consistency with Coolify
- Make VITE_API_URL optional, auto-derive from window.location.origin/api
- Remove hardcoded port mappings, let Coolify/Traefik handle routing
- Simplifies deployment configuration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Switch frontend from nginx to caddy for consistency with Coolify
- Make VITE_API_URL optional, auto-derive from window.location.origin/api
- Simplifies deployment by not requiring build-time API URL
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add docker-compose.prod.yml with env var support
- Add frontend/Dockerfile.prod with nginx for static serving
- Fix Zulip notification to run in thread pool (avoid blocking)
- Use Zulip time format for timezone-aware display
- Add Zulip @mentions for users matched by email
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add email service for sending meeting invites with ICS attachments
- Add scheduler for background calendar sync jobs
- Add Zulip service for meeting notifications
- Make ics_url optional for participants
- Add /api/schedule endpoint with 2-hour lead time validation
- Update frontend to support scheduling flow
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>