Yahoo
Skip to main content
Advertisement
Advertisement
Advertisement
Advertisement

This open-source app turned my terminal into a to-do list

Tux, the Linux mascot, wearing sunglasses and working on a laptop surrounded by floating terminal windows and 3D command symbols.-1
Lucas Gouveia/How-To Geek

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

Screenshot of Taskwarrior homepage

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:

Advertisement
Advertisement

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:

Screenshot of the task command when using Taskwarrior

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.

Advertisement
Advertisement

Once I had bought coffee, I marked it as complete using its ID:

task 3 done

Screenshot of completing a task in Taskwarrior

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

Screenshot of modifying and deleting a task

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

Screenshot of compeleted tasks, tasks projects, and task calender in Taskwarrior

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.

Advertisement
Advertisement

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

Screenshot of adding a task to project and viewing tasks in a project

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

Advertisement
Advertisement

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

Screenshot of adding task with due dates and priority in Taskwarrior

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:

Advertisement
Advertisement

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

Screenshot of starting, stopping and completing a task in Taskwarrior

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:

Advertisement
Advertisement

task /Git/

Screenshot of how to search within tasks in Taskwarrior

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.

Screenshot of compeleted tasks, tasks projects, and task calender in Taskwarrior

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.

Advertisement
Advertisement
Mobilize your Website
View Site in Mobile | Classic
Share by: