My calendars disappeared in web, still show via dav

The Basics

  • Nextcloud Server version (e.g., 29.x.x):
    • Nextcloud Hub 26 Winter (33.0.8)
  • Operating system and version (e.g., Ubuntu 24.04):
    • Debian 13
  • Reverse proxy and version _(e.g. nginx 1.27.2)
    • Caddy
  • Installation method (e.g. AlO, NCP, Bare Metal/Archive, etc.)
    • Containerized - Podman
  • Are you using CloudfIare, mod_security, or similar? (Yes / No)
    • no

Summary of the issue:

I was messin around with webdav trying to get my calendar to show in a web app. I ran something like this and I don’t know for sure if it was causal:

const response = await fetch(`${this.calendarUrl}?export&accept=jcal&filter=events&start=${startDate}&end=${endDate}`, {
    method: 'GET',
    headers: {
        'Authorization': 'Basic ' + btoa(this.username + ':' + this.password),
        'Accept': 'application/calendar+json'
    }
});

After this, my calendars are no longer showing in the web app. I am still making changes to them on my phone and they sync to my wife’s phone, but it seems that the calendar somehow is invisible in web.

I have tried:

  • Restarting the Podman containers. No difference.
  • Looking at the nextcloud logs, nothing useful on that date
  • Looking at the podman log output, nothing I can find at this point that is useful.
  • Recreating the calendar with the same name fails: “An error occurred” but nothing in the logs
  • Logging into MariaDB and poking around, especially looking for this issue but I have no records of type 3 in that specific table: DAV properties propertyvalue column has wrong column type · Issue #37754 · nextcloud/server · GitHub

Any idea where to look for corrupt entries or things that might be blocking calendars from loading in the web app? Even where to look for useful logs?

The Browser inspector as described in the support template.

Funny, that does seem a logical thing to check. Some errors and notices, but I don’t know quite what to make of them:

[INFO] calendar: Using periodic background sync
Object { app: "calendar", uid: "user", level: 1 }
calendar-main.js:56:243
[INFO] calendar:
Initial settings:
- AppVersion: 6.6.2
- EventLimit: true
- FirstRun: true
- ShowWeekNumbers: false
- ShowTasks: false
- ShowWeekends: true
- SkipPopover: false
- SlotDuration: 00:30:00
- DefaultReminder: none
- DefaultReminderPartDay: none
- DefaultReminderFullDay: none
- TalkEnabled: false
- TasksEnabled: false
- TasksSidebar: true
- Timezone: automatic
- HideEventExport: false
- ForceEventAlarmType: false
- disableAppointments: false
- CanSubscribeLink: true
- attachmentsFolder: /Calendar
- ShowResources: true
- PublicCalendars:

Object { app: "calendar", uid: "user", level: 1 }
calendar-main.js:56:243
[WARN] @nextcloud/vue: Found no locale to load.
Object { uid: "user", app: "@nextcloud/vue", level: 1, localeCode: "en" }
calendar-main.js:56:308
@nextcloud/calendar-js app is using version 2.2025b of the timezone database calendar-main.js:56:130107
[WARN] calendar: Calendar API not initialized yet
Object { app: "calendar", uid: "user", level: 1 }
calendar-main.js:56:308
[INFO] calendar: Updated moment locale: en
Object { app: "calendar", uid: "user", level: 1 }
calendar-main.js:56:243
[INFO] core: session heartbeat polling started
Object { app: "core", uid: "user", level: 1 }
core-common.js:1:3020080
Notifications permissions denied NotificationsApp-Djbul6i_.chunk.mjs:86:59069
Polling interval updated to 30000 NotificationsApp-Djbul6i_.chunk.mjs:86:58364
Started background fetcher as session_keepalive is enabled NotificationsApp-Djbul6i_.chunk.mjs:86:55524
[ERROR] calendar: [Vue error]: Error in https://vuejs.org/error-reference/#runtime-bm: TypeError: can't access property "split", r is undefined
Object { app: "calendar", uid: "user", level: 1, error: TypeError, vm: Proxy, info: "https://vuejs.org/error-reference/#runtime-bm" }
calendar-main.js:56:374
Got notification data, restoring default polling interval. NotificationsApp-Djbul6i_.chunk.mjs:86:57319
Uncaught (in promise) TypeError: can't access property "findAllCalendars", c() is undefined
    m caldavService.js:67
    backgroundSyncJob Calendar.vue:301
    setInterval handler*created Calendar.vue:299
    m runtime-core.esm-bundler.js:199
    f runtime-core.esm-bundler.js:206
    tx runtime-core.esm-bundler.js:4017
    r9 runtime-core.esm-bundler.js:3933
    r9 runtime-core.esm-bundler.js:8379
    h runtime-core.esm-bundler.js:8302
    r3 runtime-core.esm-bundler.js:8223
    B runtime-core.esm-bundler.js:6116
    I runtime-core.esm-bundler.js:6082
    k runtime-core.esm-bundler.js:5576
    effect runtime-core.esm-bundler.js:6310
    run reactivity.esm-bundler.js:264
    runIfDirty reactivity.esm-bundler.js:302
    m runtime-core.esm-bundler.js:199
    e runtime-core.esm-bundler.js:412
    promise callback*E runtime-core.esm-bundler.js:322
    S runtime-core.esm-bundler.js:338
    rp runtime-core.esm-bundler.js:7654
    scheduler runtime-core.esm-bundler.js:897
    <anonymous> reactivity.esm-bundler.js:1950
    trigger reactivity.esm-bundler.js:292
    y reactivity.esm-bundler.js:350
    notify reactivity.esm-bundler.js:641
    trigger reactivity.esm-bundler.js:615
    set value reactivity.esm-bundler.js:1554
    el vue-router.js:1392
    W vue-router.js:1320
    promise callback*W vue-router.js:1305
    W vue-router.js:1290
    install vue-router.js:1508
    use runtime-core.esm-bundler.js:4250
    32153 main.js:52
    s calendar-main.js:68
    <anonymous> calendar-main.js:68
    <anonymous> calendar-main.js:68
caldavService.js:67:9

This is the stack trace in that first error. There’s a whole vue object in there, so I’m only posting this. Let me know if I should post more:

_extractAdvertisedDavFeatures@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:53:377104
connect@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:53:370027
async*u@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:29:428
beforeMount@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:16:888461
20641/eK/</<@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:63227
m@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:46376
f@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:46458
20641/eX/r.__weh@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:63107
invokeArrayFns@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:155074
20641/rn/z/e.effect<@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:80051
run@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:29829
z@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:80647
B@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:78769
I@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:78544
k@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:75333
20641/rn/z/e.effect<@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:79819
run@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:29829
runIfDirty@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:30132
m@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:46384
e@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:47526
promise callback*E@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:47418
S@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:47832
rp@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:90638
20641/Z/c.scheduler@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:50050
@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:45095
trigger@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:30075
y@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:30442
notify@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:33178
trigger@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:33073
set value@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:41789
el@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:67:753706
12039/eh/W/<@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:67:752215
promise callback*W@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:67:752068
W@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:67:751675
install@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:67:756238
use@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:7:86413
32153@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:16:1059430
s@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:68:953899
@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:68:973373
@https://<mydomain>/custom_apps/calendar/js/calendar-main.js?v=cf4547c9-8:68:973383

And as far as I can tell, this is the actual corresponding line of code that triggers the error: this.advertisedFeatures.push(...r.split(",").map(e=>e.trim()))}_createPublicCalendarHome(){let e=this._request.pathname(this.rootUrl)+"public-calendars/";

If anyone knows the calendar code well, I appreciate the help.

Are you messing with CORS headers at all? That’s the main trigger for this that I’m aware of.

Wow, incredible. Removing my reverse proxy CORS headers restored calendars.

I feel like politely throwing a CORS error would have been helpful on Nextcloud’s or the browser’s part, but I will take this answer without complaining.

For the poor souls who find themselves searching for this topic:

  • I use Caddy as a reverse proxy. This works fine, and I have dealt with some CORS issues the Caddy way via handle @cors_preflight and got access to some other apis.
  • I tried to do the same for Nextcloud, but it appears this broke the web app’s ability to access its own webdav without throwing any CORS errors.
  • Now that I know what mistake I am making, I found this app that handles header injection from inside Nextcloud, and I believe I am back on the right track.