This open-source app turned my terminal into a to-do list
My relationship with to-do apps usually follows a predictable course. I install one, spend an unreasonable amount of time choosing colors and categories, enter every task I can remember, and then stop opening it after three days. The task list survives somewhere in the cloud, quietly preserving plans that even I have forgotten.
Part of the reason is that most of my work happens inside a terminal, browser, or text editor. Recording a small task means reaching for another window and waiting for an application to load. I could keep a text file open, though plain lists become messy once deadlines and separate projects enter the picture.
This led me to Taskwarrior, an open-source task manager that runs entirely from the command line. It stores tasks locally and provides a surprisingly capable system through a command named task. There is no account to create, and it opens without a dashboard full of motivational statistics. I installed it on Fedora and started using it within a few minutes. Taskwarrior has been around long enough to accumulate many advanced features, but its basic workflow remains wonderfully small. I can add something, display my list, and mark an item as finished with three commands. Everything else can wait until I need it!
Installing Taskwarrior and creating my first list
Three commands cover the basic workflow
Taskwarrior
Installing Taskwarrior is just as easy as installing any other package. You just have to download the taskpackage using the package manager your distro offers. The first time you run Taskwarrior, it will create a local data directory and configuration file. After that, you can add your first task:
task add "Go for a 20-minute run"
Taskwarrior confirms that it has created the task and assigned it an ID. Add a few more to make the list resemble the actual week:
task add "Update the Docker Compose file for Gitea"
task add "Buy coffee"
Running the command without any arguments displays the pending list:
The output is already more useful than maintaining a text file. Every task has an ID, description, age, and urgency score. Taskwarrior calculates urgency from several properties. A nearby due date can push an item upward, as can a high priority. The default report places the tasks needing attention near the top.
Once I had bought coffee, I marked it as complete using its ID:
task 3 done
Task IDs can change as the list changes, so I got into the habit of running taskbefore issuing another ID-based command. This sounds slightly inconvenient when described in isolation. In practice, the current list is usually visible a few lines above my prompt.
I could also correct a vague description:
task 2 modify "Update the Gitea Compose file to use named volumes"
Deleting an item works in much the same way:
task 3 delete
Taskwarrior asks for confirmation before destructive actions. That saved Buy coffeefrom disappearing during one early typing mistake, which may have been its most important contribution to my productivity.
Adding enough structure to make the list useful
Projects, priorities, and dates keep tasks manageable
A flat list works for a quiet day, but mine soon contained programming experiments, server maintenance, exercise plans, and reading. Taskwarrior lets each item belong to a project, which gave the list some shape without requiring me to build an elaborate hierarchy.
I created several project tasks directly:
task add "Write a health check for the API" project:homelab
task add "Run five kilometres" project:fitness
The project exists as soon as a task refers to it. I did not have to create a project separately or configure a workspace. To see my homelab work, I use:
task project:homelab
I could assign an existing task to the same project with modify:
task 2 modify project:learning
Due dates made the list feel closer to a proper task manager. Taskwarrior understands exact dates along with readable expressions such as tomorrowand friday:
task add "Renew the VPS backup credentials" due:friday
task add "Review pull requests" due:tomorrow
task add "Finish the chapter" due:2026–07–18
I could modify a date later:
task 2 modify due:monday
For tasks that deserved a clearer signal, I used H, M, or Lpriority:
task add "Fix the broken Grafana dashboard" priority:H
task add "Clean old Podman images" priority:M
Working from the list instead of tending to it
Filters and active tasks helped me focus
Often, a task manager ends up becoming another project demanding maintenance, but Taskwarrior works best once you stop trying to fill every field. Most small tasks need only a description, and you can add projects when the list grows crowded and use dates for work with a real deadline.
If the list is long, you can narrow it to the area you plan to work on. Taskwarrior gives you filters which allow you to find urgent security work inside that project:
task project:homelab +security
Taskwarrior also supports starting a task. I used this when beginning a longer activity:
task 3 start
The task then appeared as active in the list. When interrupted, I stopped it with:
task 3 stop
Finishing it still used the familiar donecommand:
task 3 done
Starting a task does not launch a timer window or block the terminal. It records the current state and gives that item more prominence. This was useful when I returned to the computer after lunch and had forgotten which of my six open terminals represented the main job.
Searching also remained inside the same interface. To find tasks containing a word, I ran:
task /Git/
Taskwarrior includes several reports for reviewing the database. task completedshows finished work, while task projectssummarize tasks by project. The task calendarcommand presents due dates in a terminal calendar. I found the completed report unexpectedly satisfying because terminal output somehow makes ordinary progress look like evidence from a serious investigation.
Why Taskwarrior stayed in my terminal
Taskwarrior occupies a useful middle ground between a plain text file and a whole GUI with thousands of options which makes sense for teams and shared projects. My personal work sits between those cases because I need deadlines and filters, yet I want to record a thought before it escapes into whatever undocumented storage system my brain uses.
It works over SSH and inside any terminal emulator. The data stays on my machine, and the interface remains consistent with the surrounding tools. I can also script against Taskwarrior later if I decide that manually entering "check backups" has become an intolerable burden. Taskwarrior did not transform me into a perfectly organized person. It gave the terminal one more job, and the terminal was already open.
