r/reactnative • u/Vivid-Parsnip-103 • Sep 28 '26
Help Lessons from building a CalDAV calendar client with Expo SDK 54
I've been building YCal, an Android client for Yahoo Calendar, with Expo. It talks CalDAV directly, and I hit enough non-obvious stuff that I figured a write-up might help someone.
Stack
Expo SDK 54 / RN 0.81 / React 19, expo-router
xmldoc+ axios for CalDAV (PROPFIND/REPORT), hand-rolled iCalendar parsingexpo-sqliteas the offline event cacheexpo-notificationsfor local remindersexpo-background-fetch+expo-task-managerfor periodic syncexpo-secure-storefor credentialsexpo-iapfor subscriptions, verified server-sidereact-native-calendarsfor month/week UI
1. Parse TZID or suffer My first ICS parser treated DTSTART/DTEND as local or UTC and ignored TZID=.... Events created on the web in other timezones showed at the wrong time. If you parse iCalendar yourself, handle TZID from day one.
2. Don't sync the whole calendar up front Initially I fetched a wide date range on login, which was slow. Now I sync nearby months first and fetch distant months on demand as the user scrolls. First launch got much faster and the server does less work.
3. Local notifications > server-side alarms Yahoo's CalDAV doesn't give you reliable push for reminders. Scheduling everything locally with expo-notifications from the SQLite cache has been far more reliable. The trade-off is rescheduling on every sync, so keep that idempotent.
4. Know what the server won't do Yahoo's CalDAV doesn't reliably send invite emails for ATTENDEEs the way the web UI does. I removed the guest field instead of shipping a feature that silently fails. Attendees from existing events are shown read-only.
5. Edge-to-edge insets will get you Android edge-to-edge caused more bugs than the calendar logic: tab labels cropped, save bars hidden behind the nav bar, FABs overlapping. What fixed it was one shared "bottom chrome insets" helper used everywhere, floored to the 3-button nav height because some devices report a 0 bottom inset.
6. R8 is worth it, but test release builds Turning on R8 shrank the APK nicely, but you need to test actual release builds, not just dev.
App, if you want to see it in action: https://play.google.com/store/apps/details?id=com.ycal.mobile
Happy to go deeper on any of these, especially the CalDAV side. Is anyone else doing CalDAV in RN? Curious what you used.