493: My Life is an Edge Case, with TJ Luoma


On the one hand, I’d miss not listening to MPU this week if I skipped it…

…on the other hand, I don’t think I’ve ever listened to a podcast that I was on, so maybe I’ll give it a try.

Thanks to Stephen, I think, who pulled the title out of our conversation… it’s something that I’ve said of myself for many years because I always seem to find the weird edge-case that no one thought to test for, which is why I’m a good beta tester. :slight_smile:

I meant to send them these links for the show notes:

Also, I thought of, but forgot to mention, this really old app (2005) called NoMenuBar v1.0:

NoMenuBar is a simple application without menu bar item, so it let lots of space for the right side menu bar item (like time, airport status, and any other add-ons).
It will be very useful if you have a small screen (like on a laptop) or lots of right side items.

What’s new:

  • First release.

This is what we used to use before Bartender came along. I think David mentioned in the episode something like switching to Finder that doesn’t have a lot of menus.

Unfortunately NoMenuBar is a PowerPC app (I said it was old!) so it’s not something you can still use, and even with Bartender, I sometimes find myself wishing for more menu bar space… mostly because of all the stuff I want to see via TextBar.


Why not use the calendar for the call?

Several reasons… first being that Due is the bet way to get things done because of its repeating alarms.

Second, when I “cross off” the item in Due, it will prompt me to make the call, either in the phone app or Google Voice, which removes the friction between “I need to call someone” and “I am ready to call them right now, at the number I’ve previously chosen and in the manner that I’ve previously selected.”

Third… I don’t really want this in my calendar. In most cases I don’t need to know anything about the call before I make the call, so when I check my calendar during the day, I don’t need or want to see a call scheduled for later. The nice thing about Due is that I never really look at it during the day except when it prompts me to do something, and even then it’s only momentary.

I could probably come up with others…

But it’s mostly #2 though. It just makes the process of making the call so much easier than anything else because I can front-load all the work and decision-making process to the planning stage and then the “doing” stage is that much easier.

1 Like

Really enjoyed this episode. I’m curious what tier you all are using on MacStadium. I only know them from an agency I used to work at where our bill was ~500/mo, and I see the cheapest tier is for a lowered powered mini at $60/mo. Is there a better deal or are you all just finding that to be a better deal than purchasing a refurb and keeping it on at home with a server port exposed? (Or is it just about the video file bandwidth? :wink:)


Can you share (or have you already somewhere) your workflow for downloading the YouTube videos on the MacStadium server? I have about 70% of it, but can’t quite get it finished.

Thanks for an awesome epi!! I always appreciate your opinion/insight along with your software testing super-powers!


Someone else just asked on Twitter about my YouTube workflow, so I’ll definitely write it up and post it on the forum here (and will try to link it back here so folks can find it).

Thanks for the kind words! I loathe the sound of my voice, so listening to the episode was difficult for me, but having heard it now, I think it went pretty well!

1 Like

Loved the episode! I learned a lot about utilities that could really be helpful to me. One that I immediately started playing with was TextBar. I’m having an immediate issue however with a script: My .sh file looks like this:

#!/usr/bin/env zsh

printf "Open MR"
curl -s --header "Private-Token: ${GLTOKEN}" "http://git.someurl.com/api/v4/merge_requests?state=opened&scope=assigned_to_me" | jq length

If i run this on the command line I get the expected integer returned:

➜  mycode curl -s --header "Private-Token: ${GLTOKEN}" "http://git.someurl.com/api/v4/merge_requests?state=opened&scope=assigned_to_me" | jq length

However TextBar shows this:


If fact - no matter what the script returns, the OpenMR TextBar thing shows 1.

Any thoughts?

Here’s my TextBar:

Thanks in Advance!

1 Like

I think the script is returning the return code of the script and not the return code of the lines executed. Thus, running it on the command line yields a different result compared to running as a script. This link will provide some more insight on the issue: https://bencane.com/2014/09/02/understanding-exit-codes-and-how-to-use-them-in-bash-scripts/.

thanks for the response @scubadiver … even running as a script I get the result i expected:

➜  mycode ./open_mr.sh
Open MR 2

and now that i don’t have any open merge requests:

➜  mycode ./open_mr.sh
Open MR 0

This was a great episode and even featured some apps I hadn’t heard of before, which is a rarity!

I’ve just bought Better Blocker. I’ve been using 1Blocker X in combination with pi-hole. Too early to tell if Better Blocker is better, but it’s nice to mix things up every now and then.

1 Like

@tjluoma: As you point out Due comes with different abilities and a friskier attitude than Calendar. I use both.

Due is an app that I needed to live with to appreciate.


When I have a call scheduled, I usually put the phone number on my calendar, in the location or notes field so I can just tap and call. Often, I have conference calls, and I use the format XXX-XXX-XXXX,,YYYYY# where YYYY is the conference code.

I imagine you could do the same thing with a URL. Never tried.

However, putting it in Due has a couple of advantages: If the call is not actually an appointment, then if it’s in Due you don’t have time blocked out.

Also, coolness. :slight_smile:

Great news. I really enjoyed this episode and look forward to your write up on Downie.


The biggest issue that I usually run into with Hazel, Keyboard Maestro, and TextBar is that they don’t get my usual PATH from my shell.

Unfortunately macOS no longer has a reliable way to set a PATH which is used by all GUI apps (it used to be possible in a number of different ways over the years, most recently in launchd.conf but that was removed a few years ago, and I don’t think there is a replacement.

I have a file ~/.path which is only one line:


That way, when I am writing a Hazel / Keyboard Maestro / TextBar script, I can include this line near the top:

source ~/.path

and know that my $PATH will be used, in the order that I want it. If I make any changes to my $PATH, I just need to change that one file, and it will be used everywhere (even my ~/.zshenv gets the $PATH from there, so I’m always sure I’m using the same PATH everywhere).

Of course the other alternative is to use the full path to things, so instead of jq use /usr/local/bin/jq but that gets tedious if you have longer scripts.


Another useful debugging tip for any of these programs is to use this line:

/usr/bin/printenv | /usr/bin/open -f

that will run the printenv command and send the output to your default text editor. Compare it in Terminal.app vs another app and see what might be missing.

In fact, the open -f “trick” is super-useful for other things as well. For example, try this in TextBar:

curl -s --header "Private-Token: ${GLTOKEN}" \
"http://git.someurl.com/api/v4/merge_requests?state=opened&scope=assigned_to_me" \
| open -f

That will show you what it is getting back. For that matter, you might also just try:

echo "$GLTOKEN"

and make sure that even that is being set properly.

When all else fails: verboseness and error-checking

Finally, if none of that works, well, then your best bet is to write a more elaborate shell script than you wanted to when you started, with more error checking. Something like this, perhaps:

(note that you may have to scroll this content box to see the whole script)

#!/usr/bin/env zsh





curl -s --header "Private-Token: $GLTOKEN" "$URL" > "$TEMPFILE"


if [[ "$EXIT" != "0" ]]
	echo "curl exited badly: $EXIT"
	exit 1

if [[ ! -s "$TEMPFILE" ]]
	echo "TEMPFILE is zero bytes!"
	exit 1

	## I'm guessing at the proper syntax for `jq` here, as I'm not sure what 
	## the best way is to have it parse the `$TEMPFILE` we have created 
LENGTH=$(jq length < "$TEMPFILE")

echo "Open MR
Length is $LENGTH 

exit 0

One advantage here is that you can go back and check $TEMPFILE to make sure you are getting the result you expected.

I hope this helps!


I’d really appreciate this as well - I’ve been having a play myself and am struggling to pass the url to Downie in a way that Downie likes :frowning:

1 Like

Here’s my iOS to Dropbox to Downie setup.

1 Like


Completely off topic, reading your “about me” on Rhymes with Diploma, I live in a house with two beagle and a basset hound. My wife planted the hound bug in me.

1 Like

I have a few comments about this episode. First, as the episode trails off, I heard you say that “shortcuts was good for spreadsheets ???”, if so, I’d love to know how. I also wanted to say that I agree wholeheartedly on your skepticism of iCloud Drive. It updates when it feels like it, and rarely when you need it to, creates duplicates left and right and as you said, I just don’t trust it…

This is absolutely a great episode! I’m listening to it for the third time.