Spent some time reworking pilky's Coppice for the new design language, moving the symbology to SF Symbols, trying to get glass in the right places, patching out all of the old licensing system. It's hard enough porting your own app, nevermind somebody else's vast codebase, but I'll get through it eventually 🙂
We talked for years about bringing Coppice to iPad and the App Store, but those plans just kept getting punted as the short-term todo list got longer. And with new OS redesigns and frameworks being a moving target, there's a lot of investment needed just to tread water, so I expect this to be a long-term project
Coppice is a pretty complex AppKit app, about 70,000 lines of code, with plenty of NIBs and lots of Combine. Finding every nook and cranny in the app that needs a redesign for Liquid Glass, figuring out where it is in the codebase, and how it interacts with everything else, would be impossible without Xcode's 3D layer visualizer. On top of that, the data model is broken in the last set of commits, so I have a lot of spelunking ahead of me just to get it working again. Making progress though
Here's a before/after of the empty Coppice UI so you can see the changes I've made so far, and the nature of my redesign
We're getting somewhere with the design. AppKit has a lot of rough edges with Liquid Glass, and it doesn't seem like they've bothered to update Interface Builder for any of the recent control styles either, but it's been an interesting challenge nonetheless
Problem of the day revealed: M3Data's plist parser was stumbling on 1s and 0s being interpreted as bools instead of their actual number type. Quick fix deployed, and now Coppice opens documents again 🥳

Another reveal: NSToolbar's .flexibleSpace doesn't provide progressive blur by default, but .space does 🤦‍♂️

All in a good day's work.

If you want to see how Coppice was built, pilky's dev livestreams are still up on YouTube, with hundreds of hours of AppKit and related discussion. As we approach a year since his passing, and as I prepare a significant update to Coppice, it's kinda nice to revisit them

https://www.youtube.com/@mcubedsoftware/videos

Coppice

Coppice is an app for the Mac that lets you collect your thoughts and ideas, link them together, and visually lay them out on an infinite canvas. Coppice is developed live on Twitch, with VODs put up on this channel afterwards.

YouTube
Putting a significant amount of work in while I wait for App Review; not gonna be shy about changes to Coppice — there was a lot I wanted to add to it even before it was passed to me, like quality of life additions, interaction and terminology changes, and more. I'm seeing how much I can get away with without digging a hole for myself; this week I'm the AppKit whisperer
Bringup of Coppice 2026.0 so far: 317 changed files, 2041 additions, 8575 deletions

I had often asked for color pages in Coppice, but it was always on the back burner behind a lot of other pressing todo list items. So I figured I may as well dig in now and see if I could do it myself

~several hours later~

Related: IB autolayout can go IN THE BIN 🚮

👨‍✈️ What I'm currently working on in Coppice is now available on TestFlight if you're running macOS 26 or newer. I would love for some external feedback, as it's a big app with a lot of corners to test and I don't have a pre-existing bugs list

https://testflight.apple.com/join/Z2j1UB3Y

Finding new places to insert NSGlassEffectView
Here's a before and after of the last (final) release of Coppice, and what I've been working on since
There's really nothing in the way of unfinished leftover features in the Coppice codebase. Pilky was a meticulous planner, and would do several rounds of concept mockups and unit tests before touching anything at the UI level. I'm the opposite, I need to get stuck in and try things, so my Xcode projects are all filled with little treats for later — alternate UIs, experiments, etc
Coppice is in a pretty good state now, with just one critical issue I'm aware of before I would be happy to start preparing to submit it to the App Store. It will be free to download for sure, though I still have to figure out how to justify ongoing development and keep the app healthy. I think we all know by now that Mac apps can't survive in this day and age on one-time purchases 😐
Lots of miscellany in my build to build changes now with Coppice. Bigger, more-rounded buttons on the welcome screen. 'Jump to Page' is now 'Open Quickly', composed some new, better SF Symbols to use for some verbs in the app, page titlebars have been realigned and centered, and the page editor background now blends into the window. Also reworked the QuickLook renderer, which wasn't drawing arrows on the canvas
Was reading the @johnvoorhees review of Coppice and it prompted me to build in a little Apple Intelligence feature to automatically name your pages based on their content. Fast and helpful even on an M1

I think I found my critical issue in Coppice, and it's due to NSTextView downgrading from TextKit 2 to TextKit 1 if you access .layoutManager on macOS 26 😅 It isn't triggered by apps built with an older SDK.

It seems like setting (the private) NSTextViewAllowsDowngradeToLayoutManager=NO completely fixes the issue?

This might be a problem I need Apple input on…

Props to Codex for pointing me to the problem location (in this 70Kloc codebase), but actually debugging the issue required digging through AppKit and UIFoundation in Hopper. Codex looped me round in circles with multiple superficial fixes, that worked, but left the underlying problem, so I threw it all out.

AI can do many things, but it can't replace a developer with deep platform knowledge

I've pushed this build of Coppice with the list style bugfix to TestFlight; there are still other bugs with paragraph styles but that's a job for tomorrow. This version of Coppice is drawing very close to release
Powering through the last remaining issues in Coppice. I think the last thing I have to do now before a release is rewrite all the documentation 🥴 It has felt like a herculean effort getting this up to speed, but we're there now
What do you /meaaan/ all you do is insert a StoreKit SubscriptionStoreView and it does all the work for you and you're done?
Still reeling over how easy StoreKit makes this look, but OK. I think this is how I'm going to handle 'monetizing' Coppice. Completely optional, same price as the original Coppice Pro. It's there if you want to make ongoing development possible, and you can completely ignore it if you don't. It's a bit more formal than a tip jar, and honestly I'd like the app to live on forever healthily
Polishing the last few things in Coppice before I start posting release candidate builds. It has a beautiful new version of the icon from @matthewskiles, too 😄
Need a closeup of that @matthewskiles icon, though. Just look at that thing 🤤
Having to rewrite everything in terms of TextKit 2 is causing a cascade of other issues and is really trying my patience. Who decided this was a smart thing to do when targeting macOS 26? 😐 Dealing with a UI redesign is bad enough, but a complex rich-text layout rearchitecture on top is too much
Made it through my final bit of UI in Coppice, so I can start crafting marketing screenshots and testing the waters with App Review 😄
@stroughtonsmith not sure I understand, is TextKit 2 required with macOS 26 or did some internal behaviour change?
@stroughtonsmith You're doing great work! 👏🏻 👏🏻 👏🏻
@stroughtonsmith All credit for that amazing pen goes to Martin. It was truly a genius idea, I never would of come up with on my own.
@stroughtonsmith @matthewskiles look, no liquid glass effects 🥂 great job preserving Martin's legacy

@stroughtonsmith love that approach. There’s something pretty elegant about signaling clearly what the app “should” cost and make it recurring, even if you’re willing to giving it away for free. It’s also fully reversible, which is nice.

I guess the only downside is the App Store listing saying that the app includes IAP which might spook some folks but probably worth the trade-off.

@stroughtonsmith Do you have to give the AI 30%? 😉
@stroughtonsmith I'm about to implement subscriptions for the first time and I'm eager to hear about all your experiences with this. I want to do as little transaction handling as possible 👀

@stroughtonsmith Seriously?

Is there a mechanism for one-off purchases and things like receipt/purchase verification?

Damn, the times they are a changing. 🤔

@stroughtonsmith “And its cross platform too! It looks great on iOS, iPadOS, visionOS… oh no… tvOS… don't tell me they did you dirty like that…”

@stroughtonsmith I’ll admit I only just now “saw” this and… this is an unusually American screw up and also… there is a solitary letter “p” between the words but still:

This app name containing both the words “Cop” and also “ICE” seems a bit unfortunate at this particular moment in time.

Obviously no one’s fault by the current administration but I figured I’d mention it anyway because I’d want to know were I you.

Man, things really suck lately. :(

@stroughtonsmith Boy, I could tell you some things about that view, and how much time and energy I’ve spent fighting bugs in it (most of which have not been fixed, despite years-old Feedback reports with sample projects).
@siracusa are its issues lessened when I don't have to support older OSes?
@stroughtonsmith They’re lessened if you only support the very latest OS version, but that means, like, 26.1 and not 26.0. It’s maddening. (Also, don’t try to put it in a sheet or tab view or any other “unusual” (hah) context.)
@stroughtonsmith Try asking the AI to create your documentation (and help files!)
@stroughtonsmith did you try Hopper’s MCP? I wonder if it could use it to solve stuff like this
@Lapfelix Codex is slow enough before adding Hopper into MCP 🤣
@stroughtonsmith treat it like an email correspondence 🤪
@stroughtonsmith if it goes in rounds, I always ask it to put debug logs into the code to verify its assumptions. 90% of the time the assumptions are wrong. I run the app and just copy-paste the logs and it always manages to fix the bugs in a few rounds.
@stroughtonsmith it’s a sneaky one 😅 “if your app accesses textView.layoutManager, it will revert the text engine to TextKit1, disabling Natural Selection and other features. If you need to use layoutManager, please use textView.textLayoutManager, which is the layout manager for TextKit2”
https://developer.apple.com/videos/play/wwdc2025/222
Enhance your app’s multilingual experience - WWDC25 - Videos - Apple Developer

Create a seamless experience for anyone who uses multiple languages. Learn how Language Discovery allows you to optimize your app using a...

Apple Developer
@jordanhipwell which of course isn't an NSLayoutManager and doesn't support the same APIs
@stroughtonsmith THIS is the kind of AI/LLM features that make sense.
@stroughtonsmith please don’t say “even on an M1”, I remember they were so fast 😭😭😭@johnvoorhees
@cloudthethings @johnvoorhees it's gonna be six years old this year!
@stroughtonsmith @johnvoorhees that is vaguely terrifying - I have to admit, both my M1 iPad Pro and my M1 Max MBP are doing absolutely fine for all my needs. I suspect I’d feel it a lot more if I used Apple Intelligence for, well, anything much at all, or the iPad for more complex stuff.
@cloudthethings @stroughtonsmith Yeah, my M1 Max Mac Studio is doing fine too but every so often recently I run into something where it seems to struggle a little and I start to get the itch for something faster.
@stroughtonsmith The thumbnail view sidebar on the left is kinda blending in with the overall mindmap background. Could you maybe turn up the brightness on that a little more? Or is this a Liquid Glass moment
@AnimeAndVisial I kinda like it more subtle, I’d rather not have so many distinctly-colored columns
@stroughtonsmith I’d recommend to soften the background colors more. A more muted color should improve legibility. The saturated colors make the black text hard to read, even more so the links.
@stroughtonsmith I keep hearing negative things about Tahoe’s design (ATP, cough). But it looks just stunning in your comparison
@simsaens doesn't come free! I am very happy with how this is shaping up, and I'm fond of Pastel on Tahoe too. I think Liquid Glass can look gorgeous, when the stars align
@stroughtonsmith done! Is it fine to use the usual TestFlight feedback channels, or do you prefer something else?
@juandesant those'll work, or use the contact support option in the Help menu
@stroughtonsmith I was asking about preference because some developers find TestFlight’s feedback hard to use. I guess I will make a choice based on the actual feedback to be provided.
@juandesant TestFlight feedback is indeed a bit of a pain, and Apple deletes it after a period; email is more permanent
@juandesant @stroughtonsmith they added webhooks recently, which alleviated one of my major pain points: getting notified when there’s new feedback. I always forget to check for it.