# Finding your CalDAV URLs The app needs two URLs: - `CALDAV_SERVER_URL` — the DAV root used for authentication. - `CALDAV_CALENDAR_URL` — the exact calendar collection events get written to. **Must end with a trailing slash.** Create a dedicated calendar first (e.g. "Orders") so approved entries don't mix in with a personal calendar, then find its URL below. ## Nextcloud 1. Settings → your calendar app → click the three-dot menu next to the calendar → "Link" or "Copy private link". 2. `CALDAV_SERVER_URL`: `https:///remote.php/dav` 3. `CALDAV_CALENDAR_URL`: `https:///remote.php/dav/calendars///` 4. Use an [app password](https://docs.nextcloud.com/server/latest/user_manual/en/session_management.html#managing-devices) for `CALDAV_PASSWORD`, not your account password. ## Fastmail 1. Settings → Calendars → click the calendar → copy the "CalDAV URL". 2. `CALDAV_SERVER_URL`: `https://caldav.fastmail.com/dav/calendars` 3. `CALDAV_CALENDAR_URL`: the full URL copied above (ends in `/`). 4. Generate an [app password](https://www.fastmail.help/hc/en-us/articles/360058752854-App-passwords) scoped to CalDAV. ## iCloud 1. `CALDAV_SERVER_URL`: `https://caldav.icloud.com` 2. Generate an [app-specific password](https://support.apple.com/en-us/102654) for `CALDAV_PASSWORD` (2FA required). 3. `CALDAV_CALENDAR_URL` requires discovering your principal path — the simplest way is to temporarily log the calendars from a Node REPL: ```js const { DAVClient } = require("tsdav"); const client = new DAVClient({ serverUrl: "https://caldav.icloud.com", credentials: { username: "you@icloud.com", password: "app-specific-password" }, authMethod: "Basic", defaultAccountType: "caldav", }); await client.login(); console.log(await client.fetchCalendars()); ``` Pick the `url` of the calendar you want from the printed list. ## Self-hosted Radicale / Baïkal - `CALDAV_SERVER_URL` is your server's base URL (e.g. `https://dav.example.com`). - `CALDAV_CALENDAR_URL` is the collection URL for the specific calendar, typically `https://dav.example.com///`. - Credentials are whatever username/password (or app-specific token) your server issues. ## Verifying After setting the env vars, approve one candidate in the app and confirm the event shows up in your calendar client. If it fails, check the app logs (`docker compose logs -f app`) — CalDAV write failures are returned with the server's status code and response body.