在 25 年前的 Mac 上体验现代网络。
MacSurf 是面向经典 Mac OS 9 PowerPC 的网页浏览器。支持 CSS3、ES5 JavaScript 和带 alpha 通道的 PNG —— 运行在 G3 iMac 上。
MacSurf 是一个全职投入的项目。如果它让你的老 Mac 重新回到了互联网,每一分钱的捐助都能让开发继续走下去。也可以在 Patreon 上通过开发日志跟进项目进展。[!NOTE] 早期 alpha 版本 —— 它能在一台 233 MHz 的 G3 上运行、渲染,并以原生方式使用 TLS 1.3 通信,但大多数现代网站目前还无法在其中正常工作。可以期待手工打造的页面、复古风格的网站,以及在 PowerPC 上运行 ES5 JavaScript 的奇妙快感。不要指望在任意现代网站上流畅浏览、观看视频,或运行任何重度依赖 React 的内容。
如果你手头正好有一台闲置的 Power Mac G3 或 G4,装上它看看哪些地方会出问题 —— 缺陷报告和真实硬件的截图正是这个项目最需要的东西。当前的问题清单见 docs/status.md。
二十年前,网络的发展就已经超出了经典 Mac OS 的能力范围。现代 HTTPS 则在 2016 年前后给了它致命一击。如今从柜子里翻出一台 G3 或 G4,它几乎连一个还在运营的网站都打不开。
MacSurf 试图在机器本身上解决这个问题 —— 不用截图代理,也不用远程终端的把戏。这是一个原生浏览器,使用平台上已有的工具构建:CodeWarrior、Carbon、QuickDraw、Open Transport。真正的 CSS3 布局和真正的 JavaScript,运行在 1999 年 iMac 的 64 MB 内存空间之内。自 2026 年 5 月下旬起,它通过 macTLS 直接以 TLS 1.2 与当代网络对话 —— 这是一套基于 BearSSL 的协议栈,随浏览器二进制一起分发,内置来自 Mozilla CA 证书包的 121 个信任锚。不再需要代理。
据我们所知,这是 NetSurf 首次被正式移植到经典 Mac OS,也是 Mac OS 9 上有史以来第一个原生支持 CSS Grid、CSS 自定义属性和 ES5 JavaScript 的浏览器。
下面每一张截图都是一个真实的里程碑,拍摄自一台运行 Mac OS 9 的 Power Macintosh G3。标注的修复编号与本仓库的提交历史一一对应。
最新版本是 MacSurf 1.68 —— “macQJS”(2026-07-07):JavaScript 引擎已被替换 —— Duktape (ES5) → macQJS(QuickJS,ES2023),因此现代 JavaScript 可以在 Mac OS 9 上原生运行。 此外还有可用的文本输入(光标 / 选择 / Tab)、登录状态保持、书签菜单 + 下载管理器、分栏滚动条渲染修复、可下载的 Web 字体图标字形,以及一次大规模性能优化(近乎即时启动、图像/字体磁盘缓存、视口懒加载图像)。命名是为了向 68kmla.org 致敬,正是这个社区推动了这一轮开发。完整发布说明:release-notes/MacSurf-1.68.md。
此前的 MacSurf v1.4 —— Open House(2026-06-01):JavaScript 马拉松收官。 23 个 JS 桥接问题在一个版本内从开启到全部关闭 —— setTimeout / setInterval / requestAnimationFrame、window.location、window.history、URL、URLSearchParams、classList、style、Event 构造函数、MutationObserver、DOMParser、FormData、localStorage、、 / 事件,以及 / 切换。新的探测套件在 G3 iMac 上取得了 的成绩。诊断页面已上线:、、、 都会渲染真实的计数器。查看源代码以内联方式渲染,页内查找会打开一个真正的 Carbon 对话框。此前的 带来了多曲线 TLS 1.3; 是经典 Mac OS 上首个原生 TLS 1.3; 封堵了熵源漏洞; 是界面重新设计的版本; 是冷启动加速版本(mactrove.com 从 30+ 秒缩短到约 2-3 秒);首个编号 alpha 版本是 。
browser/netsurf/frontends/macos9/MacSurf.mcp 并选择 Build。在 v1.3.1 工作区上构建 v1.4 的开发者需要向项目添加一个新的源文件:browser/netsurf/desktop/search.c(为新版查找对话框提供 browser_window_search;content/textsearch.c 已经在项目中)。macTLS 与 v1.3.1 相比没有变化。在 v1.2 工作区上构建 v1.3 的开发者需要为 TLS 1.3 添加四个 macTLS 文件:bearssl/src/ec/ec_c25519_m15.c、os9/ostls_tls13_keysched.c、os9/ostls_tls13_record.c、os9/ostls_tls13_handshake.c。在 1.0 工作区上构建 v1.2 的开发者需要 desktop/download.c。最早的版本附带一个 BuildPack.sit 快照,其中 CW8 项目已预先配置好,不过当前的版本可以直接从全新克隆构建。如果想了解背景,可以查看更早的 alpha 发布说明:docs/release-notes/MacSurf-0.1a1.md。
构建浏览器MacSurf 在 Mac OS 9 上使用 CodeWarrior 8 Pro(8.3 更新版)构建。源码可以针对 Retro68 PowerPC GCC 进行干净的交叉编译,这正是我们在 Linux 侧快速做语法检查时所用的方案。 |
![]() v0.2:Mac OS 9 上的 JavaScript 第一个包含真实世界 JS 的页面。Duktape 2.7.0 ES5 实时执行: Math.sqrt、JSON、ES5 数组方法。
|
![]() fixes73:CSS 变换 原生支持 transform: rotate() / scale() / translate()。使用整数 Q15 sin/cos 查找表,不依赖 FPU,可在 QuickDraw 上绘制任意角度。
|
![]() fixes74d:径向渐变 通过同心 PaintOval 堆栈实现双色标径向渐变。解码时以 16 级涂抹过渡。支持形状与位置关键字解析。
|
![]() fixes77:CSS 动画 在 fixes73 旋转基础上实现的线性往返动画播放器。支持摆动、摇摆,以及 0°→359° 的完整旋转。 |
![]() fixes79b:PNG 透明度 QuickTime Graphics Importer 为 NetSurf 图像内容处理器提供数据。PNG + GIF + BMP,全部支持真正的透明。 |
![]() fixes136:word-break / overflow-wrap word-break: break-all、keep-all、white-space: nowrap、旧式 word-wrap: break-word。支持 URL 风格的激进换行。
|
![]() fixes147:层叠上下文 CSS 2.1 绘制顺序。透明度、变换和显式 z-index 都会创建新的层叠上下文,并在真实硬件上正确绘制。
|
![]() fixes151:CSS Grid 列放置 grid-column: span N、整行 hero 区域的 1 / -1、按位置指定的 start / end、span + 自动换行。OS 9 上真正的 Grid 布局。
|
![]() v1.0:Showcase 新的工具带式工具栏、锐利清晰的地址栏和哑光图标,在运行 OS 9.2.2 的 G3 iMac 上渲染 home.macsurf.org。通过 macTLS 原生 HTTPS 直连源站,服务端渲染的门户页面,端到端真彩色图像。 | |
| 组件 | 语言 | 用途 |
|---|---|---|
browser/ | C (C89, CW8) | NetSurf 的分支,带有 macos9 前端。UI 使用 Carbon,绘制使用 QuickDraw,联网使用 Open Transport,JS 使用 Duktape。 |
proxy/ | Go(仅标准库) | 负责剥离 TLS 的旧版 HTTP 代理。如今 macTLS 已能原生工作,它基本退役,但在没有 CarbonLib 的机器上仍可用作备选方案。Mac 发送明文 HTTP,代理通过 HTTPS 获取内容,再返回明文 HTTP。 |
macTLS兄弟仓库 | C (CW8) | 面向 OS 9 的原生 TLS 1.2 库 —— 从 Mac 直接建立现代 HTTPS 连接,无需代理。底层使用 BearSSL,内置 121 个信任锚。 |
|
渲染管线
CSS —— 布局中约消费 150 个属性
|
JavaScript —— Duktape 2.7.0,完整 ES5
图像 —— 全部五种格式
网络
浏览器界面
|
fetchloadDOMContentLoaded<details><summary>JS 19/19 通过,0 失败about:cacheabout:memoryabout:configabout:perf