Staying Organized with todo.txt and the todo CLI
Published on : 2026-04-17 12:40
Keeping track of tasks shouldn't require a complex system.
Sometimes, a simple text file is all you need. That's where
todo.txt and the todo CLI shine.
What is todo.txt?
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
todo.txt is a plain text-based task management system. Each task
lives on its own line in a file called todo.txt. No databases, no
lock in, just simple, portable text.
- Buy groceries
- Finish blog post +writing
- Call Alice @phone
Why use the todo CLI?
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
The todo CLI is a command-line tool that helps you manage your
todo.txt file efficiently. It adds structure without sacrificing
simplicity. Benefits:
* Fast and keyboard-driven
* Works anywhere (local, SSH, containers)
* Easy to version control
* Completely transparent format
Getting Started
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
HTML Install the CLI (varies by system)
then initialize your todo list:
todo.sh add "Write first task"
List your tasks:
todo.sh ls
Mark a task as done:
todo.sh do 1
That's it - you're already using it.
Organizing Tasks
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Projects with +
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Use +project to group tasks:
todo.sh add "Fix login bug +website"
todo.sh add "Write landing page +website"
Contexts with @
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Use @context to indicate where, who or how a task gets done:
todo.sh add "Email client @work"
todo.sh add "Buy milk @errands"
Priorities
‾‾‾‾‾‾‾‾‾‾
Add priorities like (A), (B):
todo.sh add "(A) Finish report"
Searching and Filtering
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
You can quickly filter tasks:
todo.sh list +website
todo.sh list @work
This makes it easy to focus on what matters right now.
Highlighting Due and Overdue Tasks
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
One small tweak made a big difference in my workflow:
automatically showing urgent tasks whenever I open a terminal.
Here's the function I use:
todo_check() {
today=$(date +%Y-%m-%d)
# Process the output of todo.sh line by line
t ls | while read -r line; do
# Extract the date in [] if it exists
if [[ "$line" =~ ([0−9]4−[0−9]2−[0−9]2) ]]; then
due_date="${BASH_REMATCH[1]}"
if [[ "$due_date" < "$today" ]]; then
# Overdue: Red
echo -e "\e[1;31m$line\e[0m"
elif [[ "$due_date" == "$today" ]]; then
# Due Today: Yellow
echo -e "\e[1;33m$line\e[0m"
fi
fi
done
}
How it works
‾‾‾‾‾‾‾‾‾‾‾‾
* it grabs today's date in YYYY-MM-DD format
* scans each task for a date (like [2026-04-10])
* compares it with today
* highlights overdue tasks in red
* highlights tasks due today in yellow
Running it automatically
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
To make this part of my daily flow, I call it whenever I start
a new terminal. Add this to your shell config (~/.bashrc,
~/.zshrc, etc.):
todo_check
Here's another post in which I describe how I organize my .bashrc
with imports from other files:
DIR How I Organize My .bashrc with Imports
Screenshots of this function in action
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
IMG Adding tasks
In the above screenshot you can see I use t add. That's because I h
alias t='/home/sava/.config/todo/todo.sh'
IMG Showing overdue tasks
As you can see, whenever I fire up a new terminal tasks overdue
are shown in red and today's tasks are shown in yellow.
Now every new terminal session gives me a quick, visual reminder
of what actually needs attention - no extra commands required.
Why It Works
‾‾‾‾‾‾‾‾‾‾‾‾
The power of todo.txt comes from constraints:
* no over-engineering
* no distractions
* just tasks
Because it's plain text, you can:
* sync it with Git
* edit it in any editor
* script around it
Tips for Daily Use
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
* keep it open in a terminal tab
* review tasks in the morning
* archive completed tasks regularly
* don't overcomplicate your tagging
Final Thoughts
‾‾‾‾‾‾‾‾‾‾‾‾‾‾
If you're tired of bloated productivity apps, give todo.txt a try.
It's minimal, flexible, and surprisingly powerful.
HTML Todo.txt If you want to get it done, first write it down
Sometimes, the best tool is just a text file and a few well
placed shell functions.
DIR Back to my phlog