I’ve been using an Elgato Stream Deck for more than a year now. It’s a USB peripheral that offers a grid of buttons with a display underneath, so each button can be labeled with an icon…
I’ve been using an Elgato Stream Deck for more than a year now. It’s a USB peripheral that offers a grid of buttons with a display underneath, so each button can be labeled with an icon and/or text that you specify. The goal of the Stream Deck is to make esoteric actions on your computer easier by letting you place them on dedicated keys with custom artwork, so you’ll always know to press the blue button instead of typing Command-Shift-Option-3.
I was initially quite skeptical about the Stream Deck. I’ve got a perfectly nice keyboard, full of keys on which to map commands. Why not just memorize those keyboard shortcuts?
And yet, after using a Stream Deck Mini that I bought at Target on a whim for a few months, I decided to upgrade to the full-sized Stream Deck. It turns out that, yes, the concept of wiring up commands I could never recall from the keyboard shortcuts, of placing front and center all the macros and shortcuts and scripts I spent hours building and then promptly forgot existed, made it all worthwhile. I had gone from a skeptic to a convert, and it only took a few months—and a bunch of lessons learned.
It may not look like it, but the Stream Deck is essentially a tiny, weird keyboard. And it shares a few essential characteristics with a keyboard: ergonomics are vitally important, and everyone’s ergonomics will be different. I have a lot of friends who place their Stream Decks on their desks, front and center, under their monitor. That would make it easier to see, but I’d need to reach up my keyboard tray to press any of the buttons.
Instead, my Stream Deck lives on my keyboard tray, just to the left of my keyboard. It’s easy to reach with my left hand to press any of the buttons, and it’s a quick glance down. Even better, it makes the Stream Deck feel almost like an extension of my keyboard, eliminating some amount of mental friction when I stop typing and press a button.
The Stream Deck doesn’t program itself. You have to place an item on every button and decide what goes where, and if you want to use more than the allotted number of buttons, you’ll need to deal with the added complexity of programming buttons that take you to other profiles (and back).
In some ways, it’s great to be given a blank canvas! You decide what the keys do! You decide what they look like! On the other hand… you have to make all those decisions, and if they don’t work well, you’re the one who needs to fix them.
The Stream Deck companion app is… adequate? It does the job, but that’s all I can really say about it. I wish it was easier to do things like choosing a button color and a simple icon. (The app really should offer all of Apple’s SF Symbols as icon options, but it doesn’t do much on that front.) Instead, I need to turn to an app like Icon Creator, which lets me set a custom color, choose an icon, and even overlay text in a font of my choosing. Text generated in the Stream Deck apps is extremely ugly, with a limited font selection.
If you’re someone who cares even a little bit about how the Stream Deck looks—and you probably should, since the customized buttons are its primary appeal—you will find yourself art-directing buttons and button sets, which is fine if you’re into that sort of thing. You can get things just the way you want them, with some work. But I wish it all was easier and looked better.
While I was working on my Podcast Notes script, my initial concept was that I’d press a button to kick off the script, then type a little note to myself. It turned out that was a mistake — that it was just too much mental overhead to press a button and type a note while I was also supposedly having a conversation on a podcast. In general, I discovered that workflows that require me to push more than one button or push a button and then type on the keyboard are just too complicated. The entire concept is: push a button, and the magic happens. Any more, and the trick falls apart.
For my Podcast Notes script, I started experimenting with different button placements, eventually settling on a whole strip of buttons that would run the script with pre-filled text. It took a decent amount of time and effort to do that user-interface experimentation. It’s not a task that’s for everyone. But the beauty of it is that I was able to come up with an approach that’s designed just for me and works the way my brain works.
Keeping it simple also means reducing the number of buttons a task needs to use. I’ve ended up building a lot of my automations as a single shortcut that senses the current state of affairs and toggles accordingly, so instead of two or three different buttons that need to be pressed in the right order, I can place the entire task on a single button and know that my automation will intuit what I need and do the right thing.
When I started using the Stream Deck I honestly wasn’t sure what I’d put on the buttons, whether it would be keyboard equivalents or scripts or what, exactly. The answer has turned out to be delightfully eclectic.
I use Stream Deck’s “Website” type to do a lot of things that don’t involve opening a Website, like turning HomeKit devices on and off using the HomeControl app, opening remote servers in Terminal, and screen sharing my local server using Screens. All of those apps can be controlled via URL, and all Stream Deck’s Website type does is pass URLs to the system.
But for the most part, I’m automating with Keyboard Maestro or Shortcuts. These automations can be very simple or devilishly complicated, but using the KMLink plug-in makes connecting button presses to Keyboard Maestro easy. And Keyboard Maestro’s own plug-in allows a lot of complexity if you want to go down that route.
A couple of final lessons I’ve learned. While Stream Deck can automatically switch between button sets when you are using a particular app, I’ve yet to find an instance when I want an entirely different set of buttons in an app. Instead, I’ve built a series of button layers based on broader contexts. I’ve got one for podcasting, one for streaming video, and one for use with my Podcast Notes automation. Since I’m constantly switching between apps, this approach just feels better—and when I look at my Stream Deck, I’m never surprised at what I see there.
I’ve also experimented by placing ambient information in the button art itself. For example, I wrote a Keyboard Maestro macro that displays the number of current listeners to a live stream, and I installed TJ Luoma’s amazing calendar macro that displays my meeting status in a Stream Deck button.
But you know what? I prefer to see ambient information like this in my Mac’s menu bar rather than down on the Stream Deck. The only exception I’ve found so far is a macro that writes the number of minutes I’ve been recording a podcast to a clock icon on the same row of buttons as my Podcast Note script. I think it has something to do with grouping that information with buttons that I’m looking at only when I’m recording. Maybe because they go together? Your mileage may vary.
Is using something like the Stream Deck worth it? It depends on what you want to do with your Mac, but a lot of people could benefit from getting some of their favorite app shortcuts out of a nested menu or a complicated keyboard shortcut and into a colorful button. Do you find yourself searching for a command via the Help menu because you can never remember where it is? Or having to try three or four different keyboard shortcut combinations before you find the right one? It’s a lot easier to press a button with an icon or text or color swatch and get your desired result.
For years I’ve had a macro that pastes HTML as Markdown inside BBEdit; for the life of me, I could never remember what keyboard shortcut I assigned that command. I didn’t use the command often enough to internalize it, so every time I used it, I had to remember if it was shift-option or command-shift or command-shift-option. Now I have a button with an arrow and the letters “md” on the top level of my Stream Deck, and it’s actually a little exciting when I realize I get to press it.
It’s funny—Apple sort of went down the path of Stream Deck when it came up with the Touch Bar. Unfortunately, the Touch Bar lacks two key features of the Stream Deck: tactile buttons and customizability. If Apple had swapped out some of the function keys on its keyboards with Stream Deck-style keys, it might really have been on to something.
If you appreciate articles like this one, support us by becoming a Six Colors subscriber. Subscribers get access to an exclusive podcast, members-only stories, and a special community.
Shameless self-promotion, but I used a Stream Deck to make "Princess Buttons" for my kids: https://dantonio.info/projects/the-buttons/
Allows me to not be the DJ/arbiter of music for my toddlers, yet still provides them with control over the music (Sonos) and helps them learn to negotiate & take turns between themselves. The Stream Deck has, thus far, held up to quite a lot of abuse. I've added some lighting control and they have play/pause/next control, too -- works great. The USB 'server' software is fantastic, too. =D
Also thanks for sharing, however your second picture in the header screams to me that Streamdeck + sand doesn't go well together and looks like a common combination when kids plus outside play settings are combined. You mention a waterproof enclosure but I doubt the streamdeck itself is IP rated. I suspect a thin transparent sheet over the top would fix that though, or do you just replace the streamdeck every so often?
It's been out there for a year and is still working well, though is indeed dirty (I wipe it down occasionally). There's a bit of overhead protection from the elements and we discourage sand/dirt being applied to the buttons, though I did consider a silicon "liner" at some point. The Stream Deck itself seems to be more rugged than I expected, though! :)
Have you added the Pizza Button yet? :)
I built something somewhat similar, to link YouTube videos to steam deck buttons so my 2yo kid could listen to his songs :) It runs everywhere Python is available, including raspberry pis ;) Code is here: https://github.com/sylvinus/raspberrydeck
No shame in sharing something cool on HN. This was a nice well-executed project, also I like the look of your blog
I love this, thank you for sharing. Also, I'm curious... what does the "Great Wolf Lodge" button do?
It originally turned the misters on plus queued their "Great Wolf Lodge" playlist. It now just does the latter, as the misters weren't as well-received as I thought that they'd be. =D
Must be for the water works
that poor stream deck looks well loved, hopefully it doesn't die on you from getting dirt/water/god knows what else on it in the hands of children :)
As an alternative to a stream deck, I started using a MIDI board last year. I tried a copule and settled on the Behringer X-Touch Mini [1]. It's less than $100. What I primarily use it for is volume control (including muting). Like I have a particular knobs for Chrome, Master Volume and games. This is all pretty easy to set up with something like MIDI Mixer [2]. There are Youtube videos on it.
I also use the media controls for Spotify.
This particular board has extra buttons you can use for, say, muting Zoom.
As an aside, volume on Windows is a horrible mess. You can have an external speaker volume, a system Master volume, an app-specific volume (the last 2 through the Windows Volume Mixer) and then volume settings inside a game.
One thing I appreciate about iOS for example is there's just one volume for what you're doing. There are separate volumes (eg ringer, speaker, music) but you only ever adjust one and it's context-dependent. Listening to music? You adjust music volume. On a call? You're adjusting call volume. Not on a call? You're adjusting ringer volume.
In an ideal world, the hardware volume could be synced to the system master volume and there would be no game or app specific volumes. All of these would be deffered to the volume mixer. Or at least any in-game or in-app controls would merely adjust that volume.
I can but dream.
The only thing this particular board doesn't have is motorized sliders for volume. I didn't really find any options for this less than $300-500 and they tended to be much bigger boards. I'd really prefer a slider to a knob but that's just nit-picking.
> As an aside, volume on Windows is a horrible mess. You can have an external speaker volume, a system Master volume, an app-specific volume (the last 2 through the Windows Volume Mixer) and then volume settings inside a game.
You never have 2 applications outputting audio and you want to balance them? Sometimes I'll be playing a game and listening to a podcast at the same time, and I want the podcast to have the louder audio, so I turn the game down.
On my Mac I use for work, sometimes I'll be in a Teams meeting where I only need to be partially paying attention, and I'd like to be able to turn the Teams volume down and have something else at the forefront, but I can't do it because there's no volume mixer.
You misunderstand my complaint.
Windows already does this. There's a volume mixer where each app has its own volume. That's still the case AND the game/app has a separate volume.
So the actual volume playing is effectively:
Hardware volume x Windows master volume x Windows app volume x In-app volume
No one wants or needs that level of control. You end up adjusting these separately as you need until you find out one day the hardware volume is on max but the master volume is near zero and you've been compensating for that by maxing out the in-app volume.
There is one x too many, yes. But otherwise I absolutely do want that.
Hardware × software master × in-app,
maybe condensed with "flat volume", so that raising the in-app volume also raises master if necessary, while leaving other sounds at the same effective level.
The only difference I see compared to what you call iOS is that that one throws all "video" together in one giant pile. Thus youtube, netflix, spotify etc. all get the same default volume. That is really annoying me with android and I want that off!
Not all apps have in-app volume. In which case you have Hardware volume x Windows master volume x Windows app volume -- and which should be removed? No hardware volume? Everything controlled by software? Sounds horrible. No Windows master volume? What if you want everything quieter, turn it all down one-by-one? No Windows volume mixer? I explained why that's an issue in my previous comment.
Your example of a good implementation is iOS which is hard to compare to because mobile OSes are generally single-task focused. But I certainly wouldn't want an iOS-style volume control on my PC.
> So the actual volume playing is effectively:
> Hardware volume x Windows master volume x Windows app volume x In-app volume
> No one wants or needs that level of control.
I don't have a separate hardware volume relative to the Windows master volume, but otherwise I want and need that level of control.
- Windows Master Volume: I turn the knob on my headset or keyboard and things get quieter or louder. This is the thing I adjust most frequently.
- Windows App Volume: I turn games down, usually to 10-20% or so. Then I turn everything but comms (discord, zoom, etc) down to 80%. This ensures that I hear live communication over all else, and that my games aren't drowning out whatever I'm watching in the background.
- In-App Volume: Here I adjust balance in games. Music unfortunately gets set to 0 because I'm rarely just playing a game these days. Voice lines get set higher than sound effects until I'm sure I can distinguish them clearly.
The media keys are atrociously implemented on macOS - I don't know how they've managed it so badly, for so long, without a fix. Listening to Spotify and pressing play/pause, you'd expect the music to pause, not to suddenly be listening to additional sound, often from a video in a browser tab you last played a month ago.
I use Voicemeeter Banana to control audio on Windows. Works great for exactly that scenario, where I want my voice comms to have a higher volume than games, and also nice when I have multiple inputs (microphones) and outputs
> I can't do it because there's no volume mixer.
Have you tried Rogue Amoeba’s Loopback?
> In an ideal world, the hardware volume could be synced to the system master volume
This already works if you're using something that can be controlled via the windows volume. Eg, a USB dac+amp usually works like this. That is, the "hardware volume" and "windows master volume" become one synchronized slider.
Very often there's a break in the digital chain that prevents this from working more broadly, though (for example if you're outputing analog to your speakers, or using separate dac & amp)
One of things that drives me crazy about iOS volume control is trying to adjust the volume of navigation while driving.
Navigation system pipes up; that’s a little more quiet than I’d like; by the time I can adjust it safely, it’s only time to adjust the ringer; repeat.
They're a bit pricey but the gear from Intec would be perfect for this: https://intech.studio
I'm doing similar with a Novation Launchpad X that I already had.
I'm primarily using it with OBS but also use it with Zoom and a few other applications.
Any resources that you could recommend on this? Was thinking of trying to put mine up to a similar use.
A lot of apps that I use support midi input. The Launchpad has a webapp that lets you configure the outputs of each pad to send different types of MIDI outputs.
The only hitch is that the Launchpad doesn't send NoteOff messages, it sends NoteOn twice with the second time being volume 0.
For apps that don't support MIDI input, there's a tool called Midikey2key which lets you map MIDI messages to keyboard inputs/shortcuts.
Ah, so it gotta be done on the OS level, and the approach would differ per individual midi device (to set which exact midi signals are sent per button) and OS (for automating actions based on those signals received)?
Got it, thanks for answering this.
I never thought I'd have a use for extra buttons all that much. There's always keyboard combinations to spare.
Yet about 18 months ago, I remembered I'd got these 5 custom buttons on my keyboard that in something like a decade and a half of using this keyboard model, I'd never once used.
A little bit of searching later, I figured out how to write a bash script that would (for Linux) find the zoom window for whatever meeting or webinar I was in, and bring that up. Then a second script to do the same but also unmute. That has become so insanely useful I'm really kicking myself about not having used those buttons before.
This is a bit of an aside, but I play a lot of Playerunknown's Battlegrounds with a regular team of friends. That game has a fiendish amount of keyboard commands, even related to regular movement. Many of them can be accessed through sub-menus, but that puts you at a competitive disadvantage when things happen fast.
I've figured out that I just don't have the hand-eye coordination to move in four directions, activate the scope, zoom the scope, lean left and right, aim the gun and fire it during the exact right milliseconds.
So I unloaded the "lean left and right" actions from my right hand to my feet, using a set of rudder pedals intended for a flight simulator. I then unloaded some of the esoteric menu options from keyboard shortcuts to a Stream Deck with user-friendly (works even for six-year olds) picture interface right in front of me. Improved my performance considerably.
Could you share that script?
Hopefully I get this right with the formatting.
#!/bin/sh
ZOOM=$(xdotool search --limit 1 --name "Zoom Meeting")
ZOOM_WEBINAR=$(xdotool search --limit 1 --name "Zoom Webinar")
if [ -z "${ZOOM}" ]; then
xdotool windowactivate --sync "${ZOOM_WEBINAR}"
elif [ -z "${ZOOM_WEBINAR}" ]; then
xdotool windowactivate --sync "${ZOOM}"
fi
sleep 0.1
xdotool key --clearmodifiers "alt+a"
It relies on xdotool, which I don't think works on Mac?
If I was still on mac, I'd probably try and use hammerspoon somehow. I used that for a few bits of automation, and I know it had ways to choose applications.