MacSurf 1.68 – NetSurf on OS 9 Released
MacSurf 1.68: The "macQJS" Update for NetSurf on OS 9
The latest iteration of MacSurf, version 1.68, has officially arrived. This is a native web browser specifically engineered for Classic Mac OS (supporting PowerPC architectures and Mac OS 9.1 through 9.2.2). It brings the modern web to vintage hardware via native TLS 1.3 and a contemporary JavaScript engine, eliminating the need for external proxies or companion computers.
🏛️ A Tribute to 68kmla.org
The version number 1.68 is a deliberate nod to 68kmla.org. This community and its platform were the primary catalysts for the current development cycle.
"An enormous amount of 1.68 exists because 68kmla exists: it's the site I test against every single day, it's where the toughest real-world rendering, login, and JavaScript problems surfaced, and it's the reason so many of the fixes below are as thorough as they are."
The developer expresses deep gratitude to the 68kmla community for their patience with bugs, their detailed feedback, and their welcoming nature toward a "rough-around-the-edges" project. Achieving a state where a user can render a forum, log in, and post a reply from an actual OS 9 machine has been a major milestone.
💰 Supporting the Project
Bringing a modern, HTTPS-only experience to legacy hardware is a massive undertaking. To keep the project sustainable, financial support is requested:
- Patreon:
https://www.patreon.com/cw/MacSurf - Ko-Fi:
https://ko-fi.com/macsurf
Supporters gain access to development logs and a voice in the project's future roadmap.
🚀 The Headline: Introducing macQJS
The most significant evolution since version 1.5 is the complete overhaul of the JavaScript engine. MacSurf has transitioned from Duktape (ES5) to macQJS.
What is macQJS?
macQJS is a port of QuickJS for Classic Mac OS. It allows PowerPC machines running OS 9 to execute ES2023 JavaScript natively.
Comparison of JS Capabilities
| Feature | Old Engine (Duktape) | New Engine (macQJS) |
|---|---|---|
| Standard | ES5 | ES2023 |
| Modern Syntax | Required Transpiler | Native Support |
| Key Features | Basic JS | let, const, , , |
| Stability | Prone to bundle corruption | Hardware-verified stability |
Technical Improvements
Previously, MacSurf used an internal ES6ES5 transpiler to "pre-chew" modern code. This has been retired because the async/await rewriting process was silently damaging minified bundles. Now, site bundles execute directly on-device.
To prevent a malicious or poorly written script from crashing the system, the engine implements:
- Memory Cap: A strict per-heap limit.
- Execution Deadline: A timeout to prevent hangs, defined as:
Note: macQJS is developed as a standalone project, meaning other Classic Mac OS software can potentially integrate it.
🛠️ Showstoppers Fixed
This cycle focused on "the basics"—essential features that are now fully operational:
- Visual Caret: Input fields and textareas now feature a blinking text cursor (via native
place_caret). - Text Manipulation: Click-and-drag selection is functional; Cut/Copy/Paste now correctly interface with the Mac Scrap Manager.
- Session Persistence: Fixed a bug where the browser served stale, cached "logged-out" pages immediately after a successful login.
- Viewport Stability: Caret movement and page scrolling no longer cause the entire viewport to shift sideways.
- Boot Speed: Removed a heavy JS benchmark that ran at every launch, eliminating a -second freeze.
- UI Interaction: Fixed "click-through" issues where buttons on sticky overlays (like cookie banners) would trigger elements on the page behind them.
🔍 Detailed Change Log
JavaScript Engine (macQJS)
- Integrated via the
WITH_QUICKJSbuild flag. - Implemented a fresh JS realm for every navigation to prevent top-level declarations (like
classorconst) from colliding between different pages. - Completed a multi-month migration (fixes 482–554) and a stability arc (fixes 565–577).
Site Compatibility (XenForo & 68kmla)
The switch to a modern engine initially broke the XenForo editor due to a crash chain:
parentNode -null jQuery Sizzle jQuery.support XF.Element
The Solution:
- Small ES5 shims are now used for three specific bundles to define
XF.Elementand properly size the editor. - "Doomed" feature bundles (e.g.,
lightbox,media gallery) that are incompatible with the engine are now skipped entirely to improve load times.
Text Input & Keyboard
- Full support for password fields and standard text inputs.
- Integration of
Cmdkeys and the Edit menu for clipboard actions.
