Distributing classic Mac applications from PowerPC Mac to Apple Silicon, bringing retro Mac experiences to modern systems. Why throw away a Mac that still works? True sustainability is using what we have.
A personal project that keeps a 20-year-old PowerPC Mac useful as a real AI coding assistant. The official Claude Code CLI needs Node.js 18+, which can't run on Tiger's old PowerPC hardware, so this is a self-contained agent written in Perl that talks directly to an AI API over curl — Claude (Anthropic) or Gemini (Google, free tier, no credit card needed) — no Node.js, no compiling on your side required.
"Build apps that still work properly on old Macs, and have a bit more fun doing it — they don't break easily, and honestly, they still look cool." That's the reason behind pretty much everything else on this site. This one's a little different.
I bought an iBook as a student, stretching further than I really could afford. My father was a branch manager at a major company, spending most of his time on golf, driving a brand-new BMW instead of a Toyota or even a Lexus — and later traded it in for an even more extravagant Nissan GT-R. And yet he never spent a single yen on me. I ended up dropping out of a science university and working as a photo studio assistant, juggling that with whatever else I could find. Shooting notes, lighting characteristics, all of it — I wrote it all on that iBook.
So I decided to turn that old iBook into a good advisor. Something you'd consult like a soft-spoken professor. Something that could quietly add a line or two to those same worn-out notes I used to keep on it. It can't handle anything heavy — Photoshop's obviously out of the question — but that's fine. That's actually the point.
The reason this runs on Claude (Anthropic) specifically is simple: it's just really good at being a coding agent. Hand it the concept, even without writing a line of code yourself, and it gets built properly. It'll listen to old stories too, and actually talk things through with you. That old iBook has a job title now: advisor.
curl — a prebuilt, TLS 1.2/1.3-capable curl for PowerPC/Tiger (the stock curl on Tiger can't reach today's HTTPS servers)cacert.pem — a current CA certificate bundleclaude-agent.pl — the agent itself, a single Perl file with zero external CPAN dependenciesInstall.command — the installer you double-clickread_file / write_file / list_dir / run_shellppc-claude-agent.zip and copy the whole folder onto your PowerPC Mac (USB stick, file sharing, etc.).Install.command. A Terminal window opens.advisor to start.No compiling, no MacPorts, no Xcode required. The command is called advisor rather than something tied to one AI's name — if you add both keys during setup, you can type /claude or /gemini inside a conversation to switch any time, carrying the conversation over.
This project (the agent and installer) is free to use, but actually talking to an AI requires your own
API key for whichever provider you pick. Claude's key is billed pay-as-you-go at
console.anthropic.com
— a different site and a different billing system from a claude.ai subscription. Gemini's key is free
to create at aistudio.google.com,
with a free tier that needs no credit card at all. No API key is embedded in the code anywhere;
claude-agent.pl only reads it from an environment variable, so sharing this project never
exposes anyone's key or billing to anyone else. The installer walks you through creating whichever key you
chose.
| Environment | PowerPC Mac / Mac OS X 10.4 (Tiger) |
|---|---|
| Verified hardware | iBook G4 (PowerBook6,5) |
| Notes | The bundled curl was built without CPU-specific optimizations, so other PowerPC Tiger machines should work too, though not every model has been tested. |
A personal hobby project provided with no warranty. If curl doesn't run on your machine, the full project (build scripts included) shows how to build the TLS toolchain from source instead.
PPC Claude Agent is basically a single Perl file that talks straight to an AI API over curl — Anthropic or Gemini. The official Claude Code CLI needs Node.js 18+, and V8 dropped PowerPC support years ago, so this is a completely separate route built from scratch that doesn't touch Node.js at all. Here's what actually got in the way, and how each one got solved.
Anthropic's API requires TLS 1.2 or newer, and Tiger's stock OpenSSL (0.9.7l) doesn't even reach TLS 1.0. Bumping the Python version or whatever doesn't fix that — OpenSSL and curl themselves need rebuilding from source. And trying to get there via Tigerbrew or MacPorts runs into a chicken-and-egg problem, since fetching packages from GitHub needs TLS 1.2 over HTTPS in the first place. Worked around that by downloading the source tarballs on a modern machine, scp-ing them to the iBook, and doing the actual build right there on the iBook itself. The heavy lifting is still genuinely done by the G4, so the "runs standalone on the G4" goal holds up.
Once it came time to build curl, fairly recent symbols like EVP_sha256 kept coming up "undefined," crashing at runtime with dyld: Symbol not found — a confusing failure that looks like a TLS problem but isn't. Turned out Darwin's ld was preferring the system's /usr/lib/libssl.dylib (Tiger's old OpenSSL 0.9.7l) over the freshly built one, even with -L pointing at the right place. Adding -Wl,-search_paths_first to LDFLAGS forced it to check the given path first, and that fixed it.
claude-agent.pl runs on nothing but Tiger's stock Perl 5.8.6 — no external CPAN modules at all. JSON encoding/decoding is a small hand-written recursive-descent parser, just enough to handle the Claude and Gemini APIs' message formats. HTTP is handled entirely by shelling out to the curl binary that got built, so the only two things that actually need compiling are OpenSSL and curl.
Conversation history is kept internally in Anthropic's Messages-API shape no matter which provider is
active; when talking to Gemini, that gets translated to and from Gemini's contents/parts/functionCall
shape only at the moment of the API call, and translated straight back on the way in. call_api
itself ended up as a completely generic "POST this JSON, get JSON back" function once the URL and headers
moved to being passed in instead of hardcoded. The upshot: the terminal input handling and the tool
execution code (read_file/write_file/list_dir/run_shell), easily the bulk of this file, needed zero
changes to support a second provider.
:encoding(UTF-8) layer can split a multibyte character
across a buffer boundary and throw utf8 "\xXX" does not map to Unicode — just showing
up on the response-reading side this time, once a run_shell result happened to contain a
folder named “ダウンロード”. Fixed the same way: read the response as raw bytes, decode the
whole thing at once afterward.
Actually using this thing on real hardware turned up one terminal quirk after another.
The agent itself is free to share, but actually using it requires each person to get their own API key for whichever provider they pick. With Gemini's free tier, that's a genuinely zero-cost start — no credit card, no billing setup. No API key is ever embedded in the code, so sharing this never exposes anyone's billing to anyone else.
Full source code is on GitHub.