[Custom Integration] Calendar Bridge: native reminders and recurring Google/CalDAV events

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]

Example


action: calendar_bridge.create_event


target:

  device_id: <device id of the target calendar>

data:

  summary: Dentist appointment

  start: "2026-10-01 09:00:00"

  end: "2026-10-01 09:30:00"

  reminder_minutes: 30

  rrule: "FREQ=YEARLY"

The action returns the event’s UID. You can later use that UID with calendar_bridge.update_event or calendar_bridge.delete_event.

Installation

Calendar Bridge requires Home Assistant 2026.3 or newer.

It is not yet part of the default HACS store, but you can install it as a custom repository:

  1. Open HACS.
  2. Select Custom repositories.
  3. Add https://github.com/Matthias2703/ha-calendar-bridge as an Integration.
  4. Download Calendar Bridge and restart Home Assistant.

Links

This is still a young project, so feedback and real-world testing would be very helpful. If something does not work as expected, please let me know.

Hi Matthias,

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’

The full sequence is:

  1. create_event succeeds
  2. iCloud event appears correctly
  3. create_event returns UID:
    128d27c0-7f0e-4bed-b6bb-52f1fd733464
  4. delete_event is called with that exact UID
  5. Calendar Bridge calls calendar.event_by_uid(uid)
  6. iCloud/CalDAV returns 412 Precondition Failed
  7. caldav’s fallback search then crashes with:
    TypeError: Calendar.search() got multiple values for argument ‘sort_keys’
  8. Home Assistant reports:
    “Failed to perform the action calendar_bridge.delete_event. Unknown error”

The event itself was created by Calendar Bridge immediately beforehand, so the UID is definitely the UID returned by create_event.

Create therefore works, but delete fails during the UID lookup.

Happy to provide the full traceback/diagnostics if useful.

Hi,

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:

  1. iCloud CalDAV behavior: When doing a REPORT query filtered only by UID without specifying a time range, iCloud responds with 412 Precondition Failed.
  2. 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.

Cheers,

Matthias

HI Matthias

All working great now. Thanks!