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.
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 😀.
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!
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.
TL;DR: My new app Arborist is now available for download and purchase!
Over the years, as my workflows have evolved, my tools have somewhat struggled to keep up. In any project I work in, I like having multiple checkouts — maybe I’m building a feature, fixing a bug, and doing a code review. Not necessarily at the same time (as there lies madness in the multitasking), but in different places on my drive so I don’t have to stash what I’m doing and restore it later. This workflow evolved from multiple clones to git worktrees. Worktrees are great because they let me create a whole new checkout on my local machine without having to wait for a clone. I love how fast they are, and because they all share a common .git root I can easily move between branches and cherry-pick commits if I need to.
All of this came with a cost I wasn’t expecting as I started accumulating non-trivial shell commands to run in my repo: there’s the Python script at work which pulls binary dependencies, or the long fastlane incantation to make a build, and many others. These commands often require context which works well in a single-tree repo, but when I had multiple checkouts or worktrees I’d have to redo the setup for any location I was working in. I started to wonder if there’s some way to manage all this.
That idea has clanked around in my head for a while and finally I have an answer: Arborist. It’s my new Mac app which lets me take control of worktrees across my system and run any command I want. I’ve been building this app and using it every day for a while now; today it’s available for everyone running macOS 15 and above.
I’m really happy with how Arborist has turned out. It’s chock full of features:
Drag and drop your git repos and it automatically picks up all the associated worktrees and lists them right in the sidebar. The current branch is displayed right under the worktree name.
Rearrange and collapse sidebar items to get things organized just the way you want.
Create and delete worktrees with ease. Tower added worktree support a while back and while I have used that feature I haven’t loved it, because it feels like adding a whole new repository. I wanted to make worktree management seamless, and that’s just how it is in Arborist. Also, AI agents love to use worktrees but they name them the same as the repo so I’ve been stuck at times with 3 or 4 identically named locations and I don’t know why each of them is there. I can take the power back with Arborist.
The middle column is the superpower:
The commands area stores any terminal commands that you want to run in your repo, and they’ll work across checkouts. I use this for both quick and longer tasks and it’s the killer feature of the whole app in my view. There’s a small console that pops open and shows the terminal output in real time. It’s fantastic!
Tools – at the top of the column – are the apps that you use no matter which repo you’re working in. I’m a big fan of Panic’s Nova for my non-Xcode projects, and I want to be able to open any worktree in Nova with a single click. Arborist lets me do just that.
The shell environment that both commands and tools run in is fully customizable in Settings, and you can see the environment variables that Arborist uses to run commands and launch tools.
The inspector pane on the right side gives me details about the checkout I’ve got selected. The best part about it is the conversation recall for that worktree so I can see the sessions I’ve had with Claude or Codex.
Clicking on a conversation launches you right back into that conversation. This proved really valuable to me when I couldn’t find a conversation in Codex but I could resume it in Arborist.
The sessions are discovered by reading the local files in their known locations, and no data about these conversations ever leaves your machine. Arborist is 100% privacy-focused.
I’ve worked really hard to make Arborist Mac-Assed as well, with good keyboard support and a squircle-free alternate icon to boot (I freaking love that icon and use it myself on my machine). I’ve loved the Mac platform since the early ’90s and I want to make a Mac app that Mac people will love to use.
In my last post, I wrote about using RevenueCat for my licensing. I’m really happy with how that turned out, and I think the ease of tying a license to an iCloud account will make for incredibly smooth transfers to new machines.
Arborist comes with a 14-day free trial, and after that costs $39 for a full-feature license to v1 and all the updates in the v1 family. If and when a v2 comes, there will be a discount available to v1 owners (I don’t know when a v2 will ship, that’s all way in the future at this point).
I hope you give Arborist a try and that it helps you take control of your workflows.