Apps and tools that keep old Macs useful — from PowerPC to Intel, with a few classic Mac ideas brought to Apple Silicon. Why throw away a Mac that still works? True sustainability is using what we have.
A personal project that lets 20-year-old PowerPC Macs (iBook, Power Mac; Mac OS X Tiger/Leopard) keep working on today's networks.
AquaLink.zip — the app itself. Copy it onto the PowerPC Mac (Tiger/Leopard) you want to use.AquaLink-windows-setup.zip — helper files for connecting to the Mac's sharing feature from Windows. Keep both zip files together in the same folder; don't separate their contents.AquaLink.zip and launch AquaLink.app on the target PPC Mac.connect-aqualink.bat from AquaLink-windows-setup.zip.| Environment | PowerPC Mac / Mac OS X 10.4.11 (Tiger) |
|---|---|
| Verified hardware | iBook G4 (PowerBook6,5) |
A personal hobby project provided with no warranty. See GitHub for detailed technical information and source code.
AquaLink is basically a thin shell around libsmb2, a C library that speaks SMB2/3. As far as I could find when I looked into it, this makes AquaLink the first working SMB2/3 client anyone's gotten running on PowerPC Mac OS X — Apple's own smbfs.kext never got past SMB1. Here's roughly how it came together, and a few of the uglier bugs along the way.
People assume AI makes this easy. It does make some things easier — typos and indentation mistakes basically don't happen anymore. But what actually happens is lining up at least 3, sometimes 4, of Windows, a PowerMac G4, an iBook G4, an M2 MacBook Air, and a 2010 MacBook — all real hardware — taking logs off each one by hand, and squashing bugs one at a time in VS Code on the M2 MacBook Air. AquaLink especially went through this.
There was just no way for a PPC Mac to talk to a modern SMB3 NAS — the built-in SMB stack doesn't speak the protocol, full stop. libsmb2 turned out to be pretty much the only SMB2/3 client library that still builds on hardware and toolchains this old, so that decided it.
Tiger's SDK doesn't have CommonCrypto, so a stock libsmb2 build mis-detects __APPLE__, picks the CommonCrypto AES path anyway, and fails to compile. Fixed that with a small patch to configure.ac that explicitly checks for CommonCrypto/CommonCrypto.h before going down that path. Needed two more flags on top of that: --disable-werror, because gcc 4.0.0 warns about a much wider range of shadowed declarations than modern gcc does, and with -Werror those all turn into hard failures; and --without-libkrb5, because Tiger has neither GSS.framework nor krb5.h, so turning on Kerberos support just breaks the build over missing headers. Falling back to libsmb2's built-in NTLMSSP auth was plenty for a home NAS anyway.
No .nib file — the whole UI is built in code. libsmb2 is statically linked in too, so there's no make install step, no separate library to ship. Unzip it and it just runs.
libsmb2 on its own only gets you programmatic access, nothing shows up as an icon. AquaLink works around that by running its own tiny embedded HTTP/WebDAV server (raw BSD sockets, handling OPTIONS/PROPFIND/GET/HEAD/PUT/DELETE/MKCOL/LOCK/UNLOCK) on 127.0.0.1, then calling mount_webdav against that loopback address. End result: it shows up in /Volumes like any other network share, and you can just drag files into it in the Finder. FUSE would've been the more obvious route, but MacFUSE/OSXFUSE never supported Tiger at all (PowerPC support was dropped industry-wide around 2011), so that wasn't really on the table.
This wasn't part of the original plan — it got added once the actual need showed up: being able to browse and edit old RAW photos sitting on the iBook, straight from a modern Mac or PC. LocalWebDAVServer reuses the same embedded server, but swaps the libsmb2 calls out for plain POSIX file I/O (open/read/write/opendir), binds to INADDR_ANY instead of loopback-only, and adds HTTP Basic auth plus path-traversal (../) protection.
Thinking about browser-based access to the NAS feature, so you wouldn't need the dedicated app at all.
Full source code is on GitHub.
Bug reports and requests go straight to the developer, privately — a personal project, so replies aren't guaranteed.