The Half-Life.app icon, a close-up of Gordon Freeman in his HEV suit

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.

Diagram: three source trees build into five CPU slices, which lipo fuses into one Half-Life.app
Three source trees, five slices, one app

# 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.

Per-machine matrix showing CPU, macOS, slice, byte order, SDL2, renderer and window mode for each machine class
What the launcher sets up on each machine

# Screenshots

All taken on the 2007 Intel Mac mini at 1920×1080.

The opening tram ride through a service tunnel in Half-Life, lit by a single fluorescent tube
The opening tram ride
The Black Mesa Research Facility lobby with scientists at the reception desk and a wall of monitors
The Black Mesa lobby
A Sector C security desk under red alert lighting, with a guard seated and a scientist running past
Sector C under a red alert
An outdoor canyon of red rock with hazard barrels and a bunker entrance under a blue sky
Outside on the surface
A concrete dam and roadway cut into red cliffs, with a Danger Machinery sign
The dam
A floating rock island in Xen topped with tall organic spires, against a green and purple nebula
Xen
A wide view across Xen with floating platforms and spires receding into a coloured sky
Across Xen

# Mods

A cut-out render of Gordon Freeman running with a crowbar, the mod installer's About picture

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 Half-Life Mods window on Mac OS X 10.4 Tiger, downloading Xen Warrior with a log of mods that have had their game code added
Downloading Xen Warrior on Tiger 10.4, after adding game code to mods already present

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

A cut-out render of a bearded scientist in glasses and a lab coat, the System Report app's About picture

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.

Repo map: public upstream repos are cloned at pinned commits into a git-ignored vendor directory and built into one universal app; this repo tracks only the glue
What the repo tracks, and what it pulls in

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

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.

# Tech stack

C C++ Objective-C Cocoa OpenGL 1.x PowerPC x86_64 arm64 SDL2 Python Bash lipo