CalFusion is a Python service that merges multiple iCal/ICS calendars into unified calendar files.
It supports periodic updates, parallel fetching, and is configurable via a YAML file.
Ideal for personal or team calendar aggregation and automation.
- Merge multiple calendars into a single ICS file
- Configurable refresh interval and output path
- Optional parallel fetching with thread limits
- Logging with configurable log level via environment variable
- Lightweight Docker-ready deployment
Follow these steps to get CalFusion running locally:
git clone https://github.com/TrickShotMLG02/CalFusion.git
cd CalFusion
cp config/calendars.example.yml config/calendars.yml
Edit config/calendars.yml to your configuration (calendars, output path, refresh interval, etc.)
CalFusion uses uv as the package manager.
If you don’t have uv installed, follow the guide: https://docs.astral.sh/uv/getting-started/
uv python install
uv sync
uv run python main.py
- By default, logs will appear at INFO level.
- You can override log level with an environment variable:
export LOG_LEVEL=DEBUG
uv run python main.py
CalFusion can be run in Docker for an isolated, reproducible environment.
docker build -t calfusion:latest .
You can also pull the latest images from Docker Hub.
docker run \
--name calfusion \
-e LOG_LEVEL=INFO \
-v calfusion_calendars:/app/data \
-v calfusion_config:/app/config \
trickshotmlg/calfusion:latest
docker run \
--name calfusion \
-e LOG_LEVEL=INFO \
-v calfusion_calendars:/app/data \
-v calfusion_config:/app/config \
trickshotmlg/calfusion:dev
You can view a sample configuration in the file below. This is also the default configuration used when setting up a fresh installation. The currently running configuration is located in the /app/config/ directory.
Contributions are welcome!
- Fork the repo, make your changes in a new branch, and submit a pull request.
- Please follow coding style and add meaningful commit messages.
This project is licensed under the GNU General Public License v3 (GPL-3.0).
You are free to use, modify, and distribute this software under the terms of the GPL-3.0, which requires that any distributed modifications or derivative works also be open source.
Please give credit to the original authors when using or modifying this project.