The format of this file is based on Keep a Changelog, and I do try to adhere to Semantic Versioning.
interactive manage-tasks: a parent task postponed together with its child could be postponed once more in its own turn, and with caldav 3.6 this crashed with a "412 Precondition Failed" error. It is now skipped, with a note. A task changed on the server in the meantime is reloaded before it is postponed.
list --jsonprints the selection as jCal (RFC 7265), the standard JSON representation of iCalendar. #82 #83plann freebusy-sync: keeps a copy of the busy time from one set of calendars in another calendar, holding only the time and a fixed summary. Copies are moved and deleted as the source changes, so it can run from a timer in both directions between a work and a private calendar. See the user guide. #70
select --freebusyhack, superseded byfreebusy-sync. It keeps the UID of the original, and it leaves the summary, description and attendees of recurrence exceptions in place. #70
- Completing a task (
edit --complete,completein the interactive and multi-edit modes,completed!inset-task-attribs) now also completes its pending child tasks, recursively, and prints a warning for each. A child has to be done before the parent can be completed. #76 completed!inset-task-attribsmoves a recurring task on to its next recurrence, likeedit --completedoes, instead of completing the whole series. #76- Shell tab completion scripts (bash, zsh, fish) now ship with the package. They work without shell configuration for system-wide installs (and for bash user/venv installs with bash-completion 2.12+); see the README for other setups. The
make install-completiontargets are gone. #63 - icalendar 7.0.0 or newer is required. #83
- caldav 3.6 or newer is required, and
calendaring-config0.5 or newer is a new dependency. The config file is now read as caldav 3.6 reads it, so it may also usekind: caldavsections with plain keys,password_command(a program printing the password) andpassword_keyring. A section whoseinheritsnames a missing section, or forms a loop, is now skipped with a warning (an error with--raise-errors); before, the brokeninheritswas ignored and the section still used. #81 - The config file is found on the search path shared with the caldav library and other tools:
~/.config/pycal/calendar.yamlfirst, then caldav's paths,~/.config/calendar.confand/etc, or the fileCALENDARING_CONFIG_FILE/CALDAV_CONFIG_FILEnames. Before, plann read~/.config/calendar.confonly, so with several of these files a different one may be used now.plann configurecreates~/.config/pycal/calendar.yamlwhen there is none, or when the file it found cannot be written (one under/etc), and makes the file readable by its owner only. #81
list --icsrepeated the VTIMEZONE of every listed object, instead of giving each timezone once. #83interactive set-task-attribs(also run byinteractive manage-tasks): a task markedcompleted!at one prompt was asked about again at the next one, and answeringcompleted!there crashed on the already-completed task. Regression in v1.2.0. #63list-categoriesand timewarrior time tracking crashed on a task with more than one CATEGORIES line. #71 #72{CATEGORIES}in alist --templateprinted the internalvCategory([...])representation instead of a comma-separated list. #77edit --set-dtstart X --set-due Ydid not end up with DTSTART at X: moving DUE kept the duration and shifted the DTSTART that had just been set. #80
edit --add-categories,--add-resourceand--add-resourcesoptions (alongside the existing--add-category). A single value containing commas is split by the plural forms and kept literal by the singular forms.select ... list --separator=...to join the listed items with something other than a newline.- The interactive edit prompt now offers the
startcommand (starts time tracking for the task) and asks again afterwards, so a follow-up command can be given for the same task. plann configure: an interactive configuration mode (EXPERIMENTAL, under-tested) that prompts for connection parameters and writes them to the config file - a new section, or an existing one with its current values offered as defaults.- Environment variable references -
${VAR}or${VAR:-default}- in the connection settings of a config section (caldav_url,caldav_user,caldav_pass,caldav_proxy, ...) are now expanded, so e.g. the password can be kept out of the config file. See the configuration section of the README. add icalwarns when the imported data holds RECURRENCE-ID overrides with no master event for the same UID - typically left behind when the recurring event was deleted elsewhere, or exported one instance at a time. They are still imported: merged into the series when the server has the master, stored as detached occurrences otherwise.
select --uidnow prints a warning to stderr naming uids that match nothing in any calendar, instead of ignoring them silently.--no-warn-on-missing-uidrestores the silent behaviour;--abort-on-missing-uidstill takes precedence. Ref #42edit --set-resourcesnow splits its value on comma, the same way--set-categoriesalways has:--set-resources a,bsets two resources rather than one nameda,b.- Config file parsing, connection parameter extraction and calendar lookup are now done by the caldav library instead of plann's own copy of that code, and a
featureskey is resolved through the caldav library's server profiles. - Fewer server round-trips: a hierarchical
list --top-down/--bottom-upfetches each related task only once, andinteractive set-task-attribsfetches the task list once instead of querying per attribute. - Dependencies: caldav 3.3.0 or newer is now required (was 1.5.0),
python-dateutilandicalendar_searcherare new dependencies, andtzlocalis no longer needed. The package metadata now declares the license as GPL-3.0-or-later.
edit --set-category: it appends rather than replaces, which the name does not convey. Use--add-categoryto append or--set-categoriesto replace.
interactive update-config, which was never implemented and only raised an error. Useplann configure.
- Time tracking through timewarrior did not work at all: the
time_trackingsetting in a config section was never picked up, only the valuetimewwas accepted (nottimewarrior, as the error message suggested), andselect ... add-time-trackingaborted with "Invalid start character for option" before doing anything. add icalwith several concatenated VCALENDAR objects imported nothing when the data used CRLF line endings (the RFC 5545 canonical form).- Showing help for a subcommand (e.g.
plann select --help) no longer connects to every configured calendar. - A config section with
featuresbut nocaldav_urlcrashed withKeyError: 'url'; the URL is now taken from the server profile. select ... deletenow names each item as it is deleted, and says "No items selected for deletion" on an empty selection, instead of printing nothing either way. Ref #42- Durations were computed wrongly:
1ycame out as roughly 15 days, and a compound duration such as1h30mkept only its last component. Adding a year to a plain date, or to February 29, raised an error. A fractional number of years (1.5y) is now rejected instead of being miscalculated. interactive check-due --limit Ncrashed instead of limiting the number of tasks shown.select --no-pinned-taskscrashed when tasks were included in the selection.- Splitting a task interactively (the
splitedit command,interactive split-huge-tasks,interactive split-high-pri-tasks) never postponed the task: the postpone prompt was inverted, so a duration was ignored and only the0hdefault reached the postpone code, where it did nothing. postpone <duration> with parentin interactive editing silently did nothing.- The relationship overview showed only the first kind of relation, so e.g. children were listed but parents were not.
- Panic planning (
check-for-panic,dismiss-panic) no longer crashes on all-day events that have relations. - Adding a category to an object with more than one
CATEGORIESline crashed. - Reporting an inconsistent relationship crashed instead of logging what was wrong.
- Postponing a task with a long chain of parents could drop the user into the Python debugger.
- An object whose summary or description contained text like
BEGIN:VEVENTcould be taken for the wrong kind of object - e.g. a task refused by interactive editing as if it were an event. - Commands that open a text editor (
select --mass-interactive,edit --interactive-ical,edit --interactive-relations, ...) now say clearly that no editor could be found, instead of failing confusingly further down. interactive set-task-attribscould miss tasks lacking an attribute on calendar servers that do not filter searches properly.
- Added possibility to add calendar name and calendar url to the template. Ref #14 by @rjolina at github.
nowshould be an acceptable timestamp. Ref #16- Natural language timestamps now supported via
dateparser— "yesterday", "3 hours ago", "Friday", etc. are accepted wherever a timestamp is expected. - VJOURNAL support: new
plann add journalcommand and--journalfilter flag onselect. Ref #29 - Makefile with
install,dev,test,lint, andcleantargets, plus shell tab completion install targets. featuresconfig key is now passed to the caldav library, enabling server-specific compatibility workarounds (e.g."features": "davical").
- Various documentation improvements, some of it by @WhyNotHugo at github in #15
--helphad some wrong information, ref #16 by Thomas Maeder- Importing a VCALENDAR file containing multiple events/tasks failed.
procrastinate 0s(and other zero-delay variants) was not treated as a no-op due to a typo ('9s'instead of'0s').- Timezone was incorrectly applied to all-day dates (
datetime.date), causing off-by-one errors. - When selecting by UID, component type (
--event/--todo) no longer needs to be specified, and completed tasks are no longer incorrectly filtered out.
Same as v1.1.1, except the publishing workflow was not working
Changelogs up until 1.0 has been dropped, as development was going rather fast-paced and erratic, with the priority of getting a tool the author can use for his daily planning. Very little development was done in 2024 and 2025, but the tool works for me.
The 1.0.0-version probably has plenty of rough edges as it hasn't been tested much and is lacking some test code, but if nothing else I will try to stick to better development practices from now on - not breaking backward compatibility unless I really have to (and then under a 2.0-release), fewer commits with sane commit messages towards the main branch, silly commits going to side branches, keep the changelog up-to-date, make sure new features are sufficiently covered by test-code, etc.