Phoenix Slides Lives!

I’m happy to announce that a new version of Phoenix Slides has been released!

The main new feature is undo (if you accidentally move the wrong thing to the trash, or accidentally move 100 files to the Finder, you’ll be able to undo that right away… just do it before you close the window or end the slideshow). But a lot of other problems/bugs have been fixed, including some longstanding issues that have been bothering me for years, some since the first release.

It’s funny how not having to carry around a power brick makes computering so much easier and inviting. (The M2 MacBook Air is quite possibly the best laptop I’ve ever owned, by the way.) What started off as “let’s fix this macbook notch issue” ended up being an almost month-long rewrite of a lot of the basic code underlying Phoenix Slides. I would start with some innocuous-looking change, only to discover crashing bugs that demanded fixing. On top of that, Apple keeps deprecating older APIs every year, so even if all you’re doing is compiling the app it’s still a moving target. Even compiling the exact same code on a newer system can give you different behavior. My favorite example is this one, where my commit message was “comply with secure restorable state (required when compiling on macOS 14)”:

As it turns out, the reason why windows were losing their saved state across launches was because of a change enforced for all apps compiled under the latest os (macOS 14). Apparently a couple years ago it was discovered that malicious actors could use a process injection attack to potentially elevate privileges to root and execute arbitrary code by messing with the saved state files:

Luckily, Phoenix Slides does not have any specific entitlements (which would allow such privilege escalation), but regardless, I still had to make the change to implement secure coding. The fix seems short and easy in retrospect, doesn’t it?

However, developing on the latest version of Xcode/macOS is not all headaches. The best feature of Xcode 15 is quite possibly the new strings catalog feature. Instead of rolling your own strings/stringsdict files for localization (and proper plural rules), Xcode now does it all for you in a nice user interface and exports/backports to the old file formats so it still works on previous systems. It’s also nice to finally take advantage of things like NSCache so my memory usage doesn’t balloon to ridiculous proportions.

The most important thing codewise is that I think I’ve finally addressed all the concurrency issues that may have been causing random crashes. Concurrency is hard.

I still have a long to-do list for Phoenix Slides, so hopefully I’ll be able to turn to that next now that I’ve gotten the codebase more stable!