Ow, My Back

We officially went into quarantine on March 22. One hot afternoon in June, I found myself in the garage with a pair of shears, a screwdriver, and a hammer so I could cut an inch of leather off my belt and punch a new hole.

All in all, I had lost twenty pounds by doing nothing. At least not intentionally. It was merely due to skipping meals (no more lunch out at work every day), the food I did eat was almost always cooked at home, and I had cut out my twice-daily can of soda from the office fridge. (Not to mention a heaping daily dose of existential dread, anxiety, and fear.)

Small changes, but over three months, they added up. Fast-forward to October 1, when I tweeted this

Since the start of COVID, I’ve punched three holes in this belt and cut off an inch of leather two times. Today, it finally went in the trash, and I bought a smaller size. Not everything in 2020 has turned out awful.

COVID Belt

I lost weight and was certainly medically healthier. But did I feel better? Not at all. By May, I was hurting. The next month I was in pain. That summer was nothing but agony from muscle and skeletal pain.

I knew what the problem was. I’ve sat in front of a computer some portion of almost every day of my life for the past thirty years. And I’ve always had terrible posture. Add that on top of Tourette’s syndrome, and I’m amazed I’ve even gotten this far in life without my body completely revolting at one more hour hunched over a keyboard.

(I’ve talked about this a little, but I was formally diagnosed with Tourette’s twelve years ago. It’s a motor tic disorder, which means I twitch all the time. And when I try to control and repress my tics or when I’m physically unable to let them happen, my body becomes incredibly sore from trying to twitch.)

Coincidentally, as I’ve been drafting this post over the past few weeks, I read an article in The Atlantic titled “Yes, the Pandemic Is Ruining Your Body: Quarantine is turning you into a stiff, hunched-over, itchy, sore, headachy husk.” It goes into data behind so many people coming to doctors with non-COVID medical problems brought on by the switch to working from home, shitty ergonomics, longer working hours, and, yes, stress.

And so, bingo. My excruciating back and neck pain. Not being able to sit on a couch without feeling like there was a lump in my throat (yes, I got that checked out) and a hot poker in the base of my neck. Or the tingling sensation from the heel of my foot up the side of my left leg as I made the short walk from my home office to the garage fridge for a Coke Zero.

Those were all the many ways my body decided to tell me, “Yo, none of this is healthy, and you’re gonna be real fucked up soon if you don’t find a better way of working (less).”

So, I listened. And five months later, I feel so many light-years better than I did that when I think back to mid-2020 that I can only gasp and wonder how I got any work done at all.

This post is all the fun, nerdy details that went into making my home and work offices more comfortable. It was a bit of self-preservation mixed with stress-shopping. But if you want the TL;DR, I can sum it up with two words:

Stop. Sitting.

There’s more nuance to that, but I’ll get there. First, I’m going to be upfront and say that (where possible) the product links below are affiliate URLs. However, next to each link, I also include a non-affiliate URL. Everything I list is what I purchased and (most importantly) ended up sticking with and whole-heartedly recommend. If you find the links useful and want to throw a few Amazon bucks my way, you’re awesome. If not, then I hope you find these links helpful regardless.

OK.

I’ve had a love affair with office chairs for years. I wrote about my favorite one back in 2014 that I liked so much I bought two. But even with my back wrapped in the warm, Silicon Valley-esque embrace of a Herman Miller chair, my body was having no more of it.

I naively thought, “Ten years in the same chair. I just need something different.” I didn’t want to spend that kind of money again, so I settled on this cheap (but not horribly cheap by office chair standards) model (non-affiliate link).

It was sturdy, sat mostly OK, and the back support was adequate. My only real complaint was I found the armrests too high even in their lowest position.

I bought that chair in June, but it was clear my back and neck problems weren’t going away by August. (Yes, I’m doing more throughout this whole period than just switching out chairs. Taking more breaks, daily walks, etc.)

I didn’t see any way forward other than just not sitting eight or more hours a day. I last used a standing desk briefly at a job in 2013. But it didn’t last. It was a fixed height (and incorrect for me), and I stood on hard commercial carpeting on top of cement. I wasn’t optimistic I’d be able to go full-time standing, but I wanted to try.

I was lucky enough to get a motorized desk at work; I did more online research and found this highly recommended standing mat (non-affiliate link) from Ergodriven. Instead of being flat, this one has “terrain,” as they call it – raised edges and a center “dome” that encourage you to keep your legs and feet moving more than you would if standing on a flat surface.

Ergodriven Standing Mat

It’s quite wonderful. Comfortable in sock feet, sturdy when I wear shoes, and I’ve developed a habit of naturally angling my feet on the raised portion to stretch my legs as I work. I also bought a second one for my standing desk at home (more on that in a bit).

Ergodriven Standing Mat on Amazon

Speaking of standing desks, I think I was always hesitant to move to one because I’ve heard for years that the inexpensive ones are crap, and only the premium (trendy?) ones are worth the money.

So after standing full time for two months at work, I declared my standing desk experiment a success. My wife (amazingly) was all for me getting one at home, too. I liked the one I had in my office but assumed it was in the $700+ range. I asked my boss and was delighted to find out, nope. $280 ? (non-affiliate link).

Office Standing Desk

You’ll notice in that photo of my office desk my monitor is raised to a comfortable eye-level using a very classy MoonPie collectible tin. I wanted something just as nice for my iMac at home. I couldn’t find a Little Debbie collectible tin, so I settled on a HiRise stand (non-affiliate link) from the lovely folks at Twelve South.

Twelve South HiRise Pro

It matches the iMac’s finish, and the front panel flips down to reveal storage. Also, the thing weighs a million pounds. Any computer or monitor you sit on top is not going anywhere – believe me.

Twelve South HiRise Pro

Next up, I work all hours of the day and night. I did have an old table lamp on the corner of my desk (overhead lighting is the devil), but it had a huge base and lampshade, which took up more desk space than I’d like. I wanted something smaller and ideally with an adjustable temperature bulb. (I’d prefer not to reach for an app just to control a “smart” bulb.)

I found this one (non-affiliate link).

LED Lamp

It’s skinny and has three points of adjustment, so I can freely reposition it as needed. And if you look closely here

LED Lamp

You can tap to switch the LED between four color temperatures – cool to warm. And it’s hard to see in that photo, but the white/gray rectangle in the middle has + and – buttons to adjust the brightness.

You may be wondering about that large, silver box in the first lamp photo. That is an amazing device from Yottamaster that I should have bought years ago.

On December 20 I tweeted

For the first time in my adult life I am at peace with the cable organization behind my desk. Ending 2020 on a high note.

My iMac serves as the media and storage hub for my family. All of our movies and TV shows, music, photos, everything – stored on (currently) an 8TB and 12TB external drive.

I’ve never wanted to go all-in on a real NAS for various reasons. I’ve rolled my own over the network with a Raspberry Pi and openmediavault, which worked surprisingly well. But nothing beats the performance of having drives connected directly and the insanely affordable Backblaze pricing for tethered drives (non-affiliate link).

But it always drove me crazy giving up USB ports for multiple drives. And especially the awfulness of giant power bricks and their cables. I have no idea why I never thought to look for something like this before, but that silver box is perfect for my needs (non-affiliate link).

It’s just a hard drive enclosure with four bays. But it’s not RAID or anything fancy like that. It’s a single power cable and a single USB cable. But each drive mounts individually on my Mac as if they were all plugged in separately. I don’t want the overhead of dealing with a RAID array. I’m perfectly content spanning my data across multiple drives myself, so this is a terrific and inexpensive solution.

Yottamaster 4 Bay Hard Drive Enclosure
Yottamaster 4 Bay Hard Drive Enclosure

All right, we’re near to the end. One more thing for my desk. One more thing for my feet.

After standing full-time at work beginning in August and then doing the same at home in October, my legs hurt. Don’t get me wrong. It wasn’t the scary tingling sensation I had before or a painfully sore neck; this was just regular muscle soreness from being out of shape. I knew that my legs would adjust and get stronger with time, and they did.

But what I didn’t expect was around the time my legs stopped aching, the soles of my feet and especially my heel really began to hurt. At this point, I’m sure I was standing (and walking / moving) ten or more hours a day, thanks to an out of whack work/life balance. My back and neck had recovered by no longer sitting with poor posture all day, but now my feet were screaming. Fiery pins and needles type pain.

I could tell the standing mat helped, and so did taking breaks on the couch for conference calls. Ultimately, all the advice I read online agreed with an email response from my doctor, who I’m sure thinks I’m an idiot for not thinking of the fix myself.

Change your shoes, dummy.

At home, I was standing in my sock feet all day. And at work, I was in sneakers the whole time. Neither option was very supportive – and even if they were, standing the same way all day every day isn’t going to feel good.

Again, I researched online and talked to two friends who are nurses (walking in hospitals for 12+ hour shifts). I went with their recommendation and bought a pair of Dansko clogs (non-affiliate link). They’re not particularly good looking (a co-worker laughed), but they’re hella supportive when standing.

Dansko Clogs

My new routine is to switch between the clogs and sock feet every few hours throughout the day. Since making that adjustment in December, my feet are no longer in pain.

Finally, rounding out my home office, the only thing I don’t like about my desk is the desktop is so smooth it’s borderline slippery. It just doesn’t feel comfortable under my writs, and my keyboard will occasionally slide out of place.

I totally get this is a huge Princess and the Pea situation, but so be it. I wanted something that looked and felt nice and found this desk pad from Grovemade. Made of wool, feels great, nothing slides around anymore, and they even included a handwritten thank-you note with the order. So, three cheers for well-made products from friendly companies.

Grovemade Wool Desk Pad
Grovemade Wool Desk Pad

That’s it. That’s my 2020 journey from sedentary pain, losing a little extra weight, upending my posture, and then falling down a rabbit hole of fussy home-office accessories. Like I said earlier, it was a bit of getting healthier along with some retail therapy to get through a genuinely shitty year for our world.

Happy 2021, and stay safe out there, folks.

240 Invisible Pixels

When an alert notification arrives in Big Sur (not a banner that slides away after a few seconds), it will remain on screen until you make a decision about it.

On my Mac, helpful examples of this category are

When those apps have something to tell me, I generally don’t want to miss it. So I appreciate that they remain on screen until I dismiss them or open the corresponding app.

An example of unhelpful alerts that you didn’t opt-in to and can’t opt-out of are hot marketing garbage like this.

Bullshit Push Notification Screenshot

(That’s not Halide’s fault. Buy Halide. It’s excellent.)

But I digress. Helpful or spam-like, the UX problem is dismissing them.

Here’s a fictitious notification:

Big Sur Notification Screenshot

Like the notification says, can you guess where you should click to dismiss it? The keyword being dismiss. Because, in almost all instances of an alert appearing, I want to know about it, but way less frequently do I want to open the entire app behind it.

Big Sur Notification Screenshot

If the clickable areas are not clear from that gif, here’s a better view.

note-here.jpg

Clicking the green (X) will dismiss the notification. Clicking anywhere else in the red will launch another application on top of whatever you’re currently doing. (Remember the pain of accidentally launching an Adobe app in the late 90s or 2000s? Same vibe.)

For those of you keeping score at home, that’s a 22pt x 22pt target out of the banner’s total 346pt x 78pt. Or 1.8% of the total size.

Fitts’s law doesn’t even help since the (X) is just hanging out there in the ether – unlike the  menu.

Apple menu screenshot

Worse, though, Big Sur hides the (X) until you mouse over the literal bounds of the banner – not even the area where the hidden (X) will appear is initially valid.

Big Sur Notification Screenshot

If you move your mouse towards the notification intending to dismiss it, the clickable area (without backtracking your mouse) is this even smaller green part.

Big Sur Notification Screenshot

A whopping 16pt x 15pt that aren’t even visible at first to help you aim.

Compounding the problem, when you wake your Mac from sleep, you’ll often have a stack of multiple notifications to dismiss. Some of them requiring multiple clicks to get through the (X) and a second (Clear All).

Big Sur Notification Screenshot

I’m generally happy with Big Sur, but the focus on design over usability in many places is baffling to me. Luckily, from the menu bar to the muddied translucency, there are ways to improve things.

Here’s my solution for dismissing alerts.

As usual, Keyboard Maestro to the rescue. Clicking those 240 invisible pixels is now a hotkey away.

It also works when they’re stacked or in Notification Center.

It’s the simplest of macros. Move the mouse to a fixed position from the top-right corner of the screen. Pause to give the (X) time to appear, and then simulate a click.

Keyboard Maestro Macro Screenshot

You can download the macro here.

(If Keyboard Maestro is intimidating, give the fantastic new Keysmith a try.)

Just set the macro to an available keyboard shortcut that makes sense to you. Myself? I chose

^F

which lets me just mash all the modifier keys at once and press F.

I’ll let you guess what the F stands for.

One Year of App Pricing Experiments

One of my goals for 2020 is figuring out a financial path forward for my little software business – particularly around how I price and sell my apps.

I’ve been mostly open about the fact that, for a few years, I was incredibly fortunate enough that my software business was successful enough to be my full-time job. I’ve also been pretty honest that sales started slipping in 2017 before cratering in 2018. The reasons for the decline are varied – some my fault, others outside of my control.

But this post is about figuring out what can work in the years ahead. And the genesis of that experiment began last July when I started planning in earnest and setting up the infrastructure to convert my main app to a subscription model.

I flipped that switch one year ago last week, and then a year ago next week, I wrote a post titled Subscriptions or Bust. It put forth my (the industry’s) argument / assumption that Apple has left most apps with no choice except for subscriptions.

I put this to the test with the launch of VirtualHostX Pro using a “Sketch” model. (Michael Tsai was kind enough to call my approach “reasonable.”) And while I did (do) think it’s the way forward, I wanted to use 2020 to experiment with other pricing models with smaller apps that wouldn’t risk destroying my income if I made a dumb business decision.

Why?

Well, VirtualHostX is now 13 years old. It’s had a fantastic run. I hope I have one more rabbit to pull out of a hat regarding VHX and maintain support into this new, exciting chapter of macOS, but the writing with Apple Silicon is on the wall.

For nearly a decade, I’ve had another project in mind that I was always too scared to attempt building – mostly because I didn’t think the technology was in place for a solo dev or small team to pull off alone.

But last December, I saw the stars (finally) aligning to where it might be possible. So that, along with a mindset of giving VirtualHostX one final big push forward in 2020, I decided that 2021 could be my chance to build something new that sets me up for my next decade of work.

I just needed to spend 2020 figuring out how all the pieces fit together.

And so, with 2020 wrapping up around the same time as the first anniversary for my yearly subscription customers, it seemed like the right time to run some numbers and share them.

My apps have different target audiences. Three are for web developers and designers; another is a financial app for consumers, plus a few small macOS utilities. So the numbers below are in no way an apples-to-apples comparison. But they’re informative to me, and maybe you, too.

The Numbers

Rebudget

The first new thing I made in 2020 was Rebudget. It’s an app to help forecast your budget – not explicitly track every transaction.

It’s also the only Mac app I’ve had in the Mac App Store in a long time. (For reasons.) And coming fresh off offering my first subscription-based app with all that infrastructure in place, I wanted to try a variation of subscriptions again.

Here’s what I settled on for licensing.

Purchase directly from my website (like all my other software) or the Mac App Store. Both versions are free to use forever, but with a select group of Pro features behind a paywall.

That paywall being either

  • $2.99/month
  • $14.99/year
  • $39.99 one-time payment for life
Rebudget Pricing Screenshot

I had the code ready to offer subscriptions and direct-sales from my website, but the Mac App Store was a giant missing piece. Fortunately, RevenueCat to the rescue. I wrote a small utility class that wrapped StoreKit and my own backend’s APIs, so with a single build flag I could produce a version targeting either storefront. (I should go into detail sometime about how I integrated RevenueCat’s SDK with my own stuff ?)

So, how did the seven pricing options fair?

  • 12% of my active 2020 customers
  • 13x more direct-sale active users than Mac App Store active users
  • The direct-sale version has a 2.1% conversion rate
    • 50% monthly plan
    • 30% annual plan
    • 20% lifetime purchase
  • Mac App Store has a much larger 8% conversion rate, but way, way fewer customers so ????
    • 100% monthly plan

Ears

In April, I released Ears – a super-fast audio switching utility for Mac.

Ears is shareware. All features are free to use forever, but you’ll see a nag screen asking you to purchase each time you launch the app.

If you do decide to purchase, I offer a sort-of-name-your-own-price approach.

Ears Pricing Screenshot

No payment is required to use the app or pick from three price points that all deliver the same thing as paying nothing.

How’d it do?

  • Ears (including free users) accounts for 22% of my active customers in 2020.
  • I don’t have perfect conversion rate numbers for Ears, but I estimate it to be about 7%.
  • The average selling price (not including taxes) is $2.78. Which is 40% above the minimum cost.

Spotish

Next up is my little Spotify menubar utility, Spotish. I purposely didn’t make this app for sale “officially” because when I decided to release it on a whim, I was too lazy to make my own app icon, so I just used the official Spotify icon, turned it purple, and rotated it upside-down. I wasn’t about to submit that to the App Store or even put on my business website. I kept meaning to fix it, but here we are nine months later ????

Spotish is pay-what-you-want on Gumroad and promoted nowhere else than an old blog post and my personal website’s footer. I should advertise it more because I really do find it helpful. Anyway…

  • 7% of my active 2020 user base.
  • You can’t even download the app at all without paying for it, so I have an amazing 100% conversion rate.
  • With a $1 minimum price, I’m amazed to say the average purchase is $8 – with one amazing (crazy?) person paying $36.

CommandQ

CommandQ is another Mac utility app that I first released way back in 2011, didn’t update for seven years, and then did a 2.0 rewrite on my birthday last year.

Surprisingly, CommandQ has always sold very well. It’s not making me rich, but it is consistent. And for reasons I’ve never figured out, I have tons and tons of customers from Korea.

I submitted it to the Mac App Store in 2011, but App Review rejected it because it “modified system behavior” and might confuse users ? So, it’s lived on my website for nine years. I hope Apple is doing OK without my 30%.

CommandQ is a traditional app. A two-week free trial and then a one-time payment of $9.99.

  • 11% of my active 2020 customers
  • 6% conversion rate

VirtualHostX Pro

So, my main app.

VirtualHostX is $49 for twelve months of updates with an automatically renewing subscription. If you cancel your subscription, you can use the last version released during your 1-year window forever, but you don’t get new updates.

Or customers can choose a monthly subscription for $5, but the app will stop working entirely if your subscription lapses.

VirtualHostX Pro Pricing Screenshot

(As of May, you can also use VHX as part of your Setapp subscription.)

  • 45% of my active customers
  • 91% annual subscriptions
  • 9% monthly subscriptions

I’m now a little over a week into the first batch of annual customer renewals – and about two weeks since the first reminder emails were sent. I’m seeing an 8% churn rate, which is way better than I was expecting.

What’s Next?

I’m not sure. I hope you weren’t expecting some perfect conclusion. None of the above apps are entirely analogous to what a friend and I are working on. But they are informing our decisions.

Price-wise, VirtualHostX is the closest, as we’re thinking somewhere between $29 and $69 for a year of updates. No monthly option for the app itself, but there’s a possibility of an inexpensive, related web service to go along with the app that could be an additional monthly or yearly fee.

The last few years have been rough as software continues to be devalued further and / or given away as a loss-leader. On the other hand, despite all my bitching and griping on Twitter, I do think the Mac continues to have a vibrant future – even if I don’t agree with many of the software decisions Apple is making.

I’ve seen the winds changing direction for my three web development apps over the last few years. I’m willing to keep pushing forward with VirtualHostX, but its time is limited, I’m afraid.

I love the Mac platform and its ecosystem. I’d take a PC running macOS over Apple hardware running any other operating system any day of the week. Mostly because of the wealth of third-party software. So it’ll take a lot to pull me away from macOS and thus writing software for it. Until that happens, I need to figure out a profitable way forward under the new rules.

Standup.app

I’ve been trying to stay as busy as possible for most of 2020 for personal and professional reasons. But when November finally rolled around, I decided enough was enough and needed a break.

That didn’t mean a vacation. It was more of an acknowledgment that November was already our busiest month of the year at work. And then there was the US election and the holidays and going back into fucking quarantine more than we already were. Not to mention getting app updates out the door for Big Sur and Apple Silicon.

Luckily, I managed to get most of my commitments done in the first half of the month. Which meant I was able to relax for the next two weeks and just let my mind wander and play around with old and new ideas I’d never given time to before.

Two ideas emerged.

The first is a much larger collaboration with a friend that, if the stars align, I can’t wait to share early next year.

And the other is a tiny little Mac app that I made last week because I needed it in my day job. I’m not sure what to do with it or what will ultimately become of it, but, as usual, I figured I should make the app available in case anyone else finds it useful.

For lack of a better name, I call it Standup.app. It helps facilitate the super-short standup call I run with my team every morning.

It also serves double duty as a weird, helpful presentation utility for the seemingly never-ending stream of video meetings I have throughout the day.

I know there are other solutions, but this one is mine and built to my odd specifications.

Here’s a demo that likely won’t make sense until you read what’s happening below.

Standup.app is meant for when you’re sharing your screen during a video meeting – especially if that meeting is of the standup variety.

It starts by displaying your Mac’s webcam. You can resize and position the window wherever is most convenient.

Start a new timer with ⌘N. Enter how long you want the meeting to last (in minutes) and each participant’s name – one per line. (You could also list the names of tasks or projects if the meeting will use those instead of going person by person.)

Click “Start Standup,” and the meeting begins.

On the right, a timer tics down until the meeting is over.

On the left, it divides the total time by the number of participants and runs a timer for each person’s section – one after another.

The timers go from green to blue to red as they approach zero. When time is up, the app advances to the next person on the list.

(For this demo, I’ve allotted two minutes for six people. That’s stupid. But, this is a demo 🤷‍♀️)

Standup meetings shouldn’t be written in stone or ruled with an iron fist. In my view, they’re just a guideline to get everyone on the same page and the meeting over and done with. So, if one person finishes early, type ⌘P to skip to the next person.

On the other hand, if something comes up that does warrant more discussion, you can toggle (pause) the timer with ⌘T. (You’ll see the two timers dim in the video when I pause).

Ok, now for the strange parts.

The webcam factors into all of this because I use the app for video meetings. Ideally, when you’re on Zoom, or Teams, or whatever, instead of sharing your webcam directly, share your screen or the Standup.app window. This will let everyone see your face and timer at once.

More importantly, though, I mentioned above that I use this app also as a presentation aid. The camera window floats above everything else on your screen so that if your entire screen is shared, you can move and position it above or alongside other windows you’re presenting to the group. This lets you visually narrate right next to the content. In my case, that often means our Jira board or even just Xcode.

As you’re sharing, you can press ⌘↑ and ⌘↓ to adjust the transparency of the camera window. (The time boxes remain visible.)

You can also ⌘/ to toggle the camera off/on entirely.

As I said, the camera window floats above everything else you’re presenting. But that would make using other apps impossible if the Standup window is on top and in the way.

To solve this, when you switch to another app and Standup.app loses focus, the camera window will visually remain on top, but all of your mouse clicks and keyboard input will go to the other app like normal.

In the demo video, I edit and select text in TextMate behind the camera window and do a little light web browsing.

If you need to adjust the standup settings or move the camera window, switch back to the app and do what you need. The redirection of your mouse/keyboard to Standup.app or your other apps all happens automatically.

You can make the Standup window full screen or as small as you want. Make it completely solid or barely visible. I present using different methods depending on the audience and what I’m sharing.

As I said initially, this app is really, really niche – even more so than the other strange things I build for myself. But, hopefully, it might help someone else now that so many of us are collaborating with remote coworkers.

You can download Standup.app from here. It will automatically offer to download new updates if/when I push out any bug fixes or improvements. Your feedback is very much welcome, of course. I’d love to know what you think.

Download Standup.app

Stay safe out there.

The Apple Hero 2020 Needs

Rakhim is the hero we need in 2020.

Please don’t let the comedic nature of the video turn you away. I’m not sure if there is a better way he could have presented this.

Stay for the entire trainwreck so you can appreciate the focus of a two-trillion dollar company that says subscription services revenue is the future.

He really does make some excellent observations about usability, attention to detail, care, and obviousness in software.

I cackled for the full 18 minutes.

Voxmail – Voice Email with Siri

The idea for this app started eleven months ago as a collection of PHP scripts and a giant Shortcuts.app shortcut. But I quickly realized it would be best served as a real iOS app. I’ve been working on it off and on since February and have teased it a few times publicly on Twitter.

But now I think I’m ready for broader feedback from outside my small group of testers. And hope that feedback will show that it’s useful to more people than just me.

The app is called Voxmail. And (I think?) it’s the first iOS email client that you can’t use on your phone.

Voxmail app icon

Instead, you check and triage your email using only your voice with Siri.

I’ve been using it every weekday for the past six months (when not quarantined) to go through my inbox while commuting to work. Specifically, I use it with Siri via CarPlay to hands-free get a handle on any email that came in overnight or that morning before I arrive at work.

Voxmail isn’t meant to replace your real email app. It’s meant to augment your mail client so that you can read, archive, delete, mark as spam, etc. your inbox while driving or doing other tasks with headphones on.

The app even has, what I think, is an amazing workaround to give you verbal push notifications of new messages when connected to AirPods or CarPlay. (I hope Apple approves it.)

How does Voxmail work? Let me show you a conversation on my phone with Siri side-by-side with my email client and Reminders.app on my Mac so you can see things happening in real-time.

(Make sure your volume is up so you can hear Siri reply.)

Think of Voxmail like you would old-school cellphone voicemail from the 2000s. The app will read your messages to you one at a time, and you can take action or skip and move on to the next.

Here are some things you can ask Voxmail to do:

  • Check my email
  • Check my unread email
  • Next email
  • Go to my first email
  • Read that email
  • Archive that email
  • Delete that email
  • Mark that email as spam
  • Mark that email as read
  • Mark that email as unread
  • Flag that email
  • Un-flag that email

As a bonus feature, you can also say

  • Remind me about that email tomorrow at 4 pm

and Voxmail will add a reminder to the iOS Reminders app with an alert set for the date and time you chose and the email as an attachment.

But what about CarPlay?

Well, one of the things that have always annoyed me the most about CarPlay is that Apple silences all notifications while you’re driving except for a few whitelisted ones such as text messages, calendar alerts, and turn-by-turn directions.

I totally get the safety reasons for this. But at the same time, if my boss sends me a Slack message saying that the world is on fire while I’m driving home and I need to call him, I would very much like to hear that notification via CarPlay. Not so I can try replying in Slack while speeding down the interstate, but so I could hands-free say, “Siri, call my boss.”

My point is that I would like to be aware of other, non-approved notifications – even if I have no intention of ever using my phone while driving. Email is one of them.

Voxmail solves this problem by reflecting new emails to your phone via SMS when you’re connected to CarPlay or Bluetooth headphones.

What does that mean exactly?

During my commute home, Voxmail will periodically check for new email in the background. If it finds a new message, it will send the sender and subject (and nothing else) to my web server. My server then sends a text message to my phone, summarizing any new messages, which Siri will happily announce and read to me in the car or over AirPods.

If it’s a message I’m interested in, I tap the voice button on my steering wheel and say, “Read that email” to hear more.

Voxmail Settings screenshot

What about privacy?

Email is a sacred thing full of all your secrets. That’s why none of your email ever leaves your device with Voxmail.

Unlike most other iOS email apps, Voxmail checks your email itself – on your device – communicating directly with your email provider. It does not use an intermediary 3rd party server to proxy your messages. All of your information, including your email account credentials, are kept locally.

The only exception to this is the SMS forwarding trick I explained above. That feature is opt-in and disabled by default. If you turn it on and confirm your phone number, only the sender and subject line of new emails are sent to my server – never the actual contents of your emails.

Further, none of that information is stored in a database. It’s only around long enough to send you a text message, and then it’s gone.

I don’t need your data. I don’t want your data.

So that’s Voxmail. I think it’s a ton of fun and find it incredibly helpful.

It’s not fully featured or quite ready for prime-time yet, but it is now available as a public TestFlight build. If anyone would like to help test, I’d love your feedback.

You can join the public TestFlight here. And I have more documentation available here.

Talking to OmniFocus

(Click here to skip my boring intro and go straight to the fun stuff.)

It’s been nearly two years since I posted anything significant to this blog’s Productivity and OmniFocus section. A big reason for that is after practicing GTD for fifteen years, I had pretty much nailed down a slightly tweaked take on the process that worked well for me. There was no need to make changes just for the sake of change.

But one significant change I have made is to my morning routine. And it was made possible by OmniFocus’ version 3.4 update last year. I’m sorry that I’m just now getting around to writing about this new workflow because it’s a lot of fun. And it just might be my favorite new feature Omni has ever shipped. As a user, it’s wowing me with the possibilities. And as an Apple developer, I’m amazed at how well done it is.

One of the fundamental tenets of GTD is capturing all the open loops in your head and putting them into your trusted system. I’ve found that making capturing as frictionless as possible in any situation has been one of the most significant net benefits in my life.

But OmniFocus’s Siri Shortcuts allow for something entirely different: Ubiquitous Planning. I can now review my commitments for the day at any time without being visually tied to my device.

I have two young kids, so our morning routine is barely controlled chaos. Add to that a fairly long commute into the office where the last ten minutes is me on the phone for our daily standup call. So, from the time I open my eyes to when I sit down at my desk, I pretty much have no idea what’s in store for the day other than what I remember from my weekly review on Sunday or anything I managed to look over the night before.

My actual planning time is me triaging emails, Jira tickets, Slack messages, notes from standup, and my OmniFocus lists during the 30 minutes after my morning call ends. Only then am I ready to begin work. And by that point, it’s practically already time to start the daily Slack poll for what we’re ordering for lunch, and, well, mornings go by fast.

But what about that dead time in the car on the way to work? Podcasts? Sometimes. Singing at the top of my lungs to 80’s New Wave? Always.

How about stealing back some of that time and doing a daily review? Yep. Now I can.

OmniFocus now has a fantastic Siri Shortcut action that lets you run queries against your task database. And with some clever Shortcuts.app programming (is it really programming?), I’m now able to ask Siri questions about my upcoming day via CarPlay and have the results dictated back to me so I can at least get a summary of what’s available, what’s due, and a reminder of what I completed yesterday.

Let’s start with a simple example.

My OmniFocus Inbox is a dumping ground for tiny reminders, half-baked ideas, and the beginnings of larger projects. When I’m preparing for the day, those items can mostly be ignored until I’m ready to do a review or real processing. But often, I’ll also throw in one-off tasks that need to get done quickly and don’t warrant me taking the time to add them to a project or assign tags. Since these will never leave my Inbox, it’s important to me to do a quick catch-up of what’s in there, or they might get lost among the chaos of my more organized projects.

Here’s the first version of the Inbox shortcut I built. It’s a basic example of how to query for tasks.

OmniFocus Inbox Shortcuts.app Screenshot

(Quick note: I originally wanted to call this shortcut “What’s in my inbox?” as that’s the most natural phrase for me to speak. But I use all of these shortcuts hands-free while driving with CarPlay. And since iOS assumes you’re asking about Mail.app because of the word “inbox”, it complains that you aren’t allowed to use Mail.app while driving. So, I have to add the “tasks” qualifier to make the system run my shortcut.)

Here it is in action:

This works well enough, but it can be improved. Because Siri is just reading the raw output from the OmniFocus query, it’s too difficult to discern the separate tasks she’s speaking. It doesn’t sound like natural speech.

After a little bit of experimentation, here’s a better example that I can run by asking, “Hey, Siri. What’s due today?”

Siri is easier to understand in this example because I’m sending each task to voice one at a time and a one-second pause between each.

OmniFocus Due Today Shortcuts.app Screenshot

Let’s take things one step further and ask for a rundown of the upcoming week – including an overall summary as well as dates for each task.

It takes 23 actions to piece together that Shortcut. But I think the results are worth it.

I construct my OmniFocus query and then loop over all the tasks – formatting each one into a sentence – and combine them into a single, larger string that I send to voice output.

Using simple punctuation and putting a newline between each task forces Siri to speak the results more naturally.

OmniFocus Upcoming Tasks Shortcuts.app Screenshot

So, that’s how I talk to OmniFocus.

With a few custom shortcuts as well as Voxmail and CarPlay’s built-in calendar support, I’m able to get an excellent overview of my day on the drive into work. I can triage emails, find out what’s due on my task list, and hear any new meetings added to my schedule overnight.

It lets me use my otherwise dead time commuting to prepare for the day and feel more confident when I dial-in to my morning call.

Motivation

A good friend texted me the other day. They said:

Text about work ethic

I’m jealous of a lot of your work ethic, but the fact that you enjoy writing is the biggest one I think

I don’t share that to say that my work ethic is better than anyone else. I’ve been called “lazy” my whole life by teachers, friends, even loved ones when it comes to me not putting effort into things I’m not passionate about.

Is that a personal flaw? Yes, I think so. If I could have mustered the maturity and self-discipline to study for the classes I wasn’t interested in, I probably wouldn’t have flunked second-semester college Biology two times. I probably would have remained in past jobs longer. And a million other screwups and failures throughout my ridiculously privileged life could have been avoided if I had just cared enough to try harder at the things I didn’t care for.

A few years ago, my therapist told me I’m going to have just the right personality and temperament to enjoy my 40s when I get there. I wasn’t entirely sure how to take his comment then, but now that I’m well into my thirty-eighth trip around the Sun, I think it’s beginning to sink in.

What I mean is, I feel like I’m dangerously close to discovering the cheat code for my own life. After a decade of turbulence, I’m more at peace with myself than I ever have been. Thirty-eight years into being here, I finally understand myself well enough to forgive my shortcomings (while continuing to try and be better) and realize what makes me tick, what motivates me, and how I can fight back against the worst parts of myself and stay healthy.

Everything above is just a long-winded and meandering introduction to say that this post is about motivation. Specifically, the two most significant motivating factors that contribute to my “work ethic,” as my friend said.

Jerry Seinfeld

The first one is so dumb and straightforward that I can hardly believe it works. I didn’t even realize I was using it to my advantage until I stumbled upon a story about Jerry Seinfeld that accidentally made the idea internet-chic.

There are a million blog posts and articles explaining it, so I won’t bore you with a detailed rehashing. But, in summary, do the thing you want to do every day. The more days you can muster in a row, the more leverage you create to keep yourself from ending the streak – from breaking the chain.

I’m tempted to dismiss the whole idea as nothing more than a fancy way to build a habit, except that I think the insight of using an ever-growing streak – compounding interest, essentially – as leverage against yourself can help you through the period before it becomes a habit. At least that’s how it has helped me.

Two quick examples.

For a long time, I kept a daily journal using the wonderful Day One app for Mac and iOS. Whether added for this reason or not, I don’t know, but the main screen displayed the number of consecutive days you last wrote an entry. I accidentally got my streak up to twenty days or so and just never wanted to see that number stop climbing.

Soon I had a couple of months in a row, and by the time I finally let a day lapse without writing, over two years had passed.

Along those lines, when it comes to the software I write, I really do enjoy looking at my GitHub contribution chart. And while I think it’s a complete asshole move to judge anyone else by what theirs looks like, I like seeing mine.

GitHub contribution chart

While maybe not as specific or as motivating as a number you can count, it’s fascinating to see the relative ebbs and flows chronologically. I can often correlate the chart seasonally or to my mood levels over time. And, yes, it gives me a bit of an endorphin rush when I can look back and feel proud of what I accomplished.

I’ll end this section with a recent quote from one of my very favorite people, Kourosh Dini.

Moving something forward a little bit each day is likely more important than doing something all at once. Doing so helps you to build the structures needed to keep moving forward.

I wrote something similar (but not nearly as eloquent) six years ago.

Moving on.

Fear

The other big thing that pushes me forward is fear.

When I stay busy, productive, engaged, curious, whatever you want to call it, I feel mentally healthier. That doesn’t mean I work all the time or that I don’t binge-watch a season of TV every now and then, but without some baseline level of gears turning in my head, solving problems, and learning something new, I get dangerously bored – for lack of a better word.

I turn inward. I shut down. I’ve been to some very dark places in my life, and in hindsight, the warning signs were always there. Chief among them is losing interest in the work I am passionate about.

And so I’m incredibly fearful of that happening again. Call it a precursor or a canary in a coal mine, but if I can gauge my ability to remain engaged in my work as a barometer for my mental health, I’m happy to do so.

Kourosh’s post I linked above offers this quote from Paul Tillich‘s The Courage to Be.

Courage can meet every object of fear, because it is an object and makes participation possible. Courage can take the fear produced by a definite object into itself, because this object, however frightful it may be, has a side with which it participates in us and we in it.

If I’m going to be afraid, I’d much prefer to use that emotion to my advantage, stay busy, and build things that make me (and hopefully other people) happy.

Does Not Contain

I occassioanlly need to scan a folder and all of its subdirectories to see if any of them DO NOT contain files of a certain type.

I’m fully aware you can do this with some combination of shell commands, but I always spent 20 minutes googling for how to do it again every time I needed to. It was faster just to write this small utility myself.

I call it dnc, which stands for “does not contain”. You can download the source or a pre-built binary on GitHub. The builds aren’t notarized. So be sure to ask Apple if it’s OK to run this on your Mac.

USAGE: dnc --directory <directory> --query <string> [--invert]

OPTIONS:
  -d, --directory <directory>
                          The directory to recursively scan.
  -q, --query <string>    A string to search for in the filename of the directory's files.
  --invert                Invert the query. i.e., show directories that DO contain the query.
  -h, --help              Show help information.

My primary use-case is finding which albums in my music collection (folders on disk) are in a lossy format. This gives me a quick shopping list of used CDs to buy when I need something mindless to do during quarantine.

A typical command would be

dnc -d /path/to/music -q flac

That will output something along the lines of

/path/to/music/Violent Femmes/1999-11-23 - Viva Wisconsin
/path/to/music/Weezer/1994-05-10 - Weezer
/path/to/music/White Denim/2013-10-29 - Corsicana Lemonade
/path/to/music/Yonder Mountain String Band/A Decade of Yonder Live, Vol 9_ 6_29_2006 Apple Valley, MN
/path/to/music/Zero 7/The Garden

which means of all the folders recursively inside /path/to/music, those directories DO NOT contain any flac files.

A key difference of this script than many of the solutions that Google gives me, is I’m not interested in every file that does not match query. I just want to know about any folders that do not contain matching files.

You can use the full command line arguments listed above with --help, or you can quickly run the command on your current directory by only passing a query string like this:

dnc flac

Dot Dee Tee

In line with my affinity for backing up and owning my data, one component of that strategy is avoiding proprietary file formats and databases whenever possible and reasonable. That’s why I prefer plain text (and more recently .textbundle) for all of my notes, and why I’m so meticulous about how I organize my family’s photo archives.

It gives me the agility to move from app to app or even (heaven forbid, it may eventually happen) to a new platform as my needs change. If you own your own data, there’s no lock-in.

So along those lines, here’s a very tiny optimization (is that the right word for this?) that I’ve been doing for years that helps keep my reference material organized and more easily searchable and filterable.

(Oh, and also a quick story about how I effed up someone else’s data.)

My primary “database” is the Finder – files on disk. And while Spotlight is amazing and wonderful and all that (go purchase HoudahSpot), I find its results too fuzzy and noisy unless I’ve really lost a file. It’s way faster for me to find what I’m looking for using the combination of how I naturally organize files into folders based on the client / app / subject / etc. and then sorting by date.

And it’s sorting by date that this simple trick is all about.

I gave up long ago relying on file creation and modification dates as a reliable way to sort files. They’re too easily corrupted.

Some modern Mac apps that adopt the post-Snow Leopard policy of automatically saving will save files behind your back just by viewing them. That can easily blow away a file’s timestamp. Or, if you restore from a backup, it’s very likely the original dates won’t be preserved. And now that all our data is flying across the network at any given moment with Dropbox, iCloud, Google Drive, etc. it’s easy for a bug in their sync code or your own mistake to propagate everywhere instantly.

My solution is basically what every Microsoft Office Warrior has already been doing ever since email became a thing and people needed to keep track of multiple revisions.

I stick the date in the filename itself.

Finder screenshot

Ok, I know this is ridiculously obvious, but it works, it’s flexible and has saved my bacon many times.

Rather than relying on filesystem dates, which can be mangled at any time, I sort by filename and voilà.

Here are my archived photo albums:

Finder photo albums screenshot

It’s especially awesome for this purpose because, for me, I want my photos / videos stored chronologically. After all, I mentally see them as a timeline of my life. And if every album of a birthday party were named “Birthday Party Blah Blah,” it would be a nightmare to find what I was looking for among 1,000+ folders.

This strategy can really shine when you go beyond Finder and use an app that can filter, search, and sort by dates this way.

Here’s my note-taking app focused on my daily standup meeting notes. In addition to the full-text search, I can quickly filter to meetings that took place in a given month or day.

This whole thing works for me because my memory is naturally oriented around dates and timelines. When I’m trying to reference a piece of information, I can almost always pin it down to the specific month it was created, at a minimum, and then use that date range as a launching point for more refined searching if needed.

But how do you make adding these dates faster? Text snippets, of course.

I’m a terrible typist, and I can barely remember the current date as is. So I’ve been using Typinator for years to convert short abbreviations into longer snippets, including variables and dynamic data.

(Lots of apps that do this sort of thing. I feel like TextExpander is the default choice for most people, but I’ve always preferred Typinator for many reasons that warrant their own blog post.)

So when I need to insert the current date, in any app, I type .dt

Typinator text expansion demo

…and it expands into 2020-10-09. You’ll also see in that gif that typing .ts inserts the current time, too.

Neither of these snippets is amazing or original or unique. Folks have been raving online for years (rightly so) about all the amazing and clever uses you can find for apps that automate typing for you.

(If you’re curious about the sorts of things you might use a text expansion app for, go visit David Sparks. I’ve stolen a ton of great ideas reading his blog over the years.)

Anyway, this blog post’s point is just a long-winded way to say that inserting the current date into filenames or note titles is a small habit I’ve learned that makes me so much more organized. It lets me find the content I’m looking for much faster and get on with my work.

Story Time

I wrote above about the delicate nature of filesystem dates and how, if you rely on them, losing that part of your reference material can be a Bad Thing™?. That’s why I use the date-inside-the-filename trick.

But what clued me into this?

In 2009, when I was building the first version of Nottingham over Thanksgiving weekend, I sent an early build to John Gruber. I knew he was a big fan of Simplenote, and I was excited to show that my new Mac app would sync with their backend.

It didn’t go well.

(I know it’s not cool to publish emails with another person without their permission first, but I hope he’ll let this one slide as it’s been 11 years and I was clearly the idiot in the exchange.)

Screenshot 1 of email with John Gruber
Screenshot 2 of email with John Gruber
Screenshot 3 of email with John Gruber
Screenshot 4 of email with John Gruber

So, yeah. That was my first time writing any sort of network synchronization code, and I probably shouldn’t have used him as a guinea pig.

That said, a few years later, I think it was WWDC 2012, I struck up a conversation with him at Bourbon & Branch.

I basically said, “Hi, I’m the guy who fucked up your note timestamps. Sorry about that.”

I don’t remember his exact reply other than being very nice about it and not punching me in the face, but I do remember during the entire short conversation he was scribbling into a Field Notes journal. I can only assume he had learned his lesson and swore off digital note-taking.