I ported Mac OS X to the Nintendo Wii(bryankeller.github.io) |
I ported Mac OS X to the Nintendo Wii(bryankeller.github.io) |
EDIT: Oh interesting, the final paragraph says NT has been ported, didn't know that. Sadly, no pun is mentioned in that project.
That's the hacker spirit.
This is exceptional work. Unlike the low-effort slop posts I see here on "Show HN".
The build-in-public era of hacking has really turned this field into an influencer economy.
I'm not an LLM post hater, but it definitely has been a bit draining lately. This is exactly what I love to see here.
Well, okay, that's almost cheating.
Yes, I know about Ardi Executor being libre and enhanced now, but that's not the point.
I'd love to spawn MiniVMAC with a free system ROM replacement and a free Mac OS 7 reimplementation.
Frustratingly, though, they haven't released any source code yet.
https://www.v68k.org/advanced-mac-substitute/
What I would like to see it's the full OS reimplementation a la AROS m68k.
There are Minivmac ports for 9front. Exegutor it's made in C++, so no way to compile it with NPE (micro-POSIX compat layer for 9front). If anyone had that under MiniVmac, it could run everywhere.
On Advanced Mac Substitute, as it has an SDL2 interface, it can be almost done unless it's written in C++. If it's ANSI C or C99, it might run under 9front.
https://github.com/Wack0/entii-for-workcubes
See also: https://gbatemp.net/threads/windows-nt-ported-to-wii.667959/
As for which part was the most challenging... probably understanding the IOKit driver model. I really would have benefitted from having an expert explain some of the concepts to me, and give me some advice about how to structure my own drivers.
> There is a zero percent chance of this ever happening.
Similarly, "zero mention of AI" is just a surface-level observation that says nothing about how the project was completed and everything about your own insecurities defining the word hacker.
I've never seen a device with a YUV frame buffer before. What else has one?
I wonder if the YUV conversion could be offloaded somehow to the ARM inside the Hollywood or somehow using a shader (or equivalent) if the graphics were accelerated - though maybe this is way way too much.
YUV appears to be a PAL-specific color space. I wonder how off an NTSC Wii would be. Presumably it would have the wrong color space until an equivalent conversion scheme was devised for NTSC.
I was surprised to see regional color spaces leak into the project, but I presume that Nintendo's iOS (the coincidentally-named system this is replacing) could handle that abstraction for game developers.
The Wii seems to actually use "YUV422" internally, so 4:2:2 chroma subsampling, where the chroma is only halved in one dimension. The conversion to analog NTSC or PAL signals happens later in the process. The repository here actually looks like it sets up the Wii's video interface to output NTSC progressive by default, but lets you configure for PAL with a config file.
Thank you for all that you do.
Kudos to the author for being able to do make real progress in such a hostile (IMHO) environment.
Much easier to do, because of the superior, more modern architecture of Windows NT. (It's not based on Apollo-era OS like OSX is.)
Always great when your debugging feedback is via a led xD
https://web.archive.org/web/20050828114013/http://www.ipodli...
EDIT: also, I just noticed on a second pass the system is addressing 78mb of ram, potentially meaning the ram spans the gddr3 and sram, I'm amazed this works as well as it does with seemingly heterogeneous memory
I kind of want to try some project like this sometime, but I wouldn't even know where to start...
> At this point, the system was trying to find a framebuffer driver so that the Mac OS X GUI could be shown. As indicated in the logs, WindowServer was not happy - to fix this, I’d need to write my own framebuffer driver.
I'm surprised by how well abstracted MacOS is (was). The I/O Kit abstraction layers seemed to actually do what they said. A little kudos to the NeXT developers for that.
With that said, I haven't developed drivers for any other platforms, so I really can't say if the abstraction is good compared to what's used by modern systems.
That said, indeed, the abstraction layer here is delightful! I know that some NetBSD devs managed to get PPC Darwin running under a Mach/IOKit compatibility layer back in the day, up to running Xquartz on NetBSD! With NetBSD translating IOKit calls. :-)
Steve was not a developer but he made it his business to care about what they cared about.
But that's a hazy, 20 year old memory.
Usually the difference between something being well-abstracted vs poorly-abstracted is how well it's explained.
You might also be interested in this similar work: Installing Mac OS on the Nintendo Wii [video] (123pts, 37cmts): (https://news.ycombinator.com/item?id=37306018)
The author has mentioned earlier attempts to port other OSes to the Wii but it appears these works didn't get much traction here on HN except for Windows:
WindowsNT (255pts, 86cmts): https://news.ycombinator.com/item?id=43221633
Linux (53pts, 1cmts): https://news.ycombinator.com/item?id=30568676
NetBSD (4pts,0 cmts): https://news.ycombinator.com/item?id=46668959
Lastly, since we are in the context of turning the Wii into a computer, I'd like to honorable mention: Hosting a blog on the Wii (622pts, 104cmts): (https://news.ycombinator.com/item?id=43754953)But man, this is way ahead of what I could do. What this dude accomplished blew my mind. Not only the output (running MacOS on a Wii), but the detailed post itself. A-MA-ZING.
TIL Wii has only 88MB of RAM. Fortunately games weren't electron-based.
We truly had to get away with less back then. These days it feels like there is a bit more headroom where 8 GB is on the downtrend, 16 GB is becoming the most common, and the user's apps are enjoying the extra fat.
At $349, it was almost a fully functional laptop that runs on Mac OS X (comparing to over $1000+ MacBooks or $1599 MacBook Pros)
Two friends of mine literally working remotely in an Africa trip with Dell Mini 9 and mobile hotspots and were doing video conferencing with Skype (on Wi-Fi).
While the updates would break things, it was not more complicated than a Linux of the mid 90s to set up, especially with “hackintosh distros” like iDeneb. Surprisingly ok, given the anemic machine!
Before figuring out how to tackle this project, I needed to know whether it would even be possible. According to a 2021 Reddit comment:
There is a zero percent chance of this ever happening.
Feeling encouraged, I started with the basics: what hardware is in the Wii, and how does it compare to the hardware used in real Macs from the era.
I LOL'dBack in the old days, it was REALLY easy to initialize VGA and throw pixels around in ASM, C, or C++. The 6502 and related chips were relatively easy chips to build stuff for, even though tooling was non-existent. Shoot, you could do some really awesome things on a Tandy CoCo2 and BASIC of all things.
It feels like engineering has made this type of thing inaccessible. Most systems require a ton of knowledge and expertise. There is no easy 'in' for someone with a special interest in development. Even worse, AI is artificially dumbing things down, while making things even more inaccessible.
Godspeed.
Are there one or two instructions that aren't available ?
I guess it might be possible to trap and emulate those?
A side note: you embedded .mov videos inside <img> tags. This is not compatible with all browsers (notably Chrome and Firefox), which won't load the videos.
It’s interesting because we don’t often think about OS-level abstractions in the same way anymore — but projects like this really show how powerful they are when they’re done right.
Makes me wonder how feasible something like this would be with modern systems, where things feel more tightly coupled and security constraints are much stricter.
Amazing writeup, love this types of blog posts and hope the hawaii trip was enjoyable
Xcode is definitely not perfect, but it's IDE I'm most used to, so I ended up doing my most of my editing in it.
Now that the MacBook Neo has an A18, I wonder if you could get MacOS running on an iPhone? :)
> In the end, I learned (and accomplished) far more than I ever expected - and perhaps more importantly, I was reminded that the projects that seem just out of reach are exactly the ones worth pursuing.
Couldn't agree more. I've had my own experience porting something that seemed like an intractable problem (https://news.ycombinator.com/item?id=31251004), and when it finally comes together the feeling of accomplishment (and relief!) is great.
If you like this story, you might also like the story of how Mac OS X was ported to Intel as well.
Not to distract too much from the main topic, but what do you think about the Hopper disassembler? I have only used Radare2, IDA Pro, and Ghidra. Though, I haven't used the latter two on MacOS. What do you prefer about Hopper? I have been hesitant to purchase a license because I was never sure if it was worth the money compared to the alternatives.
I like using it for disassembling UIKit (for my day job working on iOS apps), and overall, I like the UI/UX and how it feels like a native Mac app.
I've tried Ghidra, and while extremely impressive and capable, it might be the most Java-feeling app I've ever used. I'd love for someone to whip up an AppKit + SwiftUI shell for it.
You are correct about the UI/UX. I do think Hopper is ahead of others in that regard. Though, Radare2 being a CLI tool is nice as well. Though, I haven't attempted to use Radare2 for MacOS/iOS disassembly. Though I must ask, why are you disassembling UIKit? Looking for private API behavior or working around bugs? I've been learning more about iOS in my spare time, because despite my love for Swift, I have never used it for iOS. I only have used Swift for MacOS automation, i.e., AppleScript replacement via the Accessibility, Core Foundation, AppKit, etc..
> Ghidra, and while extremely impressive and capable, it might be the most Java-feeling app
I chuckled while reading this because I had the exact same thought when I first used Ghidra. I haven't tried Ghidra on MacOS because I will not taint my machines with the impurities of Java. I also do not want to enable Rosetta, so that was another obstacle in trying Ghidra on MacOS. In Ghidra's defense, using Java was a pragmatic choice. The "write once, run anywhere" promise of Java is likely a near-necessity for a disassembler for government operations.
Surely, it must be a better option than Linux if you want to get the most out of a PC computer? At least for 10 more years.
I'm not sure why it would. Why would anyone want to hack on different proprietary software with no supplier support and whose days are clearly numbered (Apple's move to ARM)?
For usability I mean. It's clearly an interesting technical feat.
So to have a fully fledged and more usable computer, for those who don't want to purchase the Apple hardware.
And the latest Mac OS still supports Intel, so you'll get many more years out of a machine. For what I know, the last 10 versions of MacOS are still very usable.
Honestly, I would have said the same. Great work!
I can't imagine trying to program on a laptop with an external device, even something as portable and small as a phone, on a plane. I expect my frustration and frequently bumping things about would mean I'd get nothing done aside from having a bad time.
Although if it were me I'd probably annoy the heck out of him asking why he had a Wii on the airplane!
Can’t wait for his sequel “I received a Cease and Desist Letter from Apple; Feeling encouraged, I registered the trademark ‘Wii subsystem for macOS’”.
I mean, you need WiFi, and that's definitely a roll of the die on flights. But the last flight I had had WiFi, and the gal who sat next to me was vibe coding something.
Meanwhile I was taking photos of the seat back infotainment system's map, which showed our ETA as being before we left. Sadly, we did not time travel.
There are definitely no buses that wide.
That being said, that is absolutely amazing they brought a wii where ever they were going to write and debug this while traveling! That is dedication!
EDIT: nvm, there are multiple pictures of them traveling. First one looks bus like, second one look like an airplane.
Once he showed he went to Hawaii my idea made slightly less sense.
My favorite was “it’s impossible to know which DB is failing from a stack trace”. I created STAIN (stack traces and instance names): a ruby library that would wrap an object in a viral proxy (all returns from all methods are themselves proxies) that would intercept all exceptions and annotate the call stack with the “stain”ed tag.
It is not possible to add BLE or WiFi at this time to the MacroPad.
Oh yeah, really? There is a port hanging off the side that can be reconfigured for UART, are you sure Adafruit, what if I add an ESP32?[1] https://xdaforums.com/t/how-do-i-port-pocos-miui-camera-to-c...
[2] https://xdaforums.com/t/anxcamera-closed-on-xda-only-16th-fe...
To me, it was obviously possible, and I was determined to prove them wrong.
Anyway, this now exists because of that: https://github.com/bfirsh/jsnes
> - Everything is magenta.
was fun too
My favorite part of our online world.
Plus the internet basically equates cynicism with intelligence
There is somehow no concept of "ignorant cynicism"
This is a generally known phenomenon in psychology. If you leave a book review saying that you liked a book, people are biased to believe you are stupid. If you criticize a book negatively people are biased to believe you are smart.
>Go ahead and downvote me. I am correct on every single thing I said
> The Wii uses a PowerPC 750CL processor - an evolution of the PowerPC 750CXe that was used in G3 iBooks and some G3 iMacs.
Hilarious.
This isn't that ironic - reusing old names where the trademarks are already owned etc is a pretty common thing.
Exactly this!
Impressive work! Now run Dolphin on it. ;)
For some reason, though, it means that people overlook how NeXT’s hardware was _very_ far from fast. You weren’t going to get SGI level oomph from m68k and MO disks.
[ ](image_url.png)
(Of course, I can also right-click and do "Open image in new tab", but that's one click extra...)
Congrats on the awesome project, BTW! You were lucky that I wasn't sitting next to you on the plane. I would have wasted so much of your time asking dumb questions.
P == NP && P !== NPFunny enough about the Dropbox comment, it caught so much flak that it’s gone full circle and I’ve often found people defending it saying what the guy said made sense at the time etc
I guess Reddit is just less empathetic than HN
There is an attempt to clone the functionality of the gamepad ongoing that's somewhat usable: https://github.com/vanilla-wiiu/vanilla
I dual-booted Mojave on 2 Wintel machines back during the Clover bootloader days, I could only tolerate it for ~2 weeks before giving up. Spoofing OEM Apple hardware is basically impossible, even with configuration-matched CPUs your motherboard will still mismatch the ACPI overrides that macOS expects. Any variety of modern GPU is basically forfeit, hardware acceleration is flaky, Metal is inhumane (with or without Hackintosh), CUDA is unsupported, Vulkan is MIA, filesystem support is a joke, and OTA updates have to be disabled or else your system volume will overwrite the partition table and erase everything that's installed. Reinstalling from scratch can take multiple days if you don't back up your EFI configuration, so you really want to avoid bricking your install while you tweak the configs to stop being broken.
Even as a developer, using a Hackintosh was a waste of my time back in 2018 when "everything was supported". In 2026, I cannot comprehend a single objective reason why you would use an x86 Hackintosh instead of a better-supported and more fully-featured Linux or WSL installation. x86_64-apple-darwin is a partially depreciated target triple that's not suitable for any macOS or Linux development work, and for prosumers the architecture is already unsupported by many professional apps. Hackintosh is a museum piece now, even OpenCore can't save it: https://blog.greggant.com/posts/2025/07/16/open-core-is-dead...
About the other things you mention: What do they mean in practice? That video games don't work, or that photo/video editing doesn't work?
How does filesystem support differ from MacOS installed on a Mac?
From what I understand your comment is only from the perspective of a developer? But there are many other uses for a computer.
I'm writing from the perspective of a tech-savvy Windows user that had triple-boot working on my desktop and laptop. I'm willing to deal with some system configuration, but it took upwards of 12 hours to configure my EFI for each unique device I wanted to Hackintosh. And it still didn't fix my iCloud or get my laptop trackpad working.
That is an entirely unacceptable process for someone who isn't a developer. I cannot recommend anyone use an OS that blocks OTA security updates, let alone people that can't/don't/won't program.
The OS only only has one large source of memory it uses "optimistically" - the file/buffer cache. But that's tracked separately, so it doesn't show up in normal memory usage numbers (unless you don't know how to read them).
The other source of "extra" memory usage is memory mapped executable files, which can be unmapped and then read back on demand. That's quite small though.
Everything else (mostly) is actual memory usage caused by actual drivers and programs (though it can be swapped, but that's a major perf hit).
The major reason for Windows memory bloat is the hundreds of inefficient services from both Microsoft and hardware vendors that run at startup. The "optimization" pool (let's not call it that way) is way smaller than that.
eg. pre-loading an application is a pessimization if there's not enough memory - not only does it permanently eat away a portion of the total memory due to the intricacies of Windows working set memory management, it will need to be swapped out when actual demand for memory arises, competing with other disk access.
The only actual "optimization" in Windows is Superfetch, and that barely works these days.
Nevermind, wasn't hard to find: https://www.reddit.com/r/wii/comments/1sfzacl/porting_mac_os...
But if you follow a guide from somebody who has hackintoshed the exact same device you have, then it shouldn't take that long, or am I missing something? The posts in the hackintosh subreddit generally details what will work and not work.
I had been under the impression that DriverKit drivers were quite a different beast, but they're really not. Here's the layout of a NS ".config" bundle:
./CG6FrameBuffer.config/English.lproj
./CG6FrameBuffer.config/English.lproj/Info.rtf
./CG6FrameBuffer.config/English.lproj/Localizable.strings
./CG6FrameBuffer.config/CG6FrameBuffer_reloc
./CG6FrameBuffer.config/Default.table
./CG6FrameBuffer.config/Display.modes
./CG6FrameBuffer.config/CG6FrameBuffer
The driver itself is a Mach-O MH_OBJECT image, flagged with MH_NOUNDEFS. (except for the _reloc images, which are MH_PRELOAD. No clue how these two files relate/interact!)Now, on OS X:
./AirPortAtheros40.kext/Contents
./AirPortAtheros40.kext/Contents/_CodeSignature
./AirPortAtheros40.kext/Contents/_CodeSignature/CodeResources
./AirPortAtheros40.kext/Contents/MacOS
./AirPortAtheros40.kext/Contents/MacOS/AirPortAtheros40
./AirPortAtheros40.kext/Contents/Info.plist
./AirPortAtheros40.kext/Contents/version.plist
OS X added a dedicated image type (MH_KEXT_BUNDLE) and they cleaned up a bit, standardized on plists instead of the "INI-esque" .table files, but yeah, basically the same.https://news.ycombinator.com/item?id=10006411
"At some stage in the future we may be able to move IOKit over to a good programming language"
Remember: there was a short window of time where everyone thought Java was the future and Java support was featured heavily in some of the early OS X announcements.
Also DriverKit's Objective-C model was not the same as userspace. As I recall the compiler resolved all message sends at compile time. It was much less dynamic.
To note that Android Things did indeed use Java for writing drivers, and on Android since Project Treble, and the new userspace driver model since Android 8, that drivers are a mix of C++, Rust and some Java, all talking via Android IPC with the kernel.
Makes me think of how plists in macOS are xml because back then xml was the future
When those fears proved not true, and devs were actually welcoming Objective-C, it was when they dropped Java and the whole Java/Objective-C runtime interop.
They've also been useful more than once, e.g. you can do that to know what iteration of a loop failed. There are of course other ways to do this, but it's hard to beat "stupid, simple, and works everywhere" when normal options (e.g. logs) stop working.