Better Recurring Projects Using OmniFocus and TaskPaper

I’m a firm believer in the whole mind like water spiel that David Allen preaches through GTD. I jumped on the Gettings Things Done bandwagon around 2004 I think – the first of my two senior years in college. And here we are in 2020, which means I’ve been practicing this methodology (with varying levels of success) for over fifteen years. And now, looking back, I can see that it was probably 2010 – six years in! – before I became truly comfortable with letting go; before that whole mind like water state of flow finally became second nature.

For me, and I guess most people doing the GTD thing, getting to that point meant fully trusting your system. And that’s exactly what I mean when I say “letting go” above. You have to train yourself to be diligent enough that putting everything into your system becomes habit. And you have to trust your system (paper, digital, whatever) enough so that all those open loops in your head fall away and you can just let go and go about your life confidently.

Years ago, I worked on a piece of medical software that was designed to ensure surgeons operated on the correct side and limb of the patient’s body. It’s the 21st century; you’d think the medical industry would have fixed that problem by now, right? But even after verbally confirming with the patient before surgery, and then even after marking the incision site with a Sharpie, doctors still occasionally operate on the wrong part of the body. The software I helped build aimed to solve this problem by being a glorified, cloud-synced checklist that hospitals could buy for tens of thousands of dollars per license. (Enterprise software sales is ridiculous.) And I’ll be damned, but the research showed that medical facilities using our software reported a statistical decrease in operating room screwups.

That point of that story is to say that checklists – particularly ones that recur and involve multiple, detailed steps – can be an amazing tool to have at your disposal. And learning to use them was a huge part in my own journey towards letting go of all the crap in my head.

And so, for a long time now, I’ve been using checklists for all of the recurring, multi-step projects in my life. Here are some examples:

  • Releasing an update to one of my Mac apps is a twelve step process. Some of it can be automated – but not all. And if I forget or mess up any one of those steps, it could botch the whole release.
  • At the start of every month, I sort, organize, and backup all of the photos and videos my family took during the previous month. Because of the sheer quantity of data we generate every 30 days – and also the fact that I’m slightly crazy and don’t trust any single cloud provider with my memories – that backup process involves syncing tens of gigabytes of data and a bunch of shell commands. Once again, it’s not something I trust myself to get right every time on my own.
  • Every three months I have to renew and ship an updated SSL certificate inside one of my apps. If I forget, or if I mess up, my customers won’t be able to get their work done. This is also another fairly involved process that I can’t easily automate, so I have to do it by hand.

Originally, and for nearly a decade, all of those checklists lived inside OmniFocus as recurring projects. And by and large that worked really, really well. But in early 2019, when I found myself with a bunch of free time on my hands, I took a week to reevaluate all of the systems, inboxes, apps, and habits I use to get life done. One of the best changes that came out of that week was a new approach to handling those repeating projects. And it makes use of two of my very-most-favorite apps: TaskPaper and Keyboard Maestro.

They key insight I had was that while my checklists in OmniFocus were definitely helping make sure I do the things I’m supposed to do, they were limiting in two ways:

  1. Tasks in OmniFocus aren’t very good at holding detailed information about the task – information you might need to actually do the task. There are a few standard approaches to solving this limitation. OmniFocus does have a “Notes” field associated with each task, but it’s basically just a small textview – not really anything you would want to type in or view a sizable amount of text with. Or, you could use the “Notes” field as a pointer to link to some other actual document in your reference system. Many apps now let you copy a unique URL that will link back to the source document. That’s super handy, but in practice I’ve always found it a bit clunky, clumsy, and fragile.
  2. The other drawback to having everything in OmniFocus was that I was not capturing any of the metadata around those tasks as I completed them. When you mark a task complete in OmniFocus, the only thing that’s actually recorded is the completion date. If something unusual happens or goes wrong with one of my tasks, I don’t really have a way for my future self to reference or learn from the mistake. Or say everything went totally fine and normal, but I just need to store some piece of information particular to a task. Where does that go? Again, OmniFocus has that “Notes” field, but I just don’t find it very usable in practice – especially since the app isn’t really optimized for going back in time to reference past actions. (Nor should it be, really.)

To fix those two shortcomings, what I ended up doing was converting all of those recurring projects into TaskPaper documents. Each document contains all of the actions for the project, which of course can be nested and organized just like they were structured in OmniFocus. Then, back in OmniFocus, I deleted the project and replaced it with a single recurring task that reminds me when it’s time to start the project again.

When that time arrives, I make a duplicate of the template TaskPaper document just for that specific recurrence of the project and work my way through the checklist like normal. Having everything stored inside the TaskPaper document solves the two problems above.

  1. It’s a plain text file that can be opened with TaskPaper or any other text editor. So, I’m free to add in as much supporting material for each task as I want. I can literally drop in paragraphs and paragraphs of prose between each task if I need to. Or, some of those projects might require technical details. I can just inline those in the document itself. The same goes for actual URLs linking to other supporting materials or websites.
  2. If I need to take notes, remember anything about a particular task as it happens, or record the outcome or any results of the work, I store that in the document, too. That way, everything is self-contained and in the correct context if I ever need to reference what happened. And, again, since it’s all plain text – everything is easily searchable from Spotlight all the way down to grep.

After the project is complete, I file away the TaskPaper document for safe keeping.

So that’s the theory behind the system I’ve migrated to – and it works great. But what does it actually look like in practice? As an example, let’s look at my monthly project that backs up my family’s photos and videos. (My workflow is slightly insane, but I have “reasons”.) In OmniFocus, that project looked like this:

And that’s great. That gets the job done and makes sure I don’t miss a step. It also helps because some of these steps can take an hour or more of waiting around for data to transfer, so if I get distracted by something else while waiting, I know exactly where to pick back up from.

But, there’s also a lot of complexity behind each of those actions. The “configure server” step involves running a shell script. Where should that be stored? I find it’s a bit of a balancing act between keeping reference material contextualized alongside the task itself vs keeping it in some type of external storage (DEVONthink, Evernote, Apple Notes, Bear, etc). In this particular case, I like having it right there. And that’s not very easy with OmniFocus. (This isn’t me bitching about OF. I don’t think or know if it should even be a use case they support. There are better tools for that job, which is what I’m leading up to.)

Now, compare that to what the TaskPaper document for that project looks like:

Same thing – but now I can inline the information I need to complete each step. For this project, that happens to be all of the necessary shell commands.

So, ?, TaskPaper is great for this sort of thing. But as more and more of those documents are created each week and month, where do they all go? How are they managed, etc? Glad you asked.

They’re stored in a simple directory structure in a dedicated Dropbox folder, so they’re in sync and available on every device.

(I’ve removed a year’s worth of archives from that screenshot so you can see the full folder structure in a single image.)

It works like this:

  • Lists is a top-level folder in my ~/Dropbox. The checklists that are active / incomplete and that I’m currently working on live in this folder.
    • _Templates stores the templates / original copies of the TaskPaper documents that I duplicate and work from.
    • _Archives is where the files go once they’re completed so I have a single place to search / reference in the future. Also, many times, it’s where incomplete lists go once I give up and abandon one for whatever reason – as is often the case when I just don’t get around to completely finishing my weekly review every Sunday.

Each file has the same name as the template it was duplicated from but with the current date prepended so I can keep track of things and also sort by date in Finder.

I know all of this may sound like overkill to lots of people (especially to my family and coworkers as I watch their eyes glaze over when I get excited and start rambling on about this stuff), but it keeps me on track. More importantly, because I have this system in place – one that works for my weird, specific way of doing things – it truly allows me to let go and do my work knowing that things won’t fall through the cracks.

When I first read the GTD book and was introduced to mind like water and all that stuff, the idea was fascinating to me because it echoed the feeling of flow that most developers (and tons of other creatives and professions, of course) strive to get into when doing focused work. And not having a bunch of baggage in your head about all the things you need to do but can’t yet actually do is freeing and makes it easier for me to do my best work.

Ok, enough philosophizing. Here’s the last thing. It’s a quick Keyboard Maestro macro I wrote that makes this workflow instant.

At any time on my Mac, I can hit ⌘⇧\ (my keyboard shortcut to bring up KM’s macro picker), type the name of a list template, and press ↵. Keyboard Maestro will duplicate the template, put it in the correct folder, give it the appropriate date formatted filename, and open it in TaskPaper.

The macro is smart in that you don’t have to manually specify each list you want to work with. Instead, just add a new template into the _Templates folder, and Keyboard Maestro will read its directory contents each time you run the macro. That way, everything’s always current and available.

And here’s the macro in all its glory, which you can download.

Begrudgingly

Before I get to my point, let’s do some math.

The first digital music purchase I ever made was Eric Clapton’s Me and Mr. Johnson in April 2004 from iTunes. Since then, (I just looked this up) I’ve bought an additional 3,245 songs from Apple.

I couldn’t find a quick way to count how many of those came bundled as albums, or, more interestingly, the total cost of all that music. So let’s just ballpark it between $2,500 and $3,000 in music.

I subscribed to iTunes Match as soon as it debuted in 2011. I think that’s what? $25 a year? The nine years since then works out to an additional $225 for Apple.

I was an Rdio subscriber from February, 2011 until they shut down in November, 2015. At $10/month, that comes out to $570.

And while figuring out those dates, I came across this gem from July 14, 2011 in my email archives:

Yes, that’s a Google Buzz email notification about a tweet I posted saying:

Cancelled my @spotify membership after 24 hours. Nice product, but lacks discovery. Heading back to @rdio.

Again, searching my email archives, I found that I joined Pandora in July 2008 – back when the welcome email was still addressed from Tim.

I couldn’t determine the exact date I first became a paying customer, but I know I’ve been one continuously since at least sometime prior to mid-2012, which is the first record I have of my paid Pandora subscription renewing. Five bucks a month times ninety-two months is $460.

Once Rdio got acquired by Pandora and shut down, I switched to Apple Music. For a while I just paid $10/month for myself. But during the last few years it’s been a family play for $15/month. Regardless, let’s take the cheaper option and assume $10/month since December 2015: that comes out to a cool $500.

To date, that’s $4,755 I’ve legally paid for digital music.

At a minimum.

All of the above was paid to the giants of the industry. I have no idea how much more I’ve spent on one-off purchases to indie bands and labels that were more than happy to accept a few bucks via their website in exchange for a zip file of mp3s. Or the various live concert vaults I’ve subscribed to occasionally.

I don’t have the foggiest clue where that amount of money places me as a music customer. Surely not the low end of consumers? But I doubt the high side either. I’m guessing I’m somewhere in the upper-middle compared to what most digital natives have spent on music.

But my point is this.

I happily and enthusiastically paid for all that music. But now? Every time I see the $14.99 charge for our Apple Music family plan hit my checking account, I wince. I pay it begrudgingly because I feel like I have no other choice.

Let me be 100% crystal clear about this. The only reason I subscribe to Apple Music over Spotify or Tidal – or, hell, – Amazon Music or god-knows-what thing YouTube is currently offering, is because it’s the first-party, default service on macOS and iOS. The friction to use any other app that competes with a pre-installed, first party app on iOS (and increasingly macOS) is just too damn high. After a while I end up feeling beat down by a thousand UX papercuts and submit myself back to Apple Music and Safari and Mail.

Pretty much every six months, like clockwork, I re-activate my old Spotify account, pay for a month, and give them another try. And I’m not just starting from scratch with a blank library. Each time I try again I pay Soundiiz to import all of my Apple music (note the lowercase “m” because I’m talking about my purchased iTunes music, ripped mp3s, and saved Apple Music playlists) into Spotify. That way I can be sure to feel at home and that their recommendation engines have enough to work with.

And it’s great. In most places the Spotify iOS and Mac/web apps are so much nicer and easier to navigate and grok. I almost never find myself waiting an eternity like I do just for the Apple Music home screen to change from an empty, white screen to a slightly-less-empty, white page filled with blank album placeholder images, to finally a UI I can actually use. And I never have those moments where I’m on a cell network and Apple Music just. Never. Starts. Playing. Spotify is almost without fail fast and responsive. Even using the Plex iOS app while driving to listen to music hosted on my iMac via my home Comcast connection is way more reliable than Apple Music coming from their cloud. (Random: Like listening to music? Like how awesome Plex is? Definitely check out Prism.)

And while I love the idea of Apple’s human-centric approach to playlist curation, it just doesn’t work in practice. Spotify gives me vastly more and better recommendations for new and related music. Like my beloved Rdio of years gone by, Spotify is just far superior to Apple for discovery.

So, if Spotify is easier to use, is (arguably) designed better, performs better, is more responsive, and surfaces better content, why am I paying for Apple Music?

Like I said, it’s because Apple Music is the default.

When I use Spotify, it doesn’t matter whether I last opened the app two weeks ago or whether I backgrounded it two minutes ago while walking out the door. As soon as my phone connects to my car’s bluetooth, what happens? Ha. Why even bother writing this? We all know. Apple’s Music.app takes over and starts playing. Oh, and can we pause to admire how Music.app still can’t pick up from where it left off? In the best case it starts back at the beginning of the song that was last playing. In the more likely case it starts with the alphabetically first song in my library. Which means I’ve heard the opening whistle of Ace of Base’s All That She Wants roughly two-and-a-half million times. (Oh the irony. Just now as I googled for a link to that song, YouTube showed me this ad.)

Or how about if you ask Siri to play a song and don’t specifically say “…using Spotify” it goes straight to Apple Music even if you’re not a subscriber?

Initially, there were no 3rd party apps on iOS so of course Mail and Safari were the defaults. But then we got the App Store and suddenly there were tons of 3rd party mail clients and web browsers.

But we couldn’t set those to be the default on iOS because Apple warned that users might get confused or tricked into setting a default choice against their will. (I guess that’s why they now show a notification prompting desktop users to use Safari the first time they launch Chrome? Ok, Apple.)

I wish I could find the quote I’m thinking about. I honestly can’t remember if it actually came from Apple on-stage at the iOS 7 reveal or if it was just repeated a bunch by pundits, but the idea was that pre-iOS 7 everyone was still getting used to mobile software. But with the big redesign (The Great White Flattening™?), “the trailing wheels are coming off“. It could now be assumed that users know how this stuff works and should be trusted and given more powerful options. At that time I thought, finally, maybe we’ll be able to set a new default mail client.

But, no. Apple pivoted to banging the drum of Privacy. And I get it. If everyone just willy-nilly installed the Gmail app without thinking, and if Apple made it easy to use the Gmail app on iOS instead of artificially crippling it and essentially forcing people to their first-party Mail app, Google could probably vacuum up even more of our personal data. (Slightly related: remember how long the original Google Voice iOS app sat in review?)

But now? Now when you see that decision standing alongside the rise of heavy-handed, in-your-face, dark-patterned, growth-at-all-costs, rise of Apple services? How can anyone not be cynical and assume these restrictions are anything less than yet another push to squeeze an additional monthly penny out of customers?

It all just leaves a bad taste in my mouth. From the ban on default apps, to the constant Apple Card promotions, the Apple News push notifications, pretty much everything they’ve released in the last few years. It just feels fucking desperate and greedy. I’m completely paraphrasing comments I’ve read elsewhere made by people smarter than myself, but the Apple of old used to earn our money by creating products we loved. Now it feels like they take our money by locking us into services we have no choice but to use.

And back to the original topic and title of this post: I now give Apple my money begrudgingly. It pains me. And, god help us, with today’s news about Apple cutting sales expectations because of the coronavirus, I can’t even begin to imagine what the growth hackers at Cupertino are going to rain down upon us next.

Remember standing in line at midnight to literally pay $129 for Jaguar? Or in 2007 for the iPhone launch? There could be no more literal embodiment of the Futurama SHUT UP AND TAKE MY MONEY meme than the way I felt at those and many other Apple community events. It was a momentously joyful whirlwind of nerdery and consumerism run amok in truly the best way possible.

Goddammit, Apple. I’m in your corner. We’re all in your corner. Don’t fuck it up for a slightly higher stock price.

Postscript

I know this post meandered all over and was not as well backed up and supported as it should be given the claims I’m making and the level of vitriol I’m spewing. (I’m typing this in a dark bedroom waiting for my four year-old to finally fall asleep.) So, instead, let me just refer you to Michael Tsai’s website – who is basically the Apple dev community’s lead champion at assimilating all the disparate opinions on whatever news story or technical tidbit currently has us in a frenzy. He collects the facts and puts them together way better and without all the emotional garbage that I inject into everything.

Deactivated

It’s time.

The more men are freed from privation; the more telegraphs, telephones, books, papers, and journals there are; the more means there will be of diffusing inconsistent lies and hypocrisies, and the more disunited and consequently miserable will men become, which indeed is what we see actually taking place.

I read  The Kingdom of God Is Within You in college. I think I was too young at the time to fully digest it – for it to have the impact on me that it has had on others. Nonetheless, Tolstoy’s ideas have stayed with me in the seventeen years since then. Particularly the bit I quoted above. It seemed prescient at the time during the post-9/11 run-up to the war in Iraq when every news organization collectively lost their minds and got drunk on the power they found by turning up the volume, channeling fear, and scrolling sensationalized chyrons 24/7.

And now in 2020? There’s no need for me to spell it out. It’s all become exponentially worse in just a few short years.

Other than my unhealthy addiction to Twitter (which is clearly a huge part of our problem), I reached the point two or three years ago where I would only log in to Facebook once every few months. But I would never post anything. My Instagram account was made private long ago after a bunch of creepers started adding comments to photos of my kids they came across because I had (stupidly) tagged the images with the state park we were visiting.

Once all the old-guard tech companies realized there was no money to be made from instant messaging, they shut those networks down. Everyone I cared about migrated to text messages. I poured one out for Adium and haven’t even launched that app since 2016.

All of my close friends and family share exclusively through iCloud photo albums. (Oops.)

By the time 2020 arrived, I had sort of made peace with the idea that all those hundreds of friends I had on Facebook weren’t really very good friends after all. And I was honestly sad at the thought of no longer seeing my high school classmates’ kids grow up in photographs – even though I hadn’t seen or spoken to them since the day before graduation twenty years earlier. Except for that one click to confirm a friend request, of course.

As far as I was concerned, I was done with Facebook. And mostly Instagram, too. A quick look at my 1Password shows 842 website accounts. How many of those have I logged into in the last five years? How many of those services even still exist? I just assumed Zuck’s empire would become one more abandoned piece of my personal online history. And I was content to let my accounts lay dormant forever.

But then I read this article.

I’ve thought a lot about that story over the past twenty days. And in the course of writing this blog post I’ve taken the time to re-read it, gather my thoughts, and try to pin down exactly what it is that I find so objectionable. So anathema.

And I can’t do it.

It’s not just one thing. Or even a final straw. It’s all of it. Everything at once. An entire decade’s worth of shit, greed, hubris, and billions of people (myself included) who are both the perpetrators and victims.

What I think affects me the most is that I know how these things are built. And it infuriates me. I’m a developer. I’ve also worked in Product. And I’ve worked in Marketing. To a degree, all of these social networks are founded and grown organically. And perhaps they even become unicorns organically, too. But at some point we all have to admit that they do not continue to grow unbounded, continue to make disastrously poor, costly, and harmful decision after decision without morally bankrupt leaders and equally indefensible low-level workers purposefully and consciously choosing to do the wrong thing all in the hopes of upping engagement a sliver of a percent so they might earn one extra dollar.

Real people – every day – are going to work and continuing to build these systems. They plan the sprints. Write the code. Review the copy. And push to production. They speak at conferences and post on Medium about the hard problems they are solving.

Fuck them.

Fuck all of my old Silicon Valley friends who remain at these companies and participate in this fraud just to get one more stock grant.

But I’m done. As of last week my accounts are closed. (Well, except for Twitter. I am a professional hypocrite after all.)

This is just a decision I’m making for myself. For my mental health. And to continue being morally OK with existing online. I’m not advocating for anyone reading this to close their accounts, too. If you find a particular social network beneficial, go for it. The world is on fire, and we can all use happiness wherever we can find it.

This is just my choice. And I’m not even anywhere near the first person to come to it. But already in the last week I feel like a weight has been lifted.

Next

So, what comes next?

For me, that means continuing to interact with the same people I already care about by sharing and posting even more with them now that I’m not feeding the machine. And I’ll do that by owning my own platform.

For me, that means blogging with WordPress because that’s the publishing tool I’m most comfortable with.

I’ve already setup a new website to replace Instagram and to a lesser extent Facebook. It’s public facing, but I’m not going to share the URL here. It’s just for friends and family. If you happen to find it, then I hope you enjoy the many photos of my lunch as well as my kids being annoyingly cute.

But I am happy to share how I made it. Specifically, the tool I wrote to import fifteen years worth of Facebook and Instagram posts to seed my new blog and keep my old content alive and history preserved.

How it Works

Of the accounts I closed, Facebook and Instagram are the only two I care about preserving my history. Fortunately, both services offer comprehensive data export options to let you get a copy of all of your data in both human readable and machine readable formats.

I’ll leave the exact instructions as a google exercise for you, but in a nutshell the process is this…

  1. Export your data. You’ll be emailed a link to a zip file.
  2. Create a new WordPress blog somewhere.
  3. Run the PHP scripts in this GitHub repo.
  4. Profit.

The two scripts (one for Facebook, another for Instagram) will crawl through your exported data and make some (I think) clever decisions about what data to import and how to import it in a blog-friendly way. The result will be a blog with all of your old photos and videos, along with captions, and (optionally) location data inserted chronologically with the same date/time that you posted the original content.

One extra-special thing about this script I want to point out is that I also approached it from the point of view of a parent. I want to be able to share this new website with friends and family – many of them not the least bit tech savvy who frequently call me for help because they’ve forgotten their Facebook password…again.

So the last thing I want to do is lock all of this content behind yet another account they have to remember.

But at the same time I don’t necessarily want detailed personal info about my kids just floating around online before they’re of age to consent to that themselves.

So, like I said above, importing the location data attached to your old content is optional. But also, the script allows you to define a list of replacement words. The idea being, I added my kids’ names to the blacklist in settings along with a replacement. Then, when the script imports everything, any post caption containing names (words) like “Trevor” or “Jacqueline”, will be replaced with “T” and “J”.

This allows me to maintain the context of what I originally posted and/or captioned my photos with without being too revealing. If a stalker is determined to find out the names of my kids, there’s nothing I can do to stop them. But that doesn’t mean I have to make their identities easily googlable.

Here’s what the finished product looks like…

It’s every Facebook and Instagram post I ever made that included a photo or video, on my own domain, set to the date and time they originally appeared. It’s almost like Facebook was just a bad dream.

Furious Conclusion

So that’s my small contribution to make things better. It likely won’t matter. But it does give me some relief to have done something. Anything.

I’m filled with rage and despair and also just sad thinking about what we in the tech industry unintentionally unleashed upon the world – and then willfully made worse through greed and arrogance.

Let’s do better. And, above all, be kind.

I May Have Gone Overboard with My Keyboard Shortcuts

The other day a coworker was making fun of me (in a good natured way) after we spent some time coding together and they realized just how many keyboard shortcuts I use. And it wasn’t about me having all the standard macOS shortcuts wired-in as muscle memory or even obscure hotkeys specific to a given app. It was all of the custom, global keyboard shortcuts I use to automate repetitive tasks on my Mac in the hope that what I’m telling my Mac to do with my hands might just barely be fast enough to keep up with what my brain wants it to do.

In my head I think of apps, websites, and folders on my Mac as “places”. I don’t just open an app or visit a website. I go there. For me, much like traveling in real life, getting to my destination as fast as possible is usually the goal. And so the majority of the keyboard shortcuts I use are about launching things on my Mac that would otherwise take too many mouse clicks or key presses.

I live and die by my keyboard. And here are the shortcuts I couldn’t do without.

Controlling windows

Let’s start at the highest level. Everything you do on a Mac takes place inside a window. And constantly having to reposition new widows by delicately dragging their edges and titlebars into place drives me mad. It’s the GUI equivalent of busywork.

I’ve played around with automatic window layout managers on Linux – and even a few that have been ported in spirit to macOS. But they were all a little too fiddly and unforgiving for my taste. (Which is great for some people!) As you’ll see below, while I generally want my windows arranged in an orderly fashion, sometimes I do need to break away from my grid-based system and arrange them freeform like a sane, normal person.

Years and years ago I used and was a huge fan of MercuryMover. But at some point I switched to another app that I no longer remember before finally settling on Magnet in 2012. It’s simple and works great. Here are the keyboard shortcuts I’ve setup in it…

Magnet allows for a fair amount of positioning options without going deep into the weeds. The system I use divides my screen into three arrangements: halves, thirds, and quadrants. (Along with a few miscellaneous commands that I’ll describe.)

At first glance many of my window position shortcuts might seem arbitrary, but they make sense to me. Each one is prefixed with the ^⌥ modifier keys and then a trigger key that sort of mnemonically maps in my head to what the window position should be.

Two Halves

In my head I divide my screen into top / bottom and left / right halves, which I position windows with using…

  • Left half of screen ^⌥←
  • Right half of screen ^⌥→
  • Top half of screen ^⌥↑
  • Bottom half of screen ^⌥↓

Three Thirds

Here’s how I see my screen in the thirds layout:

And I use these shortcuts to position my windows…

  • Left third of screen ^⌥1
  • Center third of screen ^⌥2
  • Right third of screen ^⌥3

Four Quadrants

And similarly, I also visualize my screen like this:

  • Top left of screen ^⌥7
  • Top right of screen ^⌥8
  • Bottom left of screen ^⌥9
  • Bottom right of screen ^⌥0

Second screen support

Magnet works great in that the window position commands apply to the screen that the window is currently on. But if you want to quickly send a window to the next or previous screen, you can do that, too.

  • Send to screen on the left ^⌥⌘←
  • Send to screen on the right ^⌥⌘→

Miscellaneous window positioning commands

And here are the remaining miscellaneous commands I use for a few special window positions.

  • Full screen ^⌥⏎: This does exactly what you’d expect. It makes the window fill the entire screen, but, crucially, does not activate macOS’ fullscreen mode for that app. It just makes the window as large as it can be.
  • Center on screen ^⌥C: This takes the active window and centers it horizontally and vertically on the screen without adjusting its size.
  • Undo ^⌥⌫: If you use Magnet to position a window using one of the above commands, this hotkey will restore the window to its previous size and position.

And, finally…

  • Default position ^⌥5: This is a hotkey controlled by KeyboardMaestro – not Magnet. It sizes the window to be as tall as possible and 50% of the screen width, and then centers it on screen. I call this my “default window position”. I often use it when I want to bring my focus to a specific task. (For the curious: I chose “5” as the trigger key because the “5” key is phsyically in the middle of the keyboard between the 1-3 and 7-0 keys I use with my other window shortcuts.)

Here’s the macro in KeyboardMaestro:

Launching Apps

Next up are what I call my “launchers”. They quickly bring up the apps I use most often. Nearly all of them are built, again, using KeyboardMaestro.

  • Web browser ⇧⌘⏎: Like most people, I’m constantly opening my web browser. This hotkey will launch Brave if it’s not already open. If it is running, it will bring its windows to the front. And if no windows are open, it will make a new one.

Even more apps with dedicated hotkeys…

  • Open SnippetsLab ⇧⌘F7
  • Open Dash ⇧⌘F10
  • Open Bear and create a new note: ⇧⌘F11
  • Open Drafts ⇧⌘F12
  • Open iTerm ⇧⌘: This one is slightly interesting as I needed a way to either bring iTerm to the front or open a new window if one didn’t exist. For some reason the app didn’t follow the standard new window behavior, so I had to script around it.

1Password

I trigger 1Password with ^⇧⏎ and am very happy with how this macro turned out.

I take security seriously and so when I’m out and about with my laptop, I want 1Password to automatically lock itself after being idle, etc. I’m more than happy to have to enter my long, master password to unlock it. But when I’m at home working on my iMac that never leaves my house, I hate having to type in that password over and over again.

So, the macro I use to launch 1Password is actually two macros with the same hotkey. However, one is only activated when I’m at home and the other when I’m using a laptop. They both launch 1Password, but the iMac specific one then fetches my master password out of the system keychain and types it into the 1Password window for me. This lets me open and unlock the app with a single hotkey. Some might call this incredibly insecure, but I call it a small security trade-off for extra convenience 🙂

Here’s the iMac macro…

And I make use of KeyboardMaestro‘s ability to disable certain groups of macros based on what computer you’re using. In this case, you can see that I’m writing this post on my laptop right now, and the iMac group is disabled.

(I wanted to include a video of this macro in action, but in the end I decided it was too much trouble because I would have had to blur out all of my data in 1Password once that window opened.)

My final two launcher commands deal with navigating the Finder.

The first is one I wrote about recently that lets me quickly select and open my favorite folders with ⇧⌘9.

The other is probably my most used of any shortcut. Pressing ⇧⌘8 will prompt me to type the name of an application on my Mac. I can then arrow down the list of matching names and press return to select it. Then, KeyboardMeastro will open the selected Finder items (can be one file or multiple files) with that app.

Example: Often I’ll have a bunch of images selected in Finder. By default, ⌘↓ will open them with Preview. But I can just as easily hit ⇧⌘8 to open them in Acorn. Or, I might want to make a quick edit to a source code file but don’t want to wait for Xcode to spin up. Again, with ⇧⌘8 I can immediately open it in TextMate instead.

I know there are probably a million other ways to accomplish this – I think Alfred probably does it somehow – but it was faster for me to quickly write this script a couple years ago then dig around a for a specific app to do the job. Here’s what it looks like in action…

And the macro…

In / Out

These next commands are all about data. Getting data into some apps and out of others.

First, there is, of course, my beloved OmniFocusquick entry window shortcut key ^⌥␣ which immediately brings up a floating window to jot down whatever task just came to mind, and then just as quickly disappears so I can get on with my work.

I use F12 for creating a new note in Drafts. I could use Drafts‘ native hotkey support, but by going through KeyboardMaestro I get the option of launching Drafts if it’s not currently running. That’s just one less point of friction to worry about. (If there’s already a way to do this with Drafts itself, I missed it. Sorry, Greg!)

I use Pastebot to manage and sync my clipboard and so should you. The system paste hotkey is ⌘V, so naturally my shortcut for opening Pastebot’s history window is ⇧⌘V.

And, finally, I have tons and tons of other macros that I don’t use everyday or that simply don’t warrant a dedicated hotkey. However, pressing ⌘⇧ will open KeyboardMaestro‘s macro search window. I can then just start typing the name of the one I’m searching for and then press to run it.

Lastly in the launcher category is my Jira ticket opener hotkey. If you’re lucky enough to use Jira everyday, then you know it’s considered a dumpster fire by everyone who doesn’t just use it to generate reports. And navigating to a specific ticket – especially if you don’t already have a browser window open and loaded up on the appropriate page – is often a 10 to 15 second journey done tens if not sometimes a hundred times a day.

Using the macro search shortcut above (⇧⌘), I can then type jira⏎ to open a textfield that prompts me to enter the numeric portion of the ticket number. Press again and KeyboardMaestro opens a new browser window (or tab) directly onto that ticket’s detail page.

Sure, it still takes forever for atlassian.net to load, but it’s way faster than going to an intermediate page first, then needing to click into a search field, and then wait for an awful AJAX request to hydrate the data I’m actually interested in.

(Oh. And the first time my coworker saw me execute that macro, they said “Of course. You of all people would have a hotkey for Jira.” ?)

Miscellaneous Shortcuts

I’ll call out just a few others. The first are a few hotkeys I use for performing various tasks in Xcode. And the last is an amazingly useful macro that I just wish I were smart enough to have come up with on my own.

Xcode

If you use Xcode, there’s no need for me to explain how useful it is to have a lightning fast way to blow away your DerivedData folder.

Along those same lines, I also have a similar macro that wipes out all of the ~/Library/Application Support and ~/Library/Preferences files and folders for the apps I’m working on. This is super useful for resetting data when you’re testing sync logic or when you’re iterating on database schemas.

Next, long-time readers of this blog will probably realize I’m quite insane and particular about my computing habits. (So will those of you who have made it this far in this blog post.) I especially like Xcode arranged in a certain way when I’m writing code vs debugging / running an app.

When I launch an app, I let Xcode do it’s normal behaviors to show the console, swap the sidebar to a different view, etc. But when I’m done testing, I want a quick way to get back to my coding mode. I’ve assigned ⇧⌘8 to be my Xcode “cleanup” macro.

In case you don’t have every Xcode shortcut memorized like I do, that does the following:

  • ⇧⌘Y Close the bottom console pane
  • ⌘1 Swap the sidebar to show my project’s file structure
  • ⌘J Open the window pane selector (what is this thing actually called?)
  • Select the main editing pane so I can start typing

Basically, the macro maximizes the visible space for the text editor, shows me my most used sidebar view, and makes the editor the first responder so I don’t have to manually give it focus to start typing. Here it is in action…

Last on the list of my Xcode shortcuts is one I simply refer to as “FML”, which I launch with ⇧⌘R. (The meaning of that abbreviation is an exercise for the reader.)

So, so, so many times I’ll try to build and run my latest code changes and Swift and/or Xcode (I’m not sure where to draw the line or what is actually responsible) will vomit into my error logs and refuse to build. I can even do a ⇧⌘K to clean the build folder or, if all else fails, use my earlier macro to wipe out DerivedData. And, yet, still no luck building code that I ? know is fine.

But if I simply quit and relaunch Xcode – and make no code changes – my project will build and run.

This macro automates that process of quitting Xcode, pausing, opening it again, then opening the most recent project, and building. Voilà!

And, finally…

(And I do really mean finally this time.)

This macro takes advantage of KeyboardMaestro‘s text snippet expansion capabilities. If I type the phrase xfinder, KM will replace it with the full path of the selected item in the Finder.

I really wish I could remember where I came across this brilliant trick. It seemed like black magic the first time I read about it.

⌘Q

So, yeah. After writing all of the above, I’m now thinking maybe this post should have been titled A Love Letter to KeybaordMaestro.

That app, along with Magnet, are indispensable to my daily workflow. Many of the shortcuts I highlighted are extremely niche and built to suit my own, weird way of doing things. But hopefully, even if you don’t find any of them specifically useful, they do give you inspiration for ways you can remove all the little papercuts and friction you run into everyday.