Files
aris/packages/aris-source-caldav
Kenneth 31d5aa8d50 fix(caldav): expand recurring events in range (#55)
The iCal parser returned master VEVENT components with their
original start dates instead of expanding recurrences. Events
from months ago appeared in today's feed.

parseICalEvents now accepts an optional timeRange. When set,
recurring events are expanded via ical.js iterator and only
occurrences overlapping the range are returned. Exception
overrides (RECURRENCE-ID) are applied during expansion.

Co-authored-by: Ona <no-reply@ona.com>
2026-03-04 23:17:14 +00:00
..

@aris/source-caldav

A FeedSource that fetches calendar events from any CalDAV server.

Usage

import { CalDavSource } from "@aris/source-caldav"

// Basic auth (Nextcloud, Radicale, Baikal, iCloud, etc.)
const source = new CalDavSource({
	serverUrl: "https://caldav.example.com",
	authMethod: "basic",
	username: "user",
	password: "pass",
	lookAheadDays: 7, // optional, default: 0 (today only)
	timeZone: "America/New_York", // optional, default: UTC
})

// OAuth
const source = new CalDavSource({
	serverUrl: "https://caldav.provider.com",
	authMethod: "oauth",
	accessToken: "...",
	refreshToken: "...",
	tokenUrl: "https://provider.com/oauth/token",
})

iCloud

Use your Apple ID email as the username and an app-specific password:

const source = new CalDavSource({
	serverUrl: "https://caldav.icloud.com",
	authMethod: "basic",
	username: "you@icloud.com",
	password: "<app-specific-password>",
})

Testing

bun test

Live test

bun run test:live connects to a real CalDAV server and prints all events to the console. It prompts for:

  • CalDAV server URL — e.g. https://caldav.icloud.com
  • Username — your account email
  • Password — your password (or app-specific password for iCloud)
  • Look-ahead days — how many days beyond today to fetch (default: 0)

The script runs both fetchContext and fetchItems, printing the calendar context (in-progress events, next event, today's count) followed by each event with its title, time, location, signals, and attendees.