when you can’t update macOS so you run macOS in docker just so you can support macOS before you decide not to support macOS

a screenshot of macOS Ventura running on Linux using Docker/QEMU

Unity is a tool I really dislike using, but it does something that I really appreciate: it makes it easy to build your game for a wide variety of platforms. Really easy. So, when I decided to finally release a game I made called Gender Dysphoria on Steam, it felt like a no-brainer to also release the macOS build there just like I did on itch.io.

However, in order to release a macOS build on Steam you’re required to sign the app bundle. I didn’t do this for itch, but not signing your application means that users are warned that the application they are about to run is insecure. This is probably why Steam requires it. I had never done the signing before because I remembered that doing so was annoying. But, surely, I could suck it up and deal with it for a Steam release?


As far as I know, in order to sign an application you must run XCode which can only be run in macOS. Fortunately, I’m in possession of a 2014 Macbook Air that I got when I was in college. It was my first Apple product and I used it a lot, using the quaint 13” monitor to make games in Unity to the almost universal terror of my dual-monitor loving friends and coworkers. The UX didn’t appeal to me (quite the opposite, honestly) and its lack of interoperability and insistence on being a walled garden really rubbed me the wrong way. It is the first and last Apple product I’ve ever bought and I would like to keep things that way. Anyway, I figured that I could just update the Macbook Air to the newest version of the operating system, install XCode, and then sign the application, no problem!

I spent a very long time trying to figure out how to update the computer. The system was using up a lot of hard drive space for mysterious reasons, so I first had to learn how to do a fresh install so I had enough hard drive space for the 44 GB update. Then I had to actually do the update. This frankly took basically forever, time which I spent trying to read Apple’s fascinatingly poor documentation on how to sign apps using XCode while the computer did its thing, but even after it was complete I ran into a wall.

You see, unfortunately I’m in possession of a 2014 Macbook Air. In order to install XCode, you must be running macOS Monterey or newer and Apple dropped support for my device in Monterey. I can only update the computer to the version right before Monterey, which is Big Sur. The computer runs perfectly fine still on Big Sur and can still do many computing tasks perfectly fine, but Apple simply won’t let me update because they dropped support for my device. This sucks and the cynic in me wants to shout “planned obsolescence” or at the very least “irresponsibly wasteful”, especially since there are ways to get around this limitation.

I love computers, but I’m not about to buy a new Apple computer that I’m not going to use for anything other than to just sign one app. I started to wonder if maybe there are better ways for me to get around this problem. One that doesn’t require me to own a particular kind of computer and has no cost. Can I just run macOS in a VM instead? Well, in order to run a VM, I need to have the image of the operating system. Sure, that should be easy enough. However, as it turns out, Apple won’t let you download an image of their operating system! They have a page where it seems like you could, but it only lets you grab images up to Sierra. Newer images, including Monterey, are just links to the App Store. Huh, what a weird way to do things. I’m not sure what to do anymore… Oh wait, Docker exists! Docker exists!!!

After some searching, I found out that someone has done all of this already over at github.com/sickcodes/Docker-OSX. It uses QEMU and another project called OSX-KVM, whatever those things are, to run the operating system. They even provide pre-built images for recent macOS releases including Ventura. This is great! I spend a few more hours setting these Docker containers up, but macOS is a whole desktop experience so the containers end up being really big and it takes an impressively long time, which I spend trying to understand the still-inscrutable Apple documentation on how to sign apps using XCode.

Eventually, I finally get logged in to the newly installed operating system, get XCode installed, and spend another evening trying to figure out how to get files from my computer onto it without having to bounce them through the internet. Nice! This is great! Really great! I’ve got Gender Dysphoria loaded into the container and I’m finally ready to figure out how to sign apps in XCode, all while using my Linux desktop. Very exciting!✨

Looks like I need a certificate next and apparently you need to register a developer account to do that. No problem, looks like there’s a registration form I’ve got to fill out and…

the last step in the apple developer program enrollment process, which asks the user to purchase membership for 99 USD per year

It costs 99 USD/year? Ah, fuck. Forget it, I’ve jumping ship to escape the sunken cost fallacy. 💀