DevTodo the Second



DevTodo2 is a command-line task management utility. Tasks are hierarchically organised, have priorities, and track creation and completion time.

Task lists are stored in the current directory as the file .todo2.

For much more complete information please refer to the man page (todo2(1)).


DevTodo2 is written in Go. To install, you will need Go 1 or a release candidate.

Once you have Go installed and your GOPATH set, do the following:

$ go get
$ git clone git://
$ cd devtodo2
$ make
$ [sudo] make install

This will install to /usr/local by default, but that can be overridden by passing prefix=<dir> to make. The installation directories can be further customized by setting bindir=<dir>, mandir=<dir> and man1dir=<dir> which default to $(prefix)/bin, $(prefix)/share/man and $(mandir)/man1, respectively.

NOTE: You can also install with:

$ go get

But the binary will be named devtodo2 and the man page will not be installed.


If you want to uninstall, do the following:

$ cd devtodo2
$ [sudo] make uninstall


Task Command
Add a new task todo2 -a Shopping list
Add a new sub-task below task 1 todo2 -ag 1 Buy soap
Add a new sub-task below subtask 1.1 todo2 -ag 1.1 Go to store
Remove a sub-task below subtask 1 todo2 --remove 1.1
List outstanding tasks todo2
List all tasks todo2 -A


Yes, this is version 2. Version 1 was written in C++ in 2004, and has been due for a rewrite for a very long time.

Differences between version 1 and 2

New features:

  • Task lists are now stored as JSON.
  • Everything is a lot faster.
  • Much less code.

Not currently supported:

  • Readline-based editing of task text and priority.
  • Filters. Completed tasks are hidden by default, but may be displayed with -A.
  • Linked files.
  • ~/.todorc configuration file.
  • Colour customisation.
  • Custom task formatting.

How do I import my version 1 task lists?

DevTodo2 will load your old .todo files automatically. If you modify the task list with DevTodo2 it will transparently migrate the file to .todo2 in the new format.

You can specify the version 1 filename to load with --legacy-file=<filename>, and the version 2 filename with --file=<filename>.

  • Add


    For anyone who is about to create a new Issue or make a Pull Request, GitHub will auto-link a file if it exists in the top-level of a repo, right above the form.

    (Of course, the real reason I’m creating this issue is that I want to contribute…but I have no idea how. ☺)

    opened by Zearin 5
  • Improve manpage

    Improve manpage

    The manpage doesn’t really explain any options more than todo2 --help.

    • But what are “grafting”, “reparenting”, and how are they different?
    • If no .todo2 file exists, how do you start one? (Easy enough to guess; just use todo2 --add "Some new task". But it should be documented, right?)
    opened by Zearin 3
  • Fix issue #39

    Fix issue #39

    This pull request includes:

    • Editing a task doesn't change the priority to medium.
    • The completion time is displayed in local time.
    • The priority order shows the higher task first.

    Next time i will sync the fork before adding new commits :sweat_smile:

    opened by mpinloz 2
  • Edit a task inserts the index in the task text

    Edit a task inserts the index in the task text

    To edit a task it's necessary to inform the task id. But there isn't control to avoid insert this id in the text of the task.

    The workflow to reproduce it is this:

    captura de pantalla de 2017-07-08 09-48-52

    opened by mpinloz 2
  • The executable only finds the task list when you're standing in your home directory.

    The executable only finds the task list when you're standing in your home directory.

    Right now it just looks in the directory you are in, so it is assumed that the to do list is always being executed from the home directory, or that you are maintaining several you have separate lists e.g. using it inside all of your projects, it gives you less clutter.

    Obviously this is useful, but i don't think this idea comes across usability wise, generally i think its cleaner to just have one file, and then spend time enhancing the graft feature to support this better.

    I was thinking of making a option(command line and config file) that enables multiple to do lists(acts like it does now), but have it disabled and home as default.

    opened by DenLilleMand 2
  • Make devtodo2 easier to package

    Make devtodo2 easier to package

    I'm trying to make an unofficial Arch Linux package of devtodo2.

    It's much easier with:

    • A license
    • A specific version number (like 2.0)
    • Vendored dependencies with glide (so that building the package will always work for users)
    • Makefile where PREFIX can be set on the command line (PREFIX="$pkgdir/usr" make install or make install PREFIX="$pkgdir/usr")


    opened by xyproto 2
  • Issue#27


    sudo make install When executing: go build -o todo2 todo.go view.go consoleview.go legacyio.go jsonio.go main.go importer.go would throw:

    make: go: Command not found

    My changes:

    • Added a make step before make install that builds the man page and go dist.
    • Added a copy target to the make file, and modified the install target to call copy, and then clean.
    • Added better clarification in the README that make install has a optional sudo.
    • Added a make uninstall target for Issue #14.
    • Modified the README to contain a Uninstall section.
    opened by DenLilleMand 2
  • Migration ?

    Migration ?

    Hi, sorry to bother and thank you very much for your app, but I just can't understand how to migrate my old .todo files to the new JSON version. I tried todo2 --legacy-file=.todo --file=.todo2 or just todo2 -a something, or todo2 --import .todo -a something, and nothing worked, .todo2 just contains something and .todo is still XML.

    opened by pawamoy 2
  • Allow all users to view manual page

    Allow all users to view manual page

    When make install is executed, the directory that will store the manual page is created with 644 permisions. This makes inaccessible the manual page for the rest of users.

    opened by mpinloz 1
  • Changing that the go executable would sometimes have to be called with sudo. PR added.

    Changing that the go executable would sometimes have to be called with sudo. PR added.

    /usr/local/bin and /usr/local/share/man is often owned by the root user, at least in my experience. So the make install command would have to be called with sudo. The problem with calling it with sudo is that go throws the following error when the$GOROOT is not on the path: make: go: Command not found

    To make the build process more clean, i have added one more step(would be nice if this could be avoided), which is just make according to the standard UNIX install process ./configure, make, make install - i think this is acceptable. It simply clear cuts the steps a little better dividing it into build, install, cleanup.

    opened by DenLilleMand 1
  • devtodo2 creates manpage in the wrong place

    devtodo2 creates manpage in the wrong place

    I just realized that installing devtodo2 fails at installing the makefile correctly:

    [email protected]:~$ file  /usr/local/share/man/man1 
    /usr/local/share/man/man1: troff or preprocessor input, ASCII text
    [email protected]:~$ head -5 /usr/local/share/man/man1 
    .TH todo2 1 2.2.0 "Alec Thomas <[email protected]>"
    .SH "NAME"
    [email protected]:~$

    I guess the issue is in:

    install: $(TARG) $(TARG).1
        install -m755 $(TARG) $(bindir)
            install -m644 $(TARG).1 $(man1dir)

    It should probably be changed to:

    install: $(TARG) $(TARG).1
        install -m755 $(TARG) $(bindir)
            install -m644 $(TARG).1 $(man1dir)/$(TARG).1

    Please fix.

    Thanks in advance,


    opened by esantoro 1
  • I created a web extension for devtodo2

    I created a web extension for devtodo2

    DevTodo2 is a wonderful program that I use everyday. So to enhance it, I wrote a little extension or plugin for it that adds a web interface to it.

    Here is a screenshot:


    The code for it is here:

    It is just a 100 lines of code. The backend is PHP and the front-end is Vuejs + Milligram framework. Made it to scratch my own itch but in case someone finds it useful let me know! :)

    Cheers! San

    opened by san-kumar 0
  • A visual difference between done and not-done tasks

    A visual difference between done and not-done tasks

    I was thinking if we should do a 'strikethrough' effect on the tasks that are done, it is supported in a lot of terminals. Could use the ANSI escape sequence:

    \e[9m strikedthrough \e[0m

    If the terminal used doesn't have support, we could do a fallback that does the following, albeit pretty ugly:

    'T-e-s-t t-a-s-k t-e-x-t'

    I can do a PR that does this if there is any interest.

    opened by DenLilleMand 3
  • Issue#9configfile


    Trying to fix #9 and #10 in one PR. Pretty much just putting this up here, its not a final version of the PR, but its a good foundation for something that could be merged i think.

    It roughly contains:

    • Some refactoring, mostly changing strings hardcoded to constants in order to make it easier to test. Just adds more correctness aswell, naming conventions can be discussed though.
    • Support for .todorc incl. all options(excl. new color options, as discussed)
    • Tests of configuration and the order in which it loads
    • Changed ConsoleView to return strings instead of printing out directly, and wrote some tests to see if the ConsoleView prints out the correct bg and fg colors according to some viewOptions.
    • Some old commits that changed the Makefile, but then half way through i can see that i roll back the changes to a Makefile in another commit, that is already merged into this repository. Obviously that's not the best way to do it.
    • Adding new file config.go to Makefile

    Currently known errors/bugs/not so great things:

    • Minor: Missing update of README, but i guess that should be done in the very end.
    opened by DenLilleMand 6
  • Explain `--import`

    Explain `--import`

    The --import option is described thus:

    import and synchronise TODO items from source code

    But what does that mean? How does it find TODO items? Does it talk to GitHub Issues (or something)?

    opened by Zearin 4
Alec Thomas
Alec Thomas
Fortio load testing library, command line tool, advanced echo server and web UI in go (golang). Allows to specify a set query-per-second load and record latency histograms and other useful stats.

Fortio Fortio (Φορτίο) started as, and is, Istio's load testing tool and now graduated to be its own project. Fortio is also used by, among others, Me

Fortio (Φορτίο) 2.6k Jun 24, 2022
A simple Cron library for go that can execute closures or functions at varying intervals, from once a second to once a year on a specific date and time. Primarily for web applications and long running daemons.

Cron.go This is a simple library to handle scheduled tasks. Tasks can be run in a minimum delay of once a second--for which Cron isn't actually design

Robert K 210 May 4, 2022
Dendrite is a second-generation Matrix homeserver written in Go!

Dendrite Dendrite is a second-generation Matrix homeserver written in Go. It intends to provide an efficient, reliable and scalable alternative to Syn 3.6k Jun 26, 2022
Golang port of simdjson: parsing gigabytes of JSON per second

This is a Golang port of simdjson, a high performance JSON parser developed by Daniel Lemire and Geoff Langdale. It makes extensive use of SIMD instructions to achieve parsing performance of gigabytes of JSON per second.

High Performance, Kubernetes Native Object Storage 1.3k Jun 25, 2022
Subdomain scanner, asynchronous dns packets, use pcap to scan 1600,000 subdomains in 1 second

ksubdomain是一款基于无状态的子域名爆破工具,类似无状态端口扫描,支持在Windows/Linux/Mac上进行快速的DNS爆破,在Mac和Windows上理论最大发包速度在30w/s,linux上为160w/s。 hacking8信息流的src资产收集 https://i.hacking8

boyhack 361 Jun 26, 2022
There are 1,000,000 uatoms in an atom, a fact which I frequently forget and/or second-guess.

There are 1,000,000 uatoms in an atom, a fact which I frequently forget and/or second-guess. This repo contains a lot of programming to save myself a little bit of remembering.

Tess Rinearson 3 Nov 14, 2021
A simulation to see what's the result among normal people、rich-second generation、hard-working people

A simulation to see what's the result of competion among normal people、rich-second generation and hard-working people. 假设: 一个社会集体中有部分富二代,部分努力的人,多数是普通人

Myrainhua 0 Feb 20, 2022