Skip to main content

A basic command line task manager

Project description

Project Status: Active - The project has reached a stable, usable state and is being actively developed GPLv3 License Build Status Documentation Status Code Coverage Updates Codestyle: Black


Move your ToDo’s to ToDone’s!


This project has only been tested on a Unix OS. I welcome collaborations to test it for MacOS and Windows!

ToDonePy is a command-line interface for managing your to do list. It provides a root command, to, and three subcommands:

  • to do adds a new task to your list at either ‘low’, ‘med’, or ‘high’ priority.
  • to doing shows you what you should be doing.
  • to done removes a completed tast from your list.

Docs and Code

The documentation lives at .

The code lives at .


This project has been released on PyPI, so it can be installed with pip:

pip install -U ToDonePy

Alternatively, you can install the project manually by cloning the repo, and using the included Makefile.

git clone
make install

If you would like to contribute to development, the install instructions are slightly different. Please see the section on contributing.


The base command to

The base command to has a few useful features of its own. To see what version of the command you are using, call:

to --version

As with any good command-line tool, you can get some basic help by calling:

to --help

Under the hood, to creates the context object that holds the information on the file you use for tracking you’re TODOs. If you don’t specify a file to use, it will default to $HOME/TODO.csv. If you would like to specify a different file to use, than call the command with the --file/-f flag like so:

to --file /path/to/your/TODO.csv subcommand


If you plan to use a file other than the default, I recommend setting it by creating the environmental variable, TODO_LIST.

Regardless of whether you use the default or not, calling to with any of the subcommands - do, doing, or done - will check to see if the file exists. If it does exist, to then pass the path on to the subcommand. If it doesn’t exist, then to creates an empty file which it then passes on to the subcommand.

As a final note, it is worth emphasising that the contex object is only created when to is invoked with a subcommand. So, after a clean install, calling to --help or to --version will NOT create your TODO.csv file, even if you pass the --file/-f flag. However, call to do, and it will pop into existence.

Adding new tasks with to do

To begin tracking your TODOs, call the command as follows:

to do task rank

to is the base command. It must be invoked to use any part of the tool. The do subcommand is how you add tasks to your TODO.csv. After to do, there are two mandatory arguments: the task and the rank. The first argument is task. Here, specify what it is you need to do. If your task takes more than one word to describe, than you need to include it in quotes. rank should be a number indicating how important this task is. 1 is very important, 2 less so, etc. Though nothing explicitly bans you from using as many ranks as you want, I’d reccomed using 3 for high, medium, and low priority. So, if you wanted to remind yourself to write an abstract for that paper you’ve been delaying, call:

to do 'Write my abstract' 1

This will create TODO.csv if it doesn’t already exist, and add ‘Write my abstract’ with a rank of one to it.

If you were to manually open the TODO.csv file, say with vim, you’d see:

1,Write my abstract,YYYY-MM-DD HH:MM:SS

Nothing fancy, just a plain csv with rank in the first column, task in the second, and date/time corresponding to when you added the task. In fact, you could edit TODO.csv manually, and then call to doing to see your change!

Keeping track of tasks with to doing

Once you’ve added some TODOs to your list, you need to make sure you stay on top of them. To see what needs to be done, call:

to doing

This will echo your tasks to the terminal. In the future, there are plans to add an --edit/-e flag here, so you can directly edit your TODO.csv.

At the moment, to done just lists the tasks in the order you added them. In the future, it will also be able to sort by rank.

Completing your tasks with to done

After the end of a productive work session, you’ve completed a task from your list. Boom! Time well spent. To remove it from your TODO.csv, call:

to done task

As with to do, if your task is more than one word, you need to enclose it in quotes, like so:

to done 'Write my abstract'

Under the hood, to done creates a temp file, then performs a string match to each line of your TODO.csv. If task is not in a line, that line is written to the temp file. If task is in a line, that line is skipped. This way, the temp file ends up containing only those tasks that aren’t completed. Once every line is checked, the temp file replaces TODO.csv with its contents. Task deleted!


If two different tasks contain the same text, they will both be deleted!

Recent Changes

Please see the CHANGELOG

Next Steps

  • Add a date stamp for to do
  • Add a sort function for to doing to all user to return by date or priority
  • Add an edit function, likely to base to command, for editing of TODO.csv
  • Continue to expand README and doumentation.

Thank Yous

  • Click for making an excellent package with absolutely stellar documentation.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for todonepy, version 1.2.0
Filename, size File type Python version Upload date Hashes
Filename, size ToDonePy-1.2.0-py3-none-any.whl (19.1 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size ToDonePy-1.2.0.tar.gz (6.5 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page