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:

An example org-agenda

This view has 5 columns that display the following information:

  1. 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.
  2. 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.
  3. Scheduled date or deadline - When this is task is due or if I've scheduled it for a particular day.
  4. Task name - This contains the task status, its priority, and its name.
  5. 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.

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.

Footnotes:

1

I've been doing this job for 12 years but it's really hard to come up with imaginary tasks.

2

At least with made up examples they include all the info I need first time.