Summary

Adds a read-only Proton Calendar integration for cal.com using ICS feed URLs. Users can connect their Proton Calendar by sharing a calendar ICS link, which cal.com will use to detect scheduling conflicts.

Fixes #5756

/claim #5756

How it works

  1. User copies their Proton Calendar ICS feed URL (from Proton Calendar → Share → Copy link)
  2. Enters it in the cal.com app setup
  3. cal.com fetches the ICS feed to verify access and reads events for availability checking
  4. Busy times from Proton Calendar are automatically blocked in scheduling

Key implementation details

  • Read-only: No write operations (Proton Calendar does not support writes via ICS)
  • Domain-restricted: Only accepts HTTPS URLs from proton.me, protonmail.com, and calendar.proton.me (prevents SSRF)
  • CANCELLED event filtering: Skips events marked with STATUS:CANCELLED (Proton uses this for cancelled recurring instances and EXDATE handling)
  • HTTP error handling: Clear user-facing messages for 401 (use public link), 403 (check sharing settings), and 404 (invalid URL)
  • Single URL: Proton Calendar generates one ICS feed per calendar; accepts one URL per integration instance
  • Encrypted at rest: Feed URL stored encrypted using CALENDSO_ENCRYPTION_KEY, same as other credential types
  • SSRF protection: Re-validates response.url after redirects to prevent redirect-based SSRF attacks
  • Strict ICS parsing: Throws on parse failure (no silent fail-open that could expose stale data)
  • Recurrence cancellation: Uses uid:timestamp keys to prevent cross-series cancellation collisions

Files changed

  • packages/app-store/protoncalendar/config.json — app metadata
  • packages/app-store/protoncalendar/package.json — package definition
  • packages/app-store/protoncalendar/api/add.ts — endpoint to save and verify ICS URL
  • packages/app-store/protoncalendar/api/index.ts — exports
  • packages/app-store/protoncalendar/lib/CalendarService.ts — ICS parsing and availability logic (based on ics-feedcalendar)
  • packages/app-store/protoncalendar/lib/index.ts — exports
  • packages/app-store/protoncalendar/index.ts — module entry
  • packages/app-store/protoncalendar/static/icon.svg — Proton-branded icon
  • packages/app-store/apps.metadata.generated.ts — registered the new app

Testing

To test manually:

  1. Get a Proton Calendar ICS feed URL: Proton Calendar → [Your Calendar] → Share → Copy link
  2. Install the Proton Calendar app in cal.com
  3. Enter the ICS feed URL in the setup form
  4. Verify your Proton Calendar events appear as busy in your scheduling link

🤖 Generated with Claude Code

Claim

Total prize pool $200
Total paid $0
Status Pending
Submitted March 13, 2026
Last updated March 13, 2026

Contributors

AU

Aurora

@TheAuroraAI

100%

Sponsors

CA

Cal.com, Inc.

@cal

$200