The shared-resources release: attach instance-level bookable resources (a demo lab, meeting rooms) to your event types. A busy resource blocks the slot, confirmed bookings are reserved in the resource's own CalDAV calendar, and team admins can manage attachments through per-resource allowlists. Plus a round of team booking fixes reported from the field.
Shared bookable resources
- Resources are backed by a read-only ICS publish feed (BlueMind, Nextcloud, any iCalendar URL) and managed from the admin panel: feed validation, "Sync now", "Test write", sync-failure indicator (#149, #152)
- Two modes per event type: all (every resource must be free) and round-robin (least-loaded free resource is picked and shown on the booking)
- Reservation write-back into the resource's CalDAV collection prevents cross-event-type double-booking; released on cancel/reschedule
- Per-resource team allowlists: team admins attach allowlisted resources to their own team event types, enforced server-side (#153)
- CLI parity:
calrs event-type slotsconsults resources,calrs booking cancelreleases reservations and cleans the host calendar (#150) - New docs page: Shared Resources
Team booking fixes
- Write-back targets the right calendar (#147): team bookings land on the assigned member's calendar, not the event type owner's. Collective mode is now fully implemented at booking time: it verifies every member, pushes to every member's calendar, and notifies every member. Reminders and the sync orphan sweep follow the same resolution.
- Per-member slot capacity (#146): the double-booking guard is keyed per assigned member, so a round-robin team can take as many parallel bookings per slot as it has free members.
- No more duplicate Fastmail invites (#141): CalDAV write-back marks attendees
SCHEDULE-AGENT=CLIENT(RFC 6638), so scheduling-aware servers no longer send their own UTC invitation on top of the calrs email.
Upgrade notes
Migrations 060 and 061 run automatically on startup (resource team allowlist, per-member booking uniqueness). No config changes required. Thanks to Michael (3dreams-medienagentur) and Matthijs (@MatthijsZw) for the detailed reports and reproducible setups.
🤖 Generated with Claude Code