QuakeSpasm app icon

A fork of QuakeSpasm tuned for seven old Macs spanning 1999 to 2019. It's one app that runs on all of them (four builds bundled into a single file, one per chip: G3, G4, G5 and Intel) and on each Mac it loads its own settings and switches on as many of the visual effects as that machine's graphics can handle.

It's a personal project: I love Quake and I collect and tinker with old Macs. My part is the setup and testing: the build, deploy and benchmark scripts, and the per-machine settings. The engine and config changes were made mostly with AI (Claude), which I directed and checked against real benchmarks on the machines.

There's also an Apple Watch companion: a cvar-gated patch streams the player's live health, ammo and weapon off the Mac so the watch can render a tactical computer on your wrist. The same app drives the Quake II port too. It's off by default and adds nothing to the normal build.

# Before and after

Frame-rate gains on the 1999 G3, same machine before and after. Quake's built-in timedemo replays a recorded demo as fast as the machine can manage and reports the frame rate; each number here is the middle of three runs, with the first thrown away as a warm-up. The "after" column is the Round v11.1 build with see-through water, shadows under the monsters and glowing lights all switched on.

Machine Demo / resolution Before After Δ
yosemite: 1999 PowerMac G3, Rage 128 demo3 / 1024×768 5.10 20.95 +311% (4.1×)
yosemite: 1999 PowerMac G3, Rage 128 demo1 / 1024×768 7.70 17.35 +125% (2.3×)
yosemite: 1999 PowerMac G3, Rage 128 demo3 / 640×480 15.60 36.85 +136% (2.4×)
yosemite: 1999 PowerMac G3, Rage 128 demo1 / 640×480 23.90 34.45 +44%

Only the G3 row goes up in every cell, because on the G3 I chased frame rate and nothing else. The other machines' before-and-after figures are mixed, and that's on purpose. Each machine's first build was plain QuakeSpasm with its default settings, and since then I've piled visual upgrades on top: crisper textures on angled surfaces, smoother texture filtering, shadows under the monsters, see-through water, lava, slime and teleporters, and glowing lights. Where a number went down, it's because one of those effects got switched on, not because something broke. Every effect landed in a change that measured its cost across all the machines first and weighed it against how much better the game looked.

QuakeSpasm on yosemite, a 1999 PowerMac G3 with an ATI Rage 128: grenade in mid-air with explosion sparks
yosemite: 1999 PowerMac G3 / Rage 128
QuakeSpasm on sawtooth, a 1999 PowerMac G4 AGP with a GeForce2 MX: combat scene with explosions and dynamic lighting
sawtooth: 1999 PowerMac G4 AGP / GeForce2 MX
QuakeSpasm on quicksilver, a 2001 PowerMac G4 with a Radeon 9000: slipgate hub with sparks, Q-rune floor, glowing E sigils
quicksilver: 2001 PowerMac G4 / Radeon 9000
QuakeSpasm on mini-g4, a 2005 Mac mini G4 with a Radeon 9200: overhead view of an Ogre with chainsaw and visible alias-model shadow
mini-g4: 2005 Mac mini G4 / Radeon 9200
QuakeSpasm on mini-intel, a 2007 Mac mini Core 2 Duo with a GMA 950 on Lion: banner corridor with four grunts
mini-intel: 2007 Mac mini / GMA 950 / Lion
QuakeSpasm on imac-2019, a 2019 iMac 27 inch 5K with a Radeon Pro 580X: overhead slipgate hub with Q-rune floor logo
imac-2019: 2019 iMac 5K / Radeon Pro 580X

# Get the build

The current release is v1.13, which added online multiplayer and weapon damage decals.

Bundle Runs on
QuakeSpasm-OldMac-v1.13.dmg All seven benched Macs (Panther 10.3.9 → Sequoia 15.7)

The one universal binary runs unchanged on everything from Panther 10.3.9 to Sequoia 15.7. When it launches, macOS picks the right build for that Mac's chip, then the game checks which model of Mac it's on and loads that machine's own settings file.

# The bench

Machine Year CPU GPU macOS
yosemite 1999 PowerMac G3 B&W, 449 MHz ATI Rage 128, 16 MB 10.3.9 Panther
sawtooth 1999 PowerMac G4 AGP, 500 MHz 7400 NVIDIA GeForce2 MX, 32 MB 10.4.11 Tiger
quicksilver 2001 PowerMac G4, 733 MHz 7450 Radeon 9000 Pro, 64 MB 10.4.11 Tiger
mini-g4 2005 Mac mini G4, 1.25 GHz 7447A Radeon 9200, 32 MB 10.4.11 Tiger
imac-g5 2005 iMac G5, 2.0 GHz 970FX Radeon 9600, 128 MB 10.5.8 Leopard
mini-intel 2007 Mac mini, 2.33 GHz Core 2 Duo Intel GMA 950, 64 MB shared 10.7.5 Lion
imac-2019 2019 iMac 27", 3.7 GHz i5-9600K Radeon Pro 580X, 8 GB 15.7.5 Sequoia

The iMac G5 runs at its native 1440×900 only: its Leopard graphics driver hangs if the game tries to switch resolution, so it stays in same-mode fullscreen.

# Architecture

An Ubuntu workstation drives all seven Macs over the network (ssh). The Lion mini does double duty: it's one of the test machines and it's also where the builds are made, because it's the last Mac that still ships with the old compiler able to target the PowerPC chips.

Architecture diagram showing Ubuntu workstation orchestrating seven Mac bench targets via the Lion mini cross-build host
Architecture: Ubuntu orchestrator drives seven Macs via the Lion mini cross-build host

Four toolchain passes build four versions of the program, one per chip (G3, G4, G5 and Intel), and Apple's lipo tool glues them into a single universal file. No fancy build servers or containers, just rsync, ssh and scp on top of make.

Build pipeline diagram showing four toolchains (g3, g4, g5 SDKs and lion clang) converging through lipo into one fat binary
Build pipeline: four toolchain passes, four CPU-specific binaries, one universal file

The test loop is the same on every machine: copy the new build over, launch it with that machine's settings, read the timedemo result out of the log, and add a row to a running spreadsheet. Three runs each, with the first thrown away as a warm-up.

Bench loop showing deploy, launch with timedemo, poll qconsole.log, parse fps, append to results.csv
Bench loop: deploy, launch timedemo, parse fps, append to CSV

# Framerate

Full grid at commit d64427db. Three runs per cell, the first dropped as a warm-up, reported figure is the middle of the other two. This round added a small drawing optimisation that gives the G4, Intel and iMac machines a 19–46% lift on the demo3 1024 test. The G3 leaves it switched off, because testing it back-to-back on that machine actually made it slower.

Machine demo1
1024×768
demo1
640×480
demo2
1024×768
demo2
640×480
demo3
1024×768
demo3
640×480
yosemite (G3) 17.35 34.45 15.25 33.40 20.95 36.85
sawtooth (G4) 40.25 55.65 32.70 50.15 46.90 57.55
quicksilver (G4) 62.75 70.30 60.10 68.00 84.05 95.35
mini-g4 (G4) 48.45 86.30 37.40 73.85 65.60 113.20
mini-intel (Lion) 72.85 163.95 54.50 130.70 44.60 185.90
imac-2019 1610.95 1894.45 1490.20 1876.20 1575.15 1907.25

The iMac G5 isn't in the grid because it only runs its native 1440×900. There it turns in demo1/2/3 at roughly 100.8 / 74.4 / 86.1 fps. Full history and all seven machines are in benchmarks/results.csv.

# Tech stack

C OpenGL 1.x/2.x AltiVec PowerPC Apple gcc 4.0.1 Apple clang SDL Bash ssh + rsync