MacSurf is a native browser for PowerPC‑based Classic Mac OS 9 that renders real CSS3, runs ES5 JavaScript and talks TLS 1.2 without a proxy. Built with CodeWarrior, the Carbon API and a BearSSL‑based TLS stack, it demonstrates how far a 1999 G3 can stretch toward today’s web, while also exposing the gaps that still separate vintage hardware from contemporary sites.
Bringing the Modern Web to Classic Mac OS 9: Inside the MacSurf Browser

The idea of loading a modern website on a beige PowerMac G3 sounds like a nostalgic stunt, yet the MacSurf project proves it can be more than a curiosity. By forking the open‑source NetSurf engine, rewriting the UI for the Carbon API, and embedding a lightweight BearSSL‑derived TLS library (macTLS), the developers have produced a browser that actually parses CSS 3, executes ES5‑compatible JavaScript, and negotiates TLS 1.2 directly with live sites such as mactrove.com. The result is a functional, if still early‑alpha, web client that runs inside the 64 MiB memory envelope of a 1999 iMac.
Why MacSurf Exists
Classic Mac OS 9 fell out of mainstream use around 2002, and the web outgrew it shortly thereafter. By 2016, the mandatory use of modern HTTPS effectively shut the platform out of the live internet. Most existing solutions for vintage Macs are either screenshot proxies (rendering pages on a remote server and streaming a bitmap) or remote‑terminal sessions that sacrifice interactivity. MacSurf takes a different route: it is a native browser, built with the same tools that originally lived on the platform—CodeWarrior, Carbon, QuickDraw, and Open Transport—yet it speaks the same TLS 1.2 protocol that browsers on a 2026 laptop use.
This approach matters for two reasons. First, it restores a degree of agency to owners of legacy hardware, allowing them to explore the web without relying on external services that could disappear. Second, it serves as a living laboratory for low‑level systems programming: the codebase is pure C89, the same dialect a developer would have written in 1999, and it demonstrates how modern protocols can be retro‑fitted onto antiquated kernels.
Core Technical Achievements
1. Native TLS 1.2 via macTLS
The most striking breakthrough is the macTLS library, a thin wrapper around BearSSL that embeds the full 121‑anchor Mozilla root store directly into the browser binary. Because Classic OS 9’s networking stack (Open Transport) lacks built‑in TLS, macTLS performs the handshake, certificate verification, and encryption on‑device. No external proxy is required, which eliminates latency and privacy concerns associated with “TLS‑stripping” proxies.
2. Real CSS 3 and Grid Layouts
MacSurf’s rendering pipeline follows the classic NetSurf flow: fetch → parse → cascade → layout → plot. The layout engine now supports a respectable subset of modern CSS, including:
- Custom properties (
var()) and CSS variables - CSS Grid (column placement,
grid-column: span N, auto‑wrap) - Flexbox basics (
justify-content,align-content,order) - Linear and radial gradients, border‑radius, box‑shadow, opacity, and text‑shadow
- Stacking contexts (
z-index, transforms) that respect CSS 2.1 painting order
These features are implemented on top of QuickDraw, using an off‑screen GWorld buffer to compose the final bitmap before blitting to the screen.
3. ES5 JavaScript via Duktape 2.7.0
The JavaScript engine is Duktape, a lightweight, embeddable interpreter that conforms to ECMAScript 5.0. It provides closures, prototypes, regular expressions, JSON handling, and a polyfilled Promise implementation. Benchmarks on a 233 MHz G3 show a Mandelbrot set rendering taking roughly six seconds, and an Ackermann function ackermann(3,7) completing in a comparable timeframe—impressive given the hardware constraints.
4. Full‑color Image Support
MacSurf integrates lodepng for PNG decoding, preserving per‑pixel alpha, and also supports GIF (palette transparency), JPEG, BMP, and TIFF via the QuickTime Graphics Importer. This means pages can display true‑color graphics without resorting to the 8‑bit palettes that plagued earlier Classic OS browsers.
What Works Today
| Feature | Status |
|---|---|
| TLS 1.2 with full CA bundle | Native, no proxy |
| CSS Grid (basic placement) | Functional |
CSS Variables (var()) |
Supported |
| Linear & radial gradients | Implemented |
| PNG with alpha | Real per‑pixel transparency |
| JavaScript ES5 (Duktape) | Executable on real pages |
| Navigation UI (address bar, back/forward) | Usable |
| Multi‑window support | Basic |
The browser can load hand‑crafted sites, retro‑style blogs, and a subset of modern pages that avoid heavy single‑page‑application frameworks. The release notes for v0.7 (2026‑05‑26) highlight a sprint that closed twelve issues, adding cross‑element CSS variables and improving gradient syntax handling.
Current Limitations
- Heavy SPAs (React, Angular, Vue) fail because the engine lacks a DOM mutation observer and the performance needed for frequent re‑flows.
- Media: No built‑in audio, video, or WebGL support; the QuickDraw pipeline cannot render compressed streams.
- Form interactions: Many input types and validation attributes are missing, limiting the ability to submit complex forms.
- Performance: Even simple pages can take several seconds to render on a G3; the CPU is simply not designed for modern JavaScript workloads.
- CSS coverage: Features such as
flex-wrap,grid-template-areas, and many newer properties remain unimplemented.
These gaps are intentional; the project’s README explicitly asks contributors to focus on expanding the CSS/DOM/JS surface rather than trying to emulate a full‑blown Chrome experience.
Implications for the Vintage‑Computing Community
MacSurf demonstrates that protocol‑level compatibility can be achieved on hardware that predates the standards by decades. This has several broader consequences:
- Preservation of digital heritage – Researchers can now view contemporary web content in the original context of a Classic OS environment, aiding studies of web evolution.
- Educational value – The codebase serves as a teaching tool for low‑level networking, graphics, and interpreter design, especially for students interested in retro‑computing.
- Community revitalization – By providing a concrete, usable target, the project encourages owners of dormant PowerMacs to dust them off, potentially extending the useful life of otherwise obsolete machines.
Counter‑Perspectives and Future Directions
Critics may argue that investing effort in a browser for a platform that can no longer receive security updates is misguided. The counterpoint is that the security model of Classic OS 9 is fundamentally different; the operating system lacks modern privilege separation, making any network‑exposed software a potential attack surface regardless of TLS. However, because macTLS validates certificates against a current CA bundle, the browser mitigates man‑in‑the‑middle risks that plagued earlier Mac OS 9 browsers which relied on insecure proxies.
Future work could pursue:
- Incremental JavaScript improvements – Porting a more modern engine (e.g., QuickJS) while still fitting within the 64 MiB limit.
- Media decoding – Leveraging QuickTime’s codec libraries to add basic video playback.
- Hybrid proxy mode – Offering an optional Go‑based proxy that can offload heavy JavaScript while preserving the native TLS path for simple pages.
- Automated testing – Using Retro68 to run unit tests on Linux, ensuring regressions are caught before they reach vintage hardware.
Getting Started
- Download the binary – The latest release is
MacSurf.sit(v0.7). Extract and copyMacSurfto the Classic OS 9 Applications folder. - Run on a PowerMac G3/G4 – Launch the app; the UI resembles early 2000s browsers with an address bar, back/forward buttons, and a status line.
- Report bugs – Screenshots and logs from real hardware are the most valuable contributions. Open issues on the GitHub repo.
- Build from source – Clone the repository, open
browser/netsurf/frontends/macos9/MacSurf.mcpin CodeWarrior 8, and build. The project also provides a Retro68 cross‑compile workflow for Linux users.
For a deeper dive into the implementation details, see the repository’s docs/status.md and the full release notes at docs/release-notes/MacSurf-0.7.md.
Conclusion
MacSurf is a bold experiment that bridges a 25‑year technology gap, proving that a classic operating system can still speak the language of today’s web. While it will never replace a modern browser for everyday browsing, it offers a unique window into the possibilities of low‑level software engineering, the resilience of open‑source ecosystems, and the enduring charm of vintage hardware. As the project matures, each added CSS property, JavaScript feature, or media capability will not only expand the browser’s usefulness but also enrich the collective understanding of how far a 1999 PowerPC can go when paired with contemporary protocols.
Explore the source, try it on your old Mac, and help shape the next chapter of the web on Classic OS 9.

Comments
Please log in or register to join the discussion