{
  "schemaVersion": "1.0",
  "item": {
    "slug": "caldav-skill",
    "name": "Caldav",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/Chakyiu/caldav-skill",
    "canonicalUrl": "https://clawhub.ai/Chakyiu/caldav-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/caldav-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=caldav-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/calendars.py",
      "scripts/events.py",
      "scripts/radicale.py",
      "scripts/todos.py",
      "scripts/utils.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/caldav-skill"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/caldav-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/caldav-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/caldav-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/caldav-skill/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "CalDAV & Radicale Management",
        "body": "Interact with CalDAV servers (calendars, events, todos) and manage Radicale server configurations."
      },
      {
        "title": "Overview",
        "body": "CalDAV is a protocol for accessing and managing calendaring information (RFC 4791). Radicale is a lightweight CalDAV/CardDAV server. This skill enables:\n\nCalendar CRUD operations (create, list, update, delete)\nEvent management (create, update, delete, query)\nTodo/task management\nRadicale server configuration and administration"
      },
      {
        "title": "Python Library",
        "body": "Install the caldav library:\n\npip install caldav\n\nFor async support:\n\npip install caldav[async]"
      },
      {
        "title": "Environment Variables (Recommended)",
        "body": "Store credentials securely in environment or config:\n\nexport CALDAV_URL=\"http://localhost:5232\"\nexport CALDAV_USER=\"your_username\"\nexport CALDAV_PASSWORD=\"your_password\"\n\nOr use a config file at ~/.config/caldav/config.json:\n\n{\n  \"url\": \"http://localhost:5232\",\n  \"username\": \"your_username\",\n  \"password\": \"your_password\"\n}"
      },
      {
        "title": "Calendar Operations",
        "body": "# List all calendars\npython3 {baseDir}/scripts/calendars.py list\n\n# Create a new calendar\npython3 {baseDir}/scripts/calendars.py create --name \"Work Calendar\" --id work\n\n# Delete a calendar\npython3 {baseDir}/scripts/calendars.py delete --id work\n\n# Get calendar info\npython3 {baseDir}/scripts/calendars.py info --id work"
      },
      {
        "title": "Event Operations",
        "body": "# List events (all calendars, next 30 days)\npython3 {baseDir}/scripts/events.py list\n\n# List events from specific calendar\npython3 {baseDir}/scripts/events.py list --calendar work\n\n# List events in date range\npython3 {baseDir}/scripts/events.py list --start 2024-01-01 --end 2024-01-31\n\n# Create an event\npython3 {baseDir}/scripts/events.py create \\\n  --calendar work \\\n  --summary \"Team Meeting\" \\\n  --start \"2024-01-15 14:00\" \\\n  --end \"2024-01-15 15:00\" \\\n  --description \"Weekly sync\"\n\n# Create all-day event\npython3 {baseDir}/scripts/events.py create \\\n  --calendar personal \\\n  --summary \"Birthday\" \\\n  --start 2024-02-14 \\\n  --allday\n\n# Update an event\npython3 {baseDir}/scripts/events.py update \\\n  --uid \"event-uid-here\" \\\n  --summary \"Updated Title\"\n\n# Delete an event\npython3 {baseDir}/scripts/events.py delete --uid \"event-uid-here\"\n\n# Search events by text\npython3 {baseDir}/scripts/events.py search --query \"meeting\""
      },
      {
        "title": "Todo Operations",
        "body": "# List todos\npython3 {baseDir}/scripts/todos.py list [--calendar name]\n\n# Create a todo\npython3 {baseDir}/scripts/todos.py create \\\n  --calendar work \\\n  --summary \"Complete report\" \\\n  --due \"2024-01-20\"\n\n# Complete a todo\npython3 {baseDir}/scripts/todos.py complete --uid \"todo-uid-here\"\n\n# Delete a todo\npython3 {baseDir}/scripts/todos.py delete --uid \"todo-uid-here\""
      },
      {
        "title": "Radicale Server Management",
        "body": "# Check Radicale status\npython3 {baseDir}/scripts/radicale.py status\n\n# List users (from htpasswd file)\npython3 {baseDir}/scripts/radicale.py users list\n\n# Add user\npython3 {baseDir}/scripts/radicale.py users add --username newuser\n\n# View Radicale config\npython3 {baseDir}/scripts/radicale.py config show\n\n# Validate Radicale config\npython3 {baseDir}/scripts/radicale.py config validate\n\n# Check storage integrity\npython3 {baseDir}/scripts/radicale.py storage verify"
      },
      {
        "title": "Direct HTTP/DAV Operations",
        "body": "For low-level operations, use curl with CalDAV:\n\n# Discover principal URL\ncurl -u user:pass -X PROPFIND \\\n  -H \"Depth: 0\" \\\n  -H \"Content-Type: application/xml\" \\\n  -d '<d:propfind xmlns:d=\"DAV:\"><d:prop><d:current-user-principal/></d:prop></d:propfind>' \\\n  http://localhost:5232/\n\n# List calendars\ncurl -u user:pass -X PROPFIND \\\n  -H \"Depth: 1\" \\\n  -H \"Content-Type: application/xml\" \\\n  -d '<d:propfind xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\"><d:prop><d:displayname/><c:calendar-timezone/><d:resourcetype/></d:prop></d:propfind>' \\\n  http://localhost:5232/user/\n\n# Query events by time range\ncurl -u user:pass -X REPORT \\\n  -H \"Depth: 1\" \\\n  -H \"Content-Type: application/xml\" \\\n  -d '<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<c:calendar-query xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\">\n  <d:prop><d:getetag/><c:calendar-data/></d:prop>\n  <c:filter>\n    <c:comp-filter name=\"VCALENDAR\">\n      <c:comp-filter name=\"VEVENT\">\n        <c:time-range start=\"20240101T000000Z\" end=\"20240131T235959Z\"/>\n      </c:comp-filter>\n    </c:comp-filter>\n  </c:filter>\n</c:calendar-query>' \\\n  http://localhost:5232/user/calendar/\n\n# Create calendar (MKCALENDAR)\ncurl -u user:pass -X MKCALENDAR \\\n  -H \"Content-Type: application/xml\" \\\n  -d '<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<d:mkcalendar xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\">\n  <d:set><d:prop>\n    <d:displayname>New Calendar</d:displayname>\n  </d:prop></d:set>\n</d:mkcalendar>' \\\n  http://localhost:5232/user/new-calendar/"
      },
      {
        "title": "Config File Location",
        "body": "Radicale looks for config in:\n\n/etc/radicale/config (system-wide)\n~/.config/radicale/config (user)\nCustom path via --config or RADICALE_CONFIG env"
      },
      {
        "title": "Key Configuration Sections",
        "body": "[server]\nhosts = localhost:5232\nmax_connections = 20\nmax_content_length = 100000000\ntimeout = 30\nssl = False\n\n[auth]\ntype = htpasswd\nhtpasswd_filename = /etc/radicale/users\nhtpasswd_encryption = autodetect\n\n[storage]\nfilesystem_folder = /var/lib/radicale/collections\n\n[rights]\ntype = owner_only"
      },
      {
        "title": "Authentication Types",
        "body": "TypeDescriptionnoneNo authentication (development only!)denyallDeny all (default since 3.5.0)htpasswdApache htpasswd fileremote_userWSGI-provided usernamehttp_x_remote_userReverse proxy headerldapLDAP/AD authenticationdovecotDovecot auth socketimapIMAP server authenticationoauth2OAuth2 authenticationpamPAM authentication"
      },
      {
        "title": "Creating htpasswd Users",
        "body": "# Create new file with SHA-512\nhtpasswd -5 -c /etc/radicale/users user1\n\n# Add another user\nhtpasswd -5 /etc/radicale/users user2"
      },
      {
        "title": "Running as Service (systemd)",
        "body": "# Enable and start\nsudo systemctl enable radicale\nsudo systemctl start radicale\n\n# Check status\nsudo systemctl status radicale\n\n# View logs\njournalctl -u radicale -f"
      },
      {
        "title": "iCalendar Format Quick Reference",
        "body": "Events use iCalendar (RFC 5545) format:\n\nBEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//Example Corp//CalDAV Client//EN\nBEGIN:VEVENT\nUID:unique-id@example.com\nDTSTAMP:20240115T120000Z\nDTSTART:20240115T140000Z\nDTEND:20240115T150000Z\nSUMMARY:Team Meeting\nDESCRIPTION:Weekly sync\nLOCATION:Conference Room\nEND:VEVENT\nEND:VCALENDAR"
      },
      {
        "title": "Common Properties",
        "body": "PropertyDescriptionUIDUnique identifierDTSTARTStart timeDTENDEnd timeDTSTAMPCreation/modification timeSUMMARYEvent titleDESCRIPTIONEvent descriptionLOCATIONLocationRRULERecurrence ruleEXDATEExcluded datesATTENDEEParticipantORGANIZEREvent organizerSTATUSCONFIRMED/TENTATIVE/CANCELLED"
      },
      {
        "title": "Date Formats",
        "body": "# DateTime with timezone\nDTSTART:20240115T140000Z  ; UTC (Z suffix)\nDTSTART;TZID=America/New_York:20240115T090000\n\n# All-day event\nDTSTART;VALUE=DATE:20240214\n\n# DateTime local (floating)\nDTSTART:20240115T140000"
      },
      {
        "title": "Connection Issues",
        "body": "# Test basic connectivity\ncurl -v http://localhost:5232/\n\n# Check with authentication\ncurl -v -u user:pass http://localhost:5232/\n\n# Verify CalDAV support\ncurl -X OPTIONS http://localhost:5232/ -I | grep -i dav"
      },
      {
        "title": "Common Errors",
        "body": "ErrorCauseSolution401 UnauthorizedWrong credentialsCheck htpasswd file403 ForbiddenRights restrictionCheck [rights] config404 Not FoundWrong URL pathCheck principal/calendar path409 ConflictResource existsUse different UID415 Unsupported Media TypeWrong Content-TypeUse text/calendar"
      },
      {
        "title": "Debug Mode",
        "body": "Run Radicale with debug logging:\n\npython3 -m radicale --debug"
      },
      {
        "title": "Python API Quick Reference",
        "body": "from caldav import DAVClient\n\n# Connect\nclient = DAVClient(\n    url=\"http://localhost:5232\",\n    username=\"user\",\n    password=\"pass\"\n)\n\n# Get principal\nprincipal = client.principal()\n\n# List calendars\nfor cal in principal.calendars():\n    print(f\"Calendar: {cal.name} ({cal.url})\")\n\n# Create calendar\ncal = principal.make_calendar(name=\"My Calendar\", cal_id=\"my-cal\")\n\n# Create event\ncal.save_event(\n    dtstart=\"2024-01-15 14:00\",\n    dtend=\"2024-01-15 15:00\",\n    summary=\"Meeting\"\n)\n\n# Query events by date range\nevents = cal.date_search(\n    start=\"2024-01-01\",\n    end=\"2024-01-31\"\n)\nfor event in events:\n    print(event.vobject_instance.vevent.summary.value)\n\n# Get event by UID\nevent = cal.event_by_uid(\"event-uid\")\n\n# Delete event\nevent.delete()\n\n# Create todo\ntodo = cal.save_todo(\n    summary=\"Task\",\n    due=\"2024-01-20\"\n)"
      },
      {
        "title": "Create Recurring Event",
        "body": "python3 {baseDir}/scripts/events.py create \\\n  --calendar work \\\n  --summary \"Weekly Standup\" \\\n  --start \"2024-01-15 09:00\" \\\n  --end \"2024-01-15 09:30\" \\\n  --rrule \"FREQ=WEEKLY;BYDAY=MO,WE,FR\""
      },
      {
        "title": "Export Calendar to ICS",
        "body": "# Via curl\ncurl -u user:pass http://localhost:5232/user/calendar/ > calendar.ics\n\n# Via script\npython3 {baseDir}/scripts/calendars.py export --id work --output work.ics"
      },
      {
        "title": "Sync with Git (Radicale)",
        "body": "Configure Radicale to version changes:\n\n[storage]\nhook = git add -A && (git diff --cached --quiet || git commit -m \"Changes by \\\"%(user)s\\\"\")\n\nInitialize git in storage folder:\n\ncd /var/lib/radicale/collections\ngit init\ngit config user.email \"radicale@localhost\""
      }
    ],
    "body": "CalDAV & Radicale Management\n\nInteract with CalDAV servers (calendars, events, todos) and manage Radicale server configurations.\n\nOverview\n\nCalDAV is a protocol for accessing and managing calendaring information (RFC 4791). Radicale is a lightweight CalDAV/CardDAV server. This skill enables:\n\nCalendar CRUD operations (create, list, update, delete)\nEvent management (create, update, delete, query)\nTodo/task management\nRadicale server configuration and administration\nPrerequisites\nPython Library\n\nInstall the caldav library:\n\npip install caldav\n\n\nFor async support:\n\npip install caldav[async]\n\nEnvironment Variables (Recommended)\n\nStore credentials securely in environment or config:\n\nexport CALDAV_URL=\"http://localhost:5232\"\nexport CALDAV_USER=\"your_username\"\nexport CALDAV_PASSWORD=\"your_password\"\n\n\nOr use a config file at ~/.config/caldav/config.json:\n\n{\n  \"url\": \"http://localhost:5232\",\n  \"username\": \"your_username\",\n  \"password\": \"your_password\"\n}\n\nScripts\nCalendar Operations\n# List all calendars\npython3 {baseDir}/scripts/calendars.py list\n\n# Create a new calendar\npython3 {baseDir}/scripts/calendars.py create --name \"Work Calendar\" --id work\n\n# Delete a calendar\npython3 {baseDir}/scripts/calendars.py delete --id work\n\n# Get calendar info\npython3 {baseDir}/scripts/calendars.py info --id work\n\nEvent Operations\n# List events (all calendars, next 30 days)\npython3 {baseDir}/scripts/events.py list\n\n# List events from specific calendar\npython3 {baseDir}/scripts/events.py list --calendar work\n\n# List events in date range\npython3 {baseDir}/scripts/events.py list --start 2024-01-01 --end 2024-01-31\n\n# Create an event\npython3 {baseDir}/scripts/events.py create \\\n  --calendar work \\\n  --summary \"Team Meeting\" \\\n  --start \"2024-01-15 14:00\" \\\n  --end \"2024-01-15 15:00\" \\\n  --description \"Weekly sync\"\n\n# Create all-day event\npython3 {baseDir}/scripts/events.py create \\\n  --calendar personal \\\n  --summary \"Birthday\" \\\n  --start 2024-02-14 \\\n  --allday\n\n# Update an event\npython3 {baseDir}/scripts/events.py update \\\n  --uid \"event-uid-here\" \\\n  --summary \"Updated Title\"\n\n# Delete an event\npython3 {baseDir}/scripts/events.py delete --uid \"event-uid-here\"\n\n# Search events by text\npython3 {baseDir}/scripts/events.py search --query \"meeting\"\n\nTodo Operations\n# List todos\npython3 {baseDir}/scripts/todos.py list [--calendar name]\n\n# Create a todo\npython3 {baseDir}/scripts/todos.py create \\\n  --calendar work \\\n  --summary \"Complete report\" \\\n  --due \"2024-01-20\"\n\n# Complete a todo\npython3 {baseDir}/scripts/todos.py complete --uid \"todo-uid-here\"\n\n# Delete a todo\npython3 {baseDir}/scripts/todos.py delete --uid \"todo-uid-here\"\n\nRadicale Server Management\n# Check Radicale status\npython3 {baseDir}/scripts/radicale.py status\n\n# List users (from htpasswd file)\npython3 {baseDir}/scripts/radicale.py users list\n\n# Add user\npython3 {baseDir}/scripts/radicale.py users add --username newuser\n\n# View Radicale config\npython3 {baseDir}/scripts/radicale.py config show\n\n# Validate Radicale config\npython3 {baseDir}/scripts/radicale.py config validate\n\n# Check storage integrity\npython3 {baseDir}/scripts/radicale.py storage verify\n\nDirect HTTP/DAV Operations\n\nFor low-level operations, use curl with CalDAV:\n\n# Discover principal URL\ncurl -u user:pass -X PROPFIND \\\n  -H \"Depth: 0\" \\\n  -H \"Content-Type: application/xml\" \\\n  -d '<d:propfind xmlns:d=\"DAV:\"><d:prop><d:current-user-principal/></d:prop></d:propfind>' \\\n  http://localhost:5232/\n\n# List calendars\ncurl -u user:pass -X PROPFIND \\\n  -H \"Depth: 1\" \\\n  -H \"Content-Type: application/xml\" \\\n  -d '<d:propfind xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\"><d:prop><d:displayname/><c:calendar-timezone/><d:resourcetype/></d:prop></d:propfind>' \\\n  http://localhost:5232/user/\n\n# Query events by time range\ncurl -u user:pass -X REPORT \\\n  -H \"Depth: 1\" \\\n  -H \"Content-Type: application/xml\" \\\n  -d '<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<c:calendar-query xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\">\n  <d:prop><d:getetag/><c:calendar-data/></d:prop>\n  <c:filter>\n    <c:comp-filter name=\"VCALENDAR\">\n      <c:comp-filter name=\"VEVENT\">\n        <c:time-range start=\"20240101T000000Z\" end=\"20240131T235959Z\"/>\n      </c:comp-filter>\n    </c:comp-filter>\n  </c:filter>\n</c:calendar-query>' \\\n  http://localhost:5232/user/calendar/\n\n# Create calendar (MKCALENDAR)\ncurl -u user:pass -X MKCALENDAR \\\n  -H \"Content-Type: application/xml\" \\\n  -d '<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<d:mkcalendar xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\">\n  <d:set><d:prop>\n    <d:displayname>New Calendar</d:displayname>\n  </d:prop></d:set>\n</d:mkcalendar>' \\\n  http://localhost:5232/user/new-calendar/\n\nRadicale Configuration\nConfig File Location\n\nRadicale looks for config in:\n\n/etc/radicale/config (system-wide)\n~/.config/radicale/config (user)\nCustom path via --config or RADICALE_CONFIG env\nKey Configuration Sections\n[server]\nhosts = localhost:5232\nmax_connections = 20\nmax_content_length = 100000000\ntimeout = 30\nssl = False\n\n[auth]\ntype = htpasswd\nhtpasswd_filename = /etc/radicale/users\nhtpasswd_encryption = autodetect\n\n[storage]\nfilesystem_folder = /var/lib/radicale/collections\n\n[rights]\ntype = owner_only\n\nAuthentication Types\nType\tDescription\nnone\tNo authentication (development only!)\ndenyall\tDeny all (default since 3.5.0)\nhtpasswd\tApache htpasswd file\nremote_user\tWSGI-provided username\nhttp_x_remote_user\tReverse proxy header\nldap\tLDAP/AD authentication\ndovecot\tDovecot auth socket\nimap\tIMAP server authentication\noauth2\tOAuth2 authentication\npam\tPAM authentication\nCreating htpasswd Users\n# Create new file with SHA-512\nhtpasswd -5 -c /etc/radicale/users user1\n\n# Add another user\nhtpasswd -5 /etc/radicale/users user2\n\nRunning as Service (systemd)\n# Enable and start\nsudo systemctl enable radicale\nsudo systemctl start radicale\n\n# Check status\nsudo systemctl status radicale\n\n# View logs\njournalctl -u radicale -f\n\niCalendar Format Quick Reference\n\nEvents use iCalendar (RFC 5545) format:\n\nBEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//Example Corp//CalDAV Client//EN\nBEGIN:VEVENT\nUID:unique-id@example.com\nDTSTAMP:20240115T120000Z\nDTSTART:20240115T140000Z\nDTEND:20240115T150000Z\nSUMMARY:Team Meeting\nDESCRIPTION:Weekly sync\nLOCATION:Conference Room\nEND:VEVENT\nEND:VCALENDAR\n\nCommon Properties\nProperty\tDescription\nUID\tUnique identifier\nDTSTART\tStart time\nDTEND\tEnd time\nDTSTAMP\tCreation/modification time\nSUMMARY\tEvent title\nDESCRIPTION\tEvent description\nLOCATION\tLocation\nRRULE\tRecurrence rule\nEXDATE\tExcluded dates\nATTENDEE\tParticipant\nORGANIZER\tEvent organizer\nSTATUS\tCONFIRMED/TENTATIVE/CANCELLED\nDate Formats\n# DateTime with timezone\nDTSTART:20240115T140000Z  ; UTC (Z suffix)\nDTSTART;TZID=America/New_York:20240115T090000\n\n# All-day event\nDTSTART;VALUE=DATE:20240214\n\n# DateTime local (floating)\nDTSTART:20240115T140000\n\nTroubleshooting\nConnection Issues\n# Test basic connectivity\ncurl -v http://localhost:5232/\n\n# Check with authentication\ncurl -v -u user:pass http://localhost:5232/\n\n# Verify CalDAV support\ncurl -X OPTIONS http://localhost:5232/ -I | grep -i dav\n\nCommon Errors\nError\tCause\tSolution\n401 Unauthorized\tWrong credentials\tCheck htpasswd file\n403 Forbidden\tRights restriction\tCheck [rights] config\n404 Not Found\tWrong URL path\tCheck principal/calendar path\n409 Conflict\tResource exists\tUse different UID\n415 Unsupported Media Type\tWrong Content-Type\tUse text/calendar\nDebug Mode\n\nRun Radicale with debug logging:\n\npython3 -m radicale --debug\n\nPython API Quick Reference\nfrom caldav import DAVClient\n\n# Connect\nclient = DAVClient(\n    url=\"http://localhost:5232\",\n    username=\"user\",\n    password=\"pass\"\n)\n\n# Get principal\nprincipal = client.principal()\n\n# List calendars\nfor cal in principal.calendars():\n    print(f\"Calendar: {cal.name} ({cal.url})\")\n\n# Create calendar\ncal = principal.make_calendar(name=\"My Calendar\", cal_id=\"my-cal\")\n\n# Create event\ncal.save_event(\n    dtstart=\"2024-01-15 14:00\",\n    dtend=\"2024-01-15 15:00\",\n    summary=\"Meeting\"\n)\n\n# Query events by date range\nevents = cal.date_search(\n    start=\"2024-01-01\",\n    end=\"2024-01-31\"\n)\nfor event in events:\n    print(event.vobject_instance.vevent.summary.value)\n\n# Get event by UID\nevent = cal.event_by_uid(\"event-uid\")\n\n# Delete event\nevent.delete()\n\n# Create todo\ntodo = cal.save_todo(\n    summary=\"Task\",\n    due=\"2024-01-20\"\n)\n\nWorkflow Examples\nCreate Recurring Event\npython3 {baseDir}/scripts/events.py create \\\n  --calendar work \\\n  --summary \"Weekly Standup\" \\\n  --start \"2024-01-15 09:00\" \\\n  --end \"2024-01-15 09:30\" \\\n  --rrule \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"\n\nExport Calendar to ICS\n# Via curl\ncurl -u user:pass http://localhost:5232/user/calendar/ > calendar.ics\n\n# Via script\npython3 {baseDir}/scripts/calendars.py export --id work --output work.ics\n\nSync with Git (Radicale)\n\nConfigure Radicale to version changes:\n\n[storage]\nhook = git add -A && (git diff --cached --quiet || git commit -m \"Changes by \\\"%(user)s\\\"\")\n\n\nInitialize git in storage folder:\n\ncd /var/lib/radicale/collections\ngit init\ngit config user.email \"radicale@localhost\""
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Chakyiu/caldav-skill",
    "publisherUrl": "https://clawhub.ai/Chakyiu/caldav-skill",
    "owner": "Chakyiu",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/caldav-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/caldav-skill",
    "agentUrl": "https://openagent3.xyz/skills/caldav-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/caldav-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/caldav-skill/agent.md"
  }
}