Import from your iPhone calendar — bring everything across in one go
You shouldn't have to type in 200 historical events to switch to FamilyBoard. One tap pulls them in from iOS Calendar — and duplicates can't happen.

The biggest thing stopping people switching calendar app isn't learning the new one — it's moving the old one across. Mia's work schedule six months ahead. Olle's whole football season. The dentist appointments in August. If you have to retype 200 events by hand, you won't switch. You'll stay in the app you've already grown tired of.
Today we close that gap. Import from iPhone calendar is now in FamilyBoard for iOS.
What it is
Open Settings → Calendar sync → Import from iPhone calendar. You'll get a list of every calendar your iPhone knows about — Apple iCloud, possibly Google via Apple's calendar bridge, possibly your work Exchange. Tick the ones you want to read from (default: all except birthdays). Hit Import.
Within a few seconds your events show up in FamilyBoard. Not your entire calendar history — we take 30 days back and 365 forward as the default window. That's enough for the calendar to feel like yours from the first open, without us swallowing five-year-old birthday dinners you've long forgotten.
The important bit — it's idempotent
Run it twice and you get no duplicates. Run it ten times in the same week — still no duplicates. We use the iCal UID that every event carries as a unique key, prefix it with ek- so we know it came from EventKit, and check at the database level whether that event already exists.
This sounds trivial but it's actually the single most valuable decision in the whole feature. It means you can re-run the import a month later to pull in a new work schedule without panic-deleting first. Re-runs make no duplicates. Full stop.
How it works under the hood
On the iOS side we use EventKit:
EKEventStore.requestFullAccessToEventsasks for permission. The grant persists until you revoke it under Settings → Privacy → Calendars.predicateForEvents(withStart:end:calendars:)over the 30-back + 365-forward window, against the calendars you picked.- For each event: check whether
events.ical_uid = 'ek-' || event.calendarItemIdentifieralready exists. If yes — skip. If no — create.
On the server (Supabase) there's a unique index on (family_id, ical_uid) so the same event can't be inserted twice even if two clients race the import. Conflicts become database errors, not crashes or duplicates.
And the other direction?
Export — FamilyBoard → iPhone calendar — has been around for a while. So this means it's two-way now. You can import your existing schedule, keep using the iPhone calendar in parallel if you want, and anything new you add in FamilyBoard writes back.
Two caveats on the export side: we reconstruct the RRULE string for simple recurring events (every week, every Monday), but unusual patterns ("every fourth Tuesday except holidays") get flattened into individual events. We think that's the right call — better that every event shows up than a RRULE interpretation diverging between apps and leaving gaps.
Trade-offs we made on purpose
The 30/365 window isn't configurable in v1. We don't want to surprise users with a multi-minute import on their first run. If you need a wider window — tell us, we'll make it a setting.
No shared Apple calendars in v1. If someone in your family has invited you to an Apple calendar ("School parents 2025-26"), that one doesn't pull in automatically — we only import your own calendars to avoid unexpected leaks across families.
We don't touch your iPhone calendar. The import is read-only from Apple's side. We read, copy, leave the original alone. You can wipe FamilyBoard without disturbing a single row in your iCloud calendar.
Try it
Update FamilyBoard via TestFlight, open Settings → Calendar sync → Import from iPhone calendar. Grant permission, pick calendars, tap. Thirty seconds later you've moved in.
This isn't the shiniest feature we've shipped this year — but it removes the most common reason not to switch. And that's worth a blog post.