You Don't Need Stream Deck, You Need Macros
One day, during one of those meetings that did not require my full attention, I was doing some work in the background. I muted my microphone, and I was coding away[1]. Suddenly, someone asked me a question. "Now, where is that goddamn Teams window so I can unmute my microphone?!" - I asked myself, frantically going through my MacOS desktops. I use multiple desktops (or workspaces, as some other operating systems call them), each with one to three apps opened. So, instead of shuffling 20 apps opened on one desktop, I shuffle ten desktops scattered across three monitors. It took a few seconds of awkward silence before I found that Teams window. And it wasn't even the first time this happened to me.
"There has to be a better way!" - I thought, again, not for the first time. I've decided it's time to figure out how to set up a "global mute/unmute" button that would work regardless of whether Teams (or any other videoconferencing app) has the focus. One way to solve this problem was to use Elgato's Stream Deck. I've been eyeing it for some time, as many developers claim it's a very useful device.
Is Stream Deck really indispensable for a software developer?
"Stream deck is a fantastic tool, and every developer should have one (or three)!" is something I've heard here and there. I've put it on a shopping list for Black Friday, hoping I can get a good deal. But as Black Friday was getting close, I asked myself - do I really need Stream Deck? My main driver was to have a global mute/unmute button for those Teams calls when I'm doing something else and suddenly need to unmute myself. Pressing a button to unmute my microphone, say what I need to say, and mute it again without shuffling through multiple windows and desktops would be bliss. But that doesn't justify shelling out over $100 (or less, for the "mini" version) and putting another device on my already cluttered desk. So, I've started reading about other things people do with Stream Deck, especially if they are not streamers but developers like me.
There are some good reasons to buy Stream Deck. For example, if you SSH to many servers, talk with many people on Slack, generate different Stripe test cases, switch between many Spotify playlists, work on different VS Code projects, and push code to different GitHub repositories - and all that on a daily basis, then you will probably benefit from using a device that can reduce all those tasks to a press of a button or two. It sounds more useful for people who prefer to click things and press buttons instead of typing all the commands in the terminal. It also works well for those who spend most of their time in one piece of software like AutoCAD or Photoshop, where creating and assigning macros to hardware buttons will save them time. Not to mention that in this line of work, you're already using a drawing tablet, so you're used to using different devices apart from a keyboard.
There are some weird but ok reasons to buy it. Some people use it for home automation - ok, but I'm not going to run to my office to toggle lights in the bedroom. Some use it to start applications - fine, but for me, firing up a launcher like Spotlight/Alfred, typing 2-3 first letters of the app I want to start and pressing enter seems equally fast as pressing a button on an external device[2].
But a typical software developer spends most of their day pressing keys on a keyboard. Everything that Stream Deck does can also be achieved by pressing one or more keys. Some actions will trigger a keyboard shortcut, while others are equivalent to typing commands in the terminal or running a script. Stream Deck is a glorified macro recorder. It comes with a nice app that makes it easier to record those macros. It has colorful icons that catch your eye and pressing a physical button is easier than remembering a shortcut for a specific macro. But most of its functionality can be achieved by recording macros on your computer. If you have a manageable number of macros (or a very good memory of all the shortcuts you defined), it might actually be easier to use your keyboard to trigger the macros.
Stream Deck is not a big device (especially if you go for the mini version that has six buttons), but it's another device you would need to carry with you if you go somewhere. A keyboard, on the other hand, is usually an integrated part of your laptop. Where your laptop goes, your keyboard goes too.
Actually, I bought the Stream Deck after writing and implementing all the tips from this article. I got a good deal for it, and I could always return it if I saw that I wasn't using it that much. After a couple of days, I liked it and decided to keep it. While I still think you can write keyboard macros that can do the same things as an external device, remembering how to trigger those macros gets harder the more macros you have. A device like Stream Deck (or one of its cheaper or more customizable alternatives) is just more convenient for me. Pressing a colorful button with a label takes no mental effort. On the other hand, trying to remember how to trigger some less often-used shortcuts can be a bit more demanding, especially if I'm in the middle of thinking about something else.
I decided to keep the Stream Deck because I found several additional uses for it (that I will describe in another article). If I were to use it only to mute/unmute my microphone, I would definitely stick with the macro on my keyboard instead.
How do I find unused key combinations?
One of the great things about Stream Deck or a similar device is that all of their buttons come with different key codes. There is no risk that pressing a button on a device like Stream Deck will trigger a different action, for example, from the currently opened application. But if you want to start assigning custom shortcuts on your keyboard, this might be a problem.
When defining keyboard shortcuts that will trigger your macros, you need to find a combination of keys not used by any application. Otherwise, if you try to use a shortcut, the current application will intercept it and perform a completely different action. Assigning custom actions to shortcuts like "cmd+s" ("ctrl+s" for Linux/Windows users) or "cmd+w" is off the table because, in most programs, they are already used to save the file or close the app.
Luckily, there are some combinations of modifiers that are rarely used. These are called the Hyper key (shift+cmd+ctrl+option on Mac and shift+windows+ctrl+alt on Windows) and the Meh key (shift+ctrl+option on Mac and shift+ctrl+alt on Windows). Both combinations are not the easiest to press; for example, for a keyboard shortcut that uses the Hyper key, you need to press four modifier keys and another key assigned to a shortcut. But many external keyboards have additional keys to which you can assign the Hyper or Meh keys (that's what I did with my Kinesis Advantage keyboard). Even the built-in keyboards have keys you can live without (the "Caps Lock" key is fairly unused - unless you need to shout a lot on the internet) and can be converted into a special key.
I decided that before I buy the Stream Deck, I will first try to implement some useful macros. I used BetterTouchTool or BTT for short - my preferred way to define macros on a MacBook (I bought it years ago to customize the touchbar on my previous laptop, and I've been using it ever since). I configured the "Esc" key to act as the Hyper (so "shift+cmd+ctrl+alt" ) and "Insert" to act as the Meh (so "shift+ctrl+alt"). Both those keys were previously unused - I'm using "Caps Lock" as the Esc key and the "Insert" key is basically a second backslash key on the Kinesis Advantage2 keyboard.
Next, I've decided to make an easy-to-remember split of functionality of those custom shortcuts. The Hyper key would be used in shortcuts that start some applications, and the Meh key would be used for all the other macros. Ideally, the first letter of the application's name could be used as the shortcut to open it. So, for example, Hyper + o
would open the Obsidian app, Hyper + i
would start iTerm, and Hyper + f
would start Finder. Of course, not every app could have a shortcut like that (e.g. if two apps started with the same letter, one would need a different shortcut). But I've decided to limit the number of application shortcuts to only those I use multiple times per day. If an app is already opened, pressing its shortcut will switch to the desktop with that app and bring it to the front.
Next, it was time for more advanced macros that I would use with the Meh modifier:
Meh + m
: mutes/unmutes the microphone. This shortcut triggers a "Run Apple Script (blocking)" from BTT that runs an applescript to toggle the current microphone's volume between 0 and 100 and displays a notification. To make sure I don't get confused about whether my microphone is muted or not, I've added this BTT widget to display an icon in the menu bar indicating the microphone's status.Meh + p
: triggers the "Play/Pause" action in BTT to toggle the currently playing music or any other video or audio. I could achieve the same by pressing the button on my headphones, but still, my fingers are on the keyboard, so pressing a keyboard shortcut is faster.Meh + n
: sets the "Do not disturb" status for 1 hour. This hides all the notifications and is very useful during screen-sharing sessions, ensuring no weird message pops up in the middle of a presentation. I have an Apple Shortcut that sets the "Do not disturb" status and accepts a parameter defining how long it should be set. This shortcut comes with the Calm notifications workflow for Alfred, and all I have to do is trigger it from BTT with the "Run Shortcut from Shortcuts App" action (optionally followed by the "Show notification" action to get a popup confirming the correct execution of the shortcut).Meh + t
: brings the Teams window to the foreground. This is done by using the "Show/Hide Specific Application" action in BTT, and it saves me from figuring out where my Teams window is during calls.
Those are the most useful shortcuts I could think of. This setup was not without flaws, and I solved them when I bought the Stream Deck. But it was good enough to start.
What were the flaws? For instance, the play/pause button usually works for the last piece of media content played, but sometimes it's a bit random. This was an issue when I had the Spotify app opened (which is always opened) and a YouTube video paused in one of the browser tabs. Sometimes, the macro would work on Spotify, when I wanted it to start the video, and sometimes it would start a video somewhere in my browser when I wanted it to stop the music [3]. That was quite annoying, and with Stream Deck, I've solved this problem by having a separate button for Spotify and another one for other media content.
Or let's take the mute/unmute functionality. It worked well as a macro, but with Stream Deck, I can get a plugin that controls the Teams client directly and toggles the mute/unmute setting in the video call. This approach is more convenient because everyone on the call can see an icon indicating that I'm muted (and, when I try to say something, they can tell me, "Hey, you're muted"). An "operating system-wide mute" is not reflected in Teams, and I've noticed that it's more confusing to people during the calls.
Having a few macros is great if you need to simplify some common actions on your computer. But as I wrote in the side note about my experience after buying the Stream Deck, the more macros you have, the more you have to think about how to trigger each one. This can be distracting when you are in the middle of a task requiring a lot of focus. So, I gave Stream Deck a chance and ended up keeping it. Check it out to see my Stream Deck setup and my conclusions after using it for a few months.
Try to get a mechanical keyboard, and you will quickly understand why muting is necessary. ↩︎
I was wrong with this statement. Pressing a button to open an app is sometimes more convenient. Especially when I'm doing something else on my main screen and I can press the button on an external device without losing focus. ↩︎
And DJ "Spotify mixed with a random YouTube video" is terrible. ↩︎