v1.4 — Self-contained .app bundle (per-machine configs in Resources/)
One fat universal binary, six retro Macs spanning 23 years (1999 G3 → 2019 i5 iMac).
This release is a packaging improvement, not a perf round — same Round v11.1 binary as v1.3-round-v11, but the per-machine autoexec configs that were previously shipped in id1/ alongside your game data now ship inside Quakespasm.app/Contents/Resources/. The .app is now a self-contained distribution unit.
Drop-in install
- Download
quakespasm-fat-app-v0.97.0.zip - Unzip → you get
Quakespasm.app+quakespasm.pak - Put both in any folder (e.g.
~/Desktop/quake/,~/Applications/, or wherever) - Create an
id1/folder next toQuakespasm.appand drop your registeredpak0.pak+pak1.pakfrom a paid Quake install (Steam / GOG / original CD) into it - Double-click
Quakespasm.app
That's it. No autoexec cfg shuffle. The fat binary still holds three slices (ppc_750 G3, ppc_7400 G4 + AltiVec, x86_64 Lion+) — dyld picks the right one at launch, then host.c reads sysctl hw.model and loads the right per-machine autoexec from Contents/Resources/ via CFBundle. Hand-tuned visual stack on each machine, zero per-target setup.
Modern macOS (Big Sur+) will quarantine the unsigned bundle — either right-click → Open, or xattr -dr com.apple.quarantine Quakespasm.app.
What's new vs v1.3
No binary perf change — same Round v11.1 engine, same bench numbers. The change is in how the per-machine config layer is delivered:
- Old: deploy script copied
autoexec-yosemite.cfg,autoexec-sawtooth.cfg, etc. intoid1/alongside yourpak0.pak. The engine used Quake'sexec FILE.cfgcommand to load them from the gamedir filesystem. Users had to keep both the .app and the bundled cfg files together for the per-machine dispatch to work. - New: cfgs ship inside
Quakespasm.app/Contents/Resources/. The engine loads them via CoreFoundation'sCFBundleAPI (QS_ExecConfigFromBundleinhost.c). The .app is now self-contained — you only need to provideid1/pak0.pak(your own game data) alongside it.
Per-arch baseline (autoexec-ppc750.cfg / autoexec-ppc7400.cfg / autoexec-x86_64.cfg) picked at compile time via __VEC__ / __ppc__ / __x86_64__. Per-machine overlay (autoexec-<machine>.cfg) picked at runtime via sysctlbyname("hw.model", ...). Both layers travel inside the .app bundle.
Bench reference (carried forward from v1.3, no change)
| Machine | OS | GPU | demo1 1024 | demo3 1024 |
|---|---|---|---|---|
| yosemite (PowerMac1,1, 1999, G3 449 MHz) | Panther 10.3.9 | Rage 128 16 MB | 16.95 | 19.90 |
| sawtooth (PowerMac3,1, 1999, G4 500 MHz) | Tiger 10.4.11 | GeForce2 MX 32 MB | 40.25 | 46.90 |
| quicksilver (PowerMac3,5, 2001, G4 733 MHz) | Tiger 10.4.11 | Radeon 9000 Pro 64 MB | 62.75 | 84.05 |
| mini-g4 (PowerMac10,1, 2005, G4 1.25 GHz) | Tiger 10.4.11 | Radeon 9200 32 MB | 48.45 | 65.60 |
| mini-intel (Macmini2,1, 2007, C2D 2.33 GHz) | Lion 10.7.5 | GMA 950 64 MB | 72.85 | 44.60 |
| imac-2019 (iMac19,1, 2019, i5-9600K) | Sequoia 15.7.5 | Radeon Pro 580X 8 GB | 1610.95 | 1575.15 |
Full breakdown: see v1.3 release notes.