August 2026
A Plain File Todo System That Works for Me
I have always been a fan of plain-text systems. You can put them in git and preserve full history, editing is super fast using vim bindings, you get to use your favourite editor and the files will be readable 100 years from now.
Yet, for one reason or another, I was never able to stick with one for managing multi-day todos. For a single day, it is fine because I can start with a fresh one every day. But for multi-day planning, the files almost always end up getting too hairy to be useful, and I just end up dreading looking at them.
Finally, I believe I have a system that works. It has been serving me well for the last two months, the longest a multi-day plain-file system has ever lasted for me.
The structure is very simple:
# today
- [ ] Prepare rollout doc for ABC
- [ ] Review design for XYZ
- Link: ...
- [*] Raise PR for XYZ
# tomorrow
- [ ] Benchmarking runs for service
- [ ] Follow up on Security Review
# this week
- [ ] Draft RFC for auth changes
- [ ] Clean up stale docs
# later
- Project X
- Performance
- Latency dashboards
- Alerts
- ...
# done
- [x] Research ABC
- [-] Fix CI (handed over)
There are 5 sections:
- today: Things that I plan to finish by the end of the day
- tomorrow: Things I plan to work on and finish tomorrow
- this week: Things I plan to finish by the end of this week
- later: Everything else to be done
- done: Items that I have completed, handed over to someone or decided to not work on
One thing to note is that today, tomorrow and this week are linear. There is no nesting for tasks. Although you can add information (like links) as a sub-list.
And generally, in today, the items at the top are the ones I want to start working on sooner. I simply work from top to bottom. I have found that for my monkey brain, it is hard to look at a nested tree and figure out what to work on. A plain list is simple, just work top to bottom.
Every day, I sit down at my desk and look at rolled-over tasks in today, planned tasks in tomorrow and this week sections. I will move items around until today and tomorrow look reasonable. And then I'll get to work.
Every Monday (or sometimes Friday), I do a more thorough review of items in the this week and later sections. This is when I plan what to do this week.
I use markdown list markers as follows:
- [*] This is something that I have started and am working on.
- [ ] I am yet to start working on this one
- [x] Completed
- [-] Skipped, transferred, no longer relevant etc.
That is pretty much it.
A few tips#
- Editor folding: Use an editor that allows folding so you can hide the irrelevant sections when focusing on today's tasks. I use Zed paired with sanemark, my custom markdown LSP that handles formatting, folding and file-linking.
- Autocommitting changes: To avoid wondering "have I committed this?", I run a systemd service that watches file changes and automatically commits and pushes changes with a short debounce period. Zed provides me live diff indicators for uncommitted lines, so I instantly know if for whatever reason the autocommit isn't doing its job. You can look at my implementation, but it is best to be used as reference instead of something ready to use:
Differences from previous systems I have tried#
No labels/metadata on list items#
A lot of plain text todo systems try to treat each line as a key-value store.
- [x] Review PR date:today project:ABC completed_at:2026-04-01
I find it horrible for editing by hand and it makes the file harder to parse. I eliminate the need for this by making date the central structure. History is tracked in git (like completed_at) if I ever need it. And I do not find much value in project information myself once I have already planned my tasks for the coming week. For the later section, I treat the projects as the top-level list with tasks as nested lists.
No shell scripts or automation code#
All organization is done by manual editing. I still use a markdown formatter, but nothing specific to managing tasks.
Linear active tasks (nesting only in later)#
I have already covered this, but nesting makes it easy to make the file messy. Linear is simple and good enough to plan for a week.
Single file#
There are no split files for today/tomorrow/done etc. Everything in a single file makes navigation super fast. I make extensive use of code folding to hide later, this week and done sections.
As the done section grows larger, I might periodically move it to a separate file. As of now I haven't felt the need for it.
No priority#
I have never understood high/low priority. I just use dates as a priority system. Am I doing this today or not? If it's a task not being done this week, most likely its "priority" will change, so I'll decide when I get to it.
Pull vs Push#
This is a pull-based system: every morning and week, I decide what I want to do instead of the system deciding for me based on priority etc. Some systems try to infer the tasks you should work on based on metadata you provide (like priority, urgency, etc.), those are what I call push-based systems. They "push" the task to you. But I have observed that over time as the metadata gets stale, the system starts surfacing irrelevant tasks.
Other tools I have tried that didn't work#
- todo.txt - Hard to edit without relying on a CLI
- taskwarrior - Not plain-text and I find editing multiple tasks via taskwarrior to be too much friction
Ending notes#
I still use other non-plaintext todo apps for things that I need to edit on my mobile phone. But this plain text system has been serving me well for the tasks that I only need on my desk.