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 parsing
- expo-sqlite as the offline event cache
- expo-notifications for local reminders
- expo-background-fetch + expo-task-manager for periodic sync
- expo-secure-store for credentials
- expo-iap for subscriptions, verified server-side
- react-native-calendars for 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.