Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

Dt990

macrumors member
Original poster
Jan 24, 2020
75
35
Oregon
Hey all working on a guide to retro Mac Development after making a video demoing it. I figured some people like written guides more than video.

imac.png


Retro Mac development thanks to modern IDEs and 'agentic' coding tools, aka AI, makes getting into retro macOS development easier than ever. r Some people inevitably will prefer to do on-device development using period-accurate tools, to experience development as-it-were. I am of the opinion that either method is fine, but this guide will focus more on modern-meets-retro than on retro purism.

Old OS X is fun to develop with, as there are a lot fewer security guard rails, thus removing a lot of the red tape. There's no requirement for signing code in 10.4 and 10.5; more of the system files can be modified, thus making the computer more hackable.


Video version of this which shows off the concepts. It has chapters and doesn't have midroll ads.

What you need:
  • A retro Mac capable of running OS X, network-connected.
  • A modern computer (macOS, Linux, or even Windows)
  • An LLM subscription for agentic code or a similar CLI solution for those who have access to local inference. Claude Code and Chat GPT Codex are both part of Anthropic and OpenAI's $20 tier, with usage caps in time windows, but generally are enough. OpenAI's Codex with Chat GPT 5 seems to yield better retro coding results as of writing this.
Recommended:
  • Basic terminal skills
  • Understanding of version control
  • Extreme basics of programming (Ex, what is a dependency? what is an environment?)

Glossary:

Compiler
: Turns programming languages into machine-readable code. The most popular languages for the web (JavaScript, Python, Java, PHP, Ruby, C#) use what is known as JIT (Just in time) compilation, meaning the code is only converted to binaries at runtime. Traditionally, desktop applications have used pre-compiled code that must be run through a compiler ahead of time. This generates the binaries that power applications. Retro OS X applications are largely pre-compiled Objective-C. Apple no longer includes the compilers for PowerPC and no longer supports older x86 compilers; thus, you need a retro Mac to run a build tool, like CMAKE or Xcode.

Built Tools/Bundlers: Build tools provide instructions for the compiler to create application packages; various OSes have different requirements. Xcode includes a bundler, and CMAKE is a bundler. For "Vibe" coding, in this tutorial, we are going to focus on CMAKE instead of Xcode, as it generally has better support and lowers the friction. Xcode can always be added later to projects built on CMAKE and use CMAKE as its build tool if/when you need the debugging capabilities of an IDE.

IDE - Integrated Development Environment, Xcode is an IDE. Generally, an IDE provides a suite of developer tools in a single environment, such as a source-code editor, a compiler or interpreter, and a debugger.

VNC - Virtual Network Computing, is a remote desktop system that allows users to control another computer remotely by viewing its screen and controlling its mouse and keyboard over a network. Apple's Remote Desktop is powered by VNC.

Setting up your retro Mac:

OS X, being a *nix-based operating system, means its fundamental DNA is similar to modern macOS and Linux. Apple shifted to open-source standards for many core functionalities. Under the hood of every installation of OS X is a powerful Bash terminal, which provides many essentials that we will be using.
OS X 10.4 sys prefs.png


On your OS X computer, set up File Sharing, Remote Login, and Screen Sharing, and make sure it's connected to your network and you have an admin-level account attached to the sharing settings.

Also, you'll need a compatible version of Xcode. Apple still provides old versions of Xcode. Old versions (Need Apple developer account, free version works) click Additional Downloads
https://developer.apple.com/xcode/resources/

Setting up your modern Mac:

On your modern Mac, you should have the following installed: A code editor, VSCode, or Cursor, GIT for version control (GUI applications like SourceTree, GitHub Client, and paid clients like Tower are helpful), and finally your coding agent, depending on your code editor. OpenAI Codex and Claude Code are the current most popular agentic coding tools, but MS also provides Co-Pilot, and Amazon's code editor, Kiro, has direct integration.
Screenshot 2025-10-29 at 4.41.29 PM.png


From the modern Mac you'll want to mount your OS X computer and connect via VNC. The easiest way to do this is directly from the Finder under Go.... Connect to Server (Command-K) and use the IP of your computer with the protocol you wish to use (Example: vnc://192.168.1.25)

Older versions of OS X do not support the more modern SMB protocol so you'll likely need to connect via AFP. Tahoe removes AFP completely, so for the very latest Macs, you'll need to get creative.

From your code editor or terminal, you will want to SSH into your Mac. Old versions of OS X do not support the latest security algorithms, so from your modern Mac, you'll want to create a shell script to connect. AI is your friend, as you can simply vibe code a fix.

Once you're connected to all the different ways, working off a shared folder from a code editor, you can build your project via the terminal using your SSH-tunneled connection to your retro Mac and then use VNC to manually test your app.

Embracing the vibes:

There are a few hard-and-fast rules to vibe coding that I think are applicable to any sort of project.

1: Do not try to "one-shot" a project, aka a single prompt to create an entire application. Iterative design is key. When I jumped into the world of macOS screensavers, I first tried to create a "Hello World" demo. I was specific insofar as to ask for a CMAKE project that'd create a simple screensaver that printed Hello World. It failed to do this simple task in a single prompt, but it used far fewer tokens and still created the scaffolding for my project.

2: Use Version Control. If you are unfamiliar with version control, think of it like "History" in Photoshop on steroids, where snapshots can be taken and changes from multiple snapshots can be merged together. Version control is the ultimate undo button. When you make commits, you can always rollback your entire project or just individual files or lines of code to previous version(s).

To be effective at "vibe coding," you cannot shortcut here, as you should be able to understand commits, resolving merge conflicts, feature branches, releases, stashing, merging vs rebasing, Refs, and the reflog.

Being versed in Git doesn't just give you the ability to undo issues; it lets you become more experimental as you can always "reroll" and abandon changes or try different strategies, pick up and resume ideas in feature branches.

3: It will gaslight you. AI is not infallible, and it is not a knowledge-seeking tool to always be trusted. Expect it to lead you on wild goose chases. Be prepared to abandon a line of inquiry, as you can poison an active context window and cause the AI to get hung up on needless data points. I've personally become very quick to abandon and start new contexts if I notice its inability to change its "thinking".

The AIs are not intelligent and should not be called "Artificial Intelligence," and do not create deterministic results. It's one of the things that makes LLM so interesting. However, programming hinges on determinism. A compiler or runtime will fail if code deviates from expected syntax or values. This functions as the ultimate fact checker for AI, so its ability to completely lie to you is mitigated. It may insist that its one-to-many relationship in a database it's created is correct, but if it fails to be parsed, it's not.

4: Logs and console logs are your friend. One of the most effective things AI can do is debug. This works for explaining macOS crash logs, but even better for debugging code.

Compile failed? Copy and paste the entire log and hand it to your LLM and let it fix it. Does the Appe crash? Go to the console app in macOS / OS X (in utilities) and copy and paste the error.

5: The more you know, the better you will be. Seriously. Learning stuff is still worthwhile. The more you know, the more effective you can be at writing your prompts, debugging, and making intelligent requests.

I still live by Googling. Here's a hypothetical example: I'm working on processing audio and need spectral gating, so I can attenuate signals below a threshold.

I've spent enough time learning about audio processing, thus am aware that spectral gating would solve my problem. I'd Google for spectral gating libraries, sure enough, there's a very popular Python library called "noisereduce" which could then integrate into my project, assuming the stack works.

If I asked AI, it might concoct its own not-so-great solution when there's already an off-the-shelf solution.

6: LLMs can read images. When vibe coding, depending on the agent, you can copy and paste images into the agent, like in Claude Code, or reference them.

I had issues with the about page buttons being laid out over my about text. I both described the problem AND included a screenshot. This ensured the AI was able to fix the issue.

7: Learn to refactor. Long files with hundreds of lines of code are difficult for both people and LLMs. It's better for both to have smaller, structured files based on the architecture.

AI tends to like to create MASSIVE files. However, coding agents have been trained extensively refactor when asked since it's a bane of programming.

As your project gets more complex, the harder it will be to refactor; it's smart to create an architecture strategy up front and ask the AI to adhere to it. You can always refactor later, but with more risk, and it'll take more time. Generally, once you cross the 1000 line mark, a file is too cumbersome, although that tolerance will differ depending on user preferences, tech stack, and architecture. Personally, prefer much less than 1000 lines, but that's a good ballpark measurement that refactor is looming.



This is my first draft and I'll keep an edit log here. Feedback welcome! :)
 
Last edited:
Hey all working on a guide to retro Mac Development after making a video demoing it. I figured some people like written guides more than video.

View attachment 2573954

Retro Mac development thanks to modern IDEs and 'agentic' coding tools, aka AI, makes getting into retro macOS development easier than ever. r Some people inevitably will prefer to do on-device development using period-accurate tools, to experience development as-it-were. I am of the opinion that either method is fine, but this guide will focus more on modern-meets-retro than on retro purism.

Old OS X is fun to develop with, as there are a lot fewer security guard rails, thus removing a lot of the red tape. There's no requirement for signing code in 10.4 and 10.5; more of the system files can be modified, thus making the computer more hackable.


Video version of this which shows off the concepts. It has chapters and doesn't have midroll ads.

What you need:
  • A retro Mac capable of running OS X, network-connected.
  • A modern computer (macOS, Linux, or even Windows)
  • An LLM subscription for agentic code or a similar CLI solution for those who have access to local inference. Claude Code and Chat GPT Codex are both part of Anthropic and OpenAI's $20 tier, with usage caps in time windows, but generally are enough. OpenAI's Codex with Chat GPT 5 seems to yield better retro coding results as of writing this.
Recommended:
  • Basic terminal skills
  • Understanding of version control
  • Extreme basics of programming (Ex, what is a dependency? what is an environment?)

Glossary:

Compiler
: Turns programming languages into machine-readable code. The most popular languages for the web (JavaScript, Python, Java, PHP, Ruby, C#) use what is known as JIT (Just in time) compilation, meaning the code is only converted to binaries at runtime. Traditionally, desktop applications have used pre-compiled code that must be run through a compiler ahead of time. This generates the binaries that power applications. Retro OS X applications are largely pre-compiled Objective-C. Apple no longer includes the compilers for PowerPC and no longer supports older x86 compilers; thus, you need a retro Mac to run a build tool, like CMAKE or Xcode.

Built Tools/Bundlers: Build tools provide instructions for the compiler to create application packages; various OSes have different requirements. Xcode includes a bundler, and CMAKE is a bundler. For "Vibe" coding, in this tutorial, we are going to focus on CMAKE instead of Xcode, as it generally has better support and lowers the friction. Xcode can always be added later to projects built on CMAKE and use CMAKE as its build tool if/when you need the debugging capabilities of an IDE.

IDE - Integrated Development Environment, Xcode is an IDE. Generally, an IDE provides a suite of developer tools in a single environment, such as a source-code editor, a compiler or interpreter, and a debugger.

VNC - Virtual Network Computing, is a remote desktop system that allows users to control another computer remotely by viewing its screen and controlling its mouse and keyboard over a network. Apple's Remote Desktop is powered by VNC.

Setting up your retro Mac:

OS X, being a *nix-based operating system, means its fundamental DNA is similar to modern macOS and Linux. Apple shifted to open-source standards for many core functionalities. Under the hood of every installation of OS X is a powerful Bash terminal, which provides many essentials that we will be using.
View attachment 2573945

On your OS X computer, set up File Sharing, Remote Login, and Screen Sharing, and make sure it's connected to your network and you have an admin-level account attached to the sharing settings.

Also, you'll need a compatible version of Xcode. Apple still provides old versions of Xcode. Old versions (Need Apple developer account, free version works) click Additional Downloads
https://developer.apple.com/xcode/resources/

Setting up your modern Mac:

On your modern Mac, you should have the following installed: A code editor, VSCode, or Cursor, GIT for version control (GUI applications like SourceTree, GitHub Client, and paid clients like Tower are helpful), and finally your coding agent, depending on your code editor. OpenAI Codex and Claude Code are the current most popular agentic coding tools, but MS also provides Co-Pilot, and Amazon's code editor, Kiro, has direct integration.
View attachment 2573947

From the modern Mac you'll want to mount your OS X computer and connect via VNC. The easiest way to do this is directly from the Finder under Go.... Connect to Server (Command-K) and use the IP of your computer with the protocol you wish to use (Example: vnc://192.168.1.25)

Older versions of OS X do not support the more modern SMB protocol so you'll likely need to connect via AFP. Tahoe removes AFP completely, so for the very latest Macs, you'll need to get creative.

From your code editor or terminal, you will want to SSH into your Mac. Old versions of OS X do not support the latest security algorithms, so from your modern Mac, you'll want to create a shell script to connect. AI is your friend, as you can simply vibe code a fix.

Once you're connected to all the different ways, working off a shared folder from a code editor, you can build your project via the terminal using your SSH-tunneled connection to your retro Mac and then use VNC to manually test your app.

Embracing the vibes:

There are a few hard-and-fast rules to vibe coding that I think are applicable to any sort of project.

1: Do not try to "one-shot" a project, aka a single prompt to create an entire application. Iterative design is key. When I jumped into the world of macOS screensavers, I first tried to create a "Hello World" demo. I was specific insofar as to ask for a CMAKE project that'd create a simple screensaver that printed Hello World. It failed to do this simple task in a single prompt, but it used far fewer tokens and still created the scaffolding for my project.

2: Use Version Control. If you are unfamiliar with version control, think of it like "History" in Photoshop on steroids, where snapshots can be taken and changes from multiple snapshots can be merged together. Version control is the ultimate undo button. When you make commits, you can always rollback your entire project or just individual files or lines of code to previous version(s).

To be effective at "vibe coding," you cannot shortcut here, as you should be able to understand commits, resolving merge conflicts, feature branches, releases, stashing, merging vs rebasing, Refs, and the reflog.

Being versed in Git doesn't just give you the ability to undo issues; it lets you become more experimental as you can always "reroll" and abandon changes or try different strategies, pick up and resume ideas in feature branches.

3: It will gaslight you. AI is not infallible, and it is not a knowledge-seeking tool to always be trusted. Expect it to lead you on wild goose chases. Be prepared to abandon a line of inquiry, as you can poison an active context window and cause the AI to get hung up on needless data points. I've personally become very quick to abandon and start new contexts if I notice its inability to change its "thinking".

The AIs are not intelligent and should not be called "Artificial Intelligence," and do not create deterministic results. It's one of the things that makes LLM so interesting. However, programming hinges on determinism. A compiler or runtime will fail if code deviates from expected syntax or values. This functions as the ultimate fact checker for AI, so its ability to completely lie to you is mitigated. It may insist that its one-to-many relationship in a database it's created is correct, but if it fails to be parsed, it's not.

4: Logs and console logs are your friend. One of the most effective things AI can do is debug. This works for explaining macOS crash logs, but even better for debugging code.

Compile failed? Copy and paste the entire log and hand it to your LLM and let it fix it. Does the Appe crash? Go to the console app in macOS / OS X (in utilities) and copy and paste the error.

5: The more you know, the better you will be. Seriously. Learning stuff is still worthwhile. The more you know, the more effective you can be at writing your prompts, debugging, and making intelligent requests.

I still live by Googling. Here's a hypothetical example: I'm working on processing audio and need spectral gating, so I can attenuate signals below a threshold.

I've spent enough time learning about audio processing, thus am aware that spectral gating would solve my problem. I'd Google for spectral gating libraries, sure enough, there's a very popular Python library called "noisereduce" which could then integrate into my project, assuming the stack works.

If I asked AI, it might concoct its own not-so-great solution when there's already an off-the-shelf solution.

6: LLMs can read images. When vibe coding, depending on the agent, you can copy and paste images into the agent, like in Claude Code, or reference them.

I had issues with the about page buttons being laid out over my about text. I both described the problem AND included a screenshot. This ensured the AI was able to fix the issue.

7: Learn to refactor. Long files with hundreds of lines of code are difficult for both people and LLMs. It's better for both to have smaller, structured files based on the architecture.

AI tends to like to create MASSIVE files. However, coding agents have been trained extensively refactor when asked since it's a bane of programming.

As your project gets more complex, the harder it will be to refactor; it's smart to create an architecture strategy up front and ask the AI to adhere to it. You can always refactor later, but with more risk, and it'll take more time. Generally, once you cross the 1000 line mark, a file is too cumbersome, although that tolerance will differ depending on user preferences, tech stack, and architecture. Personally, prefer much less than 1000 lines, but that's a good ballpark measurement that refactor is looming.



This is my first draft and I'll keep an edit log here. Feedback welcome! :)
It might be helpful to add more of a section on what programming languages are available on PowerPC Macs, and any caveats. Objective C can have issues on 10.4.11. This thread goes into limitations: https://forums.macrumors.com/threads/a-trivial-objective-c-application-for-os-x-tiger.2375104/
If this guide is focused on Objective C only, some of the comments on the limitations in that thread could be useful to include. If other programming languages are within the scope of this guide, it is important to note which ones are useful.
A good summary is available here: https://macos-powerpc.org/
My experience is as follows:
Modern Python and Ruby will usually work without issues. Python may be ideal as my understanding is that AI has a lot of Python code in its training.
Perl tends to be fine,
C and C++ usually can produce working code, but are more likely to have issues that need debugging.
We do not have functional modern Java with a GUI. OpenJDK 8 works on 10.5+, but not yet on Tiger. Even then, it does not support a GUI. I would recommend avoiding Java when coding with AI for PowerPC OSX, as it has probably been trained on more modern Java code.
JavaScript is problematic as V8 is not functional. Simple stuff might work, but it is best to avoid this.
Go, Rust, and Scratch are non-existent.
 
Last edited:
It might be helpful to add more of a section on what programming languages are available on PowerPC Macs

It is far easier to list what is not available.

There is a lot of stuff that works (or at least builds and presumably works), including obscure compilers, both old and modern. Racket, Idris2, Lisp (at least three compilers), SML (three compilers, maybe four), Algol, Janet, Cobol, Pascal, a few Haskell compilers, Scheme, Guile, Erlang, Elixir, Ragel, Factor, wasm, OCaml. More things work than are broken.
 
How to know you are in trouble: LLM suggests to check your own stuff to look for a solution -_-

mrustc.png
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.