The command-line productivity triad: Vimwiki, Taskwarrior and Timewarrior
As a lecturer and researcher, I generally have to keep track of many different aspects of work: project management and development, writing papers, writing project proposals, checking advances in the field(s), lecturing etc. and frankly, at times, controlling everything can get very overwhelming, especially if the task at hand has been left aside for some time and no memories recall. It is always nice to know what is to be done, what it has been done, and how it has been done. Keeping things ordered at work certainly helps to have a healthy work-life balance, as it allows in the job to be done, instead of wondering what was to be done.
I particularly like Matt Might’s approach when he states that when mentioning work-life balance, balance should be treated as a verb. I see productivity as the set of habits that allow me to have a healthy work-life balance, by achieving more at work (or better said, underachieving less) and also enjoying my life out of the workplace.
As such, I try to improve my productivity habits by improving my workflow, and have tried several productivity techniques and tools, that can generally be summarized in the following steps:
- Discover new and shiny productivity tool or technique
- OMG this is SO awesome!!!
WasteInvest time in learning the tool and adapting your workflow
- Forget about tool
- Go to step 1
The cycle can last from a couple of days to several weeks. Or maybe analyzing different tools to know which one would be better, to finally not to try any of them (XKCD 1445):
So, instead of being productive, I sometimes underachieved by reading about productivity, adapting workflows, and losing time in the process.
However, several months ago, transitioning from being a PhD student to a faculty member, I started to use a new set of tools that help me to keep track of things at work:
They all are command-line based (so I can define new aliases) and store their data plain text (so I can basically edit and work with the stored data). At the moment, I am happy to use these tools and they form my productivity toolset of choice. This post covers the nature of my workflow at the time of writing, which might have evolved into something else at your time or reading.
I am well aware of the existence of other tools such as org-mode, but migrating to Emacs was a no-no for me, as I am already happy with my current setup and start learning Emacs for the sole purpose of using an organizer would defeat the initial goal of getting productive. The only things I needed were note-taking, task manager and a time logger. I know org-mode handles them well, but I am already happy using these tools. Even if org-mode spreadsheets and finance tracking look cool, I am very happy with Calc and Gnucash (I have not had the guts to migrate to ledger and friends yet).
Information repository: Vimwiki
Vimwiki is a Vim plugin oriented to build a personal wiki using Vim. Although I was a bit skeptical at the beginning, Vimwiki has become one of the main everyday tools I use at the command line.
When talking about a personal wiki, Vimwiki allows to create a set of plain text files linked between them that allow to build an information repository. Moreover, Vimwiki allows for fast note-taking, and I have notes of everything work-related (meeting minutes, lecture notes, project/paper ideas, research log etc.), and personal (Future plans, holiday planning, books I’d like to read etc.). In short, if I think I might use some information in the future, it gets recorded in Vimwiki.
Basically, Vimwiki is a plugin that, on top of Vim, provides some extra functionality that mainly consists of file manipulation and navigation, and efficient features for note-taking (shortcuts, auto-incrementing lists etc.), building a wiki-like environment.
Tab (go to next link),
Enter (create or follow link) and
Backspace (go to previous page), along with the movements in Vim (searching,
Ctrl-F etc.) it is really fast to navigate the wiki or create new content. If I want to search for some word in the wiki I generally use
find inside the wiki directory (even if Vimwiki has its own search feature).
Vimwiki supports writing in Markdown, MediaWiki and the original Vimwiki syntax (the one I use), and allows to export pages to HTML. I never do so, I and navigate the wiki exclusively from Vim. In case I need to share and export some of the notes, which rarely happens, I use pandoc.
Plain text does not take much space, Vimwiki is fast to navigate, and I am a bit of a data hoarder, so basically all my notes are there. I have not deleted anything yet, and probably I won’t.
Apart from meeting notes, I also use it as a procedural checklist to remember some steps towards some goal (configuring a VM, for instance). So it’s not only to document the past, but also to help my future self when facing not-so-frequent recurring tasks.
I sometimes take notes with a pen –my colleagues were kind enough to gift me a Lamy 2000 as a PhD graduation present that is now my main non-electronic writing device– and notebook, especially in teleconferences or when I want to avoid the typing noise, but again, at the end of the day, the notes get dumped into my wiki. The notebook itself is a mess of inconsistent notes and sketches and it is safe to say all of the input there only gets read once, when dumping notes. If something pops into my head but Vim is far away, I generally send an email or an instant message to myself with my thoughts using the smartphone to later integrate the note when possible into Vimwiki.
My Vimwiki files are scattered across several, vaguely-defined subdirectories (Research, teaching, personal etc.) so there is no conflicts in file names (I name wiki files of meeting minutes with the meeting date, which I create using a shortcut. This hybrid approach eases the process of searching for data when not using Vim. Although Vimwiki has support for tags, I have yet to integrate them into my workflow in a consistent manner, as I already feel comfortable without them. A good point for Vimwiki is that when a wiki file gets renamed, it automatically recomputes all the links to point to the new file, avoiding broken links.
As these notes are crucial and confidential for me, they are regularly gzipped and encrypted both in Dropbox and on removable media. I only access these notes from my work laptop, so syncing between different hosts is not important for me. If that is something you need, but you don’t trust your cloud/file-sharing tool, you might want to have a look at CryFS.
Vimwiki, is in short, a full-fledged yet minimalist tool for gathering and storing information in a search-friendly way. It is my brain that lies outside my head.
T-warriors: Tasks and Time
Taskwarrior and Timewarrior are an independent –but related– pair of tools, that allow to track tasks (what is to be done?) and time (on what have I spent my time?), hence their name.
Taskwarrior is a powerful, process-agnostic task manager. When I mention process agnosticism, it means that it does not force the user to adopt a particular methodology to use it as it adapts to different workflows. It is a good point when a tool lowers the entry barrier for its adoption.
As with any serious task manager, Taskwarrior allows to to group tasks in projects, as well as in sub-projects and/or tag them, all depending on user criteria. All tasks have a description which, ideally, should state what is to be done in the task.
Task information can be edited using your editor of choice by using
task [id] edit. For instance to add a tag. Then, the information is stored as follows:
Moreover, tasks can contain information about deadlines, priority, dependence between different tasks, or other attributes, allowing Taskwarrior to contain a complex set of information, which it leverages, for instance, to show which tasks should be tackled next. Additionally, Taskwarrior also allows to define other variables for tasks, so users can personalize task metadata to their needs.
Once we have tasks inside the system, we need to be able to access them, so we know what is to be done. Taskwarrior has a number of reports that present the information to the user. The one I use most is
task next, which can conveniently be filtered by projects or tags.
next report, tasks are shown by order of urgency, which Taskwarrior calculates based on different criteria, such as priority, dependency information or due date.
I started using Taskwiki to link Taskwarrior and Vimwiki. I could see Taskwarrior tasks inside Vimwiki, filtered by project. When analyzing the notes of a particular project a task came to mind, I could just add it in Vimwiki and it would be indexed in Taskwarrior. However, I do not use Taskwiki anymore, I just have Taskwarrior and Vimwiki open side by side in a vertical tmux split.
Nowadays, to ease the process of adding tasks, I add tasks on-the-fly, with minimal metadata, generally just the project it belongs to. Later, generally the next morning, when going through the pending tasks, I add the additional information such as due date, tags and priority. It is also at that moment when I choose which task(s) will I tackle during the day.
One of Taskwarrior’s main advantages when compared to shiny web-based tools is that it is possible to use Taskwarrior offline, as all the data is stored locally in the
~/.task directory. I even have a set of tasks that are deliberately tagged as feasible offline, so I can filter them when I am disconnected to know what can I tackle when I am off the net.
Normally, time trackers do not classify as productivity tools. However, I find that auditing past working time is a great way of estimating future task effort. Time trackers also allow to diagnose how much time is
wasted spent in meetings or how much to bill clients for the work done.
Timewarrior is a plain text, command-line based time tracking tool, that allows to track time. Very basic in nature, Timewarrior just records different time spans with a set of associated tags. It is inside these tags where we put the information we want about the task: project, activity, description… There is no limitation on what type of tags we can use, it is all in the hands of the user.
In this case,
Setup testbed VMs are tags.
However, in my opinion, the main power of using Timewarrior is that the task information from Taskwarrior can be used also in Timewarrior. By using a hook, it is possible to start Timewarrior when a task is started in Taskwarrior:
And when the task is marked as completed, the time is logged:
Timewarrior keeps all time records inside
./timew/data/ with a record per line. For the previously recorded task, the recorded data would be the following:
I like the fact that the task manager and time tracker are linked but independent. I can track time that is related to tasks, but I can also track time that does not have any correspondent task as some work activities are not tasks per se (travelling, meetings, lectures…):
Once the time has been recorded in the file, I can track time per project (good for billing and task estimation), or to analyze how much time I spend on specific activities (travelling, meetings…). For instance, to analyze time dedication on the DUMMY project:
Timewarrior, as its task-based counterpart, has an excellent documentation, but this cheatsheet proved invaluable when I started using the tools.
I keep a large number of tags so it is better to granularly analyze the spent time. The tags I use for tasks and time-tracking are defined in a Vimwiki page, in a table. Sometimes, writing the command for tracking a regular meeting can be tedious:
For faster repeating or entering similar Timewarrior commands, I now use fzf for fuzzy history searching of recurrent commands. This approach is faster and also helps to avoid tag misspellings. Even if not the main topic of this post, using a fuzzy search tool such as fzf on the command-line, greatly boosts performance.
Linked to time management, I have used several Pomodoro-based tools, specially Thyme. However, I have not been able to stick with them. Even if I recognize the potential of alternating relatively short work and break times, I have found that assigning fixed slots to each activity does not fit me. I use a much more flexible approach were I update the work/break ratio depending the moment and the activity at hand.
Every information can be found in the
~/.timew/data directory, in plain text files, each per month. As with the case for data aggregation, Timewarrior has some built-in reports to represent data. As we are dealing with plain text, it is also possible to build your own tools. As an example, there is timew-report, a Python library for creating reports based on Timewarrior data. However, I do not use them, I am happy with the current default reports.
As you see, using Vimwiki, Taskwarrior and Timewarrior can help organize your information, future tasks and to audit the spent time. When used in conjunction, they sort of work as a modular personal management tool, inside the terminal. Using these tools have several advantages:
- Information is kept in the local machine (though sync options exist)
- Information is accessible, as it is kept in plain text files
- Minimal overhead and the possibility for heavy customization
- If wanted, they are interoperable
- They are great choices if you are already a command-line user
- They all have awesome documentation
I keep improving my workflow, but I can confidently say that Vimwiki, Taskwarrior and Timewarrior are now founding blocks of my workflow, and they work so well that I do not foresee a change in the near future.