Getting started¶

Prerequisites¶

Perennial is intended to work with Python 3.9 or higher.

Installing¶

Use pip like usual:

pip install -U perennial

Development¶

If you’d like to explore the repo or experiment with your own changes and potentially contribute to development:

git clone https://almonds.dev/git/perennial
cd perennial
pip install -e ."[dev]"

Basic concepts¶

This section describes how to use the command-line options for creating journals, adding entries, and tracking goals. See the Perennial reference for information on how to interface with your journals more directly.

Run python -m perennial -h for help.

init¶

Initialize a journal in the current working directory:

python -m perennial init 'Journal full of examples'

Specify a journal elsewhere with the -d (--database) flag:

python -m perennial -d ~/journals/test/ init 'Journal full of examples'

This flag is settable for all subcommands. The default is the current working directory.

Each journal entry can optionally be associated with a file. The init command can take a template file with the -t (--template) flag:

python -m perennial init 'Journal full of examples' -t ~/journals/test/template.md

When recording a new entry with an associated file, this template file will be copied over if the file does not already exist.

The journal’s streak-tracking mode can be set with the -s (--streak-mode) flag:

python -m perennial init 'Journal full of examples' -s daily

Currently, the supported streak-tracking modes are: daily, weekly, monthly, and yearly. The default journal streak-tracking mode is weekly.

record¶

Record an entry with:

python -m perennial record 'This is an example entry.'

Specify a mood for the entry with -m (--mood). Mood values are integers.

Associate a file with the new entry using -f (--file):

python -m perennial record 'This is an example entry.' -f example-entry.md

goal¶

Update the status of a goal with the goal subcommand by specifying the name of the goal followed by the goal state:

python -m perennial goal 'Example goal' DONE

Use whichever goal-tracking system you like. I prefer sticking with these goal states: TODO, DOING, DONE, CANCELED.

check¶

Finally, check up on your journals with the check command:

python -m perennial check