Calendar Bridge

Semantics and limitations

What is synchronized, how, and — explicitly — what is not. When something cannot be represented faithfully on the other side, the bridge keeps the original untouched, marks the event unsupported (or adds a note to it) and tells you why. It never silently produces an approximate copy and never “repairs” the original to match a limitation.

Field mapping

Field Google Calendar iCloud (iCalendar) Notes
Title summary SUMMARY surrounding whitespace ignored
Notes description (may be HTML) DESCRIPTION (plain text) Google rich text becomes plain text (links kept) in iCloud
Location location LOCATION Apple’s map pin (X-APPLE-STRUCTURED-LOCATION) is preserved, not synced
Start / end start/end (date or dateTime + timeZone) DTSTART/DTEND or DURATION see time zones below
All-day date VALUE=DATE end date exclusive on both sides
Status confirmed, tentative STATUS see cancelled events below
Free/busy transparency TRANSP  
Privacy visibility (default / public / private / confidential) CLASS (absent = default)  
Alerts reminders (popup / email, minutes before) VALARM (DISPLAY/AUDIO/EMAIL) see reminders below
URL source.url URL Google accepts only http(s) URLs
Recurrence recurrence (RRULE/RDATE/EXDATE) RRULE/RDATE/EXDATE RRULE parts normalized, never expanded
Modified occurrence instance event (recurringEventId, originalStartTime) VEVENT with RECURRENCE-ID identity = original start
Cancelled occurrence cancelled instance or EXDATE EXDATE or STATUS:CANCELLED override treated as the same thing
Guests / organizer attendees / organizer ATTENDEE / ORGANIZER shown as text on the mirror only — see meetings
Video call conferenceData, hangoutLink X-GOOGLE-CONFERENCE, CONFERENCE shown as text; never created or regenerated

Everything else is preserved but not synchronized: Google event colors, attachments, guest permissions, other apps’ extended properties; Apple’s X-APPLE-* properties, travel time, structured locations, alerts Google cannot hold. Updates rewrite only the changed fields (Google PATCH, in-place iCalendar edits), so unrelated edits never discard this data.

Time zones

Recurring events

Supported: whole-series changes, single-occurrence changes, cancelled and restored occurrences, moved occurrences, RDATE, EXDATE, series ending (UNTIL/COUNT), splitting a series (“this and following” — both Google and Apple implement it as ending the old series and creating a new one, which the bridge mirrors as exactly that).

Not supported (reported, original kept): RANGE=THISANDFUTURE overrides, EXRULE (deprecated in RFC 5545), RDATE with periods, a resource containing several unrelated events. A modified occurrence on a date the Google series does not generate cannot be stored by Google and is noted.

If one side changes the series timing while the other edits individual occurrences, the item becomes a conflict: occurrence identities depend on the series timing, so merging would be unsafe. When Google itself discards occurrence changes after a series edit (its documented behaviour), the bridge reports the difference instead of deleting them in iCloud.

Reminders

Meetings and invitations

The bridge must never send invitations, cancellations or RSVPs, and must never impersonate an organizer. Therefore:

Cancelled and deleted events

Special Google event types

Type Default
default synchronized
fromGmail (flights, reservations from Gmail) copied to iCloud (CB_MIRROR_GOOGLE_EVENT_TYPES); Google restricts editing them, so edits from iCloud may come back as rejected
outOfOffice, focusTime, workingLocation, birthday unsupported — they have behaviours (auto-decline, working location, contacts’ birthdays) iCloud cannot represent

Calendars

What “synced” means

An item is synced only after the written copy was read back from the provider and every field the bridge wrote matched what was intended (modulo the documented limitations above). A Google event that the bridge has not processed yet is not reported as being in iCloud; the status calendar lists events as “Confirmed in iCloud” only after that verification.