58: Automating with TJ Luoma


I posted this the other day in preparation for this coming out:

Happy to try to help folks set up their own variations of it if they need assistance.


Awesome episode, as always lots of cool tips to try (I particularly want to try TJ’s BitBar scripts).

When TJ was talking about copying and pasting 9 audio files together for his podcast, I thought of an easier way than even Keyboard Maestro…

See article: Merge MP3 Files Using CAT Command in Mac OS X.

I had a bunch of translation audio (150+ mp3 files) that it spliced flawlessly…

1 Like

I’d been resisting the siren song of the Stream Deck, but this episode finally did me in. I ordered one of the big ones.


I’m starting to post my BitBar scripts here

Let me know if you’re interested in something I haven’t posted yet.

The files that I’m combining are not mp3s, and are in fact occasionally different formats (wav and Apple lossless) so Fission is definitely the right tool for the job :wink:

1 Like

Thanks @Tjluoma,

I have several of your scripts in use already :laughing:

1 Like

I still don’t get the StreamDeck, but I’m interested to learn more.

What value does it offer above a keyboard shortcut for triggering an action?

(I must admit that I have used almost all Hyperkey A-Z combinations, so extra “keys” might be welcome)

What has me intrigued enough to order one:

  1. Extra keys to assign keyboard shortcuts to.
  2. Able to display an icon/text on each button indicating what they do. One of the limitations on the number of hyper key shortcuts for me is my ability to remember which key combinations do what.
  3. One specific application that caught my attention was the ability to assign Toggl timers to Stream Deck buttons.

@Tjluoma, Cosmic forces – I was listening to the segment about magic mouse battery levels when my magic mouse surprised me with a message its battery was very low!.

1 Like

Well I hope that you were able to get your work done before you needed to “harpoon the turtle” so you could re-charge it! :wink:

1 Like

Yes! And next time, I’ll have a warning when she goes below 20% :slight_smile:

So I got two takeaways from this episode:

  1. Bitbar
  2. There is mileage in the topic “How To Be A Better Automator”. Almost a pledge. (I could work this idea up into something.)

Oh, and a third: StreamDeck being updated by Keyboard Maestro. TIme to play. :slight_smile:

1 Like

This episode got me so fired up about the StreamDeck. David has been beating this drum louder & louder for a while now.

I’m now consumed by the idea of bending StreamDeck to my will for a streamlined Photoshop Retouching workflow. I already have SO MANY Photoshop keyboard shortcuts memorized, yet there are many more I should use but they just won’t stick in my brain, plus even more that don’t have shortcuts (by default) that should be accessable with a keystroke or two because they are indispensable for my own techniques.

I use a Wacom pen all day long and even after years using it, I HATE menu navigation via pen. I want to get the visual labeling of the Photoshop menu system built into keys. That is pretty much exactly what StreamDeck does.


Welcome to the side of goodness and light :slight_smile:

With Keyboard Maestro and KMlink there are not many repetitive tasks on the Mac that you can’t automate with the Stream Deck.


TJ - I know you alluded to this on the podcast, but why do you use KMlink instead of KM’s default integration?

Loved hearing you on the show. I’m still using the Stream Deck calendar plugin!

Thanks, Rich! I’m glad people are using it!

I use both KMlink and the official Keyboard Maestro plugin for Stream Deck.

Both have their uses.

KMlink’s big feature is that if you want to, you can move it from its original location just by dragging it around. This is how most Stream Deck buttons work.

By contrast, Keyboard Maestro’s official plugin works by being assigned to a specific row and a specific column. If you want to change it, you have to go and edit the plugin.

KMlink is a link to a particular macro, but you can move that link anywhere you want.

On the other hand, KMlink cannot do things like the calendar plugin. It’s just a trigger that tells Keyboard Maestro to run a macro, but Keyboard Maestro cannot send any information back to it.

So if you want a button to trigger a Keyboard Maestro trigger, try KMlink.

If you need something more complicated, if you want to set the button’s text or the image, you want the official Keyboard Maestro plugin.


In case it helps, I have a post about the Stream Deck / Keyboard Maestro plugin options and differences.

There’s also this related discussion that may be of interest.


Great article! I think I’ve read it before, but this time I noticed this:

  • Virtual Row - this is used by the Keyboard Maestro plugin to uniquely identify the button. If you are using the button in multiple folders and profiles across apps, you may find it is necessary to change the ID to avoid clashes.

So I never even realized that you can change the ID. Can you explain how that works? I’m starting to run into conflicts where the same button on different Stream Deck profiles will launch different KM macros.

(P.s. I think you were a victim of autocorrect “helping” you at one point in your article. Search for the word ‘suture’ and you’ll see what I mean.)

I’m also trying to work out how to reliably address buttons on a pair of Streamdecks: 2 x 3 and 3 x 5.

(A problem I can’t even have on Metagrid.) :frowning:

Okay. I did have a post from last December all about this, but I wasn’t happy with it at the time and it is still sat in my drafts folder. It went in depth on more than just this aspect as it covered some workarounds too, but let’s see if I can at least get the gist of the virtual layout and button IDs across.

Virtual Locations

As an example, I’ve set up a separate profile on my Stream Deck to illustrate how this works. You can apply this across profiles, but it also applies across folders - Keyboard Maestro is almost tesseract-esque in the way you can dimension various parts of it.

On the profile page I have three entries:


A folder and two links to two Keyboard Maestro macros. More on those shortly.

Under the folder, there are two more buttons. One has the same name as the Botton on the previous screen in the same position. The second one however does not.


On the root profile screen, the ALERT 01 button is set-up like this.


I’ve given the button a name, it can be anything I like. I’ve specified the virtual row and column coordinates as the defaults it gives. So row 1 because it is on the top row and column 4 because it is in the fourth column.

The macro I linked up links to this - note the device key references the virtual row and column:


Now ALERT 02 is set-up in a similar manner.


With a similar macro; again, note the device key.


When ALERT 01 is pressed I get a notification reading “Alert 01”. When ALERT 02 is pressed I get a notification reading “Alert 02”. Hopefully, that’s all straight forward and fairly familiar.

Now let’s look at the buttons in the folder.

The first one named ALERT 01 I’ve put in the same place as the previous ALERT 01, and I’ve set-it up almost identically (just a different ID). The physical location is irrelevant as that virtual row and column reference is what we’re using for linking, and it really is virtual. But, here’s how I defined the button.


When selected, this will display a notification reading “Alert 01” as it triggers exactly the same Keyboard Maestro macro as the other ALERT 01 button.

The ALERT 03 button is set-up differently.


The button is on physical row 2, column 5, but I’ve added an arbitrary ten rows to that and placed it on virtual row 12.

Then when I have a Keyboard Maestro macro set-up like this:


When I press ALERT 03 I get a notification “Alert 03” even though this button is in the same physical row and column location as the button that earlier triggered a notification of “Alert 02”.

My advice is to keep the virtual rows and columns related to the physical rows and columns if you are going to use them. It isn’t too difficult with a few rules and calculations to keep things in line for however you want to use it across profiles and folders … it just that you can have folders in folders in folders in …; so just make sure you have a plan from the start.

Button ID

I’m only about 20 minutes into this episode, so I don’t know exactly what is discussed yet, but this official plugin I would say is much more difficult to use than the KMlink plugin or even just using a macro’s URL trigger. The advantage the official plugin does have is that it allows Keyboard Maestro to use the button ID to dynamically update the button. That’s the ID, not the virtual location, and that’s where the button ID comes into play.

For example, let’s say I have three buttons set-up as follows:

Button A:

Button B:

Button C:

If I then create a Keyboard Maestro macro like this:


When I press button A, it will update the button with a button ID of “FOO” to have the stream deck icon that the macro has. But note that both buttons B and C have that ID. IDs, just like virtual locations do not have to be unique. Pressing the button will actually update the icon on both buttons.


The only pain is that I never found a way through Keyboard Maestro to efficiently update buttons periodically. i.e. only when the button is available on the deck. Also updating it when you switch into a folder or profile requires some tacky workarounds to force things which is a little disappointing. You can do this sort of thing through writing your own plugin (BarRaider does it on his Spotify plugin for example).

I hope that makes things clearer. Any questions, just let me know.