- TypeScript 90.9%
- JavaScript 6.9%
- Nix 2.1%
- Dockerfile 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .claude | ||
| .forgejo/workflows | ||
| credentials | ||
| docs | ||
| icons | ||
| nodes/Caldav | ||
| scripts | ||
| test | ||
| .editorconfig | ||
| .env.example | ||
| .envrc | ||
| .gitattributes | ||
| .gitignore | ||
| .ignore | ||
| .mcp.json | ||
| .prettierignore | ||
| .prettierrc.json | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| compose.yaml | ||
| eslint.config.mjs | ||
| flake.lock | ||
| flake.nix | ||
| lefthook.yml | ||
| opencode.json | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| tsconfig.test.json | ||
| vitest.config.mts | ||
@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.