In my previous post about how I use OmniFocus, I made reference to an on-hold project template called “New App Release”. Anytime I release an update to one of my Mac apps, I follow this checklist. In case it’s useful to other developers, here’s what it contains…
Verify build with Deploymate – this scans my Xcode project and compares all of my API calls against my build target warning me about any deprecated, missing, or private API calls.
Increment version number in Info.plist.
Tag the release in git.
Publish the git tag.
Archive the project in Xcode and export a [Developer ID].(https://developer.apple.com/developer-id/) signed build to the Desktop.
Verify Gatekeeper and code signing is correct by running spctl -a -v App.app.
Zip the exported app binary.
Write release notes and upload the new build’s zip file to your hosting provider of choice.
Do whatever you need to do to make a new release happen in Sparkle.
Do a test update in the old version of the app.
Do a test download of the new version from your website.
Upload the dSYM file generated by Xcode’s Archive step to Hockey or whatever crash symbolication service you use.
Thanks to Tony Arnold for prompting me to post this checklist.
The best Evernote realization I ever had was to create an Evernote notebook called “@Inbox” and make it your Default Notebook. (The @ in front of the name ensures it will be sorted to the top of your notebook list.)
From then on, you can quickly save notes and web pages into your Inbox notebook and move on with your work without interrupting your flow.
Then, when and only when you have time, you can review everything in your @Inbox and sort each note into a more appropriate notebook. That doesn’t mean you can’t have a catch-all “My Notebook”, it just means new notes don’t end up in there, un-processed by default.
I’ve been using OmniFocus since the Kinkless days. Over those many years, my life has changed in countless ways, and with it, so has the way I use OmniFocus. Perhaps the best compliment I can give the app, is that it’s always managed to be exactly what I needed it to be at any given moment.
Four years ago, I wrote a long post about how I used OmniFocus to manage the three areas of responsibility in my life: personal, work, and freelance. Those areas have all grown rapidly since then. I’ve had my first child, taken on a more demanding full-time job, and watched my side business grow into it’s own full-time operation.
I figure it’s time to show how my workflow with OmniFocus has evolved to take on the added responsibility in my life.
I’m going to break this post down into three sections:
How I Organize My Projects
How I Define and Implement My Contexts
My Daily Workflow
Let’s get started.
How I Organize My Projects
Similar to what I described four years ago, the majority of my projects are sorted into three folders which represent the three primary areas of responsibility in my life:
Personal
Tandum (my day job)
Freelance (my side business)
Other than the different job, that’s pretty much how things were four years ago. What’s different, however, are the three additional folders I’ve added to the bottom.
The first one, “Photo Book”, is for the book I’m writing. It’s a large enough task that I needed to break it down into multiple projects. I could have kept them under my “Freelance” folder since they technically are a side-project, but that felt wrong as writing is such a different beast than software development. And that’s one of the key lessons I’ve learned as my use of OmniFocus has evolved. Don’t feel like everything has to fit into a neat, pre-existing category. Don’t artificially restrict yourself. Feel free to let things land wherever makes sense to you.
The second and third additional folders are special. First, you’ll see that I’ve moved all of my Someday/Maybe/Tickler projects into one folder. I was tired of them littering my other project views, even being on-hold. Grouping them into one location helps my sanity. I also know they won’t be forgotten as they show up automatically at set intervals during my OmniFocus review.
The final folder is for template projects. These are projects that have many steps and frequently repeat. Instead of recreating the project from scratch each time, I create it one time and place it on hold. Then, whenever that project occurs, I can drag a copy of it into one of my active folders. The two template examples in this screenshot:
New App Release: Every time I release a new version of one of my apps, there’s a concrete fourteen step process to ensure everything goes smoothly. I’ve eliminated most of the chance of error by using this project as a simple checklist for each step.
Travel Packing List: This is a great idea I read somewhere else online. I used to worry every time I walked out the door to catch a flight that I had forgotten something. Now, I have a standard list of everything I need to pack that I can confidently go through before each trip. As you’ll see in the next section, each of the items on my travel packing list are assigned to a context of the store where I’ll need to buy them if they’re disposable. (Target, Walgreens, etc).
One rule of thumb I’ve learned the hard way is to never nest folders. Folders within folders just lead to a world of hurt and cognitive load. I’ve found it’s best to keep as flat a hierarchy as possible. Your milage may vary of course.
How I Define and Implement My Contexts
One of the most significant changes I’ve made is how I approach my contexts.
I used to go with standard run-of-the-mill contexts that related to the specific tools I needed at hand to complete a task. Things like “Mac”, “Phone”, “Home”, and “Work”. But after re-reading Getting Things Done last year, I came to the realization that most of my tasks are bounded not by what tools I have available, but by my energy level. Tasks such as “Write new blog post” and “Update credit card mailing address” are both something I need to do while at my computer but require vastly different levels of energy and time to complete. This insight led me to categorize my tasks into the following contexts:
Full Focus – tasks which I need uninterrupted time and concentration to complete
Quick Hits – tasks which I can knock out in just a few minutes, one after the other
Brain Dead – tasks which require no energy or concentration
I found great success with splitting up all of my tasks into one of those three contexts. It allowed me to judge what sort of mood I was in and how much time was available before determining what to work on. After a few months of using this strategy, I further segregated things by breaking them out into parent contexts of “Personal”, “Work”, and “Freelance”, which correspond to my primary areas of responsibility. While not strictly necessary, this additional grouping allows me to focus on what’s appropriate depending on whether or not I’m at home or at work.
Of course, not all of my contexts relate to energy levels. I still have a “Phone” context and ones for stores I frequent. (Although, I no longer use OmniFocus for shopping lists other than for big-ticket, future/someday purchases. All of my family’s shopping lists are kept in sync between my wife’s and my iPhones using the wonderful Silo app).
The biggest and best improvement I made to my daily workflow was to codify my morning routine for picking what I’m going to work on that day. (In fact, a big part of determining what to work on each day was simply realizing I need to a concrete series of repeatable steps for choosing my day’s tasks.) Back in 2010, I wrote
It’s hard to describe how incredibly powerful Perspectives are until you actually spend a few days with them in your workflow. Other task managers have smart folders or dedicated “Today” lists, but they absolutely pale in comparison to the flexibility that Perspectives afford.
The same is still very much true today. I’ve taken OmniFocus’ perspectives feature and simplified them down to three custom perspectives I use to plan and attack my tasks for the day.
Each morning when I arrive at work, I switch to my “Planning” perspective. This perspective shows me every single task that I could possibly do, grouped by context. I take five minutes and work my way through each task and decide if it’s something I want to focus on today. If it is, I flag it. I try and pick two “Full Focus” tasks that I believe I can accomplish that day. This ties in nicely with my daily goal of doing one (or two!) concrete actions. Additionally, I pay special attention to any tasks in my “Quick Hits” or “Brain Dead” contexts. I try and flag as many of those as is reasonable, since I know there will be times during the day where my time will be limited or where I’ll be low on energy.
Once I’ve flagged what I want to do today, I switch over to my “Today” perspective. This perspective shows all of my flagged tasks in addition to anything that is due or due soon. The list is then sorted by due date. This gives me a complete overview of everything that must be done today (and anything with a due date should really be due that day, otherwise why have a due date at all?) and what I had previously flagged to complete today.
Throughout the rest of the day, I spend nearly all of my time in this “Today” perspective. I simply work my way through my list, item by item, working to get as much done as possible before it’s time to go home.
My final custom perspective is “Waiting”. That’s simply a list in context mode, focused on my on-hold tasks that other people owe me, grouped by person. This is particularly helpful when synced to my iPhone. When I’m in a meeting or run into someone, I can just tap this perspective and see if there’s anything we need to discus. For more details on how I handle the relationship between tasks and people, here’s a post I wrote earlier this year on the topic.
Wrapping Up
So, that’s it. That’s a quick summary of what my OmniFocus setup looks like four years since I last wrote in detail about the app. The biggest difference maker in my daily sanity has been the realization that I can stay on top of everything in my life with very little mental overhead if I simply trust my system and take five minutes every morning to plan my day. That, coupled with weekly reviews, ensures nothing falls through the cracks.
I’d love to hear about your own custom OmniFocus workflows. Feel free to email, tweet, or write to me in the comments below.
A few weeks ago there was some discussion online about hiring virtual personal assistants to help offload non-essential business tasks. Around that same time a Twitter user messaged me (and quite a few other indie devs) asking what sort of business tasks we would consider outsourcing. I’m pretty sure this industrious @replier was just looking for job leads, but it did cause me to stop and consider what parts of my business would I be comfortable delegating to an assistant.
The short answer is, not much.
For developers of a consumer-oriented product I think there might be a strong possibility of being able to hand off documentation writing and lightweight customer support. It would be great if I had someone answering emails that only required a link to an FAQ article, leaving the truly in-depth questions for me to answer.
But for a technically niche product like VirtualHostX, I worry my non-specialized assistant wouldn’t have the technical chops to answer anything but the most basic support questions. Writing documentation would likely also be a problem. However, if they’ve used the software proficiently in the past, the thought of them editing together some instructional screencasts is very appealing – as that’s something I never find the time to do myself. I’d love to build a list of topics and then have them go off and come back with screencasts ready-to-go. I’d easily pay a few hundred dollars a-piece for that service.
So while I’m not comfortable outsourcing my core business tasks, I have begun delegating personal tasks to free up more time for the business. A few months ago I signed up for Fancy Hands. For a few bucks a month I have access to a network of virtual assistants that I can send odd jobs to. Basically, anything non-confidential that can be completed electronically and/or remotely is fair game. I’ve used my assistant to schedule appointments, cancel hotel reservations, price shop, and do online research. I’ve been very pleased so far.
At first I found it difficult to come up with tasks to delegate to the service. A week or two would pass and I’d suddenly think “Oh, crap. I haven’t tasked them with anything lately” and worry about not getting my money’s worth.
So, I created an “on hold” context in OmniFocus called “Fancy Hands” just like I would create for any other person I assign tasks to. Then, during my weekly review or when I’m flagging tasks for the day, I’ll consciously keep an eye out for anything I can assign to them. This helps with remembering to delegate tasks as the possibility of doing so is forefront in my mind.
I don’t have any big conclusion or take-away. These are just my thoughts after actively trying to learn how to delegate tasks while running a one-person company.
I often find that constraints, real or artificial, can be a huge motivation and productivity boost when I find myself stalled on a project or piece of work. Forcing yourself to work within a specific limitation can cause you to find a creative solution in a direction you might otherwise never consider.
In my own work, I find time constraints the most useful. When I don’t know where to start developing or writing, I’ll often force myself to do something – no matter how small or tangential – to move the work along for thirty minutes or an hour. The artificial time limit frees my mind to attempt starting points I might not typically choose because I know that even in a worst case scenario, I’ll only lose an hour worth of work if my chosen path is unsuccessful. Similarly, when I find myself lacking motivation and energy to work, I’ll use the pomodoro technique. That gives me the kick in the pants I need to break the ice and get moving, which can often turn into real energy and sometimes even that magical “flow” state.
A few weeks ago on a Friday night I found myself burnt out from my day job. It had been weeks since I had done any recreational programming or development on my side projects. I desperately wanted to move them forward, but simply couldn’t find the energy.
So I tried an experiment.
I decided to give myself thirty minutes to brainstorm and come up with a product idea that I could then build to a shippable state within the next two hours. Further constraining myself, I decided to forgo my two 27″ monitors and do everything exclusively on my 11″ MacBook Air.
I knew the easiest way to come up with a new product idea was to examine my typical day and find a small pain point that I could solve with software. After mentally going through my usual day in my head, I began to focus on my calendar. I realized that I was often checking multiple times throughout the day to see how much time I had until my next appointment, which would influence which task I could take on before I have to be somewhere. (As many developers will know, a programming assignment that will take an hour, often takes longer as there’s a definite lead-up time before you really begin coding where you work to get yourself into the zone.)
I thought “Wouldn’t it be easier if I could just glance up and see how much time I had remaining?”
With that insight, I had my product idea.
Over the next ninety minutes I built a simple Mac menubar app that looks at your calendar and simply displays how long you have until your next appointment. I call it Up Next. I’ve been using it as part of my daily routine for the last few weeks and have found it works great. Without losing place in my current work, I can glance at my menu bar and see “Oh, I’ve got two hours until I need to be somewhere” or “Crap, I’ve only got twenty minutes to wrap this up”.
That little bit of awareness doesn’t distract me from getting in the flow, yet keeps me persistently time boxed and motivated.
If you find yourself similarly lacking motivation throughout the day, I encourage you to try placing a constraint on your work. And if you think Up Next might be useful to you, you can give the app a try.
I want to give a big thumbs up and a hug to everything in this fabulous post by Paul Kim. I missed it back in August when this discussion was initially happening but came across it on Gus’s blog this morning. Paul writes about his expectations starting out with Hazel and what he’s discovered looking back on his success. This portion specifically speaks to my (moderate) success and what I’ve learned:
But it wasn’t easy and it wasn’t overnight. A common sentiment I see among a lot of new devs is that if they aren’t living full-time off their app in the first year, it’s a failure. I know when starting out there is the hope that your app will be an immediate success. It’s fine to hope that; after all, its our dreams that drive us to succeed. But you shouldn’t expect it. I would say it took about three years before I could be comfortable living off of it full-time.
That’s exactly one of the points I was trying to make when I wrote about my own journey. My initial expectations for VirtualHostX were very tempered – I just wanted to earn enough money over the lifetime of the app to install hardwood floors in our tiny house. But, as the app and my audience grew, I would occasionally readjust my expectations – eventually to the point where I could financially sustain myself by my app revenue alone.
If you release your 1.0 with awareness that you may not succeed until 5.0, you’re in good shape.
Paul’s other point about luck is also worth keeping in mind:
One thing that I did learn is to have a healthy respect for randomness. Luck plays a huge role and you can’t always attribute one’s success or failure solely on their decisions and actions….That doesn’t mean you sit back and just let fate decide; you still need to work to improve your chances. Just realize that there’s a big chunk you can’t control and that on some level, you need to be ok with that.
While I’ve poured a lot of time, energy, and work into my apps, I’m very much aware that a lot of their success is just dumb luck. Case in point: I was extremely fortunate that of all the apps I could have built, I happened to pick a niche market without any serious competitors. Not only did that make me the only game in town, but it also allowed me time to breathe and let my app grow organically to meet my ever growing list feature requests from my customers. Sure, picking a niche in an underserved market is business school 101, but for the dumb twenty-four year-old that I was, that was a supremely lucky break.
In any case, if you have any interest in a successful indie journey, give Paul’s post a read.
Gus has a terrific post on his blog about what he calls “the wilderness” – a period of time between major software releases “where I’m pretty lost, and I don’t know what to do.” His working theory on the matter is that it’s basically a forced period of rest put upon you by an overworked brain. How do you get past it? The same way you walk out of any wilderness – “One foot in front of the other…You can walk for miles and maybe months in the wilderness. Just keep on going.”
I take comfort in knowing that I’m not the only one who experiences periods of low energy slogging through work like this. Unlike Gus, however, I don’t blame it on a stressed or over tired mind. For me, as someone who suffers from depression, I know that these periods aren’t just a symptom of working too hard, but that they’re actually just one part of a cycle between times of depression and times of whatever the opposite of depression happens to be.
I’ve been tracking my mental health through copious notes and journaling for three years as a way to better understand what triggers my depression, how long it lasts, and what I can do to work my way out of it. The biggest lesson I’ve learned is that these periods always have an end. They’ll pass. If you have faith that that’s true, then it becomes easier to listen to your mind and not try and force things when the timing and mood isn’t right. In the same way that I take advantage of my mentally high states and code like a crazy person, I know to divert my focus to other more doable tasks when I’m at a low point. Rather than coding, I’ll update my FAQ articles, record screencasts, or do a deep dive into my marketing analytics safe with the knowledge that I’ll come through to the other side and return to coding in a better state of mind.
Gus equates escaping these periods with putting one foot in front of the other and continuing to walk until you find your way out. For me, I see it more as riding waves on a boat. There’s going to be low points just as there are high ones. The key is to keep sailing.
For years I’ve used on-hold “waiting” contexts named after coworkers and family members to denote tasks that I’ve assigned to other people and am waiting on them to finish. But a few weeks ago I had a realization that there are two other types of relationships between tasks and people that I haven’t been tracking. And with a few quick modifications to how I title my tasks, it’s possible to track them in OmniFocus.
Let me explain.
There are three types of relationships between tasks and people:
A task can be assigned to another person by you.
A task can be assigned to both you and another person.
A task can be assigned to you by another person.
Number one, tasks assigned to another person, can be handled as mentioned above by giving the task a context corresponding to the name of the person it’s assigned to. So, if I’m waiting on Jeff to complete a design document, I’d give that task an on-hold context of “Jeff”. This lets me quickly filter tasks that Jeff owes me whenever I run into him. Great. I’ve been doing this for years.
But it would also be super useful to track tasks that are shared between you and someone else. How can you do this with OmniFocus?
The best solution I’ve found is to add the other person’s initials to the task title surrounded by parentheses. For example, a task that I’m working on with Mike Davis would be titled “Review design specs (MD)”. Then, much like focusing on a context assigned to a person, it’s easy to view all of the tasks you’re doing with someone else. Just perform a search for their initials inside the parentheses like “(MD)”. You can even perform a search and save it as a custom perspective for people you frequently need to review. And don’t forget the parentheses – they’re important. It prevents your search from finding task titles with words that contain the initials you typed.
Taking the initials trick a step further, I add initials inside square brackets for tasks that I owe someone else. For example, instead of creating a task titled “Complete TPS report for Jack Posey”, I title it “Complete TPS report [JP]”. Again, this lets me perform a search for anything I owe Jack.
You could go even further and use additional sentinel characters to define other relationships between tasks and people. For example, you could use curly braces { } or angle brackets < >. I don’t use those myself, but it’s nice knowing they’re available if there’s another relationship type you frequently need to assign.
I’ve always gone with portability and sleekness over outright power and versatility. I bought an 11″ MacBook Air the day they came out. I switched to an iPad Mini from the bulky third generation iPad. I walk around with a slim wallet. I keep my iPhone naked in my pocket – no case.
So I was hesitant but very curious about the iPhone 6 Plus. I’ve always scoffed at Android users with huge phones – mainly because I never saw the benefit. Very few Android apps adapt themselves to take advantage of the extra screen real estate. Most users spend all day with stretched and scaled up apps that could just as easily run on a smaller screen device. But with Apple’s recent advancements in AutoLayout, size classes, and their keynote demo, I love the idea of the additional UI elements a larger screen iPhone could provide.
That said, it goes against my very nature not to get the most portable device I can afford.
But after spending a day with a Samsung Note III in my pocket as a size comparison, I came to a realization I hope comes true.
The 6 Plus may be a huge phone, but it might just allow me to give up my iPad (which I don’t use very often) and consolidate down to only one iDevice.
In that sense, going with the Plus actually is the smaller option.
I’m probably not going to say anything new. But I wanted to put down on paper my system for staying on top of email since I so often see people with overflowing inboxes. And I’m not trying to specifically call out anyone I’ve worked with in the past with an unmanaged inbox. I’ve known plenty of very productive people who can’t stay on top of their email. This is just my solution for taming the crazy.
Every morning when I wake up, I typically have 20 – 30 new emails across my three inboxes. (Personal, Freelance, and Work.) Usually, while standing in the kitchen drinking coffee, I’ll open my iPhone email client of choice (Dispatch – it’s truly amazing) and switch to the combined “All Inboxes” view. Then…
I read the subject of every email. If I don’t know what the email is from the subject, I’ll tap and read the body.
Every email is read. Without fail. Nothing is skipped.
For every email, before I move on to the next one, I do one of four things with it:
Delete it
Send it to spam
Archive it
Leave it in my inbox in an unread state
Those first three actions should be mostly self-explanatory.
If it’s trash, I delete it.
If it’s unwanted, I mark it as spam. I know some people will just delete spam emails, but that does yourself a disservice. At least with Gmail, by marking a message as spam, Gmail will learn to mark future similar emails automatically as spam – leaving you with one less email to triage.
If it’s a legitimate email that does not require a reply, I archive it. Gmail has blessed us with practically infinite email storage. You never know when you might need to refer to an old email, not matter how mundane, and it’s absolutely no bother to archive an email just in case you may one day need it.
With those three options out of the way, that only leaves emails in your inbox that require a response or an action on your part. If an email requires an action, I send it to OmniFocus and then (you guessed it) archive the email.
If the message requires a reply, I leave it in my inbox until later in the day when I have time to reply. And immediately after reply, I archive it.
Throughout the day I’ll get new email. I feel no need to check it immediately. When the time is right, I repeat the above process on any new emails.
And during the day when I have time to reply to email, I know every message left in my inbox needs a reply without having to reassess them or make any decisions. Just open an email, reply, and archive.
I follow this routine ruthlessly. The result is a completely manageable and under-control email experience. No emails ever get lost in the shuffle or forgotten. Everyone who needs a reply from me, will get one. And any email that requires an action will be acknowledged.