I've been a freelance developer for 12 years, and Emacs has been at the center of my working environment for 10 of those. I use it for a lot of things - including writing this post - but today I'm concentrating on my workflow.
Here's how I use Emacs and org-mode during a regular day.
The packages
There are two of packages that are central to my daily routine: org-mode
and
projectile
.
org
itself is a text markup language with a lot of extras that make it great
for organizing work. org-mode
allows Emacs to extract this information and use
it for scheduling tasks, estimating task effort, tracking time, and a whole
bunch of other things. I remember reading that org
is a gateway drug that leads
to Emacs - that was certainly the case for me.
projectile
adds functions for navigating between projects and files. A project
in the world of projectile
is a file directory, which is usually a git working
directory in my case. In a typical day I can work on a dozen different projects,
so being able to quickly jump between them is extremely helpful.
I use a lot of other packages when doing actual work, but these two keep me organized and allow me to quickly get to where I need to be.
The setup
All of my org files live in "~/Documents/org/" and are synchronized between my desktop and laptop.
Each client has their own .org
file with headlines for each project that I'm
working on. I also have inbox.org
which I use for capturing new tasks, and
goals.org
which contains my monthly goals.
Major personal projects also have their own org files, although I'm slowly transitioning to per-project "TODO.org" files instead.
All of these files are added to the org-agenda-files
list so that they show up
in my org agenda.
;; For Emacs versions < 25 (setq org-agenda-files (find-lisp-find-files "~/Documents/org" "\.org$")) ;; For version >= 25 (setq org-agenda-files (directory-files-recursively "~/Documents/org/" "\\.org$"))
Update: thank you to kaiwen1
on reddit for letting me know about directory-files-recursively
.
The agenda
The org agenda is a powerful way to display tasks from across multiple files. Agendas can be filtered to a time period, urgency, project, and much more.
My daily agenda looks something like this 1:
This view has 5 columns that display the following information:
- Category - For freelance clients I use the client name, followed by the
project. This looks something like
client:project
. Personal projects use just the project slug. - Estimate - I try to keep individual tasks on this list to under 2 hours. If it's longer than that, it probably means I haven't broken it down enough.
- Scheduled date or deadline - When this is task is due or if I've scheduled it for a particular day.
- Task name - This contains the task status, its priority, and its name.
- Tag - This is used to identify project and client tasks, and also to store my monthly goals. I used to use this for GTD-style contexts, but seeing as 99% of my work is at the computer I didn't get much use from it.
The configuration for these columns is fairly simple:
(use-package org-agenda :after org :custom (org-agenda-prefix-format '((agenda . " %i %-20:c%?-12t%-6e% s") (todo . " %i %-20:c %-6e") (tags . " %i %-20:c") (search . " %i %-20:c"))))
And the actual agenda configuration (without the code to display my monthly goals) looks like this:
(setq org-agenda-custom-commands '(("d" "Today's Tasks" ((agenda "" ((org-agenda-span 1) (org-agenda-overriding-header "Today's Tasks")))))))
To view my daily agenda, I'll run M-x org-agenda
(which I have bound to C-c
a
) and then select d
for the "Today's Tasks" view. It shows me everything I
have scheduled for the day, as well as due and upcoming deadlines.
The day plan
At the start of the day I'll open my agenda and choose which tasks to work on, based on due date and priority. I'll then block out time to work on them on my paper day plan. I'll always leave some extra room for tasks that will pop up during the day.
The day planner itself is really simple and looks a bit like this (shortened to save space):
Monday | Tuesday | Wednesday | Thursday | Friday | |
---|---|---|---|---|---|
9-10 | Task A | ||||
10-11 | Task B | ||||
11-12 | Task C | ||||
12-1 | Lunch | ||||
1-2 | |||||
2-3 | Task C |
I split my work day into blocks of one hour to make things easier; I've tried slots of 30 minutes long, but that felt less flexible and quickly fell apart if something came up. I use red for billable tasks, green for personal projects, and orange for essentials like exercise and eating.
Although org-agenda can be used to create day plans that are similar to this, I prefer having a paper copy in front of me. It lets me get a quick overview of how busy the day is going to be, as well as how much is going to be spent on billable time vs personal projects.
Adding new tasks
I generally deal with two kinds of task: proactive, and reactive.
Proactive tasks are things I've already planned out; I can choose when to work on them, and I know when they're due and what urgency level they are.
Reactive tasks are when emails/calls/chat messages come in and I need to do something about them. They may be urgent and need doing ASAP, or they may end up on the proactive list.
We'll start with reactive tasks first.
An example non-urgent request would be something like "We're wanting to add a new report to <product> by next month. Design and documentation attached"2.
I'll open up the org file for this client, jump to the appropriate project node, and add a new sub-task for this request. In this example it would look a bit like this:
* TODO Create new "days without an accident" report [0/4] DEADLINE: <2021-04-30 Fri> ** TODO Email person re: new report SCHEDULED: <2021-04-15 Thu> ** TODO Create markup for new report ** TODO Add data backend to new report ** TODO Deploy new report to staging for tests
I'd also break down each sub-task into individual steps and add estimates, but that's a topic for another day.
Once this is done, the first task will show up on my daily agenda. My weekly agenda will also have a reminder that there's an upcoming deadline.
For scheduling proactive tasks I'll read through my list of tasks and assign dates as needed. org-agenda can search for top-level TODO items and filter them by category and context. It can also list "stuck" projects that don't have an assigned next action.
Working on a task
When it's time to work on a task, I'll use org's clock timer to track the time I spend on it. Starting work looks like this:
- I highlight the task in the agenda.
- Hit
<enter>
to jump to its entry in the appropriate file. - Switch the task to
IN-PROGRESS
. - Start clocking time with
C-c C-x C-i
. - Navigate to the project with
C-c p p
. - Choose the file I need to be working on and start.
- Use
C-c C-x C-o
to stop the clock once I'm done or need to switch.
- Clocking in can be done directly from the agenda (thanks to reddit user
codygman
for this tip). - The task state can be automatically switched using org-clock-in-switch-to-state.
I know all the previous steps sound like a lot, but going from my agenda to working on a task only takes a few seconds.
Emacs also supports bookmarks, so if I want to start on something immediately the next day, I'll leave a bookmark in the right spot so I can jump straight to it.
Tasks in org have a keyword at the start to indicate their status. I use the following keywords:
TODO
- A task that I need to do.IN-PROGRESS
- A task that I've started and is actively being worked on.TESTING
- A task that is being tested and reviewed by the client.WAITING
- A task where I'm waiting on something - could be more information about what needs doing, or it could need an external party to review it.TO-DEPLOY
- It's done and ready and waiting to deploy at a specific date & time.DONE
- It is done and nothing needs doing on it again.CANCELLED
- The task/project was cancelled for one reason or another.
Because org-agenda can search for keywords, it's easy for me to check for
various tasks during my weekly review. For example, I can check through the
WAITING
list and see if I need to follow up on anything.
I also use org for detailed project planning; it's great for breaking down a
task into chunks, adding estimates, and assigning to milestones. But this post
is already boring long enough so I'll save that for another day.
~~~
If you found this helpful and would like to read more content like it,
follow me on Twitter.
4 Comments
Excellent post! I got some ideas. One thing, how do you manage to have specific monthly goals (primary and secondary) as shown in the agenda? I'd like to do the same. Thanks!
Hi Adela, thanks for the comment!
To display my monthly goals I use a custom agenda command that searches for tasks with a specific tag. I wrote about the full process here: displaying my monthly goals in org-agenda.
Hi Phil, I came across this while searching project management in org-mode, you've given me ambitions to customize my org-agenda some more!
The section about jumping between project contexts stood out to me. If you do similar context switching in a Chromium browser you might find my extension - BrainTool useful (@ABrainTool on twitter). Its a bookmarker/browser controller that uses Org as the backing store. I'm actively soliciting feedback.
Hi Tony, thank you for the suggestion! I use Firefox for my browsing, but braintool definitely looks like an interesting extension. I really like how it stores everything in an org-mode file and gives you full access to it - I'm all about plaintext data!