Merges multiple ical .ics files into one for importing elsewhere


stars 🌟issues ⚠️updated 🛠created 🐣size 🏋️‍♀️
189Jun 18, 2021Oct 25, 2016Minified + gzip package size for @jacobmischka/ical-merger in KB


Calendar merger

Suite of tools to merge multiple external calendars into a single view or a single file for importing.




Default export is a relatively simple function that merges multiple .ics files into one.

merge(inputs, options);
icals = [
    fs.readFileSync('cal.ics', 'utf8'),
    fs.readFileSync('another.ics', 'utf8')
merge(icals, {
    calname: 'Merged Calendar',
    timezone: 'America/Chicago',
    caldesc: 'Two calendars put together'

Calendar name, description, and timezone default to their respective values in the first calendar encountered (inputs[0]);

CLI tool


A small wrapper for the underlying package.

ical-merge <filenames...>
CALNAME="Merged Calendar"\
CALDESC="Two calendars put together"\
ical-merge cal.ics another.ics

Accepts filenames, options are set by environment variables. Output is sent to stdout.

Web service


Web service that serves the calendar webapp and serves merged .ics files.

/combine.ics accepts an array of URLs to externally-hosted .ics files, and responds with the merged file. URLs are specified with PHP-style array syntax: ?urls[]=….

Other /[ID].ics merged files are returned, based on the .env.json configuration file.



Webapp that displays public calendars from Google Calendar in a single view. Uses FullCalendar heavily.

Webapp view



The web service and the webapp require configuration via .env.json in the project's root

    "calendars": {
        "cal1": {
            "calname": "Calendar 1",
            "caldesc": "Calendar 1 desc",
            "timezone": "America/Chicago",
            "color": "#462aa3",
            "googleCalendarId": "[ID]@group.calendar.google.com",
            "url": "https://calendar.google.com/calendar/ical/[ID]%40group.calendar.google.com/public/basic.ics"
        "cal2": {
            "calname": "Calendar 2",
            "caldesc": "Calendar 2 desc",
            "timezone": "America/Chicago",
            "color": "#001f3f",
            "subCalendars": [
                    "calname": "Subcalendar 1",
                    "caldesc": "Subcalendar 1 desc",
                    "timezone": "America/Chicago",
                    "color": "#0074D9",
                    "googleCalendarId": "[ID]@group.calendar.google.com",
                    "url": "https://calendar.google.com/calendar/ical/[ID]%40group.calendar.google.com/public/basic.ics"
                    "calname": "Subcalendar 2",
                    "caldesc": "Subcalendar 2 desc",
                    "timezone": "America/Chicago",
                    "color": "#7FDBFF",
                    "googleCalendarId": "[ID]@group.calendar.google.com",
                    "url": "https://calendar.google.com/calendar/ical/[ID]%40group.calendar.google.com/public/basic.ics"
    "calendarGroups": {
        "basic": {
            "calname": "Group Name",
            "caldesc": "Main calendar group",
            "timezone": "America/Chicago",
            "color": "#36a2eb",
            "calendars": [
    "combine": {
        "calname": "Combined Calendar",
        "caldesc": "Combined calendar desc",
        "timezone": "America/Chicago"

Webapp uses googleCalendarIds, web service uses urls.

FullCalendar instructions for Google Calendar API key and calendar IDs



To build the Docker-container run the following command in ./Docker:

docker build . -t ics-merger


To run the tool in a Docker-container build it first then run:

docker run -p 80:3000 -d -v $PWD/.env.json:/ics-merger/.env.json:ro ics-merger

Where .env.json is your configured file.

If you find any bugs or have a feature request, please open an issue on github!

The npm package download data comes from npm's download counts api and package details come from npms.io.