How I Get Things Done

I currently work as a freelance software engineer. Although my work hasn't changed too much since I started, how I organise myself has.

This is a short post about how I currently get things done & my current work setup. I've always found it interesting to see how other people work, but I always want to be able to look back and see how my setup has changed over time.


My tasks generally fall into the following buckets:

  • Working on stuff I already know about - This is anything that takes longer than a few hours. Most of my work falls into this category.
  • Working on new tasks - New tasks either come directly via email, or from support tickets
  • Phone calls - I try to keep these to a minimum
  • Fixing things - Finding out what broke, why it broke, and then fixing it

As work comes in I'll have to make a decision on how important it is, based on what it is and what I'm already doing. For example, if I'm working on a fix for one project and an email about tweaking text comes in, I'll put it off until I'm done. However, if a site is down or something is seriously broken I'll drop what I'm doing to fix it.

Daily Routine

I've kept this for the last few years. There's room for improvement, but so far I've found it to be the most efficient system for me.

  • Get up nice and early - I aim for 5:30am
  • Check for any important emails that came in overnight. Add anything else to my todo lists.
  • Work on whatever I have going on. Getting up early allows me to get important work done before everyone else wakes up and starts adding more.

    I'll check my org-agenda first to see what's due, and then work on any other priority items. I prefer to work on something that I can get done before 8 so that I've started my day in a good way.

  • Break around 8am for breakfast. I'll usually have a snack around 10am - either fruit or nuts of some kind.
  • Break at 12 for lunch
  • Aim to finish work for 5pm. Usually finish much later…

Every day is a little different. Sometimes everything goes smoothly and I have a nice, efficient day. Other times everything starts going wrong and my plan goes straight out the window.

Organisational Tools

I've simplified my setup in recent years, and it currently has very few components:

  • Emacs + org-mode - For things I need to think about harder I'll use some paper to sketch out notes, but that's pretty much it.

    I have a directory for client projects, and each client has their own org file. I also have directories for my own projects, and an file for keeping track of incoming items and things that don't really belong anywhere else.

    All my org files are synced using DropBox.

  • Mozilla Thunderbird for managing my email
  • Trac for ticket management

Doing the work

The majority of my projects are web-based, so my setup is tailored towards making that more efficient. Like my organisation system, I've tried to keep things simple.

  • My editor of choice is emacs - see my list of emacs extensions for an idea of what I have installed. My .emacs.d is also synced using DropBox so that whether I'm on my laptop or desktop I have pretty much the same environment.

    I also use emacs for tracking my time, although for some clients I use Harvest.

  • All the sites I have in development are run from a single server. As my work is web-based it helps to have a local machine to test on, and it also makes life much easier when using different development machines.
  • PHP development tools include phpunit and behat for testing, and phing for automating things (such as testing and deployment). Everything lives in source control where possible. I prefer git as it's easier to get small repositories setup quickly.

    I also use guard and guard-livereload to refresh sites as I'm building them. guard alone has saved me hours when slicing things up.

  • Hardware consists of a dual-monitor GNU/Linux desktop and a MacBook Pro. I usually work on the desktop when I need more room to see things, such as turning an image into an HTML template.

Keeping Going

I use a couple of other tools to keep me in line:

  • RescueTime - This helps me keep an eye on how much time I'm spending on various activities. It also has a nifty tools for blocking websites when you need to focus.
  • - my favourite Pomodoro app at the moment, mainly because it's so simple and keeps track of statistics between machines.
  • Router block - All distracting websites are blocked by my router between 5am - 5pm. This gets rid of the temptation to "just check the news for a bit".
  • Beeminder - I have a private goal for tracking how much work I'm billing. At some point I want to add another goal to make sure I don't do any work past a certain time. It's all too easy to spend all your time working.

One Year with Beeminder

I first started using Beeminder back in April of 2012, and since then it's become an important part of my toolset. I still fall off the road more often than I'd like, but overall it's made a very positive impact.

Getting the most out of Beeminder

Over time I've noticed certain patterns emerging in the Beeminder goals I've tried:

  • Start small, get big – My biggest successes have come when I've started small and worked my way up. My biggest failures have come from trying to do much too soon. That just leads to falling off the road, getting frustrated and losing money.
  • Avoid time-based goals – I try to avoid things like "write for X minutes a day". When work gets busy I tend to enter full-on panic mode to get things done, and sometimes I'll end up spending my time on "filler" tasks in order to meet my goal. I still have a few time based goals, but I find them much harder to keep. Maybe that just means I need to manage my time better.
  • Automate where possible – If you can't automate, try and pick a measurement that doesn't take much effort such as "did you exercise today?" rather than "How many calories did you burn?" The idea here is to reduce as much resistance as possible.
  • Make a pledge – I can say with absolute certainty that having money on the line works wonders.

Isn't Beeminder just a crutch for people with no self-discipline?

Sort of. But in a good way.

I've found it difficult to accept that I have very little discipline in some areas of my life. Some things require constant effort, Beeminder acts as a nice kick up the bum for when I start slipping back into bad habits.

So far it's worked out pretty well.

Pomodoro Guide Updated

The Pomodoro technique has gained a lot of attention in recent years. It's incredibly simple, requires virtually nothing to get started, and it fits in well with just about any organisational system.

As its popularity has increased, so have the number of Pomodoro apps available - which is where the Pomodoro Apps Guide comes in. I've tried to cover the main categories (online, desktop and mobile) as well as give a little rundown about the app.

The full guide can be viewed here: Pomodoro Apps - it's still very much a work in progress, so I'll be adding new apps as I go.

A new start

It's been over seven years since I wrote my first post on this blog. In those seven years I've averaged a whopping post every two months. I don't think anybody could accuse me of writing too much.

When I first started I quickly fell into the trap that every post had to be useful. It sounds logical, but what it actually means is I've ended up with a folder full of drafts and not much else.

Lately I've been reading through my old writings. Over the years I've kept journals, written blog posts and kept various activity streams. Going back to them was enlightening (to say the least), and it made me a little sad that I hadn't written more.

The funny thing is that I actively try to avoid writing about myself on this site. Funnier still is that I deliberatly bought a domain with my name in it to force me to write about myself.

Starting again. Kind of.

Last year I converted the main site to Jekyll. Previously it was just a bunch of custom PHP files which meant adding new content to the site was a bit of a pain. After the conversion everything on the front end is kept in plaintext (org-mode formatted) and then built using Jekyll.

One side effect of the conversion was I felt much more comfortable editing and adding content. I've decided to see if this effect will work on other areas, so of today the blog is now built using the same process.

There's still a few other things I want to get working, but I didn't want to get stuck in the whole perfection-procrastination loop. I don't really know where I'm going with all this, but I think I'm starting to appreciate that the process is as important as the result.

WordPress + Beeminder = Happy Blogger

I've been using Beeminder for a couple of months now, and I've grown rather fond of its stick based approach to goal achievement.

However, one of the biggest problems I have with the service is the data entry side. Although it's pretty easy to add new data, frequently entering new data points can add a little friction to the whole process.

Thankfully the folks at Beeminder released an API a few weeks, so I've been playing around with ways of integrating it with my work flow. One thing I've wanted to do for a long time is blog more frequently, so a WordPress plugin to notify Beeminder when I post seemed like a good idea.

So here it is.

Beeminder Ping

Beeminder Ping is a really simple plugin for WordPress that notifies Beeminder whenever a post is published. Amazing features include:

  • Notify a Beeminder goal with a single value when a post is published. Good for "post 5 times a week" style goals.
  • Notify a Beeminder with the word count of a newly published post. Perfect for "write 1,000 words a week" style goals.
  • Only notify Beeminder for newly published posts, not edited posts or ones that have been moved from published -> draft -> published.

You can download the latest release from the Beeminder Ping page, either as a tar.gz file or a zip. Once installed, you can enable the different notification types and set which goals should be pinged.


As Carl Sagan would say, if you want to write Beeminder Ping, you must first create the universe. Luckily the universe is already here, but I needed a way to interface with the API using PHP, so I wrote beeminder-api. It's still a work-in-progress, but you can download the source from GitHub and play around with it. Please let me know if anything is broken, missing, or just plain sucks.