No description
  • TypeScript 90.9%
  • JavaScript 6.9%
  • Nix 2.1%
  • Dockerfile 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
marti 09ef9f4b78
All checks were successful
publish / publish (push) Successful in 1m38s
ci / check (push) Successful in 1m34s
ci / nix (push) Successful in 51s
Merge branch 'release/0.1.0'
2026-09-26 13:05:08 +02:00
.claude chore: wire graft into the repo for agents 2026-09-26 12:02:24 +02:00
.forgejo/workflows ci: create the Forgejo release with a node script 2026-09-26 13:05:08 +02:00
credentials refactor!: rebuild the node on the new client, with no runtime dependencies 2026-09-26 12:20:22 +02:00
docs docs: rewrite the README and add usage, development and architecture docs 2026-09-26 12:29:26 +02:00
icons feat(lib): expand recurrences on the client, in the event's timezone 2026-09-26 12:19:20 +02:00
nodes/Caldav feat(event): update an event in place 2026-09-26 12:23:40 +02:00
scripts ci: create the Forgejo release with a node script 2026-09-26 13:05:08 +02:00
test feat(event): update an event in place 2026-09-26 12:23:40 +02:00
.editorconfig chore: add editor and git attributes, drop a stray local n8n folder 2026-09-26 11:53:23 +02:00
.env.example build: add a Nix flake, a compose stack and a Radicale for the tests 2026-09-26 12:01:44 +02:00
.envrc build: add a Nix flake, a compose stack and a Radicale for the tests 2026-09-26 12:01:44 +02:00
.gitattributes chore: add editor and git attributes, drop a stray local n8n folder 2026-09-26 11:53:23 +02:00
.gitignore chore: add editor and git attributes, drop a stray local n8n folder 2026-09-26 11:53:23 +02:00
.ignore chore: wire graft into the repo for agents 2026-09-26 12:02:24 +02:00
.mcp.json chore: wire graft into the repo for agents 2026-09-26 12:02:24 +02:00
.prettierignore chore: wire graft into the repo for agents 2026-09-26 12:02:24 +02:00
.prettierrc.json build: move to the @n8n/node-cli toolchain and vitest 2026-09-26 11:57:00 +02:00
AGENTS.md docs: rewrite the README and add usage, development and architecture docs 2026-09-26 12:29:26 +02:00
CHANGELOG.md chore(release): 0.1.0 2026-09-26 12:53:07 +02:00
CLAUDE.md docs: rewrite the README and add usage, development and architecture docs 2026-09-26 12:29:26 +02:00
compose.yaml build: add a Nix flake, a compose stack and a Radicale for the tests 2026-09-26 12:01:44 +02:00
eslint.config.mjs feat(lib): add a dependency-free CalDAV client and iCalendar layer 2026-09-26 12:09:32 +02:00
flake.lock build: add a Nix flake, a compose stack and a Radicale for the tests 2026-09-26 12:01:44 +02:00
flake.nix build: publish only what a clean build produces 2026-09-26 12:32:39 +02:00
lefthook.yml docs: rewrite the README and add usage, development and architecture docs 2026-09-26 12:29:26 +02:00
opencode.json chore: wire graft into the repo for agents 2026-09-26 12:02:24 +02:00
package-lock.json refactor!: rebuild the node on the new client, with no runtime dependencies 2026-09-26 12:20:22 +02:00
package.json build: publish only what a clean build produces 2026-09-26 12:32:39 +02:00
README.md docs: rewrite the README and add usage, development and architecture docs 2026-09-26 12:29:26 +02:00
tsconfig.json build: publish only what a clean build produces 2026-09-26 12:32:39 +02:00
tsconfig.test.json refactor!: rebuild the node on the new client, with no runtime dependencies 2026-09-26 12:20:22 +02:00
vitest.config.mts feat(lib): add a dependency-free CalDAV client and iCalendar layer 2026-09-26 12:09:32 +02:00

@m4rti21/n8n-nodes-caldav

An n8n community node for CalDAV calendars: list calendars, and create, read, update and delete events, from workflows or as a tool for an AI Agent. Built and tested against Radicale; it speaks plain RFC 4791, so other CalDAV servers work too.

Status: 0.1.0, not yet published to npm. A fork of mediabc/n8n-nodes-caldav-calendar, rewritten; see the changelog.

Operations

Resource Operation What it does
Calendar Get Many Every calendar the account can see, with its path, name, colour and components
Event Create A timed or all-day event, optionally recurring, optionally with your own UID
Event Get One event by UID, plus any individually changed occurrences
Event Get Many Events in a time range, recurring ones expanded into occurrences
Event Update Change some fields; everything else (alarms, attendees, ...) is kept
Event Delete An event, or a whole recurring series, by UID

How dates, timezones, all-day events and recurrences behave is in docs/usage.md.

Install in n8n

Settings > Community Nodes > Install, then enter @m4rti21/n8n-nodes-caldav. Self-hosted n8n only: the package is published from Forgejo, without the npm provenance n8n Cloud requires.

Then create a CalDAV API credential:

Field Radicale example
Server URL https://radicale.example.com/ (the root, your /user/ home, or one calendar)
Username your Radicale user
Password its password

Other servers: Nextcloud https://cloud.example.com/remote.php/dav/, Baikal https://dav.example.com/dav.php/, iCloud https://caldav.icloud.com/ (with an app password). Calendars are discovered from whatever URL you give.

Develop

Three ways in; pick one. Details in docs/development.md.

# Docker: n8n with this node loaded, next to a Radicale (tester / testpass)
npm ci && npm run build && docker compose up
# open http://localhost:5678, server URL http://radicale:5232/

# Local tooling: Node 22+ and, for the integration tests, radicale on PATH
npm ci && npm test

# Nix: everything above, plus graft and the git hooks
nix develop -c npm test
Command Does
npm run build compile to dist/ and copy the icons
npm run dev n8n with the node hot-reloaded (n8n-node dev)
npm test unit and integration tests
npm run test:unit unit tests only, no server needed
npm run test:integration against a throwaway Radicale, or CALDAV_TEST_URL
npm run lint n8n's community-node lint rules
npm run typecheck tsc over source and tests
npm run format prettier; format:check to verify
npm run check:ascii fail on non-ASCII characters in source

Environment variables are only read by the compose stack and the integration tests; the node takes everything from its credential. See .env.example:

Variable For Example
N8N_PORT, RADICALE_PORT host ports of the compose stack 5678, 5232
GENERIC_TIMEZONE the compose n8n's default timezone Europe/Madrid
CALDAV_TEST_URL run integration tests against this server instead http://127.0.0.1:5232/
CALDAV_TEST_USER, CALDAV_TEST_PASSWORD its credentials tester, testpass

Layout

credentials/        the CalDAV API credential
icons/              node and credential icon
nodes/Caldav/       the node: description, operations, n8n transport
nodes/Caldav/lib/   CalDAV client, iCalendar, time and recurrence; no n8n imports
test/unit/          pure tests, no server
test/integration/   tests against a real Radicale, through the node's execute()
test/radicale/      the throwaway Radicale config and image
docs/               usage, installation, development, architecture, releasing

Docs

  • Usage: dates, timezones, all-day events, recurrences, errors
  • Installation: n8n, prerequisites, other servers
  • Development: day-to-day, tests, debugging
  • Architecture: how a request flows, and why no dependencies
  • Releasing: versioning and the Forgejo publish workflow

License

MIT, as declared by the upstream project.