NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2806 most downloaded on PyPI
Calculate recurrence times of events, todos, alarms and journals based on icalendar RFC5545.
Last release 5 months ago
30 Apr 2026
Ships unpredictably
gaps range from 2 weeks to 8 months
Nearly every release is documented
notes for 31 of 31 stable releases
1 version withdrawn
withdrawn after publishing
8 years old
70 releases · first in 2019
To view the changes, please see the Changelog . This release can be installed from PyPI .
Fix: Prevent additional events when replaced event with lower SEQUENCE has RRULE. See Issue 253 .
One column per quarter.
Fix: License identifier in pyproject.toml
Mark as compatible with icalendar versions 6.* and 7.* . See Issue 257 .
Test compatibility to Python 3.14.
Documentation:
Fix documentation build dependencies.
Build documentation with Python 3.14 and icalendar>=7.0.0.
To view the changes, please see the Changelog . This release can be installed from PyPI .
Fix: Invalid events and todos that swapped start and end are now calculated with start before end. See Issue 132 .
To view the changes, please see the Changelog . This release can be installed from PyPI .
Fix: RECURENCE-ID is now not identical to DTSTART. See Issue 243 .
To view the changes, please see the Changelog . This release can be installed from PyPI .
Set SEQUENCE to highest version of any used event in a series. See Issue 223
To view the changes, please see the Changelog . This release can be installed from PyPI .
Remove unused files: requirements.txt and setup.py .
Use version identifier for PyPI.
To view the changes, please see the Changelog . This release can be installed from PyPI .
Add the RECURRENCE-ID to all the occurrences, see Issue 219
Document how to edit one event inside of an existing calendar.
To view the changes, please see the Changelog . This release can be installed from PyPI .
Fix computation of mixed start and end times, see Issue 201
To view the changes, please see the Changelog . This release can be installed from PyPI .
Move to pyproject.toml format to include directory structure more easily. See Issue 214
Remove release 3.5.0 as it does not contain any source files.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Restructure module into package with a file structure.
Add pagination, see Issue 211
To view the changes, please see the Changelog. This release can be installed from PyPI.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Add VALARM support: Calculate alarm times. See Issue 186
To view the changes, please see the Changelog. This release can be installed from PyPI.
Allow x-wr-timezone 1.* and 2.* for this lib to remove dependency update problems.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Fix: Events with DTSTART of type date have a duration of one day, see Issue 179
To view the changes, please see the Changelog. This release can be installed from PyPI.
To view the changes, please see the Changelog. This release can be installed from PyPI.
Support RDATE with PERIOD value type where the end is a duration, see Pull Request 180
Support modifying all events in the future (RECURRENCE-ID with RANGE=THISANDFUTURE), see Issue 75
To view the changes, please see the Changelog. This release can be installed from PyPI.
Make tests work with icalendar version 5
Restructure README to be tested with doctest
Remove DURATION from the result, see Issue 139
Document new way of extending the functionality, see Issue 133 and Pull Request 175
To view the changes, please see the Changelog. This release can be installed from PyPI.
Allow datetime.timedelta as second argument to between(absolute_time, datetime.timedelta())
To view the changes, please see the Changelog. This release can be installed from PyPI.
Fix: Remove duplication of modification with same sequence number, see Issue 164
Fix: EXDATE now excludes a modified instance for an event with higher SEQUENCE , see Issue
To view the changes, please see the Changelog. This release can be installed from PyPI.
Add count() -> int to count all occurrences within a calendar
Add all() -> Generator[icalendar.Component] to iterate over the whole calendar
To view the changes, please see the Changelog. This release can be installed from PyPI.
Change the architecture and add a diagram
Add type hints, see Issue 91
Rename UnfoldableCalendar to CalendarQuery
Rename of(skip_bad_events=None) to of(skip_bad_series=False)
of(components=[...]) now also takes ComponentAdapters
Fix edit sequence problems, see Issue 151
- Fix: Edits of whole event are now considering RDATE and EXDATE, see Issue 148
Fix: Edits of whole event are now considering RDATE and EXDATE, see Issue 148
- Test support for icalendar==6.*
Test support for icalendar==6.*
Remove Python 3.7 from tests and compatibility list
Remove pytz from requirements
- Add support for multiple RRULE in events.
Add support for multiple RRULE in events.
- Add after() method to iterate over upcoming events.
Add after() method to iterate over upcoming events.
- Test and support Python 3.12.
Test and support Python 3.12.
Change SPDX license header.
Fix RRULE with negative COUNT, see Issue 128
- Fix RRULE with EXDATE as DATE, see Pull Request 121 by Jan Grasnick and Pull Request 122 .
Fix RRULE with EXDATE as DATE, see Pull Request 121 by Jan Grasnick and Pull Request 122 .
- Claim and test support for Python 3.11.
Claim and test support for Python 3.11.
Support deleting events by setting RRULE UNTIL < DTSTART, see Issue 117 .
- Added support for PERIOD values in RDATE. See Issue 113 .
Added support for PERIOD values in RDATE. See Issue 113 .
Fixed icalendar>=5.0.9 to support RDATE of type PERIOD with a time zone.
Fixed pytz>=2023.3 to assure compatibility.
- Fixed omitting last event of RRULE with UNTIL when using pytz , the event starting in winter time and ending in summer time. See Issue 107 .
Fixed omitting last event of RRULE with UNTIL when using pytz , the event starting in winter time and ending in summer time. See Issue 107 .
- Fixed crasher with duplicate RRULE. See Pull Request 104
Fixed crasher with duplicate RRULE. See Pull Request 104
- Only return VEVENT by default. Add of(... ,components=...) parameter to select which kinds of components should be returned. See Issue 101 .
Only return VEVENT by default. Add of(... ,components=...) parameter to select which kinds of components should be returned. See Issue 101 .
Remove beta indicator. This library works okay: Feature requests come in, not so much bug reports.
- Add repeated TODOs and Journals. See Pull Request 100 and Issue 97 .
Add repeated TODOs and Journals. See Pull Request 100 and Issue 97 .
- Remove syntax anomalies in README.
Remove syntax anomalies in README.
Switch to GitHub actions because GitLab decided to remove support.
- Add support for X-WR-TIMEZONE calendars which contain events without an explicit time zone, see Issue 86 .
Add support for X-WR-TIMEZONE calendars which contain events without an explicit time zone, see Issue 86 .
- Add support for zoneinfo.ZoneInfo time zones, see Issue 57 .
Add support for zoneinfo.ZoneInfo time zones, see Issue 57 .
Migrate from Travis CI to Gitlab CI.
Add code coverage on Gitlab.
- Note: These deprecated Python versions may still work. We just do not claim they do.
Remove Python 2 support, see Issue 64 .
Remove support for Python 3.5 and 3.6.
Note: These deprecated Python versions may still work. We just do not claim they do.
X-WR-TIMEZONE support, see Issue 71 .
- Events with a duration of 0 seconds are correctly returned.
Events with a duration of 0 seconds are correctly returned.
between() and at() take the same kind of arguments. These arguments are documented.
- between() and at() allow arguments with time zones now when calendar events do not have time zones, reported in Issue 61 and Issue 52 .
between() and at() allow arguments with time zones now when calendar events do not have time zones, reported in Issue 61 and Issue 52 .
- Check that at() does not return an event starting at the next day, see Issue 44 .
Check that at() does not return an event starting at the next day, see Issue 44 .
- Check that recurring events are removed if they are modified to leave the requested time span, see Issue 62 .
Check that recurring events are removed if they are modified to leave the requested time span, see Issue 62 .
- Add ability to keep the recurrence attributes (RRULE, RDATE, EXDATE) on the event copies instead of stripping them. See Pull Request 54 .
Add ability to keep the recurrence attributes (RRULE, RDATE, EXDATE) on the event copies instead of stripping them. See Pull Request 54 .
- Fix issue with repetitions over DST boundary. See Issue 48 .
Fix issue with repetitions over DST boundary. See Issue 48 .
- Fix handling of modified recurrences with lower sequence number than their base event Pull Request 45
Fix handling of modified recurrences with lower sequence number than their base event Pull Request 45
- Benchmark using @mrx23dot ’s script and speed up recurrence calculation by factor 4, see Issue 42 .
Benchmark using @mrx23dot ’s script and speed up recurrence calculation by factor 4, see Issue 42 .
- Handle Issue 28 so that EXDATEs match as expected.
Handle Issue 28 so that EXDATEs match as expected.
Handle Issue 27 so that parsing some rrule UNTIL values does not crash.
- Handle Issue 28 where passed arguments lead to errors where it is expected to work.
Handle Issue 28 where passed arguments lead to errors where it is expected to work.
- Events with an empty RRULE are handled like events without an RRULE.
Events with an empty RRULE are handled like events without an RRULE.
Remove fixed dependency versions, see Issue 14
- Repeated events also include subcomponents. Issue 6
Repeated events also include subcomponents. Issue 6
- Fix compatibility Issue 20 : EXDATEs of different time zones are now supported.
Fix compatibility Issue 20 : EXDATEs of different time zones are now supported.
- Remove attributes RDATE, EXDATE, RRULE from repeated events Issue 23 .
Remove attributes RDATE, EXDATE, RRULE from repeated events Issue 23 .
Use vDDDTypes instead of explicit date/datetime type Pull Request 19 .
Start Changelog
On this page
Edit on GitHub
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →