The browser /browser
A NetSurf fork with a macos9 frontend — Carbon UI, QuickDraw plotters, Open Transport networking, and the Duktape JavaScript engine.
FETCH → PARSE → CASCADE → LAYOUT → PLOT
MacSurf is a real web browser for Classic Mac OS 9. Real CSS3. Real ES5 JavaScript. Real PNGs with alpha. Rendering live inside the 64 MB memory floor of a beige G3.
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. 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.
As far as we can find, it is the first serious NetSurf port to Classic Mac OS, and the first browser shipped on Mac OS 9 with native CSS Grid, custom properties, and ES5 JavaScript.
The Mac speaks plain HTTP. The proxy bridges out to the modern, encrypted web — or skip it entirely with native TLS.
A NetSurf fork with a macos9 frontend — Carbon UI, QuickDraw plotters, Open Transport networking, and the Duktape JavaScript engine.
FETCH → PARSE → CASCADE → LAYOUT → PLOT
A TLS-stripping HTTP proxy. The Mac sends plain HTTP, the proxy fetches over HTTPS and hands plain HTTP back. One binary, no config.
DEPLOY ON A VPS · OR RUN IT LOCALLY
A 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.
HTTPS · DIRECT FROM THE METAL
Around 150 CSS properties consumed in layout, a complete ES5 engine, five image formats, and real cooperative-multitasking networking.
var() resolutionvar()justify-content, order, aligngrid-template, gapborder-radius, box-shadow, opacitytransform, text-shadow, counters, aspect-ratioackermann(3,7) on a 233 MHz G3CopyMask)InContext callsEvery pixel below was painted by QuickDraw on a physical Power Macintosh running Mac OS 9. No emulation, no compositing.
MacSurf works around them, not against them. This is what building a browser for 1999 actually costs.
No preemptive threads anywhere. WaitNextEvent drives the UI; Open Transport yields via the Thread Manager.
No inline, no // comments, no designated initializers, no for-scope declarations. CW8 compiles nothing more modern.
Without macSSL, all TLS is handled by the proxy — the Mac speaks plain HTTP and the proxy bridges out.
libcss allocates from the OS heap and runs out below ~12 MB on real-world pages. Memory is the hard ceiling.
Build the browser on the Mac with CodeWarrior, or stand up the proxy in seconds with a single Go binary.
Source stays cross-compile-clean against Retro68 PowerPC GCC for fast Linux-side syntax checks. See the Mac-side build guide and Linux cross-dev workflow.
No config files. No dependencies beyond the standard library. Point the browser's proxy setting at the host and you are on the modern web. See the deploy guide.