I've found that "Todo apps" are generally useless for me. The list gets too big, or it has limited support for priorities or dependencies or whatever, so I built my own.<p>Its philosophy is built around the fact that I'm only ever going to be working on one major, todo-worthy task during a given minute. There's no reason to inundate me with dozens of things I <i>could</i> be working on when I'll only ever be doing one. And most of the time, I'm ambivalent to what I'm doing — if I need to consult a Todo list to remember it, clearly it's not something I'm actively working on, since I don't (yet) need help remembering those.<p>It's been <i>very</i> effective when I can use it (it needs a few tweaks so it can accept tasks from multiple sources, rather than one singular list). The core workflow is to jot down a task name and a priority in a text-based, line-delimited list file. Then, when you have time to do something, the app parses the list of tasks and selects <i>exactly one</i> at random, weighted by the priority. At that point, you have four options:
- Defer the task and roll for a new one (which increments a counter on the task, and does not guarantee that you'll actually get a different task!)
- Log some time on it, and optionally roll for a new task (again, not guaranteed to be different)
- Mark it done, and roll for a new task
- Exit the app<p>It knows about repeating tasks, start and due dates, dependency trees, and "stints", which are just a log of the time you spent on a particular task. It can filter tasks based on how much time you have to work vs. how long you estimate it will take, whether there are unsatisfied dependencies, etc. There's even an option that tries to assign you tasks that try to keep your "mood" steady. You can optionally annotate tasks with a mood tag (which is just a float), with the idea being that tasks with positive values are pleasant, and ones negative values are unpleasant. If it assigns you a mood-tagged task and you work on it, it adds the value from the tag to a global mood variable, and the default priority scheme tries to keep it around 0. In other words, when you do something pleasant, it builds up a buffer so you can handle something unpleasant. Or, if you do something unpleasant, it tries to reward you by giving you something pleasant to do.<p>The crown jewel is the LISP-y functional priority language that implements these dynamic tweaks to the priorities. For example, I have some rather daunting tasks that entail a lot of repetitive, monotonous work. Since it knows when I've been working on it, I can script it to de-prioritize those based on how much time I've spent on them lately.<p>It's technically open source (it's a TUI app written in Go), but I'm hesitant to post a link here since it's not robustly tested, the code isn't pretty, and the README is written in a sarcastic, derisive tone. I'm hoping to rewrite it after I finish up a library I'm working on to make it a bit more generally useful.