ClawSkills logoClawSkills

iCalendar Sync

Synchronizes events between local calendars and iCloud using app-specific passwords securely stored in the OS keyring with full CRUD support.

Introduction

# iCloud Calendar Sync Skill

Synchronizes calendar events between local system and iCloud.

## ⚠️ Security Requirements

**CRITICAL - Read before installation:**

### 1. Use App-Specific Password ONLY

- Generate at https://appleid.apple.com/account/security - **NEVER use your main Apple ID password** - Can be revoked anytime if compromised

### 2. Use OS Keyring for Credential Storage

The skill stores credentials securely in your operating system's keyring: - **macOS**: Keychain - **Windows**: Credential Manager - **Linux**: Secret Service API

### 3. For Headless/Automated Environments

For Docker, CI/CD, or headless servers where interactive input is not possible:

**Option A: Environment Variables** (standard, secure method) ```bash # Set credentials as environment variables export ICLOUD_USERNAME="[email protected]" export ICLOUD_APP_PASSWORD="xxxx-xxxx-xxxx-xxxx"

# Run setup python -m icalendar_sync setup --non-interactive ```

**Option B: Docker/Kubernetes Secrets** (most secure for containers) ```bash # Docker secrets docker run --secret icloud_username --secret icloud_password ...

# Kubernetes secrets kubectl create secret generic icloud-credentials \ [email protected] \ --from-literal=password=xxxx-xxxx-xxxx-xxxx ```

Credentials are read in this order: 1. OS keyring (if available and configured) 2. Environment variables (if keyring unavailable) 3. Interactive prompt (if neither available)

## Installation

```bash ./install.sh ```

## Usage

### Setup Credentials (Interactive)

```bash # Interactive mode - password prompted securely python -m icalendar_sync setup --username [email protected] ```

The password will be prompted interactively and stored in OS keyring.

### List Calendars

```bash python -m icalendar_sync list ```

### Get Calendar Events

```bash python -m icalendar_sync get --calendar "Personal" --days 7 ```

### Create Event

```bash python -m icalendar_sync create \ --calendar "Personal" \ --json '{ "summary": "Meeting", "dtstart": "2026-02-15T14:00:00+03:00", "dtend": "2026-02-15T15:00:00+03:00" }' ```

### Update Event

**Update simple event:** ```bash python -m icalendar_sync update \ --calendar "Personal" \ --uid "event-uid-here" \ --json '{"summary": "Updated Meeting Title"}' ```

**Update single instance of recurring event:** ```bash python -m icalendar_sync update \ --calendar "Work" \ --uid "recurring-event-uid" \ --recurrence-id "2026-02-20T09:00:00+03:00" \ --mode single \ --json '{"dtstart": "2026-02-21T09:00:00+03:00"}' ```

**Update all instances:** ```bash python -m icalendar_sync update \ --calendar "Work" \ --uid "recurring-event-uid" \ --mode all \ --json '{"summary": "New Title for All Instances"}' ```

**Update this and future instances:** ```bash python -m icalendar_sync update \ --calendar "Work" \ --uid "recurring-event-uid" \ --recurrence-id "2026-03-01T09:00:00+03:00" \ --mode future \ --json '{"dtstart": "2026-03-01T14:00:00+03:00"}' ```

### Delete Event

```bash python -m icalendar_sync delete --calendar "Personal" --uid "event-uid-here" ```

## Requirements

- Python 3.9+ - iCloud app-specific password - Access to iCloud CalDAV server (caldav.icloud.com:443)

## Security Features

- ✅ OS keyring integration for credential storage - ✅ App-specific password requirement (not main password) - ✅ SSL/TLS verification enforced - ✅ Rate limiting (10 calls per 60 seconds) - ✅ Automatic credential redaction in logs - ✅ Input validation on all user inputs

## License

MIT

More Products