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. Every guide tells you to install DAVx⁵, and every guide stops there.
DAVx⁵ is the right answer. It’s just not the whole answer, and the missing half is where people end up with calendars that show 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. One thing, one setup screen. Android doesn’t work like that, and the split confuses everybody once.
Android has a system calendar database —
CalendarContract —
and around it, two distinct roles:
- A sync adapter moves bytes between a server and that database. It has no interface beyond an account screen. This is DAVx⁵.
- A calendar app reads that database, draws a month grid, lets you edit, and turns due reminders into notifications. This is whatever you tap on your home screen.
DAVx⁵ does the first job, completely, and deliberately does not do the second. It has no calendar view and never will. 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’re not connecting an app to Nextcloud. You’re connecting the phone to Nextcloud, once, and then choosing separately what 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 — the same open-source app either way; the Play listing is how the project is funded.
If you have the Nextcloud app installed, this is two taps: 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.
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 — a reverse proxy doing something unusual, an older server —
fall back to Connection with URL and username. 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 and your account password. If 2FA is on, your normal password will not work, 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⁵. Worth doing even without 2FA — 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 — which is every sync adapter, because you never open them. 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, not the phone. 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 generates the most confused forum posts, and it belongs to the second job rather than the first.
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 be listening for that broadcast and turning 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 isn’t broken. The job simply has nobody doing it.
Which calendar app, then
Any of them, genuinely. 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, not a vendor API, and that’s the whole 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 — which is a claim you can only make honestly if you never wanted the network in the first place. On a phone whose calendars come from your own server, an app that can’t phone home is a reasonable thing to want.
But the point of the architecture is that this is your choice and you can change it on a Tuesday. Nothing about your Nextcloud setup is tied to it. Swap the front end, keep the sync, lose nothing — which is what open standards buy you, and roughly why I build on them rather than around them.