Denote Tasks

denote-tasks is pretty much “what I hoped to get with TaskWarrior but didn’t.”

Rather than using sqlite it uses Markdown files named using Denote conventions, with some extra metadata in the YAML frontmatter for priority, due date, and project associations.

I chose to use the Denote naming convention because it gives me a reliable index for making associations between normal tasks and projects and can be the foundation for subtasks at some point. That also means you can use it in the context of a normal Denote notes corpus and take advantage of Denote stuff like dblocks if you like.

I chose plain text instead of a database because you can just pop open a task or project and make notes in it, or link to other notes, or whatever. There’s a (l)og hotkey to drop a quick timestamped note into any project or task. I use it when I close a task out or have new context to add.

I do need to go in and straighten out some of the hotkeys, because it started life as an extension to another notes management TUI, but that got a little cumbersome and complex.

Either way, it’s very keyboard-centric: Hotkeys let you change priorities, dates, and tags from the task list. No need to open a metadata window or sidebar, which drives me crazy with a lot of todo apps. You can navigate the task list with j/k/gg/G.

There’s a plain old CLI, too, for scriptability and because I like having an alias that just pops out today’s todos without opening an app, but it needs a bit more work – the syntax is a bit mangled from going a couple of wrong directions.

I liked TaskWarrior’s conception of “contexts” but borrowed Things3’s “areas” to name it. You can filter by area at launch, so denote-tasks -t --area=work will open up the task list to your work tasks and projects.

And I liked TaskWarrior’s core UI: A big list. Partly because it feels grounding. A lot of task management tools hide tasks away behind whatever their organizational containers are (projects, etc.) and while I get that this is meant to be a calming design decision, it doesn’t work for my particular brain. I take a little of the potential sense of overwhelm out with a simple horizontal rule that underlines the block of tasks due today, and have filters for priority, estimate, tag, etc. so I can quickly narrow things down if I need.

It also has the core task states I tend to think in: open, done, delegated, paused, dropped. There are little visual indicators for those states, and the list is filterable by those, too.

Oh, there’s also fuzzy search and tag search. Great for 1:1s if you take the time to tag tasks with people.

So, I think mooooost people who are super into Denote would probably tend to just use org-mode for tasks. Moooost people who are into Denote would just tend to use Denote in the context of Emacs. I just really like Denote naming conventions conceptually, and like some of the portability baked into them and I don’t want to go live in Emacs right now. I’m still really digging Helix because since first setting up LSPs for it and doing basic configuration, I haven’t felt the urge to fiddle with it. Launches super fast, doesn’t need a daemon, does everything I want.

And denote-tasks does everything I want. I really wanted to like TaskWarrior, and like a lot of its ideas. But other parts of it were a little hard to swallow and there’s a ton of complexity there. This gets me the parts I liked, inflected to suit my particular mental model a bit better.

Oh … also I did this one with Claude Code as opposed to Claude Desktop. It is a lot more eager to take credit when it makes commits, and I think that’s a good thing. It’s fine and probably good if people know they’re getting code churned out by a bot.