Home Assistant’s built-in calendar.create_event action can create events in Google or CalDAV calendars, but I was missing two things: native reminders and recurring events.
There is no way to attach a real reminder or alarm to an event, and the action does not accept rrule. So I built Calendar Bridge.
Calendar Bridge talks directly to the Google Calendar REST API or to CalDAV, where it creates the iCalendar VALARM itself. It works alongside the existing Home Assistant google and caldav integrations. It adds a few configuration controls for each calendar, but does not create duplicate calendar.* entities.
What it can do
Add native popup or email reminders to calendar events
Create recurring events using RRULE
Update or delete a single occurrence of a recurring event
Reuse an existing Home Assistant Google Calendar login
Connect to CalDAV calendars such as iCloud
Manage multiple target calendars per account
Send optional Home Assistant notifications per event or per calendar
Send a test notification for each configured calendar
Start a CalDAV reauthentication flow after a password change
Provide redacted diagnostics for troubleshooting
Register two Lovelace “Create event” cards for phone and tablet layouts
[Layout preview: phone and tablet cards side by side]
Great integration, does what i need but I’ve found what appears to be a problem with delete_event when using Calendar Bridge v0.4.1 with an iCloud/CalDAV calendar.
Environment:
Home Assistant Core: 2026.9.3
Home Assistant OS: 18.2
Calendar Bridge: v0.4.1
Backend: iCloud / CalDAV
Calendar: HITCH Visits
Create works correctly:
calendar_bridge.create_event successfully creates the event in iCloud
the event appears correctly in Apple Calendar
create_event returns a UID
However, calendar_bridge.delete_event fails when given that returned UID.
The HA log shows:
Traceback (most recent call last):
…
File “/config/custom_components/calendar_bridge/caldav_target.py”, line 521, in _delete_event
event = calendar.event_by_uid(uid)
File “/usr/local/lib/python3.14/site-packages/caldav/collection.py”, line 1469, in event_by_uid
return self.object_by_uid(uid, comp_filter=cdav.CompFilter(“VEVENT”))
File “/usr/local/lib/python3.14/site-packages/caldav/collection.py”, line 1415, in object_by_uid
items_found: List[Event] = self.search(root)
File “/usr/local/lib/python3.14/site-packages/caldav/collection.py”, line 1012, in search
return self.search(
…
TypeError: Calendar.search() got multiple values for argument ‘sort_keys’
Immediately before that, the CalDAV library reports:
caldav.lib.error.ReportError: ReportError at ‘412 Precondition Failed’
Thanks a lot for the kind words, and especially for the detailed bug report. The traceback and the exact sequence made this really easy to reproduce and track down!
It turns out there are two issues involved here:
iCloud CalDAV behavior: When doing a REPORT query filtered only by UID without specifying a time range, iCloud responds with 412 Precondition Failed.
A bug in python-caldav: When the library catches that 412, it tries a fallback search internally. In the current release, this runs into an argument handling bug where sort_keys gets passed twice, causing the exact TypeError you saw.
I’ve just published v0.4.2 on GitHub with a workaround for this. Calendar Bridge now catches the error and falls back to a direct URL lookup ({calendar_url}/{uid}.ics), bypassing the broken search. This worked correctly with iCloud in my tests.
Could you update to v0.4.2 and try delete_event again? It would be great if you could let me know whether it fixes the issue on your setup as well.