Welcome to the lab.

Getting started with Howzit

I’ve been using Howzit almost daily for years now. I made a bunch of upgrades to Howzit over the last month, including packaging it as a gem and completely refactoring the code. In the process it’s become pretty obvious that not many non-me people have actually tried it, and I really think they should, so I figured I’d at least make sure everyone understood what it does and how to use it.

Is Howzit Right for Me?

  1. Do you spend a good portion of your day in Terminal?
  2. Do you have different types of projects with different tools for building and deploying? Different processes/destinations for updating and publishing documentation?
  3. Do you ever come back to a project and find you’ve forgotten how you set it up and what you automated?

If you answered yes to all three questions, then you’re a prime candidate for Howzit. If you answered yes to the first two and no to the third, congratulations, you’re amazing. Either way, unless you checked all three, you can totally stop reading now. Go outside, enjoy life. Or whatever people who aren’t obsessed with the command line do.

A better Shortcuts command for Bunch

The last time I talked about Bunch I had just added a command in the Bunch beta for running macOS Shortcuts. After working with a user on Sunday, I made it a bit more useful.

The command now accepts text input (which can be the content of ${variables}), and also returns results if the Shortcut provides text output, which can then be assigned to Bunch variables. To send text, just include it in double quotes after the Shortcut name:

(shortcut New Project "${projecttitle}")

If the Shortcut contains a “Stop and output” action that returns text, you can assign that result to a variable the same way you would capture shell script output:

project_name = (shortcut New Project)

Handy stuff.

I think I’ve also finally found the issue with spaces in the path for a Bunch folder. So much weird behavior in that area, but it came down to creating the NSURL with the wrong method. I think.

Please note that all of this is currently only in the beta (155 as of this writing). It needs a bit of testing before I push it out to the world. If you want to help (or just try out the new features), grab the beta download here.

And as evidenced by this little feature boost, I respond kindly to Discussions, so please join us there!

howzit got gemified

It seems like just yesterday that I was saying I’d never gotten around to making howzit into a gem that you could easily install and update. Then I had a bit of a sleepless night and decided to go for it.

You can now just run gem install howzit to install, and keep it updated in the future by running it again (or by running gem update howzit). Be sure to remove any previous version of the script from your path so that the new binary gets picked up.

If you run into permission errors in your setup, you may have to use sudo (sudo gem install howzit).

This has the added benefit of allowing me to add dependencies that are automatically included when the gem is installed, allowing me to extend the functionality a little bit using external libraries. See what all is new in the changelog.

Prereqs and Postreqs

One new feature that just got added is pre and post requisites for topics. You can block a section of notes as @before...@end or @after..@end. If there’s a @before block in the topic and you try to run it, it will display the contents and ask for confirmation that the prerequisites have been taken care of. Just to serve as a reminder when I come back to an automation and there are manual tasks I may have forgotten about. Anything in an @after block will be displayed after the topic runs. Neither of these tags are shown when just viewing the topic.

Other New Stuff

  • Alternative display format for topic titles (can be set in config file):

  • Get and set config options with --config-get and --config-set.
  • Allow multiple selections when using an fzf menu
  • Option to handle multiple results with all, first, best, or choose
  • Display multiple sections by separating title searches with a comma, e.g. howzit build,deploy

Epilogue

I just have to say that I’ve found using howzit to be a real boon. It allows me to automate all of the processes around a project in a single file, and by using similar topic titles between projects, I can use the same command to execute a certain type of task, regardless of what kind of project it is. For example, in just about anything I work on, I can run howzit -r deploy (which I have aliased, of course), and it will build and deploy the project, whether it’s a website that needs to be rendered and rsynced, a gem that needs to be packaged and pushed, an Xcode project that needs compiling and packaging… anything I’ve automated (which is everything) just works. And in the process of adding these automations to my build notes, documenting as I go, I have a reference to remind me how each process works when I come back to it later.

It’s been a great solution for me and my ADHD brain.

Getting serious about Overtired

I’m putting a renewed focus on Overtired right now. Setting up more social media accounts, getting our episodes out on YouTube, amping up cross-promotions, and refining the podcast itself. I’ve got a great editing workflow down and it’s replicable, so now I can share the responsibilities with others without worrying about losing quality. I’m working to automate as many of the editing and promotion tasks as I can so that we can focus on making a great podcast and still maintain our day jobs.

If you’ve never listened, or haven’t for a while, now’s a great time to dig back in. The last few episodes really highlight where we’re going with the show.

We’ve really honed in on mental health as our driving force. We’ve long had a “Mental Health Corner” segment, but now it’s a weekly thing and I’ve really appreciated the feedback from listeners. If nothing else, I think that talking about it does a service, and I’m happy to be a part of that. We’re no longer a Taylor Swift podcast that also talks about tech and maybe mentions ADHD, now we’re a mental health podcast that also talks about tech and only occasionally mentions Taylor Swift. Or Miley. It’s a notable shift.

We added Jeff Severns Guntzel as a co-host a little while back, and the show has been better for it. I’ve known Jeff for a long time now, and we always have great conversations. I was thrilled to find that he conversed with Christina just as easily as he did with me, and there’s a whole dynamic with the two of them that is something completely different than the ones between Jeff and me or Christina and me. Again, a notable shift, and one that emboldens me to build our listener base.

Also a shout out to Backbeat Media, who tirelessly sell our ads. We’re not the biggest show on the network, and we swear a lot, focus on non-tech issues, and make ourselves generally unmarketable, yet Backbeat rises to the challenge. The ads Dave and company sell on our show have kept us going. Side note, I may additionally add a Patreon in the future, if there’s interest.

Once I have all the social accounts set up, I’ll start promoting those here and elsewhere, so stay tuned. Right now you can follow:

Instagram/ovrtrd
I’ll be posting snippets and clips here. I’m able to select text from the transcript in Descript and output an “audiogram” to Headliner to generate visually interesting reels, complete with captions. I aim to find at least one compelling clip per episode, more when I can. I’d appreciate any followers I can get right now, but will hopefully be adding content regularly and building up the presence.
Twitter/ovrtrd
I’ll also be ramping up our Twitter presence, with clips, more regular tweets, and conversations with listeners. If you don’t already follow us but listen to the podcast, this one should be a given.
Discord
We have a growing community on Discord. Currently free to join, and I’d love to see more conversations happening there. Mental health, queer issues, and Taylor Swift are all welcome topics.
YouTube/Overtired
We’ll be publishing clips and full episodes to YouTube. I’m told it’s the hottest place for podcast discovery and audience growth right now, and I can pretty much automate the process with Headliner. I have high hopes for this one. Subscribe now and you’ll be able to say “I’ve been a follower since before it was cool.”

And of course, you can subscribe to Overtired a ton of ways, pick the one that works for you.

Project Updates July 2022

I took a couple weeks of paid time off this month. Partly I wanted some downtime surrounding Macstock, and partly I just wanted to refresh myself a bit so I could tackle my work more effectively. And a little bit of it was spent putting some time into code polishing and new features. So here’s a general update, in case you were wondering.

As I’ve probably mentioned before, I switched ADHD medications a few months back. The Focalin was messing with my bipolar too much. Too many extended manic episodes and frustrating depressions, and the net result was having maybe 5 truly productive days a month. I’m back on Vyvanse now, which I’ve previously been on for years. As I’ve said before, it’s not the most effective ADHD drug for me, but it’s also much less likely to trigger manic episodes, and that’s held true. I’ve been mostly stable for the last few months, with just a couple mild episodes that result — at most — in one night without sleep and a short recovery period (as opposed to 5+ days without sleep followed by 2+ weeks of depression). Overall far more manageable than what I’ve been going through for the year prior.

Macstock

Macstock was small this year. I ended up running a couple of panels and doing some Q&A, even though I’d intended to take a year off of speaking. Between Covid and family emergencies, enough speakers dropped out that folks like Mike Rose and I had to step up to flesh out the speaker lineup. The winner for best presentation goes to my co-worker Erin Dawson, though, who did a live studio session demonstrating the creation of an original video soundtrack with no musical expertise required. It was great.

I have high hopes for seeing Macstock begin to grow again. Even when it’s small, I still have a great time seeing old friends and making new ones.

Project Updates

nvUltra is at a standstill for a few weeks while Fletcher has an increased rotation at the hospital, so most of my coding time went to Bunch.

Bunch

I love putting time into Bunch. I know a lot of people are using it (I get regular donations and feature requests, if that’s any indication), and I’d love to see more examples of what people are doing with it. Here’s my formal plea on the forums. In the meantime, here’s the latest stuff and nonsense.

Available in the stable release:

  • /opt/homebrew/bin is now included in the default path for M1 users using shell scripting
  • (Fixed) Close all Finder windows with XX (and on close with !!Finder)

In the current beta (download here):

(shortcut NAME) command
Run macOS Shortcuts with fuzzy name matching.
(shortcut Work Mode) # or (sc work m)
New browsers
Added canary: and firefoxdev: as browser prefixes that can be used to open a url in a specific app.
canary:https://brettterpstra.com
Chrome profiles
Target specific Chrome profiles using chrome[Profile Name]:http://... (also works with canary[Profile Name]:)
chrome[Personal]:https://hulu.com
Create new Bunches with AppleScript
AppleScript commands to copy or save a new Bunch with running apps.
tell app "Bunch" to save bunch with running apps named "Working" ignoring {"TweetBot"}`

howzit

I never did make a gem or package out of howzit, but you can grab the script from GitHub to update to the latest. It’s a cool script that I use daily, and I’ve made some major improvements over the last year.

Most recently:

  • Added the -F option to various pager setups based on less to avoid paging if there’s less than one page of output
  • Added special handling for the delta pager to ensure that screen contents aren’t cleared when exiting
  • Added a grep feature that allows you to select from topics matching a search pattern. Accepts regular expressions and if there’s more than one matching result, it will display a menu.

mdless

I put a little time into mdless as well. You can get the latest version with gem install mdless.

  • Code cleanup
  • Special handling for delta as a pager

It wasn’t my most productive month ever, but I also nailed an automation at the day job. Our GitHub-based publishing workflow can now publish to Oracle Content Management, meaning we can write everything in Markdown, manage it with git and Pull Requests, and still publish to official channels. That one took some hours, but I’m really happy with the result.

So that’s what’s up with me. Back to enjoying my last day of vacation! I also have some updates regarding Overtired that I’ll post tomorrow.

Web Excursions for July 20, 2022

Web excursions brought to you in partnership with CleanMyMac X, all the tools to speed up your Mac, in one app.

brianmichel/Juice: Make your battery information a bit more interesting.
Make your macOS battery information a bit more interesting by making your own measurement scale instead of a boring battery indicator.
Astrofox
This is the tool that’s going to get Overtired on YouTube, finally. Easily add video to an audio track with images, waveform animations, and effects. Free and open source.
riquito/tuc: When cut doesn’t cut it
This CLI adds capabilities to cut that would otherwise require some sed or awk magic. It has an intuitive syntax and I’m loving it for my command output manipulation needs.
raftario/licensor: write licenses to stdout
I love tools that make adding licenses to OSS projects simple.
nb · command line and local web plain text note-taking, bookmarking, archiving, and knowledge base application
I’m not giving up nvUltra any time soon, but if you’re keen for plain text, command line, note taking, bookmarking, and knowledge base building, this is an amazing project.

CleanMyMac X

BetterTouchTool and Stream Deck

It was promised some time ago, and after a long wait1 BetterTouchTool has added Stream Deck support, and it’s awesome. It’s a beta feature, but I’ve already found it to be an amazing extension to my Stream Deck.

I’ve only begun to dig into the possibilities here. Setting up your Stream Deck with BetterTouchTool is a little more cumbersome than using the Stream Deck software, but the scope of capabilities is vastly larger. Fully scriptable buttons, the ability to control buttons from external scripts, and anything BetterTouchTool can do can be assigned to your Stream Deck. And you’re no longer limited to just folders and pages, now you can do things like hold a button and have a row of options temporarily change, allowing things like multi-press triggers.

Plugin or Full Control

You can run BetterTouchTool as a Stream Deck plugin, integrating it into individual buttons in the Stream Deck software, or BetterTouchTool can take over control of your Stream Deck completely. The latter is supposed to be more performant, but it also means you lose all other Stream Deck plugins. I wasn’t willing to let go of those quite yet, so I’m running as a plugin. There are only a couple of plugins I would want to fully replicate in BetterTouchTool before switching over, namely the CPU load plugin (which won’t be hard to recreate with some shell scripting) and the Spotify integration that shows cover art while playing. The Touch Bar widgets in BTT already include that functionality, so I imagine a Music/Spotify Stream Deck plugin isn’t far off. The weather widget is superior to the Stream Deck weather plugin already, and you can have multiple buttons for future forecasts. You can have a page that shows you a full 7-day forecast, if you want to. The Zoom controls I have in my Touch Bar are easy to port to the Stream Deck, so that’s already covered.

Bunch Buttons

One of the new things I can do is have Bunch icons in my Stream Deck that actually reflect the open/closed status of the Bunch. I’ll probably eventually update the btt_stats script to handle this more elegantly, but here’s the script I’m currently using to do that.

Just save the script and add a shell script widget. Set the script to this:

/path/to/bunch_status.rb sd title "Bunch Name"

Then you can add a shell script action to toggle the Bunch. Just call:

open 'x-bunch://toggle/Bunch%20Name'

(Using a shell script open command instead of an open URL command avoids your web browser being involved in the process.)

Now the button will check the status of the named bunch and return the name of the Bunch along with a grey (closed) or green (open) background color. If you assign an icon to the widget, just remove the word “title” from the bunch_status.rb command to avoid adding text.

Media Control

I’ve also added buttons for volume control (using BetterTouchTool’s media controls), which can now have key repeats, so I can just hold down volume up/down and gradually adjust the volume. I added a mute button as an on/off button that reflects the mute state. Because there aren’t separate “mute” and “unmute” actions, this can get thrown off if I mute the volume using another method. I think I might have to write a script for it that actually returns the current state. Same with my mic mute, it just triggers a hotkey that controls Mikrofon, but can get out of sync. To be continued.

Shortcuts and Keyboard Maestro

If you’re into macOS Shortcuts, there’s a widget for that. It can run shortcuts and receive responses, so you can easily turn all of your Shortcuts into dynamic Stream Deck buttons. Anything Shortcuts can do is now easy to add to your Stream Deck.

You can also use AppleScript widgets to control Keyboard Maestro macros. And the macro can use BetterTouchTool scripting to affect button states, which makes it more powerful than using the KM plugin for Stream Deck. So anything Keyboard Maestro can do, your Stream Deck can do. Between the capabilities of BetterTouchTool, Keyboard Maestro, and Shortcuts, plus shell scripting and AppleScript, I can’t think of much you can’t do.

Home Automation

I use Indigo for most of my home automation, and I like my Stream Deck to be able to turn my office and basement lights on and off, and set the brightness for late night hacking.

I use Indigo’s Restful API to just send URLs that perform various actions. In the Stream Deck software this has always meant having a separate button for on and off, and multiple buttons for brightness settings. It’s also slow to send URLs, so there’s a 1-2 second delay when hitting a button.

Thanks to the scriptability of BTT, I can now have toggle buttons that show the current state. A Shell Script widget queries the device for on/off/brightness and updates the button state. The Shell Script action it runs uses curl to call the Indigo actions, and the response is immediate. So what was five buttons before is now three. I may make it four buttons and do the extra scripting to incrementally increase/decrease brightness of my office lights, but for now I just have a preset that toggles between 20% and 100%.

Here’s a basic version of the script I’m using for Indigo control (sans the brightness toggles).

Multiple Stream Decks

I have two Stream Decks, one Regular and one Mini. In the Stream Deck software I have a screen on the Regular that can change the profile on the mini. BetterTouchTool can take over this responsibility, but it seems to take a significant amount of configuration, as opposed to the simple “Switch Profile” selector in the Stream Deck software. Running BTT as a plugin and just adding buttons to appropriate profiles seems like the path of least resistance for now.

App-Specific Buttons

The documentation is currently missing, but you can also have app-specific buttons. It seems a little quirky, but I have gotten it working. I might experiment more with it, but I’ve never used the same feature much in the Stream Deck software because most of the buttons I want to use are global, and when I want specific controls for an app, I just use the Regular to load them on the Mini and not worry about them disappearing as I switch apps.

What About the Pedal?

I don’t have a Stream Deck Pedal, but BetterTouchTool also includes support for that. Now I’m tempted to get one…

Check out the docs to see what’s already available. I look forward to seeing this developed further, and if I know Andreas, there will be plenty of amazingness to come.

Update: Andreas let me know he’s almost finished with the Now Playing widget, as well as Dock and Calendar widgets. Excellent.

  1. I know, I should talk… *cough*nvUltra*cough* 

Bunch 1.4.8

Bunch 1.4.8 was officially released this morning. It consists entirely of bug fixes that have been going through beta testing for a while now. Nothing groundbreaking, but some stuff that you probably didn’t know wasn’t working1 is now working.

Some variable handling stuff:

  • Variable keys passed from URL handler were running into case sensitivity issues
  • Variables defined in a snippet call file line now work with conditional logic within the snippet (if var...)

Tagging stuff:

  • When launching or quitting Bunches based on tags, %\tag was not ignoring the action on close
  • Don’t inherit tags when nesting Bunches

Some general fixes:

  • Allow retries when sending AppleScript commands for things like Hide Desktop and Hide Dock
  • Ensure relaunch of Finder after hiding/showing desktop icons
  • Modifier key mismatch in Select Editor tooltip

Grab the latest version from the download page (or just use Bunch->Check for Updates). Please keep the bug reports coming, and feel free to join the discussions if there are features you’d like to see.

  1. Because they mostly relate to obscure features that, statistically, you likely don’t know exist.