The modern web, on a 25-year-old Mac.
MacSurf is a web browser for Classic Mac OS 9 PowerPC.
Real CSS3. Real ES5 JavaScript. Real PNGs with alpha. Running on a beige G3.
The web outgrew Classic Mac OS twenty years ago. Modern HTTPS killed it for good around 2016. Today, an out-of-the-box G3 or G4 running OS 9 can barely reach a single live website.
MacSurf brings the real web back. Not a screenshot proxy. Not a remote terminal session. A native browser, built with the tools that were on the platform — CodeWarrior, the Carbon API, QuickDraw, Open Transport — running real CSS3 layouts and real JavaScript inside the 64-megabyte memory floor of a 1999 iMac.
It is, as far as we can find, the first serious NetSurf port to Classic Mac OS, and the first browser shipped on Mac OS 9 with native CSS Grid, CSS custom properties, and ES5 JavaScript.
Each shot below is a real milestone, captured on a Power Macintosh G3 running Mac OS 9. The fix-number annotations match this repo's commit history.
| Component | Language | Purpose |
|---|---|---|
browser/ |
C (C89, CW8) | NetSurf fork with a macos9 frontend. Carbon UI, QuickDraw plotters, Open Transport networking, Duktape JS engine. |
proxy/ |
Go (stdlib only) | TLS-stripping HTTP proxy. Mac sends plain HTTP, proxy fetches via HTTPS, returns plain HTTP. Deploy on a VPS or run locally. |
macSSLsibling repo |
C (CW8) | Native TLS 1.2 library for OS 9 — modern HTTPS straight from the Mac, no proxy required. Built on BearSSL with ten embedded root CAs. |
|
Rendering pipeline
CSS — ~150 properties consumed in layout
|
JavaScript — Duktape 2.7.0 ES5
Images — all five formats
Networking
Chrome
|
Two StuffIt archives in builds/ — pick what you need:
builds/MacSurf.sit— ready-to-run binary. Expand on Mac OS 9.1+ with CarbonLib 1.5+ and launch.builds/MacSurf-BuildPack.sit— full source + CodeWarrior 8 project file. Expand, openMacSurf.mcpin CodeWarrior, choose Build.
|
MacSurf is built on Mac OS 9 with CodeWarrior 8 Pro (8.3 update). Source is cross-compile-clean against Retro68 PowerPC GCC for fast Linux-side syntax checks. |
A single Go binary. No config files. No dependencies beyond stdlib. cd proxy
go build -o macsurf-proxy
./macsurf-proxy |
- Architecture — rendering modes, proxy services, milestone plan
- Project status — what works, what's next
- Version history — milestone timeline
- CSS status — feature-by-feature CSS coverage
- The MacSurf story — narrative writeup
- Full doc index
The platform sets the rules. MacSurf works around them, not against them.
- Cooperative multitasking only. No preemptive threads anywhere.
WaitNextEventdrives the UI; Open Transport synchronous calls yield via the Thread Manager onkOTSyncIdleEvent. - Strict C89. No
inline, no//, no designated initializers, no variadic macros, no for-scope declarations. CW8 doesn't compile anything more modern. - No HTTPS in the browser (without macSSL). All TLS is handled by the proxy — the Mac speaks plain HTTP and the proxy bridges out to HTTPS.
- 16 MB Carbon application partition. libcss allocates from the OS heap and runs out below ~12 MB on real pages.
- Two memory floors: 64 MB RAM (development) on a G3 iMac, 256 MB+ (enthusiast tier) on G4 hardware.
There was nothing here before. The netsurf-dev list has a single 2017 "Port to OS9?" thread with no follow-through. Best references the project was built against:
- Classilla — the Mozilla-era reference Carbon browser. MacSurf borrows the
'carb'resource pattern and Open Transport architecture from Classilla'smacsockotpt.c. - cy384/ssheven — production SSH client for OS 9; the canonical reference for cooperative-multitasking + Open Transport on real hardware.
- cy384/miscellany — the shortest known-good OT HTTP client (~220 lines).
MacSurf is a derivative work of NetSurf and inherits its licensing terms: GPLv2 with the OpenSSL linking exception, plus MIT for visual artwork. The complete text is in LICENSE.
The Go proxy and macSSL ship under permissive licences — see each subproject for details.









