QuakeSpasm app icon

A fork of QuakeSpasm tuned for six old Macs spanning 1999 to 2019. It's one app that runs on all of them — three builds, one for each kind of chip, bundled together — 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.

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 rows in the full earliest-to-current grid 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.2-round-v8.

Bundle Size Runs on
quakespasm-fat-app-v0.97.0.zip 4.8 MB All six 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
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

# Architecture

An Ubuntu workstation drives all six 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 six Mac bench targets via the Lion mini cross-build host
Architecture — Ubuntu orchestrator drives six Macs via the Lion mini cross-build host

Three compilers build three versions of the program, one per chip, 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 three toolchains (g3 SDK, g4 SDK, lion clang) converging through lipo into one fat binary
Build pipeline — three compilers, three 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

# Frames per second across the rack

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

# Tech stack

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