You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
3.**Webhook logs** — Failed deliveries are queryable via `GET /calendars/:id/webhook-logs`.
506
506
4.**Domain** — `caldave.ai` for v1. Email addresses: `cal-abc123@caldave.ai`.
507
507
5.**Event size limits** — 64KB for description, 16KB for metadata JSON.
508
-
6.**Outbound email** — Not in v1. Agents can accept/decline internally but organisers are not notified. Stubbed for v2.
508
+
6.**Outbound email** — Implemented. Creating/updating events with attendees sends METHOD:REQUEST invite emails via Postmark. Responding to inbound invites sends METHOD:REPLY emails to the organiser. Requires `POSTMARK_SERVER_TOKEN` env var; gracefully skipped if not set.
509
509
7.**Calendar sharing** — Not in v1. Could add via a `calendar_shares` table later.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+11Lines changed: 11 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,9 +7,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
7
7
## [Unreleased]
8
8
9
9
### Added
10
+
-**Outbound calendar invites** — when an event is created or updated with attendees, CalDave sends METHOD:REQUEST iCal invite emails via Postmark. Invites include `.ics` attachments that work with Google Calendar, Outlook, and Apple Calendar. From address is the calendar's email so replies route back through the inbound webhook.
11
+
-**Outbound RSVP replies** — when an agent responds to an inbound invite via `POST /respond`, CalDave sends a METHOD:REPLY iCal email back to the organiser with the agent's acceptance, decline, or tentative status.
12
+
-**Graceful degradation** — if `POSTMARK_SERVER_TOKEN` is not set, outbound emails are silently skipped. All API endpoints continue to work normally.
13
+
-**Outbound email tracking** — new `invite_sent`, `reply_sent`, and `ical_sequence` columns on events prevent duplicate sends and support proper iCal update semantics.
14
+
-**`email_sent` in respond response** — `POST /respond` now includes an `email_sent` boolean indicating whether a reply email was triggered.
10
15
-**All-day events** — events can now be created with `all_day: true` and date-only `start`/`end` in `YYYY-MM-DD` format. End date is inclusive (e.g. `start: "2025-03-15", end: "2025-03-15"` = one-day event). Supported across the full stack: API CRUD, recurring events, inbound email detection (VALUE=DATE), iCal feeds (DTSTART;VALUE=DATE), plain text view, MCP tools, and documentation.
11
16
-**`caldave-mcp` npm package** — standalone MCP server published as `caldave-mcp` on npm. Run with `npx caldave-mcp` with `CALDAVE_API_KEY` set.
12
17
18
+
-**Postmark webhook event logging** — new endpoint ingests Postmark delivery, bounce, spam, open, and click events into a `postmark_webhooks` table for email deliverability debugging. GET the same URL to view recent events.
19
+
20
+
### Fixed
21
+
-**`trust proxy` for Fly.io** — set `app.set('trust proxy', 1)` so `express-rate-limit` correctly identifies clients behind Fly's reverse proxy. Fixes `ERR_ERL_UNEXPECTED_X_FORWARDED_FOR` validation errors on every cold start.
22
+
-**Improved outbound email logging** — all outbound email operations now log with `[outbound]` prefix including Postmark message IDs on success and status codes on failure.
23
+
13
24
### Changed
14
25
-**`rrule` accepted as alias for `recurrence`** — POST/PATCH event endpoints now accept either `rrule` or `recurrence` for the recurrence rule field. `rrule` is the RFC 5545 term and more intuitive for most users.
15
26
-**Timezone in event list responses** — `GET /events` and `GET /upcoming` now include a `timezone` field in the response envelope when the calendar has a timezone set, making it easier for agents to convert UTC times.
Copy file name to clipboardExpand all lines: GOTCHAS.md
+24Lines changed: 24 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -34,4 +34,28 @@ This file documents confusing issues, mistakes, and lessons learned. When Claude
34
34
35
35
**Prevention**: When implementing DST-aware recurrence, expand RRULEs in the calendar's local timezone, then convert each occurrence to UTC for storage.
36
36
37
+
### Postmark sender signature requirement
38
+
39
+
**Date**: 2026-02-14
40
+
41
+
**Problem**: Outbound calendar invite emails fail to send because Postmark rejects the From address.
42
+
43
+
**Cause**: Postmark requires all sender addresses to be verified via a Sender Signature or domain-level verification. Calendar email addresses (`cal-xxx@invite.caldave.ai`) are auto-generated and not individually registered as sender signatures.
44
+
45
+
**Solution**: Verify the entire `invite.caldave.ai` domain in the Postmark account settings (not individual email addresses). This allows any `*@invite.caldave.ai` address to send.
46
+
47
+
**Prevention**: When setting up a new Postmark account or changing the `CALDAVE_EMAIL_DOMAIN`, always verify the domain in Postmark first.
48
+
49
+
### ical-generator requires organizer.name
50
+
51
+
**Date**: 2026-02-14
52
+
53
+
**Problem**: `ical-generator` v10 throws `'organizer.name' is empty!` when creating a VEVENT with an organizer that has no name.
54
+
55
+
**Cause**: The library validates that `organizer.name` is a non-empty string. Setting just `{ email: 'foo@bar.com' }` fails.
56
+
57
+
**Solution**: Always provide both `name` and `email` when setting the organizer. For REPLY .ics (where we may not know the organiser's name), use the email address as the name.
0 commit comments