Nextcloud calendar on Android: DAVx⁵ and the other half

You’ve got a Nextcloud instance. Your calendars live on it, the web UI is fine, and now you want them on your phone, editable, with reminders that actually fire. Most guides tell you to install DAVx⁵ and stop there.

DAVx⁵ is the right answer, but only half of it. The other half is why people end up with calendars that show up but never remind them of anything.

Sync and display are two different jobs

On iOS, CalDAV is a system account type and the stock Calendar app talks to it directly, with one setup screen. Android splits the job in two, and that trips most people up at least once.

Android has a system calendar database, CalendarContract, and around it two distinct roles:

DAVx⁵ does the first job completely and deliberately leaves the second alone. It has no calendar view. Once it has run, your Nextcloud calendars are rows in the platform’s store under a DAVx⁵ account, and every calendar app on the device can see them without knowing Nextcloud exists.

So you connect the phone to Nextcloud, once, and then choose separately which app looks at it.

The setup, in the order it actually goes

Nextcloud’s own manual recommends DAVx⁵, which is a reasonable signal. It’s paid on Google Play and free on F-Droid. It’s the same open-source app either way; the Play listing is how the project is funded.

If you have the Nextcloud app installed, start there: Settings → Sync calendars & contacts. It hands off to DAVx⁵ with Nextcloud’s Login Flow, so you authenticate in a browser and no password is typed into a third app. DAVx⁵ creates the account and hands you back to the Nextcloud app; open DAVx⁵ yourself afterwards and grant it access to your calendars and contacts when it asks.

If you don’t, open DAVx⁵, add an account, pick Nextcloud, and give it your root URL (https://cloud.example.com/, not a path). Same browser login.

If neither works, say because of a reverse proxy doing something unusual or an older server, fall back to Login with URL and user name. The base URL is your Nextcloud plus /remote.php/dav, so https://cloud.example.com/remote.php/dav.

Then the step that is easy to miss: after the account exists, open it in DAVx⁵ and tick the calendars you want. Nothing syncs until you do. Hit refresh, and within a minute your events are in the system store.

Four things that go wrong

Two-factor auth needs an app password. If 2FA is on, your normal account password stops working in DAVx⁵, and the error you get is a uselessly generic “unknown resource” rather than “wrong credentials”. Use an app password: Nextcloud personal settings → Security → Devices & sessions → create one for DAVx⁵. It’s worth doing even without 2FA, because it’s revocable on its own, so a lost phone costs you one token instead of your account.

Battery optimisation eats the schedule. Since Android 6, Doze and app standby will quietly stop a background sync adapter that you don’t open often, and you never open a sync adapter. DAVx⁵ will warn you about this; take the warning and mark it unrestricted. Otherwise sync happens when you open DAVx⁵, which defeats the point.

WebCal subscriptions aren’t CalDAV. A read-only .ics URL (a holiday calendar, a team’s published schedule, a football fixture list) is a different protocol, and DAVx⁵ won’t touch it. That’s ICSx⁵, by the same developer, free on both stores. It writes into the same system database, so it lands in the same place.

Invitation emails come from the server. Add attendees on your phone and DAVx⁵ won’t email anybody; it writes the event and lets the server do the scheduling, per RFC 6638. Nextcloud does send those invitations. A server that doesn’t implement auto-scheduling silently won’t, and it will look like your phone’s fault.

And then: reminders

This one causes a lot of confused forum posts, and it belongs to the second job.

Android’s calendar provider stores your reminders and broadcasts when one comes due. It does not put a notification on your screen. Something has to listen for that broadcast and turn it into one, and the platform delegates that to the installed calendar app.

So if you sync Nextcloud perfectly and then use a calendar app that doesn’t handle reminder delivery, your events are all there, correct, and silent. The sync works fine; nobody is doing the reminder job.

Which calendar app, then

Any of them. Your phone’s stock calendar will show DAVx⁵ calendars the moment they appear, and so will Etar, Fossify Calendar, or Google Calendar if you’re keeping it around for other reasons. The system store is a real integration point that any app can use, which is the benefit of this shape.

I wrote Calendula because I wanted one specific combination: a Material 3 Expressive interface over that provider, reminders delivered by the app itself, and no network permission at all. On a phone whose calendars come from your own server, an app that can’t phone home is a reasonable thing to want.

But with this architecture the choice is yours, and you can change it on a Tuesday. Nothing about your Nextcloud setup is tied to it. You can swap the front end, keep the sync, and lose nothing. Open standards buy you that, and it’s roughly why I build on them.