Awesome Open Source
Awesome Open Source


An iCalendar 🗓 proxy that allows you to shape the data to your needs for a better integration in your beloved calendar client.

How it works ?

calendar-shaper forwards all requests that it receive to the calendar server, receives the response, applies a set of rules and transformations and forwards it back to the client.

All configured calendars configured will be accessible using their name on the host.

There are 3 type of rules that allow you to process the data at a certain level of the calendar : for the whole file, at an event level and at a tag level. Thus a deep personalisation is possible.

You can configure the calendars rule by editing the calendars.json file under the config folder.


calendar-shaper use Maven for its build, and can be simply built using the package job :

mvn clean compile package

General configuration

You can configure the general properties of calendar-shaper by editing the config/config.json file.

List of properties available :

Property Description Default value
port The port the server will be started to 80

Calendars configuration

calendar-shaper can handle multiple calendars. Each one will be available from the outside using its name.

The config/calendar.json file represents a list of calendar object. Each calendar is defined by a name, the server URL to forward requests and a list of rules.

Example of a calendar with an empty set of rules:

    "name": "4-ifa",
    "url": "",
    "rules": [ ]

You can find example of calendars configuration under the example folder.

The rules

There are 3 types of rules :

  • CalendarRule are rules that apply on the whole calendar
  • EventRule are rules that apply on each event of the calendar
  • TagRule are rules that apply on each values of a certain tag within the event context

All rules are composed of a type and a list of transformation. Note that the TagRule has an additional property : the tag name.

Example of a TagRule with an empty set of transformations:

    "type": "TagRule",
    "tag": "DESCRIPTION",
    "transformations": [ ]

The transformations

The transformations are the concept that allows you modify your data according to your configuration.
Each transformation is defined by a type and a set of parameters.

You can combined as many transformations as you want. All will be executed in the given order.

Example of a ReplaceTransformation :

    "type": "Replace",
    "params": {
        "regex": "wrong",
        "replacement": "right"


Removes all occurrences of a regex pattern found

Parameter Description
regex The pattern to be removed


Replaces all occurrences of a regex pattern by a literal string.

Parameter Description
regex The pattern to find
replacement The string literal to replace to


Replaces all occurrences of a regex pattern by the value of a replacement pattern. You can specify the regex group to use for both pattern.

Parameter Description
findRegex The pattern to find
findGroupId The group index to replace inside the pattern
replaceRegex The pattern that will replace the found one
replaceGroupId The group index inside the replace pattern to use as a replacement


Selects only a part of the data defined by a regex pattern.

Parameter Description
regex The pattern to replace the data by
groupId The group index inside the pattern


Replaces the data by the value of a given tag.

If you are in a CalendarRule the first occurrence of the tag will be used.
If you are in a TagRule the value will be taken in the nearest VEVENT parent.

Parameter Description
tag The tag to extract the value from


Replaces the data by a literal string.

Parameter Description
value The value to replace the data by

Docker image

A docker image is available under the docker folder.
It can be easily built using the script configured to your needs.

You probably want to access your configuration from the outside of the container. You can create a volume pointing to /opt/calendar-shaper/config folder.

docker run -p 80:80 -v /my/cfg/fldr:/opt/calendar-shaper/config -d bmarsaud/calendar-shaper


  • Java 11
  • gson - JSON serialization/deserialization library
  • log4j - Logging library


Brought to you with ❤️ by :

Name Role
Bastien Marsaud Developer

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Java (710,184) 
Proxy (3,443) 
Calendar (1,940) 
Icalendar (146) 
Related Projects
Advertising 📦 9
All Projects
Application Programming Interfaces 📦 120
Applications 📦 181
Artificial Intelligence 📦 72
Blockchain 📦 70
Build Tools 📦 111
Cloud Computing 📦 79
Code Quality 📦 28
Collaboration 📦 30
Command Line Interface 📦 48
Community 📦 81
Companies 📦 60
Compilers 📦 60
Computer Science 📦 74
Configuration Management 📦 39
Content Management 📦 167
Control Flow 📦 197
Data Formats 📦 77
Data Processing 📦 266
Data Storage 📦 132
Economics 📦 60
Frameworks 📦 198
Games 📦 122
Graphics 📦 103
Hardware 📦 148
Integrated Development Environments 📦 47
Learning Resources 📦 147
Legal 📦 28
Libraries 📦 119
Lists Of Projects 📦 21
Machine Learning 📦 336
Mapping 📦 61
Marketing 📦 15
Mathematics 📦 55
Media 📦 228
Messaging 📦 97
Networking 📦 304
Operating Systems 📦 84
Operations 📦 120
Package Managers 📦 52
Programming Languages 📦 229
Runtime Environments 📦 96
Science 📦 42
Security 📦 375
Social Media 📦 26
Software Architecture 📦 70
Software Development 📦 68
Software Performance 📦 57
Software Quality 📦 127
Text Editors 📦 45
Text Processing 📦 131
User Interface 📦 310
User Interface Components 📦 465
Version Control 📦 29
Virtualization 📦 68
Web Browsers 📦 38
Web Servers 📦 25
Web User Interface 📦 194