Elgato Stream Deck XL

Do you mean have it open the default Calendar.app instead of Fantastical? Sure. That should be as easy as selecting the different app in the Keyboard Maestro macro.

I have not only because there really isn’t enough room to display the meeting names on the Stream Deck buttons.

I use Fantastical to show my next meeting in the menu bar of my Mac instead. There’s also ‎MeetingBar (free with optional support as an IAP).


Hi T.J.,
I’ve just been trying to get this to work on my new Mac Mini and I seem to have broken something because the script gives the following 3 errors:

I’m not sure what they mean but I do know that the next event showing is not the one I expected to see.
Thanks for any help.

Something is going wrong with the script. It seems like it is being run as something other than a zsh script, which means it will not work, as there are lots of zsh-specific code in there.

I do not know how that would have happened, unless you edited the file or it was somehow corrupted.

I would recommended re-downloading it from Github and see if that helps.

Thank you. I’ll try that.

Thank you for this script. The idea of changing the button color is a stroke of genius. I find it extremely useful.
I’ve made an addition to this script -

  • I’ve added the ability to “Trigger a script” x minutes before the meeting. My use case is this -
    2 minutes before my “Google Meet”, my script is triggered which does the following
  1. Turn off Dragon Dictate
  2. Turn off Sonos
  3. Jump to Google Meet (which triggers Do Not Disturb)

I can submit the changes if you are open to it.

I released this more with the intention of it being a starting point for people who didn’t know how to do it themselves or a “jumping-off point” for people who wanted to build their own system. It’s not something that I really intend to “maintain” in its public form, at least for the time being.

In fact, I’ve since “re-renovated” the way that I do this now, but haven’t gone through and cleaned it up enough to release it publicly, because it works essentially the same way, the changes are just “under the hood”.

That being said, I’d be very curious to see what you did and how you did it, so if you do want to share that, either here or on GitHub.

Here you go .


One more little typo I found on the project’s GitHub page…

" Second: Make Sure They Are Executable

Enter these two lines in Terminal:"

The word two should be three, as there are three files that need 755 permissions.

I’ve annotated the below screenshot to help make it easier to understand what I’m trying to say! :man_facepalming:

I also created an issue in the GitHub project and linked the same screenshot. I had the honor of posting the first issue in the project. That’s a new one for me! :grinning_face_with_smiling_eyes:

Maybe it’s just me being too thick again, so forgive the dumb question, please.

I’ve followed all the steps in the readme, and I must have missed how to get the KM Macros onto the SD buttons.

Is it a drag and drop thing? Do I need to add the KM macros to the StreamDeck app? Man do I feel dumb on a Friday!

Thanks for the assist.

Ugh… really thick.

I really hate it when I post, and then 30 seconds after, I answer my own question. Here’s a breakdown if anyone else is confused as I was…

  1. With KM Link installed in the StreamDeck app, select Custom from the StreamDeck right side menu, and drag the KM Link to a button on the left side.

  2. Then, from the Macro dropdown, click on the disclosure triangle to show the list of all the active KM macros that you’ve got installed.

  3. Scroll down to the StreamDeck section and assign one of TJ’s Macros with whatever title you want, and any applicable/optional parameters and you’re good to go.

Here’s a quick GIF showing the process:

1 Like

Don’t be too hard on yourself! As my former CompSci professor¹ used to say: “Everything is easy…when you know what you’re doing.”

His unspoken point, of course, is that it’s not easy when you’re learning (aka “don’t know what you’re doing”).

¹ p.s. - Marco Arment had the same CompSci professor, Dr. Cupper. Marco and I attended the same college, but he arrived 5 years after I left. Marco wrote a bit about Dr. Cupper upon his passing in 2013:

In memory of Dr. Bob Cupper – Marco.org

I was a terrible CompSci student (briefly), but I enjoyed Dr. Cupper. He was quite a character, and was a great storyteller. He also occasionally “threatened” that if we did really badly on an exam, he’d give us a “Q” for a grade instead of an “F”.

He lived near enough to campus that he could walk to campus on days when he had time, but sometimes he’d drive if he needed to.

He once told us, “Sometimes I’ll drive to campus, but then at the end of the day, I’ll forget that I drove and walk home. Sometimes I’ll walk to campus, but forget, and drive home instead.”

I was the only one who laughed, and he looked at me and gave me a little smile, and moved on with the lesson. He’d said it completely deadpan serious, so I’m was never sure if any of my other classmates had realized the paradox.

1 Like


I’m a newbie on the forum and not a programmer. I heard about your brilliant integration with Fantastical on MPU and was intrigued to try it out on my new Stream Deck. However, I hit a snag installing - perhaps I’m missing something really obvious?

I got as far on the setup to add the lines below in terminal:

Second: Make Sure They Are Executable

Enter these four lines in Terminal:

chmod 755 /usr/local/bin/icalBuddy

xattr -r -d /usr/local/bin/icalBuddy

chmod 755 /usr/local/bin/km-icalbuddy.sh

chmod 755 /usr/local/bin/seconds2readable.sh

but I get an error message after line 2

% xattr -r -d /usr/local/bin/icalBuddy
Not enough arguments for option -d. Expected at least 2 but got 1

usage: xattr [-l] [-r] [-s] [-v] [-x] file [file …]
xattr -p [-l] [-r] [-s] [-v] [-x] attr_name file [file …]
xattr -w [-r] [-s] [-x] attr_name attr_value file [file …]
xattr -d [-r] [-s] attr_name file [file …]
xattr -c [-r] [-s] file [file …]

The first form lists the names of all xattrs on the given file(s).
The second form (-p) prints the value of the xattr attr_name.
The third form (-w) sets the value of the xattr attr_name to the string attr_value.
The fourth form (-d) deletes the xattr attr_name.
The fifth form (-c) deletes (clears) all xattrs.

-h: print this help
-l: print long format (attr_name: attr_value and hex output has offsets and
ascii representation)
-r: act recursively
-s: act on the symbolic link itself rather than what the link points to
-v: also print filename (automatic with -r and with multiple files)
-x: attr_value is represented as a hex string for input and output

I tried to run the lines one at a time and get the error after the second line.
I’m running a 16" M1 Max MacBook.

Any suggestions appreciated, thanks.
(edit for typo and clarity)

It seems that in Monterey, you need to add com.apple.quarantine to the command being entered. This is due to Gatekeeper quarantining the file once you edit it to make the changes needed for calendar names etc.

xattr -r -d com.apple.quarantine /usr/local/bin/icalBuddy

TidBITS discussion on the feature

1 Like

Hi Tony,
that did the trick!!
now waiting to test it tomorrow… it’s 23:13 here in Scotland

1 Like

Well, it’s not so genius apparently, since I missed a basic part of that command. Yes, you have to add com.apple.quarantine. I have fixed the command.

1 Like

I know the feeling… I’m in England! I seem like i get stuck into fun automation at silly o’clock — like the 1am it is now…

@tjluoma Sorry — I meant to message you when I installed your iCalBuddy a couple of weeks ago to mention this, but it went clean out of my head. Anyway, I have been using iCalBuddy for those couple of weeks now and it is awesome, so thanks for putting together this amazing and handy tool and publishing it for the rest of us to make use of.

1 Like

I’m so glad others have found it useful. I’m sure someone can do it better in shortcuts now, but it’s been pretty useful for folks and I’m pretty pleased about that.

1 Like

This is brilliant!
I’m loving getting into KM and Stream Deck - I’ve been fiddling with trying to get this appointment setup, but for some reason the macro is not picking up details from my calendar - it returns an empty string even tho there are some appointments.

  • I’m using the correct version of icalBuddy from your site
  • I’ve altered km-icalbuddy.sh with the correct calendar names (some had spaces in the names but I removed them) and also updated with the correct Row/Column on the Stream Deck.
    Am I missing something, or is there something else I could try?

Hrm. That’s an odd one.

What happens if you enter this in the Terminal.app on a day when you have events:

icalBuddy -ic 'Dragon Slaying' eventsToday

Replace “Dragon Slaying” with your actual calendar name

That’s basically the minimal command necessary for showing calendar items, and if it works or doesn’t, it’s a clue that we can use.

If you get an error message, that’s important to know too.

1 Like

thanks for quick response - I tried what you suggested and got no calendars… hmmm
then I remembered that I had disconnected my apple calendar a while ago because I was using fantastical, so I reconnected the apple calendar and, hey presto, it works on the Stream deck!!

…but when I type the command into terminal, I still get no calendar - perhaps because my main calendar is a google workspace account shared with a colleague - and while she has her own email address, different from mine, both of these calendars seem to show up in my calendar! Strange… I’ll need to do a bit more digging, looks like some conflict with the google workspace accounts.

Thanks so much for the suggestion tho, really helped my troubleshooting!

best regards, Joe