Building a notetaking and todo system from the ground up
A post by Kev Quirk peaked my interest into what a great notetaking and todo system would look like. I’m currently using vikunja for tasks and mkdocs for notes, however, there are still things with the overall flow that I am missing. For example, there is no ability to create a task within a note. This might be useful if you are in a meeting and someone states an action item. In order to have notes available on the go and from anywhere, I decided to just have a public notes site, however, this prevents me from using the notes for anything that needs to be kept private. So, perhaps now is the time to rethink things a bit[1].
What do I want the system to be able to do?
These are not all must haves, rather, the objective is to check as many of these boxes as possible.
- Within a note, be able to write something like #TODO or
- [ ]
and have the task register somewhere. Tasks that are without context could just be in the note about the day (kind of like a journal) - Notes should be plaintext markdown, with little additional syntax.
- Writing and editing notes needs to support vim keybindings.
- Be able to see all tasks in one centralized view or place.
- No cost or subscription.
- Access on mobile (more important for notes, for tasks, I don’t need to work on things from my phone).
Crucially, I don’t need reminders or notifications. In thinking through this, I have realized that I don’t want reminders on my computers, only my phone, as it is something that travels with me and sends me notifications. Tasks and reminders are separate things. Tasks are something that I need to work on, reminders are things I need to remember (such as bringing something to a party, or sending a message when I get home). Reminders need to have a title and reminder time entered as easily as possible, tasks can have much more detail.
Okay, with the work cut out, time to evaluate some solutions.
Option 1: TODO comments plugin with plain markdown in Neovim
Folke has a neovim plugin that I already use that can find comments with TODO:
, highlight them, then retrieve them later. Sounds great! However, it only recognizes the syntax in comments! Doing comments in markdown is the same as html (<!--
), what a pain!
Option 2: Vimwiki
Although vimwiki supports tasks, enabling them to be easily created with a hotkey, there is no native way to find tasks once they have been created.
Option 3: Taskfinder
This one was mentioned by Félim Whiteley on Late Night Linux[2]. Task finder is a rust program that you install on the command line, and then you can find tasks by using tf
.
cargo install taskfinder
Tasks are written anywhere in plaintext files with the following syntax under the path in the taskfinder config. Conveniently, this path could be ~/wiki
or ~/notes
! As a bonus, when combine with the rendering markdown plugin todos show up nicely in this syntax.
TODO
- [ ] A sample task
- [ ] Another sample task
Option 3 is looking pretty promising. We can combine it with neowiki to keep daily notes, and even to separate personal and work notes, similar to keeping different vaults in obsidian.
Wiki structure
For personal tasks, they will originate from daily notes. These are named according to the ISO date format, which is guaranteed to be unique (unless I go back in time!). For work tasks, they can come from meeting minutes, or project notes.
wiki/
├─ personal/
│ ├─ journal/
│ │ ├─ 2025-07-30.md
│ ├─ books/
│ ├─ index.md
├─ work/
│ ├─ meetings/
│ ├─ index.md
├─ index.md
The index.md
page in each directory should lay out what that directory does (kind of like a README) so that we don’t have to remember how to do things. We help our future self with clear instructions.
The next step is to configure taskfinder to look within our wiki for tasks. We can do this by editing the taskfinder config file, found in the expected location ~/.config/taskfinder/config.toml
path = "/home/mark/wiki" # This line used to say /home/mark/taskfinder
num_tasks_log = "/home/mark/.local/share/taskfinder/num_tasks_log"
file_extensions = ["txt", "md"]
days_to_stale = 365
include_completed = false
priority_markers = ["pri@1", "pri@2", "pri@3", "pri@4", "pri@5"]
evergreen_file = ""
start_mode = "Files"
overdue_blink = true
We now have a system in place to write plaintext notes, and have tasks embedded within them that we can find later. From anywhere in our terminal, pressing tf
will bring up all tasks from our notes system.
Wrapping up
Of the original wishlist, we accomplished the following.
- We can find our tasks from anywhere within our wiki. We don’t even have to be inside the wiki to see them.
- Notes are written in pure markdown, no additional syntax required.
- Can edit notes through Neovim, so vim keybindings are supported. Furthermore, through
<leader>wt
we can easily convert a line to a task. - All tasks are shown in one centralized place.
- No cost or subscription.
We didn’t accomplish:
- Access on mobile
I’m okay with this outcome, and think that it is probably as good as things are going to get. My phone has been repurposed for reminders only, while my computer is for getting serious work done.
Time to give this new system a try! The notes site isn’t going anywhere for now, but I will copy all of my notes into the wiki.
It is not lost on me how many times I have changed things up or tinkered with both tasks and notes. For whatever reason, the category just seems prone to optimization and further refinement! ↩︎
Huge thank you to the Late Night Linux matrix room for helping me track down the name after all this time! ↩︎