Half-Life for old Macs
Half-Life 1 and 25 of its mods on PowerPC, Intel and Apple Silicon Macs from one universal app, using the open-source Xash3D FWGS engine in place of the retail GoldSrc one.
One Half-Life.app holds five CPU slices, and macOS loads the right one at launch. The same download runs on everything from a 1999 G3 on Mac OS X 10.3.9 to an M-series Mac on macOS 26, natively on all of them. It configures itself for the machine it lands on, and a second app installs 25 Half-Life mods beside it. Mac OS X and macOS only, not Mac OS 9.
The engine, menu and game code are all other people's work (see credits). The porting was done with AI (Claude Code) under my direction, and I tested the builds on the machines.
# Get the build
Download the .dmg from the releases page, copy Half-Life.app out of it into any folder, and put your own valve/ folder beside it from a disc or Steam copy of Half-Life. That is the whole install. Nothing is merged: everything the project builds lives inside the app, and saves and settings are written to your folder, so a newer build swaps in without losing anything. No game content is included.
On macOS Catalina and later, pick a folder outside Desktop, Documents and Downloads: those three are privacy-gated per app, and an unsigned app has its writes silently denied there, so the game cannot save. The launcher explains this if it happens. On Mac OS X 10.3 through 10.14 any folder works.
# Which Macs
| CPU | macOS | Slice |
|---|---|---|
| G3 (PowerPC 750) | 10.3.9, 10.4 | ppc750 |
| G4 (PowerPC 7400 / 7450) | 10.4 | ppc7400 |
| G5 (PowerPC 970) | 10.3.9 through 10.5 | ppc7400 |
| Intel, 32-bit (Core Solo / Core Duo) | 10.6 | i386 |
| Intel, 64-bit | 10.6.8 and up | x86_64 |
| Apple Silicon | macOS 11 and up | arm64, native |
dyld picks a slice by CPU capability alone, never by OS, so a slice exists only where the instruction set differs: the G3 has no AltiVec unit, the G4 and G5 do. The reasoning is in the decision record.
# The game
Every machine renders with hardware OpenGL, from the G3's ATI Rage 128 up, with the software renderer as automatic fallback. The world is drawn in a single multitexture pass rather than the stock two, worth about 30% more frames on the fillrate-bound G3. The launcher picks a display mode per machine: the G3 gets exclusive fullscreen at 800×600, every other PowerPC Mac gets borderless at its desktop resolution, and Intel and Apple Silicon get exclusive fullscreen at the desktop resolution. A config shipped inside the app re-applies renderer-safe defaults on every launch, and the console is reachable everywhere without developer mode.
LAN multiplayer works across the endian boundary: PowerPC and Intel machines host and join each other.
# Screenshots
All taken on the 2007 Intel Mac mini at 1920×1080.
# Mods
Half-Life Mods.app installs the 25 supported mods: They Hunger, Poke 646, Echoes, Residual Point, Blue Shift, Opposing Force and the rest. Get Mods first adds game code to any mod folders already beside Half-Life.app, then fetches everything with a public release, each mod from wherever its author published it, verified by checksum. The project hosts no content. Installed mods appear under Custom Game in the main menu with artwork and a description.
A mod is the authors' maps, models and sounds plus the game code that drives it, and only the code, about 3% of the bulk, needs rebuilding for these machines. Each mod's code is built from its own hlsdk-portable branch as a fat ppc + i386 + x86_64 + arm64 dylib pair, so one file serves every machine. Team Fortress Classic is the one exception: no open server implementation exists for GoldSrc, so there is nothing to rebuild.
The detail is in the installer's README, docs/MODS.md to build the dylibs yourself, and docs/MOD-AUDIT.md for the source audit.
# If it will not launch
Half-Life System Report.app says what your Mac is and which slice the game would load, and copies that to the clipboard in one press to paste into an issue. It reads only and sends nothing. Its floors are deliberately lower than the game's, so a machine the game refuses can still say why.
# How it is built
Half-Life splits into three separately built parts, and all three are other people's code: the Xash3D FWGS engine, the mainui_cpp menu and the hlsdk-portable game code. The port is carried as commits on the oldmac branch of my own fork of each, so git log upstream..oldmac in any of them is exactly what this project changed and nothing else. Every slice builds from the same branch of each tree; there is no separate PowerPC tree.
The repo holds only the porting glue: build scripts, the two companion apps, per-machine configs and docs. No upstream source and no game data is committed. Upstream is cloned at pinned commits into a git-ignored vendor/ directory and built.
Development is an automated AI loop, Claude Code under my direction: implement, build, deploy to real hardware, run it there, iterate. Every change is compiled on an Intel Mac mini running Lion, where all the PowerPC and Intel slices cross-compile, plus an Apple Silicon box for arm64, fused with lipo and tested on the machines below rather than on an emulator. Findings that turned out wrong are recorded as wrong in docs/port/POWERPC-FINDINGS.md.
# Tested on
| Machine | CPU | GPU | macOS |
|---|---|---|---|
| Power Mac G3 (Yosemite) | PowerPC 750 @ 450 MHz | ATI Rage 128 | 10.3.9 and 10.4.11 |
| Power Mac G4 (Quicksilver) | PowerPC 7450 @ 733 MHz | ATI Radeon 9000 | 10.4.11 |
| Mac mini G4 | PowerPC 7450 @ 1.25 GHz | ATI Radeon 9200 | 10.4.11 |
| iMac G5 | PowerPC 970 @ 2.0 GHz | ATI Radeon 9600 | 10.5.8 |
| Power Mac G5 (dual 2.7 GHz) | 2x PowerPC 970 @ 2.7 GHz | ATI Radeon 9650 | 10.3.9, 10.4.11 and 10.5.8 |
| Mac mini (Intel) | Core 2 Duo @ 2.33 GHz | Intel GMA 950 | 10.7.5 |
| Mac mini (Intel) | Core 2 Duo @ 2.26 GHz | NVIDIA GeForce 9400 | 10.6.8 |
| MacBook Air (M5) | Apple M5 | Apple integrated | macOS 26 |
Benchmarks and per-machine notes are in docs/BENCHMARKING.md.
# Credits
- The FWGS team: the Xash3D engine, the menu and the portable Half-Life SDK, which are what this builds on.
- alex-free: the legacy native-Cocoa SDL2 the PowerPC slices link, since modern SDL2 refuses to build pre-10.6.
- Ian Lance Taylor: libbacktrace, for crash backtraces.
- Mbed-TLS, zlib and 7-Zip: the mod installer's fetching and unpacking, on OS versions whose own TLS cannot reach modern servers.
- The authors of all 25 mods: the maps, models and sounds are their work, and this project supplies game code and no content.
- runthinkshootlive.com and archive.org: keeping those releases downloadable decades on.
It is an independent repackaging, not affiliated with any project it builds on. Report problems on its own issues page, never on an upstream release page.
Half-Life and the valve/ game data are © Valve, and this ships neither. Gordon Freeman is Valve's character. The game icon is an AI-edited derivative of Little Red Zombies' "HλLF-LIFE: Gordon (UE4)" MetaHuman render; the companion apps' icons and About pictures are AI-generated images made for this project. An unofficial fan project, not endorsed by Valve; any of this artwork comes out or gets replaced on request. The code is under the GPLv3, the same licence as the engine it builds.