How Org-Mode helps with my Project Management
I started using emacs a few years ago and it has slowly become the one application that is always open on any computer I use. This post is on how org-mode helps me with my project management.
I’ve been using Emacs for about three years now, and I think it’s about time I started writing about my Emacs experiences. Not that I have anything particularly useful to add to the ocean of Emacs related material out there, rather, I hope it serves to illustrate how a non-technical user uses Emacs.
Ok, technical is a relative term, so let me clarify this. I am non technical in the sense that I’m afraid of the terminal, have almost always preferred GUI applications and when I finally decided to learn programming last year, JavaScript headbutted me so badly that I quit the course and lost my fees! (I did learn a little HTML and CSS though).
I intend to write my Emacs story sometime, but today I’d like to write about how Org-mode, an Emacs mode, helps me manage my work.
I run a small not-for-profit social enterprise focused around art and a lot of our projects are self-initiated, as opposed to projects that emerge through clients or partners. This means that it is almost never clear at the outset which project will eventually need to be prioritized, shelved, frozen and so on in the effort to keep things humming. Projects are constantly shifting based on either external or internal constraints or opportunities.
I can summarize my project-management needs as the ability to view:
- A complete list of all our Projects
- Projects that I need to move on next
- Projects that are stuck and need some action
- Projects that I have put on hold (say, I need resources to continue)
- Projects that are waiting (say, for someone else to complete an action)
To enable these needs, I’ve done this:
- Projects are distinguished by a PROJ todo state as well as a :project: tag
- The project tag is not inherited, meaning it does not pass on to it’s children.
- Projects with a PROJNEXT todo state are projects that I need to move on next
- Projects that do not have tasks with a TODO, NEXT, or DOING tag are considered stuck
- Projects with a HOLD todo state are one’s I have put on hold
- Projects with a WAITING todo state are ones others have put on hold
To ensure that the state flow from TODO to DONE is unbroken, I have two sets of TODO states. See the elisp below. The @ symbol prompts me to leave a note when I change the state, which is appropriate for quickly making a note of why something is WAITING or has been DROPPED. the ! symbol inserts a timestamp – useful to know when I started DOING a project and so on.
The keyword face colours is sort of arbitrary. I The DROPPED, LOG and NOTE states are grey because I don’t want them to stand out, beyond this the colour choices don’t have much meaning. I need to shave this particular yak at some point.
;; trying to make my agenda more readable
(setq org-todo-keywords
'((sequence "TODO(t)"
"HOLD"
"NEXT"
"DOING(!)"
"WAITING(@/!)"
"|"
"DROPPED(@/!)"
"DONE(d!)")
(type "PROJ" "PROJNEXT" "NOTE" "LOG" "|" "DROPPED" "DONE")))
(setq org-todo-keyword-faces
'(("TODO" . "DarkOrange3") ("HOLD" . "DimGray") ("PROJ" . "Magenta") ("PROJNEXT" . "gold1") ("NEXT" . "gold2") ("DOING" . "chartreuse3") ("WAITING" . "wheat4") ("DROPPED" . "gray30") ("DONE" . "SeaGreen3") ("LOG" . "DimGray") ("NOTE" . "DarkSlateGray")))
The second set (PROJ and so on) aren’t really todo states, they are labels. The Note label for instance are for things like project notes and the Log label are for logs of things such as reviews, community meetings and so on. I can list all this via the incredible org-agenda.
So, the final composition may look like this:
* PROJ Develop Community Portfolio Review program :project:
* DOING Develop list of artifacts for review :plan:
* NEXT Discuss plan outline with community moderators :meet:
* DONE Pitch Portfolio Review Program :meet:
* PROJNEXT Plan Out-of-city Jam for members :project:
* TODO Finalize on list of locations :plan:
* HOLD Plan the budget for day long event :plan:
The second project will turn up on my stuck projects list, even though it is labelled as a next project (PROJNEXT), telling me that I need to clear the contradiction. This actually happens in real life. I know I need to move on a project next, but I had put the prep work on hold to shift my focus elsewhere. It’s nice to be able to simply see all my stuck projects, narrow it down to the ones I need to move on next, and work on clearing the logjam.
This is an opinionated view of stuck projects, but it works for me. I more or less replicated the Stuck Projects section from the org-mode manual as is.
Here is the elisp that makes some of this possible.
Org-Agenda Custom Command
This is a org-agenda custom command. The order it displays in is:
- Show me my agenda for the next 2 days
- Followed by, Priority A tasks
- NEXT tasks
- NEXT projects
- Priority B and C tasks
- and last – all tasks on hold or waiting
By the way, I edited tasks priorities within M-x customize Groups and Priorities to set D as the default priority and E as the least. This is because org-agenda assumes the default priority to be B and so, lists all tasks. This actually makes sense because a priority ceases to be a priority if it has more than a single level, but I have too many tasks tagged with B and C, so I’m going to keep it this way until I can start applying the new rule of a single top priority – A.
;; Spotted a simple agenda command to show me todos alongside calendar
;; found this on: https://www.youtube.com/watch?v=vO_RF2dK7M0&t=2s
(setq org-agenda-custom-commands
'(("O" "Priority Work Tasks"
((agenda "" ((org-agenda-span 2)))
;; limits the agenda display to two days because I find it useful
(tags-todo "+PRIORITY=\"A\"")
(todo "NEXT")
(todo "PROJNEXT")
(tags-todo "+PRIORITY=\"B\"")
(tags-todo "+PRIORITY=\"C\"")
(todo "HOLD|WAITING"))
Defining stuck projects
;; trying to define stuck projects
;; I found the scheduled piece in an old mail thread...
;; https://getpocket.com/read/3882805950
;; rest is from org manual
(setq org-stuck-projects
'("+project/-HOLD-DONE" ("NEXT" "TODO" "DOING") nil "\\<SCHEDULED\\>"
))
Ensuring the ‘project’ tag is not inherited
;; excluding the tag: project from tag inheritance
;; i don't want sub-items to automatically inherit the tag
;; I got it from here: https://mbork.pl/2016-01-02_Org-mode_%E2%80%93_how_to_exclude_certain_tags_from_inheritance
(setq org-tags-exclude-from-inheritance '("project"))
All these projects are organised in .org files. See this post to learn about Org files and how I organise them.