{"id":20339073,"url":"https://github.com/julienmalka/linkal","last_synced_at":"2026-03-04T16:31:41.755Z","repository":{"id":60262288,"uuid":"538780717","full_name":"JulienMalka/linkal","owner":"JulienMalka","description":"A public-calendar aggregator server","archived":false,"fork":false,"pushed_at":"2024-02-05T20:33:52.000Z","size":125,"stargazers_count":129,"open_issues_count":10,"forks_count":11,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-19T04:26:38.901Z","etag":null,"topics":["aggregator","caldav","caldav-server","calendar","nix-ci","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JulienMalka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-09-20T02:38:53.000Z","updated_at":"2025-10-13T13:55:25.000Z","dependencies_parsed_at":"2023-11-15T21:27:55.086Z","dependency_job_id":"5894daad-3a7c-4954-beaf-8e0a5d8f86d5","html_url":"https://github.com/JulienMalka/linkal","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/JulienMalka/linkal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JulienMalka%2Flinkal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JulienMalka%2Flinkal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JulienMalka%2Flinkal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JulienMalka%2Flinkal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JulienMalka","download_url":"https://codeload.github.com/JulienMalka/linkal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JulienMalka%2Flinkal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30086451,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T15:40:14.053Z","status":"ssl_error","status_checked_at":"2026-03-04T15:40:13.655Z","response_time":59,"last_error":"SSL_read: 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":["aggregator","caldav","caldav-server","calendar","nix-ci","rust"],"created_at":"2024-11-14T21:15:20.275Z","updated_at":"2026-03-04T16:31:41.733Z","avatar_url":"https://github.com/JulienMalka.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Linkal\n[![made-with-rust](https://img.shields.io/badge/Made%20with-Rust-1f425f.svg)](https://www.rust-lang.org/)\n[![built with nix](https://img.shields.io/static/v1?logo=nixos\u0026logoColor=white\u0026label=\u0026message=Built%20with%20Nix\u0026color=41439a)](https://builtwithnix.org)\n![GitHub repo size](https://img.shields.io/github/repo-size/JulienMalka/Linkal?label=Size)\n\nLinkal is a public-calendar aggregator server. Given a set a public calendars links, it can make a CalDav client believe all these calendars are part of the same calendar collection. It makes it easy to source public calendars from multiples users and locations and easily distribute them to your end user.\nIt works by exposing the same endpoints as a real CalDav server, emulating responses when needed and otherwise forwarding the requests to the upstream servers.\n\n## 🔧 How to build\n\n### ❄ Nix users\n\n```bash\nnix build\n```\n\n### ❄ 👴🏼 Nix legacy users\n\n```bash\nnix-build\n```\n\n### 🐳 Docker users\n\nOne can build a docker image for docker by running `nix build .#docker-image`.\n\n### Others\n\nHaving cargo installed, run ``cargo build``.\n\n## Usage\n\n### ⚙️ Configuration\n\nLinkal is configured using a json file describing your calendars. The file has to follow this structure :\n```json\n{\n  \"calendars\": {\n    \"https://calendar1.link/public-calendar/path\": {\n      \"name\": \"Calendar 1 name\",\n    },\n    \"https://calendar2.link/public-calendar/path\": {\n      \"name\": \"Calendar 2 name\",\n      \"color\": \"#c63b52\",\n    }\n  }\n}\n```\nThe calendars have to be **public**. Linkal does not perform any authentification. The ``color`` field is optional. If provided, the color of the calendar will be overriden by Linkal. This is useful if several of the calendars you're aggregating have the same color.\n\n### Running\n\n```bash\nlinkal --calendar-file \u003cFILE\u003e\n```\n\nThis command will start the Linkal Server on port ``8443``. It is recommanded that you host Linkal behind a reverse proxy with https enabled (like Nginx for example).\n\n### Add a linkal calendar in a CalDav client\n\nTo add a linkal aggregated calendar to your client, use as url either the ip/url of your server with port ``8443`` or the url that is set in your reverse proxy. The id and password that your client is asking can be set with any value. \n\nSupported clients are :\n- ✅ Thunderbird\n- ✅ Apple calendar\n\n⚠️ Some clients may need you to go to advanced options and hard set the port of the service, which would be ``443`` if you run Linkal behind a reverse proxy with https enabled. \n\nIf your calendar client is supported and not on this list, please open a pr/issue. If your favorite calendar client is not supported, open an issue. \n\n## 🚧 Roadmap\n\nLinkal is in development phase and can be succeptible to bugs. Identified elements for upcoming developments are :\n- Parallel requests to answer to ``/cals`` requests\n- Improve the auto discovery of the service\n- More abstract handling of propfind requests\n- More reasonable format of the config file\n- Allowing to override more calendar fields \n- Ability to serve multiple calendar collections\n- Better support of the [RFC 4791](https://datatracker.ietf.org/doc/html/rfc4791) (Long term)\n- Filtering protocol, if possible actionnable from the calendar client or a web interface (Long term)\n- Supporting private calendars with auth en both sides\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulienmalka%2Flinkal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjulienmalka%2Flinkal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulienmalka%2Flinkal/lists"}