{"id":39979205,"url":"https://github.com/icaldav/icaldav","last_synced_at":"2026-02-07T07:00:47.257Z","repository":{"id":332072915,"uuid":"1131356315","full_name":"iCalDAV/iCalDAV","owner":"iCalDAV","description":"A Kotlin CalDAV client with offline sync and conflict resolution. Sync calendars with iCloud, Nextcloud, and other CalDAV servers.","archived":false,"fork":false,"pushed_at":"2026-01-25T23:31:24.000Z","size":851,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-26T14:49:53.642Z","etag":null,"topics":["android","baikal","caldav","calendar","calendar-sync","google-calendar","icalendar","icloud","jvm","kotlin","library","nextcloud","radicale","rfc5545","sync","webdav"],"latest_commit_sha":null,"homepage":"https://icaldav.github.io","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iCalDAV.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-09T21:46:48.000Z","updated_at":"2026-01-25T16:28:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"7c34b149-4016-4669-a58e-5d4a314fc7c4","html_url":"https://github.com/iCalDAV/iCalDAV","commit_stats":null,"previous_names":["icaldav/icaldav.github.io","icaldav/icaldav"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/iCalDAV/iCalDAV","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iCalDAV%2FiCalDAV","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iCalDAV%2FiCalDAV/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iCalDAV%2FiCalDAV/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iCalDAV%2FiCalDAV/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iCalDAV","download_url":"https://codeload.github.com/iCalDAV/iCalDAV/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iCalDAV%2FiCalDAV/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29188304,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T05:07:31.176Z","status":"ssl_error","status_checked_at":"2026-02-07T05:06:15.227Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","baikal","caldav","calendar","calendar-sync","google-calendar","icalendar","icloud","jvm","kotlin","library","nextcloud","radicale","rfc5545","sync","webdav"],"created_at":"2026-01-18T23:03:26.570Z","updated_at":"2026-02-07T07:00:47.252Z","avatar_url":"https://github.com/iCalDAV.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# iCalDAV\n\n[![Maven Central](https://img.shields.io/maven-central/v/org.onekash/icaldav-client)](https://central.sonatype.com/namespace/org.onekash)\n[![Build](https://github.com/iCalDAV/iCalDAV/actions/workflows/ci.yml/badge.svg)](https://github.com/iCalDAV/iCalDAV/actions)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Kotlin](https://img.shields.io/badge/kotlin-1.9+-purple.svg)](https://kotlinlang.org)\n\nA Kotlin CalDAV client with offline sync and conflict resolution. Sync calendars with iCloud, Nextcloud, and other CalDAV servers.\n\n## RFC Compliance\n\n| RFC | Title | Status |\n|-----|-------|--------|\n| [RFC 5545](https://datatracker.ietf.org/doc/html/rfc5545) | iCalendar Core (VEVENT, VTODO, VJOURNAL, RRULE) | ✅ Full |\n| [RFC 5546](https://datatracker.ietf.org/doc/html/rfc5546) | iTIP (iCalendar Transport-Independent Interoperability) | ✅ Full |\n| [RFC 4918](https://datatracker.ietf.org/doc/html/rfc4918) | WebDAV (PROPFIND, REPORT, PUT, DELETE) | ✅ Full |\n| [RFC 4791](https://datatracker.ietf.org/doc/html/rfc4791) | CalDAV (calendar-query, calendar-multiget) | ✅ Full |\n| [RFC 6578](https://datatracker.ietf.org/doc/html/rfc6578) | WebDAV Sync (sync-collection, sync-token) | ✅ Full |\n| [RFC 3744](https://datatracker.ietf.org/doc/html/rfc3744) | WebDAV ACL (access control, privileges) | ✅ Full |\n| [RFC 6638](https://datatracker.ietf.org/doc/html/rfc6638) | CalDAV Scheduling (iTIP delivery, free-busy) | ✅ Full |\n| [RFC 7986](https://datatracker.ietf.org/doc/html/rfc7986) | New iCalendar Properties (COLOR, IMAGE, CONFERENCE) | ✅ Full |\n| [RFC 9073](https://datatracker.ietf.org/doc/html/rfc9073) | Event Publishing Extensions (VLOCATION, PARTICIPANT) | ✅ Full |\n| [RFC 9074](https://datatracker.ietf.org/doc/html/rfc9074) | VALARM Extensions (ACKNOWLEDGED, UID, PROXIMITY) | ✅ Full |\n| [RFC 9253](https://datatracker.ietf.org/doc/html/rfc9253) | iCalendar Relationships (LINK, enhanced RELATED-TO) | ✅ Full |\n| [RFC 6047](https://datatracker.ietf.org/doc/html/rfc6047) | iMIP (email-based scheduling) | ⬜ Out of scope |\n\n## Features\n\n### iCalendar (RFC 5545)\n- Complete VEVENT, VTODO, and VJOURNAL parsing and generation\n- Recurring events (RRULE, RDATE, EXDATE, RECURRENCE-ID)\n- Access classification (CLASS property: PUBLIC, PRIVATE, CONFIDENTIAL)\n- All-day and multi-day event support\n- Timezone handling with VTIMEZONE and timezone distribution service\n- Alarms (VALARM) with DISPLAY, EMAIL, and AUDIO actions\n\n### CalDAV Protocol\n- CalDAV client with automatic server discovery\n- WebDAV ACL support (RFC 3744) - read and modify access control\n- CalDAV Scheduling (RFC 6638) with iTIP message building\n- Sync engine with offline support and conflict resolution\n- Provider quirks handling (iCloud, Nextcloud, Radicale, Baikal)\n\n## Installation\n\n```kotlin\n// build.gradle.kts\ndependencies {\n    implementation(\"org.onekash:icaldav-client:2.6.2\")\n\n    // Optional: Sync engine with offline support\n    implementation(\"org.onekash:icaldav-sync:2.6.2\")\n\n    // Optional: Android CalendarContract mapper (API 21+)\n    implementation(\"org.onekash:icaldav-android:2.6.2\")\n}\n```\n\n**Requirements:** JVM 17+, Kotlin 1.9+. Android module requires API 21+.\n\n## Quick Start\n\n```kotlin\nimport org.onekash.icaldav.client.CalDavClient\nimport org.onekash.icaldav.model.ICalEvent\nimport org.onekash.icaldav.model.ICalDateTime\nimport org.onekash.icaldav.model.DavResult\nimport java.time.Instant\nimport java.time.temporal.ChronoUnit\nimport java.util.UUID\n\n// Create client\nval client = CalDavClient.forProvider(\n    serverUrl = \"https://caldav.example.com\",\n    username = \"user@example.com\",\n    password = \"password\"\n)\n\n// Discover calendars\nval discovery = client.discoverAccount(\"https://caldav.example.com\")\nif (discovery is DavResult.Success) {\n    val calendarUrl = discovery.value.calendars.first().href\n\n    // Create event\n    val event = ICalEvent(\n        uid = UUID.randomUUID().toString(),\n        summary = \"Team Meeting\",\n        dtStart = ICalDateTime.fromInstant(Instant.now()),\n        dtEnd = ICalDateTime.fromInstant(Instant.now().plus(1, ChronoUnit.HOURS))\n    )\n\n    val createResult = client.createEvent(calendarUrl, event)\n    if (createResult is DavResult.Success) {\n        val (href, etag) = createResult.value\n\n        // Update event\n        val updated = event.copy(summary = \"Team Meeting (Updated)\")\n        client.updateEvent(href, updated, etag)\n\n        // Delete event\n        client.deleteEvent(href, etag)\n    }\n\n    // Fetch events in date range\n    val start = Instant.now()\n    val end = Instant.now().plus(30, ChronoUnit.DAYS)\n    val events = client.fetchEvents(calendarUrl, start, end)\n}\n```\n\n### Error Handling\n\nAll operations return `DavResult\u003cT\u003e`:\n\n```kotlin\nwhen (val result = client.fetchEvents(calendarUrl, start, end)) {\n    is DavResult.Success -\u003e handleEvents(result.value)\n    is DavResult.HttpError -\u003e println(\"HTTP ${result.code}: ${result.message}\")\n    is DavResult.NetworkError -\u003e println(\"Network: ${result.exception.message}\")\n    is DavResult.ParseError -\u003e println(\"Parse: ${result.message}\")\n}\n```\n\n## Modules\n\n| Module | Purpose |\n|--------|---------|\n| `icaldav-core` | Parse and generate iCalendar (RFC 5545) |\n| `icaldav-client` | CalDAV/WebDAV client with discovery and CRUD |\n| `icaldav-sync` | Sync engine with offline support and conflict resolution |\n| `icaldav-android` | Android CalendarContract mapper (API 21+) |\n\n## Tested Providers\n\n| Provider | Notes |\n|----------|-------|\n| **iCloud** | CDATA responses, namespace quirks, regional redirects, app-specific passwords |\n| **Nextcloud** | Standard CalDAV |\n| **Radicale** | Direct URL access (skip discovery) |\n| **Baikal** | sabre/dav based, standard CalDAV |\n\nOther CalDAV servers following RFC 4791 should work. [Open an issue](https://github.com/iCalDAV/iCalDAV/issues) if you encounter problems.\n\n## Links\n\n- [Maven Central](https://central.sonatype.com/namespace/org.onekash)\n- [GitHub](https://github.com/iCalDAV/iCalDAV)\n- [Contributing](CONTRIBUTING.md)\n\n## License\n\nApache License 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficaldav%2Ficaldav","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ficaldav%2Ficaldav","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficaldav%2Ficaldav/lists"}