Arborist 1.2

I previewed Arborist 1.2 last week and I’m happy to announce I just released it!

The biggest new feature is support for running tasks from Make and mise. These systems let you define reusable pieces of work a scripts or short commands and are very common across all kinds of projects. Arborist now supports these tasks right below the Commands section of the main window. I’m really happy with how this turned out, and it’s only the beginning. I’m on the lookout for other task runners to support (and the beta of Arborist 1.3 already supports justfile and npm run tasks).

The next biggest effort is not strictly an app feature at all. It dawned on me early after releasing Arborist 1.0 that an app like this really should have documentation to go along with it. This would serve users well by being a place to look before asking for help as well as a repository for articles based on questions and feedback that I get from users. So now Arborist help exists with pages covering many parts of the app. I’ll be continuing to build this space out as I add new features and get questions from users.

To build out the help section I used Maverick, my blog engine that powers this site. I had to make quite a few modifications to it but now it’s no longer just a blog engine. I’m really happy with how it came together and that I have found another new use for textbundles. It’s a format that I really do enjoy working with because it makes bundling assets alongside my text a breeze. I’ve even got my own textbundle editor that I’ve been building for the last 6+ years, and writing more posts here plus the new help articles have given me al the more reason to continue building that out too.

Back to Arborist, there are some other nice features added:

  • The branch selection pop-up now has a filter at the top of the list so you can easily find the branch you’re looking for.

  • App update notifications no longer interrupt your work, they appear in the sidebar (that was inspired by Rogue Amoeba.

  • Open the selected worktree in the terminal using the new Open Worktree in Terminal command in the Worktree menu.

There were also a handful of bug fixes too. Check out the full release notes, and grab the new version today.

Thank You Swift Talk

I woke up this morning to an email that I did not expect, Swift Talk from the guys at objc.io is ending its run at 500 episodes.

I’ve been a subscriber since its inception, and while I tend to come in and out of their series I’ve learned so much from them over the years to see it come to an end is really sad.

So I wanted to at least say publicly, thank you Chris and Florian. Your contributions to the Apple developer community have been enormous. Swift Talk will be missed!

They do end with some good news though:

At the end of the year, we hope to make the full Swift Talk archive available.

Coming Soon to Arborist and Baseplate

I’ve been hard at work on updates to Arborist and Baseplate recently and wanted to give a preview of what’s coming up.

Arborist 1.2

The list of things for Arborist 1.2 keeps growing and I think it’s about ready to release. I’ve been building a help section to the Taphouse website and writing Arborist articles based on some feedback questions I’ve received as well as the typical “getting started” kind of things. I think finishing out that part of the website and adding the actual link into Arborist’s help menu is the last thing I have to do.

Release highlights:

  • I built a new feature where Arborist will recognize a Makefile or a mise configuration and import those tasks to run right in the app. I used to be a big make user but migrated to mise a couple of years ago and it’s become a key part of my workflows. Having those tasks right in Arborist has been amazing. If you’d like to see an example of how I use mise, here is this site’s .mise.toml file.

  • A feature request that I got was adding a filter to the branch selector popup when creating a worktree. I added support for this too and it’s been super useful in my day-to-day as I’m making new worktrees. This one was fun because it gave me a chance to drop down to AppKit and wrap that in a SwiftUI representable view.

  • I took inspiration from Rogue Amoeba and made the “Update available” indicator appear inline in the status bar – at the bottom of the window, but there really wasn’t room at the top when I tried that thanks to the unified toolbar – and I really like how this turned out. It stands out just enough in both light and dark modes.

  • I had been fighting with SwiftUI and SplitView to the point where if I moved the inspector pane’s size too much I would get crashes, so I had to restrict the sizes of the sidebar and inspector. No longer! I have changed the main window structure to AppKit and am using NSSplitViewController to power it, and the feel of the app is just so much smoother now.

There’s also a bunch of bug fixes especially around cancelling commands (thanks to the updated swift-subprocess library) and other things that I found bothersome during my regular usage of the app while building my other apps or at my day job.

Baseplate

I acquired Baseplate a couple of years ago now and that has been such an interesting experience. Learning someone else’s code, updating it to be more my style, and adding features there has been fun but also slow going (just look at the update history). But I’ve been hard at work at Baseplate 2.0 and I’m so excited to get this app out into the world.

It’s basically a rebuild of the UI. The current interface is very custom, and worked well in a pre-Liquid Glass world but it started feeling a bit dated to me. So I’ve set out to breathe new life into the app with a massive redesign, but also many under-the-hood changes as well.

  • Baseplate will now sync your collection data between your iPhone, iPad, Mac, and Vision Pro (I’m letting go of the watch app for now). Seeing my data come across from one device to the other for the first time was magic and I hope this feature really lets customers dive in to their Lego collections on all their devices. This took quite a bit of planning and careful migration – I’ve moved to using SQLiteData from the excellent Point-Free folks and it’s been wonderful.

  • The UI as I mentioned is completely redesigned. I’m making your Lego collection the first tab, and want the app to be all about what you have on your shelf and in your queue to build. I’m really happy landing on my stuff when I launch the app now.

  • Next is the Discover tab, which will start out with the familiar list of themes as a starting point but then gives you search right away. I moved the Vision feature to this tab as well as a button in the navigation bar. It’s a very cool feature but I think it is another way of searching for sets so it fits better in this tab.

  • A brand new tab is Radar. This is where your wanted sets will land, and I’m adding sections below those for sets just announced by Lego so you can see what’s on the horizon. There’s also links in all the sets to buy them from Lego.com, and I’m getting product data for sets as well so you can see what sets are available, what are retired, etc. I’m really happy with how this tab has turned out!

I’ve also saved the best for last: Baseplate has a brand new icon that I am in love with. The fine folks at The Iconfactory had a great offer recently to help indie apps remake their icons and I jumped on it. I could not be happier with the result and can’t wait for you to see it on your home screen!

I’m targeting the iOS 27 launch day for Baseplate 2.0, though it may be the end of September. We’ll find out the OS launch date on September 9th 😀.

Maverick Engine Updates

I’ve been hard at work on some updates to my textbundle blog engine Maverick over the past couple of weeks:

  • I’m working on adding a support section to my Taphouse website for Arborist and decided to take a crack at seeing how textbundles could work for that kind of content. It turns out that it works quite well! I’m not ready to roll it out there as I’m building out the articles now but suffice to say that Maverick is doing the job really nicely (and that’s what the 4.x releases were about).

  • I’ve also wanted to bring social cross-posting in-house. For a while now I leaned on the micro.blog cross-posting features to send my posts to Mastodon, Bluesky, and LinkedIn. Micro.blog is fantastic, but I wanted more from how my posts showed up in those contexts and so I added cross-posting to Maverick. This post is the first test of how that all worked, so my fingers are crossed 🤣

I’ve always enjoyed working on Maverick, and since my first post using it 8 years ago I’m really happy with how it’s performed. I love textbundle files too, and I have a Mac app that I’ve been working on for a while that is tailored to that format that I may be able to get polished up enough for release this year. No promises on that though 🙂

So this post is partly to talk about the work I’ve been up to behind the scenes, and also partly to test the cross-posting features of Maverick. Let’s hope things went well on the latter front!

Arborist 1.1 is out

What a whirlwind the last week has been since I released Arborist. I’ve gotten lots of positive comments, and it was amazing to see myself featured on Michael Tsai’s blog, the RevenueCat Engineering blog, and Brett Terpstra’s Web Excursions. Thank you to everyone who has talked about Arborist and helped make the launch special!

Today I’m releasing Arborist 1.1 with support for Grove, a customizable terminal picker, big improvements to iCloud login for licensing, and more.

The first feature request I got for Arborist was support for Grove, which is a tool that I had never heard of but found that it complements Arborist quite nicely. The idea is that Grove can keep your main repo and all the feature branches you’re working on grouped together in a top-level directory, with an optional .groverc file that can define things like branch name prefixing and a set of commands to run when creating a new worktree. I think this would be especially helpful for me since I have a monorepo with mise as my main task runner, and Xcodegen as my project generator. I could see using Grove to have Arborist automatically run mise trust and xcodegen to get my new checkout up and running automatically. It’s been a really fun tool to learn about and I’m really happy with how its integration came together in Arborist.

Another feature request was for being able to customize the terminal application opened when resuming a Claude Code chat. Arborist 1.0 only supported the built-in Terminal.app, and 1.1 adds support for Ghostty and iTerm2 as well. I looked into Prompt support because I love Panic’s apps but it doesn’t appear that there is a way to open a new Prompt window to a location on the file system.

The other major feature that I’ve been able to ship is something I mentioned in my licensing blog post about iCloud. In 1.0, Arborist leaned on the Mac having a logged-in iCloud account in order to purchase a license. In 1.1 I’ve been able to add a web login to any iCloud ID (iCloud is still required to buy) so that you can use Arborist on a Mac that either has no logged in iCloud account or has an account other than the one you bought a license on. This has been helpful to me with my Adobe-issued work machine; once I logged in to my personal iCloud account in Arborist my license instantly activated, which is exactly what I was going for.

I’m very happy with how this release turned out, and there’s more in this release too – bug fixes and smaller tweaks – that you can read about in the full release notes.