Three Things Again

Last March, I released Three Things Today. It’s a one-trick-pony Mac app that lets you schedule out your three main goals for each day on a calendar. It’s built around my two basic assumptions for getting work done:

  1. There is only enough time to do three significant things each day. One goal in the morning, one after lunch, and another near the end of the day.
  2. Your day will never go as planned, fires will happens, things will be delayed or droppped entirely. That’s OK. Accept that reality, plan for it to happen, don’t punish yourself.

Anyway, you can read more about the app and how it operates under those two assumptions.

The point of today’s post is that while I’ve been using Three Things myself for a year now, a very nice person was kind enough to email me last week and let me know that the version posted online had expired. My bad.

Here’s an updated build.

Also, this new version comes with an experimental new feature: iCalendar syncing!

You can add a public iCalendar (.ics) feed to Three Things, and it will display all day events / tasks within the app.

Why is this useful? For me, I’ve subscribed Three Things to the calendar feeds for my Trello boards that I track my software projects with. Most of my Trello cards (tasks) are undated, but in the rare case one has a due date, it will automatically appear in Three Things. More importantly, Three Things will enforce rule #1 and make sure I don’t overcommit myself on that day accidentally.

This Only Happens Here

My five year old, driving home from daycare today, unprompted:

I know what lockdown is.

Like when we had to stay home for a long time last year?

It’s when we turn the lights off and lock the door and hide in the fire room because a bad guy is coming.

Pause.

But, daddy. Why do bad guys have swords and kill all the people?

Time Machine

And suddenly, my kids are grown up.

What I mean is, it’s been a long time since I’ve been inside a restaurant with my kids.

467 days.

The last time we ate out as a family, they were, well, horrible little human beings. It was just that age.

But then we walked inside and closed the door behind us. And waited.

For over a year, we played it as safe as possible — minimized risks. Even when our jobs ordered us back into the office, we did what we could. Drive to work. Eat lunch in – not out with coworkers. A social pariah among young non-believers. Drive back home. Maybe the grocery or drug store.

A grandparent’s wave through a glass door.

And we made it through mostly unscathed.

Mostly.

It was, at the same time, the longest and shortest year of our lives.

Two weeks ago, my wife and I sat outside in the rain near a cave. And laughed. And sang. And danced a little.

Music echoed through the clearing.

We cried. And were thankful.

Tonight, my son asked for sushi from the Chinese place he likes best. His eyes lit up when I replied, “Would you like to eat inside?” My wife and I call it “Trump Chinese” because they sell counterfeit MAGA gear out of a golden display case in the lobby. Two hats for $35. The food is comforting – if overpriced. The owners are giant assholes. But it was a regular spot nonetheless.

When we drove up this evening, I cackled when I saw the interior stripped to the studs, and they had finally gone out of business. Good.

Sure, my kids sobbed because that age never likes disappointment. But that was solved easily enough by making a quick detour to a nearby deli instead. Another favorite of ours. Hello, old friend.

We opened the door and stepped out of our time machine — my children another year older. And, my goodness, actually not terrible dinner companions like they used to be.

Let’s Reimplement an Amazing First-Party Feature in the Dumbest Way Possible

[Update 2021-12-18: See this post for a better solution.]

Some ideas are just too silly to not try and follow through with.

Earlier this evening, Michael Tsai tweeted

Safari is already less compatible, so if the user interface is going to be worse, too, I just don’t see the point. The main other thing keeping me there is 2FA auto-fill.

and I replied

I’m very, very close to writing a KeyboardMaestro macro to grab the latest 2FA code from Messages.app to work around this.

I was mostly joking.

Until I thought, why not?

Here it is. Just launch the macro, and it grabs the new two-factor code that was just texted to you. Then inserts it into your non-Safari browser.

And here’s how it works…

My first instinct was to try and copy the text of the most recent conversation in Messages.app and then pipe that through a regular expression to parse out the two-factor code.

For very boring reasons that aren’t very interesting, I’ll just say that I spent two days a few years ago trying to hack together something similar using Messages’ AppleScript interface. It wasn’t very good back then, so I didn’t even attempt going down that road tonight – especially since it’s a Catalyst app now.

Instead, I decided to just try “clicking” my way through the UI with KeyboardMaestro. Something along the lines of…

  1. Activate Messages.app
  2. Click a known x,y coordinate from the top-left corner of the window to select the first non-favorite conversation.
  3. Double-click a known x,y coordinate from the bottom-left corner of the window to select a word in the last message of that conversation.
  4. Type ⌘A to select all the text in that message.
  5. ⌘C to put it on the clipboard.
  6. Parse out the code.
  7. Paste the code onto the clipboard to use.

That sort of worked. But it wasn’t very reliable. Mostly because Messages.app takes so long to wake up sometimes. If its window hasn’t been displayed in a while, it can take a not-insignificant amount of time to appear. And then switching to the newest conversation is similarly slow.

As much as I tried to work around this by adding delays in the UI script or other KeyboardMaestro tricks, it was too fragile to be reliable in my testing. I needed another approach.

Here’s what ended up working.

  1. Click the menubar’s clock to activate Notification Center. (By the way, it took me a full damn month after installing Big Sur before I realized what Apple had done with the Notification Center icon and that it was still accessible without needing to use the two-finger-swipe-from-right trackpad gesture.)
  2. Wait for the reveal animation to finish.
  3. Take a screenshot.
  4. Flip the image horizontally. (Because KM’s crop action only works from the top-left corner of an image.)
  5. Crop out the known size/position of the first notification message. (All message bubbles are the same size no matter their contents.)
  6. Flip the image horizontally (back to the original orientation).
  7. OCR the text contained in that cropped image, which should hopefully contain our two-factor code.
  8. Extract the code using a shell script. (Please dear god Apple don’t remove Perl from Monterey.)
  9. Close Notification Center.
  10. Wait for the collapse animation to finish. (This delay is longer because I found I had to wait for the animation to finish and then an additional delay for the active application to regain keyboard focus a moment later.)
  11. Type the code into the current app (probably your non-Safari browser).
  12. Put the code on the clipboard for good measure.

And, boom, in just twelve easy steps… ?‍♀️

You can download the macro here.

Caveats

  • I haven’t tested this yet on multi-monitor systems.
  • The image crop dimensions assume you’re using a retina display.
  • The regular expression will probably fail for you, but it works for Google and my bank.
  • This is all a dumb hack that isn’t actually meant to be taken seriously but illustrates the internet’s collective knee-jerk response to not wanting to use the new Safari.

The Entire Amount of Commerce

It’s that time of year again, and I wanted to expand on a tweet from last year.

This is your iPhone and Mac without 3rd party developers.

Riccardo Mori replied

Impressively carved skeletons with no meat.

Since Apple will stand on a virtual stage tomorrow and tell us how much they love, value, and appreciate third-party developers, here is an alphabetical list of iOS apps that I depend on – from solo developers, small companies, and giant world-eating ones, too.

(And these are not affiliate links because Apple sure put a stop to that.)

1Password, DEVONthink, Day One, Drafts, Dropbox, Due, Fantastical, Fastmail, Firefox, Google Maps, Home+, Instapaper, Noom, OmniFocus, Overcast, PCalc, Pins, Plexamp, Pushover, Reeder, Sonos, Spotify, SwiftScan, The Athletic, Trello, Tweetbot, WolframAlpha, YouTube Music

I want to be crystal clear about the value these apps (and many others) provide. Without them, I would not own an iPhone. Or an iPad. Or an Apple Watch. I would not have purchased an iPad Magic Keyboard. Or any number of first-party Apple Watch bands.

I would not own three Apple TVs. (Well, only one is still in use. The other two are in a closet after being swapped out for Android TV last Summer. But that’s another blog post.)

I would not pay for iCloud storage each month. My seven-year-old son would not use his chore money to pay for Apple Arcade.

And because modern life relies so much on connected ecosystems, if I didn’t use any of the above hardware, dare I say, I would not still be using a Mac, either.

As the head of IT for my family and extended family (is there a better way to phrase that?), I would question if any of them would own iPhones, iPads, Apple Watches, Mac laptops, and pay for iCloud, Apple Music, and even Apple Fitness+.


The iPod halo effect brought millions of people into Apple’s walled garden. But as Tim Cook testified in court last week, no customers are locked in by Apple.

Lawyer: What about references to locking customers into devices?
Cook: It means making all the product work so well together people don’t want to leave.
Lawyer: Is there anything Apple could do to lock people into iOS?
Cook: Not that I’m aware of.

And I agree with Cook. I could switch to Windows and Android. I wouldn’t like it, but I could make the switch.

Except for all those third-party apps. I couldn’t give those up without significant effort – if it would even be possible to find replacements for each.

Third-party apps are what keep me locked into Apple’s lucrative don’t-call-it-a-walled-garden.

In any healthy software ecosystem, third-party developers and the platform vendor are a symbiotic relationship. To pretend otherwise is fanciful gaslighting.


Cook: I view it differently than you do, Your Honor. I view that we are creating the entire amount of commerce on the store

I view it differently than you do, Mr. Cook. I view that developers are creating the entire incentive for consumers to purchase your hardware.