Keyboard Maestro's Native Stream Deck Plugin Versus Kmlink Plugin

Howdy folks, I'm writing this tutorial to help new(er) users understand the advantages/disadvantages to using the Keyboard Maestro native Stream Deck plugin versus the KMLink Plugin (now available directly in the Stream Deck app).

The KMLink is very handy when you do not need to update the title or icon via a Keyboard Maestro action. It is very simple to setup and is not dependent on button location, meaning it can be moved around with zero consequences.

The Keyboard Maestro native plugin requires a little more setup (typically assigning a virtual column and row, as well as a button ID), but has the unique advantage of allowing KM to communicate back to the button, thus being able to change it's icon and/or title.

To give you an example of how I use both plugins, consider these screenshots of my Zoom profile (or page).

KM native plugin Screenshot (click to expand/collapse)

KMLink plugin Screenshot (click to expand/collapse)

The first screenshot (KM native plugin), shows how I have assigned a Button ID, Virtual Row and Virtual Column to the button. This particular button is for Zoom's microphone. The Button ID allows KM to update the icon as well as the title from within an action. I have it set up to change the color to red when the mic is off, and green when it is on (as in the screenshot). The virtual row and column is used so KM can identify which button is being pressed. Each button should have a unique one to avoid conflict palettes. My naming convention consists of giving a unique number to each page (Zoom page being 3), and then combining that number with the button's position on the SD's layout to come up with row 34, column 33. Again, 3 for my Zoom page, 4 because it's the 4th row down, 3 because it's the 3rd column over. This means that no matter how many pages (or profiles) I have, I will never run out of virtual row/column numbers, and it makes it easy to keep track of them. This is just my method; it doesn’t have to be yours, as long as you assign each button that makes use of the KM native plugin some sort of unique number.

In the second screenshot (KMLink plugin), you can see that I have my 10)[AS:ZM] Unmute All macro selected. This can be selected/changed via the dropdown menu, which makes it very easy to change. Since it does not require a virtual row/column nor a button ID, it also does not matter where you place the button; it will always work. The disadvantage is that this method does not allow KM to communicate back to the button, therefore making it impossible to change it's icon/title. For simple macros, and where you do not need any kind of visual feedback on the SD itself, this probably does not matter. Another advantage to the KMLink plugin is the ability to pass a parameter to the KM macro, much like we can do from within KM. This allows you to execute different actions using a single macro all by changing the parameter. For an example see how I use these buttons on my Apple Music profile to play a specific playlist just by changing the parameter in the SD software.

Play a playlist button Screenshot (click to expand/collapse)

Using KMLink and a supplied parameter Screenshot (click to expand/collapse)

The macro it executes, using supplied parameter Screenshot (click to expand/collapse)

For another example, see @noisneil's post here for some Logic Pro buttons.

So what does this all mean? TL;DR time... if you want a simple button and do not need visual feedback on the SD itself, or you want to pass a parameter to the macro, use KMLink. If you want a button that allows KM to change it's icon and/or title (and don't need to pass a parameter), use the KM native plugin.

One more note on the KM native plugin... if you want to change the icon/title via KM... you CANNOT manually set either of those items from the SD software. They must be left blank (title) and default (icon), otherwise the KM action will not update them. Keep this in mind if you ever set them manually and then later on decide to change them via KM action(s).

Hopefully this quick tutorial helps, and if anybody has any questions on using Stream Deck with Keyboard Maestro, feel free to reach out to me or (hopefully he won't mind me tagging him here haha) @noisneil who also works quite a bit with SD and is knowledgeable about it and whom I have spoken with a number of times about it.



One thing I would add is that KMLink has a parameter box that passes on a TriggerValue to KM. The same macro can be triggered by multiple buttons with different parameter values, which can be passed to variables or used to determine which of a number of actions are executed. This alone makes KMLink incredibly versatile.

As an example, you could have one macro that mutes or unmutes your microphone, depending on the TriggerValue it receives.

1 Like

Great point. I only use the parameter feature on a handful of macros so I didn't think of it in my initial post. I updated it to reflect a basic usage. Thanks Neil!

1 Like

I use it all the time. Here's another great example. One macro is triggered with lots of different TriggerValues to load different plugins in Logic Pro.

SD Screenshot


Macro Screenshot



Not real clear on how the virtual page number is assigned. How is the Zoom page 3? I see a 3 in the name at the top left of the screenshot, but does it parse 3 out of that full name?

As you can see, Chris isn't using pages for this particular profile.

I'm guessing he's just named his profile "Meetings (3)" for some reason that makes sense to him.

Personally, I don't see any advantage of pages over folders, so I don't use them.

Hi @leicaman, as Niel said in the examples I provided I'm not using pages (though I have started using them on other profiles). The Zoom profile screenshots will show you that I named the profile itself "Meetings (3)". The 3 is important (to me) because I prepend my virtual row/column numbers with it. So a button at the very top-left of that profile becomes R31C31, for profile 3, row 1, column 1. A button at the very bottom-right would become R34C38, for profile 3, row 4, column 8. Hope that helps explain it better!