« Hiveminder Mobile | Main | SVK 2.0 Technology Preview 1 »

September 25, 2006

todo.pl (or: How I learned to stop worrying and love the command line)

I've got a dirty little secret. I don't like using a web browser that much.  For much of my life, I've just made my todo lists in a text editor.  (I knew Hiveminder was ready for us to release when I started voluntarily using it on a day to day basis, rather than just keeping a text file open in a window.)

A few summers ago at O'Reilly's Emerging Technologies Conference, Danny O'Brien gave a session called Life Hacks: Tech Secrets of Overprolific Alpha Geeks. One of the things that it seemed all the super-productive uber-hackers did was to track their todo lists in simple text files.  Since long before we launched, Hiveminder's "braindump" and "edit as textfile" features have made it pretty easy for me to work as if I'm still living in a textfile.
, the editor of lifehacker.com, launched todotxt.com, a site dedicated to command line tools and a simple text format to track your todo list.  One of the "killer apps" for todo.txt lovers has been todo.sh, a simple command line program for managing your todo list.  When we saw it, we fell in love.

We're proud to present the first testing version of todo.pl, a Hiveminder client that works like todo.sh does.

You can download it at: http://search.cpan.org/dist/App-Todo/ or just install it via CPAN by running: cpan -i App::Todo (probably as root).

To get started, you'll need a (free) Hiveminder account. If you're moving over from todo.sh, you can upload your todo.txt and we'll create Hiveminder tasks for you.

Some usage samples:

      todo.pl add "Do the dishes [housework]"

            Add a task to your todo list.

      todo.pl list
            List all tasks in your todo list.

      todo.pl --tag home --tag othertag --group personal list
            List all personal tasks (not in a group with tags 'home' and 'othertag').

      todo.pl --tag cli --group hiveminders edit 3G Implement todo.pl
            Move task 3G into the hiveminders group, set its tags to
            "cli", and change the summary.

      todo.pl --tag "" 4J
            Delete all tags from task 4J

      todo.pl tag 4J home
            Add the tag ``home'' to task 4J


TrackBack URL for this entry:

Listed below are links to weblogs that reference todo.pl (or: How I learned to stop worrying and love the command line):


Feed You can follow this conversation by subscribing to the comment feed for this post.

if you have a lame perl environment, you will end up installing


and then you will be amazed by how quickly you can delete tasks from a command line. this is great.

Looks cool-- any links on how to use it?

You need to tidy up the prompts for email / password - it's very confusing - otherwise this rocks!

Any chance of getting more documentation or a man page for this? It would help to be able to know e.g. whether the date format includes "tomorrow" (I suppose I could read the code).

The prompts for the email and password do not appear because of buffering. Adding '$| = 1;' without the quotes to line 171 just before 'while (1) {' should solve this.

I was messing around with the source seeing how it works and adding a few features I would like to have. I though it would be cool to look up a particular task if given the ID, perhaps 'todo.pl #ID' or 'todo.pl lookup ID' would work. I tried to add this myself except I can not find a way to download a single task given it's ID. Did I overlook something or does the yaml service not provide this?

For right now, you can search on a task seach of id/k2f

We're still working on getting the real webservices rolled out.

This is great! Now how about a desktop client that will sync with the Hiveminder website? That would make my year.

It looks like the example above:

todo.pl add "Do the dishes [housework]"

does not tag the task with 'housework' but rather includes it in the task text. It should be:

todo.pl --tag housework add "Do the dishes"

If you look at


you will see a pointer to the day.sh script which I found, that gives you a way to express "hide this todo for 100 days" simply and without manually doing the arithmetic.

I did it this way rather than with a day.pl or with some day library in the perl code beause I already had the day.sh script hanging around.

I've got add/del/tag implemented in todo.py (and I've split the config file and protocol handling into their own objects - the perl version being global-heavy makes it hard to reuse from code :-) Anyway, I'll continue fleshing out verbs, but what I'd actually like to have next is and-then and but-first protocol messages... they can just take a pair of task_ids...

(eventually I'd like DownloadTasks to include the next task so I can walk the graph, but that's less important in practice then being able to push things around.)

It not easy for me to make this perl script run, even after I install these 3 .pm, I have to give up.
Can you please make a shell script that I can run it as simple as possible?

Thanks a lot.

Wish list:

a command tool to process todo.txt as handy as Todo.sh on http://todotxt.com
(no extra install tasks to run ... etc.)

I'm a huge fan of todo.txt

Still using this! One tip -

I created a directory ("projects") and made a subdirectory for each active project/tag that I'm working on. When I'm in task completion mode I cd to that directory and thus I get a way to do completion on long tag names (just hit tab) and also a way to keep the number of random tags I use down.

I wrote a tiny script "randomline" (from one of the perl cookbooks) that picks one line at random from a file, and wired that up so I can get a random tag's worth of tasks sent to me

(cd $HOME/projects; todo --tag $(ls | randomline))

is what it looks like. A weekly review of sorts is to do randomtodo for a while until I have a pretty good grasp on what's in the collection of things to do without being biased to do the alphabetically early tasks first.

What would be pretty neat would be to integrate this approach with NextAction, which provides a lean, GTD style experience using a standalone JavaScript and HTML page (no web server). See http://trimpath.com/project/wiki/NextAction

Is there a way to get at the on/today and on/yesterday history from the command line client? It would be really nice to be able to get a quick dump in text of the working set.

We're going to be rolling out more of the History view. Very high on the list is making it accessible from within a group. I'd _like_ it to be available for any search, but there are some obnoxious technical reasons why that's a bit harder than I'd like it to be.

I'm trying this out because my connection to both jabber.org and hiveminder's jabber server seems to be failing.

It would be nice if the script checked for the dependencies and informed if they were missing, or even offered to pick them up using CPAN. Thanks to Edward V. for letting us know what the depends were. Before I read that, all I got was nothing.


I don't see how to get extra fields in the output. Specifically, I'd like to keep a shopping list in the notes section of an item, then issue this command to see what I need at the grocery store, hardware store, and various other stores:

todo --tag shopping --show-me-the-notes-also

What syntax am I missing for the final item?

Installed OK with OpenSuse 10.3. Where should I specify $EDITOR for braindump and feedback?



I added

$ENV{'EDITOR'} = 'kwrite';

to line 3 of todo.pl and it works fantastic!

I normally like 'vi' but in this case 'kwrite' is the way to go!

The comments to this entry are closed.