Linkal - A public-calendar aggregator server

Overview

Linkal

Build Status made-with-rust built with nix GitHub repo size Lines of code

Linkal 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. It works by exposing the same endpoints as a real CalDav server, emulating responses when needed and otherwise forwarding the requests to the upstream servers.

🔧 How to build

Nix users

nix build

👴🏼 Nix legacy users

nix-build

🐳 Docker users

Please be serious.

Others

Having cargo installed, run cargo build.

Usage

⚙️ Configuration

Linkal is configured using a json file describing your calendars. The file has to follow this structure :

{
  "calendars": {
    "https://calendar1.link/public-calendar/path": {
      "name": "Calendar 1 name",
    },
    "https://calendar2.link/public-calendar/path": {
      "name": "Calendar 2 name",
      "color": "#c63b52",
    }
  }
}

The 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.

Running

linkal --calendar-file <FILE>

This 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).

Add a linkal calendar in a CalDav client

To 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.

Supported clients are :

  • Thunderbird
  • Apple calendar

⚠️ 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.

If 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.

🚧 Roadmap

Linkal is in development phase and can be succeptible to bugs. Identified elements for upcoming developments are :

  • Parallel requests to answer to /cals requests
  • Improve the auto discovery of the service
  • More abstract handling of propfind requests
  • More reasonable format of the config file
  • Allowing to override more calendar fields
  • Ability to serve multiple calendar collections
  • Better support of the RFC 4791 (Long term)
  • Filtering protocol, if possible actionnable from the calendar client or a web interface (Long term)
  • Supporting private calendars with auth en both sides
Comments
  • [BUG] webcal link from leagueathletics.com does not seem to work

    [BUG] webcal link from leagueathletics.com does not seem to work

    Linkal looks like just what I've been thinking about building for myself.

    When I try to set it up with a calendar hosted on leagueathletics.com, I can't get it to work.

    Here's my configuration

    ❯ cat calendars.json
    
    {
      "calendars": {
        "webcal://www.LeagueAthletics.com/Feeds/ICal/?teams=1031498&org=arlingtonlittleleague.org": {
          "name": "Fall 2022 Majors Royals"
        }
      }
    }
    

    When I then start linkal by running

    ❯ cargo run -- --calendar-file calendars.json
        Finished dev [unoptimized + debuginfo] target(s) in 0.26s
         Running `target/debug/linkal --calendar-file calendars.json`
    

    it appers to start with no errors. When I connect to it with the Mac OS calendar program, it tells me no calendars are available, and cadaver tells me

    ❯ cadaver http://localhost:8443/
    dav:/> ls
    Listing collection `/': collection is empty.
    

    No further messages are printed to linkal's stdout/stderr.

    I suspect I'm either missing something that should be obvious to me or just trying to use this for the wrong thing altogether.

    bug enhancement 
    opened by geoffbeier 3
  • Highjacking requests

    Highjacking requests

    For requests that are forwarded to the upstream server, some highjacking has to be made to eleminate wrong urls. These seem to confuse the Apple Calendar App.

    opened by JulienMalka 1
  • Abstract handling of propfind requests

    Abstract handling of propfind requests

    Propfind requests are handled using static strings and do not correspond to what the caldav client is requesting, which is creating undefined behaviours. Parsing the propfind requests and generating the correct responses is the way forward here to support more clients.

    opened by JulienMalka 1
  • [FEATURE] Caldav server detection

    [FEATURE] Caldav server detection

    The supported clients have server detection = some kind of autoconfiguration. This is not always working very well and should be improved to provide ease of configuration.

    enhancement 
    opened by JulienMalka 0
  • [DOCS] First minimal doc

    [DOCS] First minimal doc

    Minimal doc should include :

    • Explanations on how to use the config file
    • How to run the service and test functionnality
    • How to configure a caldav client to use Linkal
    documentation 
    opened by JulienMalka 0
Owner
Julien Malka
ENS student
Julien Malka
On-chain query aggregator/batcher in Terra.

Multicall On-chain query aggregator/batcher in Terra. Mainnet Code Id: 3758 Mainnet Address: terra1y60jx2jqh5qpmcnvgz3n0zg2p6ky4mr6ax2qa5 Testnet Code

SCB 10X 32 Sep 5, 2022
A fediverse compatible forum and link aggregator. Downstream from Lemmy.

Pangora A fediverse compatible forum and link aggregator. Downstream from Lemmy. About The Project Pangora is a forum and link aggregator. You can pos

Pangora 7 Sep 11, 2023
⚡️ Lightning-fast and minimal calendar command line. Written in Rust 🦀

⚡️ Lightning-fast and minimal calendar command line. It's similar to cal. Written in Rust ??

Arthur Henrique 36 Jan 1, 2023
carl is a calendar for the commandline.

carl is a calendar for the commandline. It tries to mimic the various cal(1) implementations out there, but also adds enhanced features like colors and ical support.

Birger Schacht 1 Jan 2, 2022
Get your loadshedding schedule in your calendar and never be left in the dark! Open-source, up-to-date, and developer friendly.

Loadshedding schedules in your digital calendar. No apps, no ads, up-to-date, and developer friendly. Get it • Key Features • Using the data • Project

Boyd Kane 117 Apr 26, 2023
CLI to query for public transport connections in switzerland

Swiss Public Transport CLI This is a simple tool to search public transport connections from one station to another, possible with a via. It uses the

Sandro Covo 4 Apr 2, 2022
Donate To Charity (A.K.A. Public Goods) Without Lossing Anything

Donate To Charity (A.K.A. Public Goods) Without Lossing Anything

Gajesh Naik 10 Mar 3, 2022
BoilerFiles is a CLI for downloading your boilerplate files from a public GitHub template repo.

BoilerFiles Available on crates.io. BoilerFiles is a CLI for downloading your boilerplate files from a public GitHub template repo. Features Are you t

Jan Müller 4 Oct 1, 2022
Mercy is a public Rust crate created to assist with building cybersecurity frameworks, assessment tools, and numerous other projects

Mercy ?? Documentation Mercy is a public Rust crate created to assist with building cybersecurity frameworks, assessment tools, and numerous other pro

Umiko Security 2 Nov 27, 2022
Mercy is a public Rust crate created to assist with building cybersecurity frameworks, assessment tools, and numerous other projects

Mercy ?? Documentation Mercy is a public Rust crate created to assist with building cybersecurity frameworks, assessment tools, and numerous other pro

CyberSuki 2 Nov 27, 2022
Rust bindings to the RVVM's public api

rvvm [WIP] Safe Rust bindings to the RVVM's public API. Provides the Rust-idiomatic interface to the RVVM public API. Implemented Virtual machine crea

null 3 Jan 9, 2023
A high-performance WebSocket integration library for streaming public market data. Used as a key dependency of the `barter-rs` project.

Barter-Data A high-performance WebSocket integration library for streaming public market data from leading cryptocurrency exchanges - batteries includ

Barter 23 Feb 3, 2023
Get up-to-date departure times for Munich public transport in your terminal.

MVG Fahrinfo MVG Fahrinfo is a CLI tool to keep up-to-date with latest departure times of Munich public transport. The app is a native binary and uses

Faisal Bin Ahmed 70 Nov 14, 2023
Automatically replace Discord CDN links with local file links, by downloading the images to the public folder

Auto Undiscord Did you hear that Discord will be blocking external websites from using images hosted on their servers? Did you host every image on you

Dot32 5 Nov 17, 2023
Free and open public transport routing.

Transitous Free and open public transport routing. Goal A community-run provider-neutral international public transport routing service. Using openly

Public Transport 108 Mar 24, 2024
Bruteforce connecting to a specific Sea of Thieves server. Useful if you want to be in the same server as your friends.

SoT Server Finder Find which Sea of Thieves server you're connected to. Useful if you want to be in the same server as your friends. Setup Download so

Martin 4 Mar 19, 2023
Leptos server signals synced through Server-Sent-Events (SSE)

Leptos Server Sent Events Server signals are leptos signals kept in sync with the server through server-sent-events (SSE). The signals are read-only o

messense 13 Oct 3, 2023
A Rust CLI tool that helps you enforce Git policies through Git hooks both server and client side

GitPolicyEnforcer This is a command line utility written in Rust, that helps you utilize Git hooks, to enforce various policies. It currently supports

Vagelis Prokopiou 4 Aug 14, 2022
Text-based to-do management CLI & language server

☑️ Todome (日本語版はこちら) Todome is a notation developed for making and editing to-do lists. It is inspired by Todo.txt, and in fact some of the todome not

monaqa 16 Aug 17, 2022