Automators Podcast, episode 58

I was extremely pleased to be on episode 58 of the Automators podcast on Relay.fm.

This was my first time on Automators, which is a show that I have really enjoyed since it first began.

I’m guessing anyone who has managed to still find and read my site probably knows this already, but I’ve also been on a few episodes of Mac Power Users too:

Links and Show Notes

Here are the show notes for Automators 58:

Free Books: Healthy Clergy Make Healthy Congregations

(Note: These books are only free today, September 3rd, 2020)

Steve McCutchan posted on The Presbyterian Outlook’s website that today (September 3rd, 2020) is his 54th wedding anniversary. He adds:

My wife, Sandy, who passed away this past November 30th, in addition to being my faithful companion, was also the chief editor of all my books. This includes the nine-volume series, Healthy Clergy Make Healthy Congregations (HCMHC). I’ve decided that in celebration of the fifty-three years we spent together and in thanksgiving for all she contributed to me, I’m going to GIVE AWAY ALL NINE VOLUMES of the HCMHC series on that day.

Here are links to the Kindle versions of each book, plus a 10th book which is also free today:

Those links go to Amazon.com and to the Kindle versions. They should show a price of $0.00. (If not, you may have missed the deadline.)

I’m not sure if they are free in other Amazon stores other than Amazon.com.

I haven’t read these books, so I can’t vouch for them directly, but it seems like a generous offer, worth checking out.

Thanks to Steve for making these books available in honor of Sandy’s memory.

These Are Not the Masks You‘re Looking For…

Scene: Jenkins, a product manager at Disney, reports to his Boss about Disney’s new licensed Star Wars masks for COVID-19…

Jenkins: “Hey boss! We’ve got those Star Wars face masks for sale on the website.”

Boss: “Great! People need to be wearing masks, and we have some iconic masked characters: Darth Vader, Boba Fett, Kylo Ren, The Mandalorian…”

Jenkins: “Um…”

Boss: “What?”

Jenkins: “It’s just, um. Those are all excellent suggestions, sir. It’s just that… We didn’t make those.”

Boss: “Oh. Huh. Well… Ok. Decided to do with Storm Troopers then?”

Jenkins: “Oh… Storm Troopers… Yeah that would have been a good one…”

Boss: “…”

Jenkins: “…”

Boss: “So what did you…”

Jenkins: “We’ve got an R2D2…”

Boss: “Oh, the gold droid who talks a lot? I lov—”

Jenkins: “Um, no sir, that’s C3PO… He’d be a good one, though, I’ll write that down. We did the other one.”

Boss: “You did a mask of a droid… but not the one whose head is shaped like… a head?”

Jenkins: “Yes sir… We have some others.”

Boss: “Show me…”

Jenkins: “This one features the 1977 cast…”

Boss: “1977… Jenkins, you do know we’ve made a few more of these movies since then, right?”

Jenkins: “But this is iconic artwork, sir…”

Boss: “Why does Leia look like she’s one of Luke’s legs? And… is she wearing a turtleneck? And a tiara for a belt?”

Jenkins: “Sir, you mentioned our newer properties, I think you’ll really like this one, it has iconic symbols from the new movies.”

Boss: “Not those stupid dice, I hope…”

Jenkins: “No, sir, we’ve gotten rid of those, as you asked. Look here.”

Boss: “What are these?”

Jenkins: “Those are symbols of the rebellion.”

Boss: “That one looks like the adapter I used to have to use for my 45 RPM albums.”

Jenkins: “Sir?”

Boss: “Nevermind. Who is the guy with the tusks?”

Jenkins: “You know, sir, that’s… um… Darth… Tuskus…”

Boss: “Where are the X-Wings?”

Jenkins: “Oh, um…”

Boss: “You said iconic symbols. I don’t see an X-Wing, or a TIE Fighter, or even a lightsaber. Those are pretty important symbols of Star Wars, right? How about the Millenium Falcon?”

Jenkins: “You’re going to love this last one. It’s ‘The Child’…”

Boss: “Who?”

Jenkins: “‘The Child’? From ‘The Mandalorian’?”

Boss: “You mean ‘Baba Yoda’?”

Jenkins: “Actu— Yes. Baby Yoda, sir. You’re going to love this one.”

Boss: “Jenkins. Did you cut off Baby Yoda’s ears?”

Jenkins: “No no no. See, of you hold the elastics out like this, see how it kind of looks like the shape of ears?”

Boss: “When people wear this mask, are those elastics going to stick out like that?”

Jenkins: “Um. No?”

Boss: “No, they’re not. So it’s just going to look like they’re wearing a mask with Baby Yoda’s ears cut off.”

Jenkins: “I…”

Boss: “Get out.”

Jenkins: “Yes, sir. I’ll bring your ideas to the team.”

Boss: (pushing button under desk) “I don’t mean out of my office. I mean out of the building. These men will show you the way. We’ll send your last check to you.”

Compare macOS Versions with zsh and is-at-least

Update (26 July 2020)

Howard Oakley has reported that Big Sur is both 10.16 and 11.0.

For the purposes of shells scripts, sw_vers will return 11.0 unless SYSTEM_VERSION_COMPAT=1 is set. If it is set, then sw_vers will return 10.16.

To my mind, this new information only makes the following suggestion more useful, because it will work under either scenario.

end of update

Original Post

I have already run into an issue where I’ve had to adapt some of my scripts for Big Sur.

(n.b. if you have used the -p arg to shasum in the past, it no longer exists in Big Sur. There is a new -U option which is not the same as what -p used to do. Ironically, -p was for ‘portable’ mode.)

It has already been noted that Apple is referring to Big Sur as “macOS 11” which presumably means that sw_vers -productVersion will return ‘11.0’ once Big Sur is out of beta.

However, at least as of this writing (10 July 2020), sw_vers -productVersion on Big Sur returns ‘10.16’.

If you are trying to write a shell script which can be used on both Big Sur and earlier versions of macOS, how can you check to see which version you are running?

I would like to recommend the following, which uses a feature which I believe is unique to zsh — and since Apple has made zsh it’s preferred shell, I recommend writing all of your shell scripts in zsh (however I should note that I may be a little biased, as I’ve been using zsh for 20+ years).

is-at-least

The zsh feature in question is called is-at-least and you use it like this:

autoload is-at-least

is-at-least "$MINIMUM" "$ACTUAL"

where $MINIMUM and $ACTUAL represent the two numbers that you want to compare. What is especially nice about is-at-least is that it can compare version numbers such as 10.15.5 and 10.13.4 and 10.16 (or 11.0).

Note: the autoload is-at-least line needs to be called once-per-script before you use is-at-least but once you’ve loaded it, you can use is-at-least as many times as you want in that script.

The key here is that regardless of whether Big Sur reports itself as 10.16 or 11.0, we can use ‘10.16’ as $MINIMUM and then set $ACTUAL to the version of macOS that we are using.

Note that you don’t have to use variables here, you could do this:

autoload is-at-least

is-at-least "10.16" "$ACTUAL"

The result of is-at-least will be zero if $ACTUAL is at least equal to 10.16, or 1 if it is not.

Here’s a complete example script as a gist for those who may find it useful.


#!/bin/zsh -f
# Purpose: Check to see if we are running on Big Sur
#
# From: Timothy J. Luoma
# Mail: luomat at gmail dot com
# Date: 2020-07-10
PATH="/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin"
# this will check to make sure `sw_vers` exists
# if it does not, this is probably not macOS
if ((! $+commands[sw_vers] ))
then
echo "$NAME: 'sw_vers' is required but not found in $PATH" >>/dev/stderr
exit 2
fi
## First we get the value for this Mac and save it to `$ACTUAL`
ACTUAL=$(sw_vers -productVersion)
## load 'is-at-least' so we can use it
autoload is-at-least
## "Is the version of macOS that we are using _at least_ 10.16?"
is-at-least "10.16" "$ACTUAL"
## EXIT will be '0' if ACTUAL is at least 10.16
## EXIT will be '1' if ACTUAL is _less than_ 10.16
EXIT="$?"
if [[ "$EXIT" == "0" ]]
then
# This is Big Sur (or later)
echo "YES"
elif [[ "$EXIT" == "1" ]]
then
# This is BEFORE Big Sur
echo "NO"
else
# we should never get here
echo "This should not have happened. EXIT = $EXIT"
fi
exit 0

Listen, record, and even pause Relay.fm Live using VLC and Audio Hijack

Relay.fm has a schedule of live shows which you can listen to as they are recording. Most people just listen to these in a web browser, because that makes the most sense and is the easiest way to do it. If you have an iOS device you can use the free Relay.fm app which I will also use if I am not at home when a show is live.

However, if I am on my Mac when a show is live, I prefer to listen using VLC which is a free app, and I also like to record the live show, either so I can pause it if I get interrupted or can just listen later to the MP3. This is accomplished by using VLC plus Rogue Amoeba’s Audio Hijack program, which is not free, but which any self-respecting Mac nerd ought to own because it’s amazing cool and powerful. It can do 1,000 more things than this, but I’m just going to talk about this for now.

Using VLC to listen to Relay.fm live

To listen to Relay.fm in VLC, you need the URL to the live-stream server:

http://stream.relay.fm:8000/stream

That URL is only enabled when the live-stream is active.

First go the File » Open Network:

VLC: File » Open Network

Second, put the URL into the Network URL in the Open Source window that will open:

VLC: Network Pane

If the live-stream is active, it will look like this:

VLC: Live Stream window

If you’re comfortable with the command line, you can replace the first two steps by this line in Terminal:

open -a VLC 'http://stream.relay.fm:8000/stream'

which will automatically open VLC with the stream playing (again, only if it is live).

Record Relay.fm Live with VLC and Audio Hijack

If you want to record Relay.fm with Audio Hijack, we can still use VLC, and then set it up the output to go two places:

  1. To an MP3 so we can listen later

  2. To the Mac’s speakers

In number 2, we also add a “Time Shift” block, which will allow us to pause the livestream (which will keep recording in real-time to the MP3, because that is completely separate). It will also allow us to rewind the broadcast if we missed something. It’s sort of like TiVo for audio.

The setup (which Audio Hijack calls a “Session”) will look something like this:

VLC in Audio Hijack

You can see there are two “branches” from VLC, one going up to an MP3, and the other going down to “Time Shift” and “Output Device”.

We have to tell VLC what to play when this Session runs, which we can set by clicking on the VLC “block” in Audio Hijack, which will reveal the VLC settings. You can see it here:

VLC settings in Audio Hijack

Note that the box next to “Open URL” is checked, and the URL is entered into the appropriate box.

You can also change the MP3 settings (not shown) by clicking on the “Recorder” block. I have mine set to save recordings to the folder ~/Music/Audio Hijack/ with filenames that are formatted like this:

Relay.FM-2019-05-16-at-13-04.mp3

The first part makes sure that all the Relay.fm recordings will be grouped together by name, and then the date (YYYY-MM-DD) followed by the time that the recording began (13-04 refers to 1:04 p.m. local time on May 16th of 2019).

You can download my Audio Hijack session file here: Relay-to-Speakers-and-mp3.ahsession

Assuming you have Audio Hijack installed, you should be able to double-click on the Relay-to-Speakers-and-mp3.ahsession file and have it open right in Audio Hijack. You can then adjust any of the settings that you might want to change. (The file also assumes that VLC is installed at /Applications/VLC.app.)


p.s. – You can easily adapt these instructions to record other podcasts which record live, by creating a new “Session” in Audio Hijack and changing the URL of the live-stream server. For example, ATP’s URL is http://marco.org:8001/listen

With ATP, you can even use Audio Hijack’s “Schedule” feature to record Wednesday nights at 8:58 p.m. (US/Eastern) to 11:55 p.m. and automatically record most of ATP’s live shows. They do occasionally change that date/time of recording, but that will catch most weeks. I suggest starting a few minutes before 9:00 p.m. not because I want to subject you to Marco’s Phish concerts, but just to give yourself a little leeway. Also, they usually stop recording long before 11:55 p.m., but Audio Hijack is smart enough to figure out when there is no sound playing.

The Daily Lectionary Podcast

Last year (2019) during Lent, I started reading The Daily Lectionary. After Easter, I stopped. No idea why, really. I guess because Lent was over? Which doesn’t make much sense, because I enjoyed reading it every day. Nevertheless, I stopped.

Recently, I’ve been wanted to resume the practice again, but I found that I really liked the idea of reading it in community.

Unfortunately, right now we can’t really read “in community” very easily — at least not in the ways that we’re used to thinking of “community”. I did think of making it a daily Zoom call, but everyone I know right now has plenty of Zoom calls, so I decided to do something different.

I decided to start a podcast where I read The Daily Lectionary.

A Little Background Information

If you have been involved in a mainline Christian church, you may be familiar with the lectionary as a list of readings assigned for Sundays throughout the year, and it operates on a three year cycle. The Revised Common Lectionary is the most familiar, but that’s only one kind of lectionary, and there are lots of others.

The Presbyterian Church (USA) also has a two-year daily lectionary from our Book of Common Worship. You can find the readings online at https://pma.pcusa.org/devotion/. That page is updated every day to show the current day’s readings.

(Of course, there’s nothing particularly “Presbyterian” about the readings; they all come from the Christian Bible, so if you are not Presbyterian, don’t consider that a hindrance.)

Each day consists of 7 readings:

  • 2 Psalms for the morning
  • 3 Readings for mid-day
  • 2 Psalms for the evening

Now, I know you may be thinking, “Seven readings?!?” but these are not long readings. In fact usually they are fairly short, compared to readings that we usually have for a Sunday worship service.

In fact, looking at the readings from the past two weeks’, I can tell you that reading all 7 of them takes an average of 13 minutes per day! The shortest day was about 10 minutes, and the longest was about 17 minutes. If you can take 20 minutes a day, you can do this.

Also note: The podcast is just the text. There is no commentary or interpretation offered, which would not only lengthen the time commitment, but it might be a barrier to some folks. The whole point is simply to have the texts themselves to read, with the expectation that you will add your own thoughts and prayers to the hearing of them.

The mid-day readings usually include one reading from the Hebrew Bible, one reading from the epistles, and one reading from the Gospels.

The times are, of course, just suggestions. You can read them all at once, or divide them differently. I found that I preferred to read the two “morning Psalms” and the three “mid-day” readings early in the day, and then I would read the 2 evening Psalms when I went to bed. There’s no wrong way to do it.

(As an aside: the daily lectionary also tends to repeat the Psalms. This is not a mistake; it is, I believe, intended to give you another opportunity to hear something that you might have missed the first time, or that means more to you on one day than it might have on another.)

“How to listen”

There are several ways to access these recordings, so if you do not know how to do it one way, keep reading, and maybe you’ll find another option you like better.

Option 1: Listen as a Podcast

If you already know what a podcast is and how to use them, then all you need to know is that you should use https://feedpress.me/lectionary as the link to subscribe.

sketch of the Plattsburgh church

You can also search for “Daily Lectionary” in the iTunes Podcast Directory, but if you do that, please note that there are more than one, so look for either my name (Rev. Dr. Timothy J. Luoma) or the picture of the Plattsburgh church (shown here) which is what I used for artwork.

Each day’s readings post at midnight on the day of the assigned reading, so no matter how early in the morning you get up, it should be available for you.

Each episode also includes links to the text of the readings, in case you want to read along as you listen.

Option 2: Receive Links via Daily Email

If you don’t know what a podcast is, or would rather just get a link via email, you can subscribe via email using this link.

Note: To sign up, you will need to enter your email address, then you will receive an email with a link. You must click that link in the email you receive in order to confirm that you want to receive the daily emails.

You will receive one email each day with a link to the page for today’s readings. Click the link, and you will find a web page where you can listen (and read along, if you’d like).

(Unfortunately, there is no way to have the actual audio file delivered via email, but the link should make it almost as easy to get as if it was in your email.)

Option 3: Read (and Bookmark!) a Web Page

If you do not want to use either of those options, you go to this page: The Daily Lectionary and add it to your browser’s “bookmarks” or “favorites,” so you can quickly get back to it.

From there, you can read the text of each day’s readings and listen to the recordings, right from each page.

Option 4: Read using your own Bible and a printed reference guide

You can also find printable lists of the readings for each month in 2020 (or for the entire year, if you want).

Option 5: Get the readings emailed to you each day

The PC(USA) offers a daily email newsletter with the readings, so you don’t have to keep 5 bookmarks in your Bible.

Option 6: There’s an app for that!

The PC(USA) also offers an app for iPhone/iPad and Android devices which will give you the daily readings in your hand.


I hope that this will be a help to those who might want to add daily Scripture readings to their lives but have struggled to do it on their own.

Shortcut: Due Schedule Call

(A note to the reader: although it has been updated and re-posted on March 21, 2020, this was originally written in October 2018.)

Here’s a scenario that you might relate to: I’ll often think to myself, “Oh, I just remembered that I call someone, but I can’t call them right now.” Here are some examples:

  • I need to call to arrange some type of service (plumber, electrician, car shop, etc) but it’s after they are closed for the day.
  • I need to call a friend or family member, but it’s during the day when they are probably working, so I need to call them in the evening.
  • I meant to call someone earlier, but forgot, and it’s too late in the day to call them now.

Or I might want to make sure that I call someone at a specific time:

  • I need to call the car repair shop as soon as they open tomorrow.
  • I want to call Mom on Tuesday night before she leaves on Wednesday.

Et cetera.

Here’s the problem. Well, one of the problems.

If I can’t do it now, I need to set some kind of reminder to do it later.

If the time comes for me to call and I’m distracted, tired, busy, or otherwise occupied, I might not actually make the call when the time comes, so I need my Current Self to make this as easy as possible for my Future Self.

In the past, what I have done is added a note in Due which would say something like “Call AppleCare” and then set the time/date when I want to be reminded.

(If you haven’t used Due, one of the things everyone loves about it is that it will keep reminding you to do something until you actually do it. You can have the reminders repeat every minute, every 5, 15, 30, etc. It’s the most-reliable way to get yourself to do something at a specific time or close to it.)

The problem with my method has always been that the reminder would do off, and then I’d have to do to the phone app, look up the person I wanted to call, and then select the phone number. Sometimes I would realize that I didn’t have the number that I needed to call, and wondering if I had the number that I needed to call always made me dread when a reminder came up to make a call.

It’s that little bit of friction that doesn’t seem like much, but often made me resistant to actually Do The Thing I needed to do when the reminder goes off. It has also happened that I’ve dismissed the reminder, and then been distracted before I actually made the call, either because I didn’t have the number, or something similar.

Now I realize that when you see it written down, it seems silly, and maybe it is, but I’m being honest: even that little bit of “friction” in the process made it much less likely that the call was going to get made, and even when I did it, it always seemed like a bit of a hassle. One of the things I most appreciated about David Allen’s Getting Things Done book was when he talked about being lazy and therefore wanting to make things as easy as he could. He devised the whole system to make it so that when it came time to doing things, he had removed as much friction as possible.

Then I learned that Due has a built-in feature which makes this easier.

I’m sure this is mentioned in the documentation somewhere, but I stumbled across it by accident.

I set a reminder in Due, but this time I added the phone number of the person I needed to call as part of the reminder text. When the reminder alert went off and I went to dismiss it, Due automatically prompted me to call the number.

My eyes grew very wide.

“So you’re telling me that if I put the phone number into Due along with the reminder, then Due will recognize that it’s a phone number and offer to dial the phone for me?”

This is a lazy-person’s dream. Having the number right there means the friction has been removed. I can dismiss the reminder and make the call in one step! And if I realize that I don’t have the number now when I’m thinking about making the call later I can look up the number as my leisure so that I am 100% sure that I’ll have it when I need it.

“This is awesome!” I thought.

But only for a moment. Because brains are terrible, at least mine is, and so the first thing it said to me is: “You do realize that this means that you need to go to the Contacts app, find the person, select their phone number, copy the phone number, and then paste the phone number into Due, right?”

Yeah, I know it seems like that’s not a big deal, but my brain is a jerk and he knows exactly how to push my buttons.

And just like that, there was friction again. It had just from “Doing The Thing” to “Setting The Reminder” which meant now I was subtly resistant to even making the reminder to do the thing that I needed to do.

(Look, I’m not proud that I’m like this, I’m just telling you how I actually am.)

Complication #2: Google Voice

There was actually a bigger complication: most of the calls that I make are not made with via the iOS Phone.app, but with Google Voice.

I use Google Voice for all of my calls related to my “day-job”, and I need/want to use Google Voice for those calls because then the caller-ID will show the phone number that work-related people have for me, instead of my actual iPhone number.

So there’s another piece of friction.

If only there was some way to make this easier…

Cue “Shortcuts”

As most of the people who are reading this probably know, Apple just introduced an app called “Shortcuts” which is basically version 2 of an app which was previously not-by-Apple. Version 1 of the app was called “Workflow”.

I never really used Workflow much. Although Apple had approved it and let it into the App Store, I was certain that Apple would eventually kick it out of the App Store, and then I would be sad if I had built a bunch of things with it.

Well, as it turns out, not only was I wrong, but I was wrong in about as big of a way as possible. Instead of kicking Workflow out of the App Store, Apple bought Workflow, and renamed it “Shortcuts”. In iOS 13, Shortcuts was released as part of iOS itself, instead of a separate app that needed to be downloaded and installed.

Once Shortcuts became an official Apple app, I decided to start using it. But this was the first time that I had a problem that I really wanted to solve with automation on the iPhone:

“How can I make it easier to schedule calls on my iPhone?”

I was poking around in Shortcuts when I realized that I could send the name and phone number of a contact to Due fairly easily.

All I had to do was choose the person from my Contacts.app, and the shortcut could automatically copy the name and phone number, and sent both pieces of information to Due. Then all I had to do was pick a date/time for the reminder.

But what about Google Voice? Unfortunately the official Google Voice app doesn’t support Shortcuts (yet?), but there is another iPhone app for Google Voice called GV Connect which has an URL scheme (for the nerds in the audience, GV Connect supports “x-callback-url”), meaning that I can use it with Shortcuts.

“Due Schedule Call”

Putting all of this together, I made my first real Shortcut, which had 3 (or possibly 4) steps.

  1. Select a contact from my contacts list
  2. If the contact has more than one phone number, it will prompt you to choose which one to use.
  3. Next it will ask if you want to use Google Voice or the regular Phone app
  4. Finally it will send that information to Due, so you can set a time/date for the reminder.

Step #2 was the last piece that I figured out. If I didn’t have some way to choose a phone number, I was either left with the option of sending all of the phone numbers to Due (which was a terrible idea) or just automatically picking the first one (which wasn’t a great idea, although better than the previous alternative).

After that, the real magic happens between steps 3 and 4, and it happens completely in the background.

If I choose the Phone.app, the shortcut just sends the name and number to Due. But, if I choose Google Voice, the shortcut reformats the phone number into the proper syntax for GV Connect, and includes it in the text that is sent to Due.

By front-loading all of the decisions into the first part of the process (making the reminder), I have made it easier for my Future Self to actually make the phone call. It’s easier than it has ever been.

When I “check off” the reminder, Due will let me trigger the call with almost zero effort.

For the first time ever it is just as easy for me to use Google Voice as it is to use the built-in Phone app!1

See For Yourself

I made a short (about 1 minute) screencast of this shortcut in action.

In it, I setup 2 reminders:

  1. I selected a contact named “Apple” (which has multiple phone numbers) and scheduled a call to be made with the Phone app.

  2. I selected a contact named “AppleCare” (which only has 1 phone number) and scheduled a call to be made via GV Connect.

You can see it here:

(Be sure to make it full-screen so you can see things more easily.)

You can get the shortcut here.

Thanks

Thanks to Andreas Amann, GV Connect’s developer, who helped improve this shortcut.

Thanks also to Raymond Velasquez who helped me solve another part of the puzzle via a post on the forum for the Automators podcast, which is a great place to get automation help for iOS or Mac.

Side note: if you aren’t listening to Automators with Rose Orchard and David Sparks, you really should be.

Update 2018-10-13

It occurs to me that this shortcut might be useful to more people if I offered a variant without the Google Voice portion. After all, if you don’t use Google Voice, there’s no sense in having to choose the phone app each time this shortcut runs.

So I made a version without Google Voice. You can find it here:

Due Schedule Call (without Google Voice)


  1. In fact, it’s actually one less tap to use Google Voice rather than the regular phone app, because when you use the Phone app, Due offers to let you call or message the phone number, whereas with GV Connect I can specify that I want to make a call, not send an SMS. 

Tracking Subscriptions

Subscriptions are increasingly common and show no signs of going away, regardless of what you may think about them.

With subscriptions being an important part of modern digital life, it seemed wise to find a way to keep track of them. First I turned to Bobby, which is an iPhone app that has been mentioned a few times on Mac Power Users for managing subscriptions.

Having used it quite a lot now, I can say that Bobby is both great and frustrating.

Bobby’s Best Bits

It’s great to be able to set the name, price, and “cycle” (usually monthly or annually) of a subscription. Bobby has a lot of services already built-in, which will show the appropriate logo and colors for the service. Once you have your subscriptions added in, you can see the average price you are paying on a weekly, monthly, or annual basis.

Perhaps the best feature is the ability to have Bobby remind you when a subscription is coming due. You can set it to remind you the same day (don’t do that, it might be too late to cancel), or 1-30 days/weeks/months/years before it’s due.

(Not sure that “years” is a necessary option. Does anyone have a subscription that they want to be reminded about a year before it expires/renews?)

I wish Bobby let me set a default reminder. Generally I want a week’s notice on all of my subscriptions, with a few exceptions (no need to tell me Netflix is renewing, thanks), but the default in Bobby is for no reminder, and the setting is not shown by default. (More on that below.)

We’ve all had the experience of getting an email saying “Thank you for renewing your annual subscription!” for a subscription that we had forgotten about and would have cancelled if we had remembered it. Bobby can help you avoid that, but you have to remember to add it each time.

Bobby also looks very nice. The fact of the matter is that most of us could very easily just create a spreadsheet with all of this information in it. But we don’t. (Ok, except for you in the back, frantically waving your hand. We see you, and we’re all very impressed. Now sit down.)

I much prefer to look at this:

My Subscriptions in Bobby

…than at some dry and boring spreadsheet. Until I used Bobby, all of my attempts at tracking subscriptions had been short-lived. Now I think that I’ll keep at it, using Bobby, despite some problems and frustrations.

It’s worth talking about those problems and frustrations, even though I don’t think any of them should stop you from using Bobby. If nothing else, you can learn from a few of my mistakes.

Bobby’s Bothersome Bits

Here’s the UI for entering a new subscription.

two Bobby screenshots, one showing ‘More Options’ expanded

(This particular screen is for adding a subscription for a service Bobby doesn’t know about, which is why it looks fairly plain. But I want to focus on the text and fields here anyway.)

On the left side is the default screen that you see whenever you are adding a new subscription. The blank space at the bottom is usually filled with the iPhone keyboard, which you’ll need for entering in the price, name, and (optionally) a description.

The right side is the same screen as the left, except that I have tapped on “More Options” to reveal, well, you know.

The fields for Color, First Bill, Cycle, Duration, Remind Me, and Currency are selected by tapping and choosing from various “pickers” rather than typing.

“First Bill” is not the same as “Next Renewal Date”

I made two mistakes with the “First Bill” field.

The first one was a minor edge case which I only discovered because I was using a Bluetooth keyboard with my iPhone: you can get to the “First Bill” field by pressing Tab and typing something like “2020-02-06” but the app will not recognize a date entered like that, so you need to tap on the field and choose the date from the date picker.

The second mistake was, in hindsight, both more obvious and more frustrating. The field quite clearly says first bill, but the dates that I entered were for the next renewal date. I did that mostly because those are the dates which are easiest to find. I have no idea when I first started using some of these services, and I mistakenly thought that what I should do was put in when I was going to have to pay for these services again.

That, as it turned out, was a significant mistake, because if the “first bill” date is in the future, then Bobby will not include the subscription amount in the monthly estimate until that date occurs.

So, for example, if I told Bobby that my “First Bill” for Dropbox was not until, say, October 15, 2020, then Bobby assumed I was not paying for Dropbox between now and then. Now, I don’t remember when I first started paying for Dropbox (it’s been several years), but what I should have done is put in “October 15, 2019” so Bobby would know that a) I am paying for it now and b) it will renew this year on October 15th.

At first, I found this baffling. Why would I want to track subscriptions unless I am paying for them? Are there people who make plans to start subscriptions at some point in the future?

The only subscription that I could see using this for was Apple TV+ which I have for free until November 2020 but then will renew at its usual price, but that is a rare exception.

Having thought about it further, I assume that this feature is intended to be used when you start a free trial. For example, if you sign up for a free one-week trial before you start paying, you could enter the subscription info into Bobby (along with a reminder, in case you want to cancel before the free trial ends).

Once you know how it works, it is easy enough to adjust. I went through and changed all “2020” to “2019” for any active subscriptions, and that seemed to get Bobby to understand that these were all active subscriptions.

Having said that, if I could change only one thing about Bobby, it would be to change “First Bill” to “Billing Date”. If I choose a date in the future, Bobby could ask me if I want to include the cost in my monthly subscription costs starting today. It seems like a solvable problem, but in the meantime, it’s easy to overcome once you know the system.

Cycle

If I could change two things about Bobby, the second would be that I would not have “Cycle” hidden under “More Options”.

Maybe I’m unusual (don’t answer that) but most of my subscriptions are annual not monthly. In fact, in looking at my subscriptions, I have 10 which are monthly but 26 are annual. That’s a significant difference.1 The default “cycle” for subscriptions in Bobby is monthly which I can understand, since most subscriptions do have a monthly option. However, because the “Cycle” field was not shown by default, I made the mistake (several times) of setting annual subscriptions as monthly, which will really screw up the budget projections.

(Aside: If I could change two more things in Bobby, it would be a) let me set a default reminder for all new subscriptions and b) let me always see the “More Options” screen without having to tap to expand it every time.)

Again, here’s my list of subscriptions in Bobby:

This is a very visually pleasing screen, and you can see that Bobby has done very well identifying most of the subscriptions that I use.2 Under the amounts, you can see time-frames listed (6 months, 4 days, 3 weeks, etc.) which shows how long until that subscription comes up for renewal. That’s great, but I wish there was some indication of whether each subscription amount shown was per month, year, etc.

I’m not great as visual design, but I think it would be possible to put the subscription length after the price. So, for example:

Apple Music – $15.00

would become

Apple Music – $15/month

and

Dropbox – $120.00

would become

Dropbox – $120/year

You could even abbreviate “mon” for “month” and “yr” for “year” if needed. I would also drop .00 from prices. I tend to round-off all of my subscriptions anyway, because I’d rather see “$100” than “$99.99”. As I said, maybe I’m unusual.

My last frustration with Bobby is that there is no iPad app. I would love to see an iPad app, and ideally even a Mac app, because it would be so much easier to enter all of this information on my Mac where I could search my email for receipts/renewal information, and then enter it in Bobby.

Beyond Bobby

I really like Bobby and I’m glad that someone created an app like this. For $1 you can unlock unlimited subscriptions, but for $2 you can unlock all of its features and the developer will get a whopping $1.40 after Apple takes their cut.

That said, once I started tracking this information, I found a wanted a bit more. For example, for subscriptions outside of the App Store, I wanted to keep track of the URLs for changing or cancelling my subscription. I also wanted to know which payment method they were set up to use (I have a few subscriptions which are business expenses, so I want to make sure they have the correct credit card information.)

I also wanted to put any contact information that I had for the service, and if there’s one time when companies want to make sure you can contact them, it’s when you’re going to give them money, so subscription renewal emails are a good place to find contact info for each of these subscriptions.

Eventually, I did make that boring and ugly spreadsheet that I mentioned above, specifically so that I could add additional information.

Having it in a spreadsheet also means that I can see the data in other ways. For example, I made columns showing the monthly and annual price of each subscription. It’s one thing to know that I’m paying $18/month for YouTube, but when I realized that also meant I was paying $216/year for YouTube, it really brought home how expensive it is to hate commercials as much as I do.

As I mentioned, Bobby does have a reminder system built-in, but I still wish that I could see my subscriptions as a calendar in my calendar app.

I also found myself wanting to “group” subscriptions. For example, there are just some which I would never consider doing without; then there are some that I feel like I need to have even if I don’t love them (hello, Office 365); then there others that are support that I give mostly just because I want to (Six Colors, MacStories, Relay.fm, TidBITS, and Patreon).

Then there are weather apps. Until I compiled all of this info, I didn’t realize how many different weather apps I was paying for, ranging from $5/year to $25/year.

So when my subscription to forecast data through iStat Menus Weather came up for renewal, I realized that I could probably make do with one of the other weather apps that I was already paying for.

Pro-Tip: If you use iStat Menus via Setapp the weather data is included in your Setapp subscription price. I had bought iStat Menus before I started using Setapp, but now that I have Setapp, I decided installed iStat Menus through it, so I could keep using iStat Menus weather,. Setapp also includes Forecast Bar. I’m using them both. And Carrot Weather. Yes, I currently have 3 weather apps in my menu bar, and no, I don’t have a problem. What I do have is a forecast predicting up to 22" of snow.

This is harder than it sounds

What has amazed me is how difficult it actually is to track down all of my different subscriptions. I’ve been doing this for quite awhile and I still keep finding myself saying “Oh! I just thought of another one” including (literally as I was writing this) Setapp.

People used to criticize Apple for making it too hard to find your subscriptions list. It’s much easier now, just go to the app update screen on your iPhone or iPad and you’ll see it right near the top:

Screenshot of App Update screen

But the truth is that App Store subscriptions are easy to find and manage. It’s all of the other subscriptions that are harder to remember, but it’s worth taking the time to pay attention before you get another email thanking you for renewing a subscription that you had entirely forgotten about.

I thought I had a pretty good idea of how much I was paying in subscriptions, but seeing it all in one place surprised even me. It also got me to go ahead and cancel some of these that I no longer really need.

What I should do next is tally up the cost of my domain names. But… I really don’t wanna. A few years ago I had a terrible habit of collecting domain names, and they’re overly hard to let go. As I write that, I realize how stupid it is, but it’s true, and I suspect others can easily relate. Seeing those totalled would no doubt spur me to cut a few loose. After all, each domain name is probably worth about the same as a month of YouTube without commercials.

Update 2020-02-10

Someone on the Mac Power Users forum reminded me that David Sparks posted a Subscription Database (which is really a Numbers spreadsheet) that is set up to help you track subscription costs, and uses some spreadsheet calculations to do some of what I am doing by hand in my spreadsheet. Worth checking out.


Short URL for this post: luo.ma/hi-bobby


  1. I also have two subscriptions which are 24 months, one which is 36 months, and one which is 10 years. 150 points if anyone can guess what it is. 
  2. Bobby did not have an icon for Acorn, and when I added it, Bobby automatically chose the icon of a squirrel, which I thought was extremely clever. I realize that it was probably just random, but I like to think it wasn’t. Oh, one more item for the Bobby wishlist: let me use my own images, rather than just selecting from Bobby’s selection of icons. 

Using Keyboard Maestro to make the Home.app Less Terrible

The Home.app on Mac is, frankly, not very good.

It was originally released as an example of iOS apps coming to the Mac, and when it first came out, pretty much everyone said “Well, sure, it’s not very good, but it’s better than nothing… and surely Apple will improve on it over time.”

That has not happened (yet?) and the app remains mostly terrible. For example, it is completely missing some HomeKit accessories which appear in the iPhone/iPad.

In our living room we have 9 overhead lights which I grouped together as “one light” in the Home.app on the iPhone… but for some reason they continue to appear as 9 individual lights in the Home.app on the Mac. I grouped them together on the Mac Home.app, and later they appeared un-grouped again. Why? Who’s to say?

Oh, and some of my Home.app scenes just don’t appear on the Mac. Why? Who knows? How do I fit it? Who knows? The only thing I can do is uncheck the box for “Home” in System Preferences under iCloud, wait for the Home.app to empty out, and then check the box again to re-enable it.

Screenshot of System Preferences, iCloud, Home

That did work to get the Home.app to recognize some new accessories, but it did not help the missing “scenes” appear. Which, I guess, is better than nothing.

(You’ll notice that “It’s better than nothing” is effectively the slogan of most of these iOS-apps-on-the-Mac, at least so far.)

Home.app Automation

The Home.app is mostly impervious to attempts to automate it on the Mac. There is absolutely zero AppleScript support, and keyboard shortcuts are limited to switching between the “Home”, “Rooms”, and “Automation” tabs in the main window.

(That “Automation” tab is identical to what you see on iOS, where you can set timers and triggers. That automation is pretty good, but if you want to assign a keyboard shortcut to setting a Home.app scene or even turning an accessory on/off, well, you are out of luck.)

One minimal piece of functionality that the app has is that each of your “rooms” are available under the “View” menu and via an icon on the Home.app toolbar.

Screenshot of Home.app's "View" menu

I have often wished for a way to go to a specific room via a keyboard shortcut, and today I finally made that happen using one of the best apps on macOS: Keyboard Maestro.

It’s a relatively straight-forward macro, but I thought I’d walk through it as an intro to folks who may want to learn more about Keyboard Maestro.

Create a “Macro Group” for the Home.app

Screenshot of Keyboard Maestro - create macro group

Click the + icon in the first column of Keyboard Maestro’s Editor window to create a new “Macro Group” (think of it like a folder). Then, in the third (main) section, set “Available in these applications” to the Home app using the dropdown. This will restrict the macros in that Macro Group to only being active when you are using the Home.app. Note that I called mine “» Home.app” but you could call it anything you want. I use the » prefix before all of my Macro Groups that are specific to an app to help keep them sorted together.

(That process of setting a Macro Group to only work in one app is a handy feature of Keyboard Maestro that you will probably use a lot.)

Create a Macro for each room

Screenshot of Keyboard Maestro - create macro

  1. Click the + icon in the middle column to create a new macro inside the “Home.app” macro group.

  2. The Macro Name (shown here as “Ethan’s Room”) can be anything you want. You could call it “Bedroom 3” or “Purple Monster”. Whatever name you give it will be what is shown in the middle column.

  3. Assign a “hot key” which is Keyboard Maestro’s name for a keyboard shortcut. Notice that I have assigned two hot keys: ⌥E and ⌥S.

    Keyboard Maestro will let you create as many of these as you want (which is especially nice if you don’t always remember what keyboard shortcut you used — if you think it might be one or the other, use both!)

    However, in this case, I am going to assign at least two keyboard shortcuts to each room, and one of them will always be ⌥S (I will explain why in a moment).

  4. Click “New Action” and choose “Select or Show a Menu Item” (not shown in screenshot) to tell Keyboard Maestro that you want it to use that keyboard shortcut to match a menu item. The top level title is “View” (that is what appears in the menu bar) and the menu item is the name of the room. (Note: in this step, you do have to be exact and match precisely what the menu item says, so be careful.

Repeat the previous 4 steps for each room

I’m not going to show them all to you, but here’s the next one for the Front Door.

Screenshot of Keyboard Maestro, Macros, Front Door

Notice that the first “hot key” is unique ⌥F but the second is the repeated ⌥S.

The same is true for Garage, Hallway, Tj’s Room, Living Room, Office, and Tracey’s Room.

In the middle column you can see the hot keys which have been assigned to each macro. If more than one hot key is assigned, only the first will be shown, so make sure that is that unique one.

(Yes, I will explain why I added those bracketed letters to Tj’s Room and Tracey’s room.)

Q: “Why did you assign the same hot key for each room? Obviously that isn’t going to work right… Right?”

Well, it depends what you mean by “work right” I suppose.

Normally, if you had two identical keyboard shortcuts in an app, you would expect that when you use that keyboard shortcut, nothing will happen, except maybe the system beep will go off.

Keyboard Maestro is smarter than that. If you assign the same keyboard shortcut (or “hot key” in Keyboard Maestro parlance) when you press that keyboard shortcut, Keyboard Maestro will show you what is called the “Conflict Palette”.

The “Conflict Palette” is a little pop-up window which will appear and look something like this:

Screenshot of Keyboard Maestro's Conflict Palette

Note that at the top of the window it shows ⌥S so you will know what hot key caused the conflict. Then there is a list of each macro that has that hot key assigned to it.

Also note that the first letter of each macro name is in grey. When the “Conflict Palette” appears, you can press the corresponding letter to choose that macro, so H for “Hallway” for example.

You’ll note that that last two both start with the letter T. If you press the letter T when this “Conflict Palette” appears, it will then show you only those two items:

Screenshot of Keyboard Maestro's Smaller Conflict Palette

Now it shows the first unique letter to each macro: in this case it’s either J or R. So if I wanted to go to Tracey’s Room, I could press ⌥S then press T then press R.

However, if you look at the Keyboard Maestro Editor screenshot above, you can see that I have also assigned ⌥R and ⌥J to those rooms, so I can go to them directly by pressing those respective keys. You will note that I added [J] and [R] to the macro names to help me remember which keyboard shortcut to use to go directly to those rooms.

(It is not shown here, but I also assigned the hot key ⌥T to both of them, so if I press that it will bring up the second “Conflict Palette” showing just those two rooms.)

This intentional use of the “Conflict Palette” can come in very handy when using Keyboard Maestro to create these floating menu items which you can select with your keyboard.

It’s also a way to make the Home.app slightly less terrible.


Short URL for this post https://luo.ma/km-home-app

Today’s Files

Like nearly everyone else, I jump around a lot during the day between different projects, files, apps, trains-of-thought, etc. I know I shouldn’t and it isn’t my preference, but it’s how most days actually go.

One of the worst parts of this is when I find myself thinking “Wasn’t I working on something important before I got side-tracked? What was that?”

For years I berated myself about this and promised future-me that I would do better. And I would. For awhile. Until it happened again. And then I’d berate myself all over again. Sound familiar?

Well, I still try not to do it, but I have given up believing that it will never happen again. Because it will, and life is too short to keep lying to yourself about reality.

So I’ve started trying to keep track of what I was doing, especially if I can find a way to do it automatically and easily.

Enter the Finder

I didn’t expect to get help from the Finder, but I did. Now, I realize that there are some people who leave their active files on their Desktop, and if that works for you, great. For me, I keep all of mine in Dropbox, and I have a lot of sub-folders with a lot of files. I’ve tried other ways, and this works best for me.

But how do I find that file I was working on earlier without having to keep navigating through all those files and folders? In the Finder. More specifically, with a saved search.

Saved Searches have been around since the origin of Spotlight, as far as I remember, but I’ve never really used them all that often. I hadn’t quite forgotten about them, I just never used them. But I changed that recently and it’s been a much bigger help than I expected.

What I did was really simple. So simple that I almost didn’t bother writing it up, except that I figure if I could benefit from this but didn’t think of it before, maybe someone else will be the same way.

So here’s how I made my Saved Search.

Step 1 is easy, just go to a Finder window and press ⌘F and Finder will switch into Spotlight mode.

2019-11-21-002.png

Now, look at the plus sign (+) at the top right of that window. See it?

2019-11-21-002-CloseUp.png

Watch what happens when I press and hold the option key (⌥)

2019-11-21-003.png

See that change? It’s pretty small, but it’s vital. Instead of being a plus sign, now it looks like a floating ellipses (…). Click that.

Now, look at the area in the red box:

2019-11-21-004.png

Usually when you are searching for things, all of the criteria are added together: I want to search for this “and” that. But in my case, I want this “or” that. Using the Option/⌥ click on the plus sign (+) gives us the “Any of the following are true” search. That’s what we want.

(Note: the first criteria “Kind is Any” is harmless, but we don’t need it, so click the minus button shown with the arrow above to get rid of it. Or don’t.)

Now, change the criteria of “Last opened date” to “today”:

2019-11-21-006.png

…then click the plus sign at the far right of that row.

Next add “Created Date” is “today”:2019-11-21-007.png

…then click the plus sign at the far right of that row.

Lastly, add “Last modified date” is “today” — I’m assuming you know to just click the “within last” and select “today” but if not, here’s what it looks like:

2019-11-21-008.png

Now you have a list of all of the files and apps that you have used today, because if you were working with a file then chances are 99.9999% that you either:

  1. opened the file,
  2. created the file, or
  3. modified the file.

Maybe even more than one of those. But that’s a good net to cast to catch just about anything and everything you’ve worked on today.

We could stop here, but let’s make one more little change.

See that header row with the name, Date Create, Kind, etc? Right click somewhere on there, such as where the arrow is pointing:

2019-11-21-009.png

Select “Date Modified”, “Date Created”, and “Date Last Opened” as columns that you want to see. (If you want or don’t want “Kind” you can leave it or un-check it.)

Done!

Well, almost.

You don’t want to have to do this every time you need it, so click the “Save” button at the top-right: 

2019-11-21-011.png

And then give it a name. Because I am vëry clëver, I called mine “Today’s Files”:

2019-11-21-012.png

Make sure that “Add To Sidebar” is checked and then hit “Save”.

Now, anytime that you need to re-trace your steps, just click on “Today’s Files” in your Finder’s Sidebar2019-11-21-014.png

and you can sort the columns by Date Modified/Created/Last Opened if that helps.

I realize that to some of you this is macOS 101 material, but for me it’s one of those things that I never used until I did, and then I wished that I had done it a long time ago.

I hope it comes in handy for someone else.