Skip to content

mplsllc/macsurf

MacSurf

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.

Latest release License Open issues Stars Mac OS 9 PowerPC Built with CodeWarrior Carbon API CSS coverage JavaScript engine Discussions


Mac OS 9, meet TLS — Native, no proxy needed.


Warning

MacSurf is a very early alpha. It runs, it renders real CSS3, it executes JavaScript on a beige G3, and as of 2026-05-25 it speaks TLS 1.2 natively against real modern HTTPS sites (mactrove.com is the canonical hardware test target). Most websites in 2026 will still not work in it — heavy SPAs, modern CSS features MacSurf doesn't ship yet, missing form interactions, slow JS on real hardware. A lot is still rough.

It is ready to be tested. If you've got a Power Mac G3 / G4 sitting around, please load it up and try it. Bug reports and screenshots from real hardware are exactly what this project needs right now. Coders welcome too; there's an enormous amount of CSS / DOM / JS surface left to fill in, and the code is approachable C89 (the same C you'd have written in 1999). See docs/status.md for the current punch list and docs/README.md for the doc index.

What you should not expect yet: smooth browsing of arbitrary modern sites, video, audio, WebGL, service workers, anything React-heavy. What you can expect: hand-built pages, retro-style sites, a respectable subset of the CSS Grid spec, native HTTPS with the full Mozilla CA bundle, and the surreal experience of running ES5 JavaScript on a 233 MHz PowerPC.

First numbered version: 0.1a1 (2026-05-20). Latest release: v0.6 — Mac OS 9, meet TLS (2026-05-25). Full notes: docs/release-notes/MacSurf-0.6.md.


Why MacSurf exists

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. As of 2026-05-25 it talks TLS 1.2 directly to the modern web, through a BearSSL-based stack (macTLS) that ships inside the browser binary with the full 121-anchor Mozilla CA bundle. No proxy required.

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.


The progression

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.

JavaScript Hello World on Mac OS 9
v0.2: JavaScript on Mac OS 9
First real-world JS-bearing page. Duktape 2.7.0 ES5 evaluating live: Math.sqrt, JSON, ES5 array methods.
CSS transform rotate, scale, translate
fixes73: CSS transforms
Native transform: rotate() / scale() / translate(). Integer Q15 sin/cos table, no FPU dependency, arbitrary angles on QuickDraw.
CSS radial gradients
fixes74d: radial gradients
2-stop radial gradients via concentric PaintOval stack. 16 levels smeared on decode. Shape + position keywords parsed.
CSS animations: wiggle, swing, slow spin
fixes77: CSS animations
Linear ping-pong animation player on top of fixes73 rotation. Wiggle, swing, and full 0°→359° spin.
PNG image with transparency on Mac OS 9
fixes79b: PNG transparency
QuickTime Graphics Importer feeding the NetSurf image content handler. PNG + GIF + BMP, all with real transparency.
CSS word-break and overflow-wrap
fixes136: word-break / overflow-wrap
word-break: break-all, keep-all, white-space: nowrap, legacy word-wrap: break-word. URL-style aggressive wrapping.
CSS z-index stacking contexts
fixes147: stacking contexts
CSS 2.1 painting order. Opacity, transforms, and explicit z-index all create new stacking contexts, properly painted on real hardware.
CSS Grid column placement
fixes151: CSS Grid column placement
grid-column: span N, 1 / -1 full-row hero, positional start / end, span + auto-wrap. Real Grid layout on OS 9.

What's in the box

ComponentLanguagePurpose
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.
macTLS
sibling 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.

What works today

Rendering pipeline

  • Full NetSurf fetch → parse → cascade → layout → plot
  • Native libcss with var() resolution
  • QuickDraw plotters with offscreen GWorld back-buffer

CSS: ~150 properties consumed in layout

  • Custom properties & var()
  • Flex (justify-content, align-content, order)
  • Grid V1 + grid-template-columns/rows, gap
  • border-radius, box-shadow, opacity
  • Linear & radial gradients
  • text-shadow, text-overflow: ellipsis
  • transform (rotate / translate / scale)
  • z-index stacking contexts (CSS 2.1 painting order)
  • CSS counters, viewport units, aspect-ratio
  • Font-family aliases (sans / serif / monospace)

Full CSS status →

JavaScript: Duktape 2.7.0 ES5

  • Closures, prototypes, regex, JSON
  • Promises (polyfill), recursion, Mandelbrot
  • ~6 sec ackermann(3,7) on a 233 MHz G3

Images: all five formats

  • PNG with real per-pixel alpha (lodepng + CopyMask)
  • GIF with palette transparency
  • JPEG, BMP, TIFF

Networking

  • Open Transport TCP, plain non-InContext calls
  • HTTP/1.1 + chunked + keep-alive + 3xx follow
  • Connection pooling, 15s no-progress timeout
  • HTTPS via Go proxy or native macTLS

Chrome

  • Address bar, back / forward / reload / home
  • Status bar, page-info, multi-window
  • Smooth scroll bar, keyboard scrolling

Download

Latest release: MacSurf v0.6 — Mac OS 9, meet TLS (2026-05-25, native HTTPS). Previous: v0.5.0, v0.1a1.

  • MacSurf.sit (latest binary, v0.6), ready-to-run. Expand on Mac OS 9.1+ with CarbonLib 1.5+ and launch.
  • Building from source: clone this repo, then on the Mac side open browser/netsurf/frontends/macos9/MacSurf.mcp in CodeWarrior 8 and choose Build. The earliest release ships a BuildPack.sit snapshot with the CW8 project pre-wired; current builds work straight from the git clone.

All releases (with full notes per version): github.com/mplsllc/macsurf/releases. Earlier alpha release notes: docs/release-notes/MacSurf-0.1a1.md.


Getting started

Building the browser

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.

Running the proxy

A single Go binary. No config files. No dependencies beyond stdlib.

cd proxy
go build -o macsurf-proxy
./macsurf-proxy

About

A modern web browser for Classic Mac OS 9 PowerPC. Real CSS3, ES5 JavaScript, native HTTPS — built with CodeWarrior on the Carbon API.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors