Search 浏览器版本演进全记录:从 1.0 到 Unreleased 的变更工程与实现解读

原创2026-09-30 22:40:271,101 阅读

Search 浏览器版本演进全记录:从 1.0 到 Unreleased 的变更工程与实现解读

Search(Office Commun 出品的 macOS 浏览器)的 CHANGELOG.md 不仅是逐版本的功能清单,更是这个项目「如何持续发布」的工程档案:它记录了每个版本新增了什么、修好了什么、为什么这样改,以及每一条变更背后的社区来源。本文以该文件为骨架,结合仓库内的源码(Updater.swift、AI.swift、SplitView.swift、Bench.swift 等)与配套文档(NOTES.md、ROADMAP.md),带读者完整读懂 Search 从 1.0 到下一个版本的每一步演进,并理解其更新机制、测试体系与隐私设计在源码中如何落地。

CHANGELOG 的定位与工作流:项目如何记录每一次变更

文件开头的说明定义了这份文档的运作规则,也是理解全文的前提:

  • 最新在前:越新的版本越靠上,Unreleased 汇总自上个版本以来所有已合入的工作;
  • 每一条变更在合并当天登记:每个修复、每个新增都会在合入那天写上自己的行;
  • 版本发布时:该节标题获得版本号和日期,其要点段落成为 NOTES.md 中的段落(也就是 Settings 和更新器向用户展示的内容),而列表本身则作为更新公告发布;
  • 计划中但未完成的工作不在这里,而在 ROADMAP.md。

从源码看,这一流程与 ROADMAP 是联动的:ROADMAP 开头说明其清单由 ./ideas 工具维护(./ideas start ID "who"、./ideas done ID 在合入 main 的同一时刻登记进 CHANGELOG),而 NOTES.md 每一段恰好对应一个已发布版本的要点摘要——例如 1.0.4 的段落是「Several windows, and a lot to discover…」,1.0.3 是「Security, and the mouse wheel…」。三者(CHANGELOG / NOTES / ROADMAP)共同构成「已发布 / 正在做 / 将来做」的完整视图。

版本时间线与整体脉络

Search 的版本节奏非常紧凑:1.0 于 2026 年 9 月 23 日发布,之后几乎每天一个版本(1.0.1 同日、1.0.2 次日、1.0.3 再次日、1.0.4 于 27 日),随后进入 Unreleased 阶段。整体脉络可概括为:

版本 日期 核心主题
1.0 2026-09-23 首发:极简浏览器,约 2.9 MB,复用 macOS 内置 WebKit 引擎
1.0.1 2026-09-23 Spaces、Web Inspector、自选搜索引擎、macOS 14 兼容修复
1.0.2 2026-09-24 Passkeys 全面可用、书签栏、Peek、浮动视频扩展、隐私加固
1.0.3 2026-09-24 安全加固(更新/扩展/bench 三轮审查)、滚轮滚动修复
1.0.4 2026-09-27 多窗口、AppleScript、站点快捷指令、快捷键自定义、浏览器导入
Unreleased — ⌃Tab 卡片切换、AI、定位权限、Intel 支持、Split View、下载暂停/续传等

Unreleased:下一个版本的完整变更清单

Unreleased 是当前最丰富的章节,也是理解 Search 近期产品方向的窗口。它包含 19 条 Added 与 34 条 Fixed,下面逐类整理。

新增(Added)

界面与交互

  • ⌃Tab 切换器接管指针:卡片上停留指针即可选中(指针移动后生效),点击则选中(无论是否按住 ⌃),点击卡片外部关闭切换器。
  • 从地址栏搜索站点(类 Arc):输入站点名开头(如 red、yout),按 Tab,之后输入的内容就搜索该站点。Reddit、YouTube、X、ChatGPT、Claude、Perplexity、Wikipedia、GitHub 等内置,声明了搜索地址的站点会自动加入;自定义站点快捷指令不受影响。默认关闭,开关位于 Settings › General › Search a site from the address field。
  • 全新窗口启动:启动时只保留固定标签(pinned tabs),不带上次的其他标签。默认关闭:Settings › General › Start with a fresh window。
  • Split View 分屏:把标签拖到页面左/右边缘、标签菜单选择 Open in Split View、或按 ⌥⌘N 打开并排空页;拖动分隔条(停在均分位置、双击均分、右键交换/分离/关闭双方)、⌃⌘←/⌃⌘→ 切换页面、⌘W 只关当前页、⇧⌘T 恢复。固定页以副本形式分屏且原位不动;被窥视(Peek)的链接可通过新按钮或 ⌥⌘Return 保留在旁边。一对页面中某个弹 alert/confirm/prompt 时只覆盖自己的半边。每个 Space 各自保留分屏对与宽度(重启后仍在),默认关闭:Settings › Tabs。从源码看,其实现是 SplitView.swift 中的 SplitStage:通过 PaneStage 持有页面,由 browser.split(for:)、swapSplit()、evenSplit()、detachSplit()、closeSplit() 等驱动布局与动作,SwiftUI 层(PaneLayers)负责覆盖在每页之上的封面、故障、地址栏与查找栏,并标注「这是谁的页面」。

功能与平台

  • AI 页面助手(默认关闭):Settings › AI 开启后,View 菜单出现 Summarize Page 与 Ask About This Page…。回答运行在你选择的地方:下载到本机的模型(Apple Silicon 上为 Qwen3 1.7B,1.1 GB,每次使用前校验,由 Search 自带的、无法联网或访问文件的小程序运行)、本机的 Ollama 或 LM Studio、或你自己的 Anthropic / OpenAI / Google Gemini / OpenRouter 密钥、或 OpenRouter 账号登录。回答显示在页面旁的纯文本面板中,标注「可能错误」与运行位置;追问留在面板内,面板关闭后不留任何内容。只发送页面可见文本,绝不含密码、表单或其他标签页;页面文字作为「阅读材料」而非「指令」交给模型;回答中凡不在页面上的网址、邮箱或电话都会被指出。密钥只存于本机钥匙串并只发给对应服务商;服务商不在本机时,首次请求前会展示将发送的内容;隐私标签页只用本机运行的服务。源码佐证:AI.swift 中的 AIProvider 枚举定义了七种来源(On this Mac / Anthropic / OpenAI / Google Gemini / OpenRouter / Ollama / LM Studio),isLocal 区分本机与远程,base 给出各服务商地址(Ollama 为 http://127.0.0.1:11434/v1/、LM Studio 为 http://127.0.0.1:1234/v1/,本机引擎则永不走网络),defaultModel 提供各服务商默认模型(如 claude-haiku-4-5、gpt-5.4-mini、gemini-3.8-flash),AIKeys 将密钥按 provider@host 存入数据保护钥匙串,仅供 Search 自身签名读取。
  • 网站定位权限(类 Safari):卡片提供 Allow once / Always allow / Don't allow,Always 与 Don't 按站点保存(Settings › Privacy › Forget choices 现在覆盖相机、麦克风与定位)。只有屏幕上的页面可请求,且仅限自身或同站同址的 frame;跨站 frame 一律拒绝;隐私标签页不保留任何选择。macOS 会先询问 Search 是否允许使用定位。相机/麦克风卡片与前 0.5 秒不接受点击。
  • Intel Mac 支持:提供独立于 Apple Silicon 的下载与独立的更新 feed,避免「一个通用包让所有人负担双倍体积」;两类 Mac 各自更新,绝不会被交给对方的构建。源码佐证:Updater.feed 通过 #if arch(x86_64) 在 Updater.swift 中分别指向 officecommun.com/search/intel/appcast.json 与 officecommun.com/search/appcast.json。
  • 登录框下的 Passkeys(类 Safari):站点在登录框下提供 passkey 时,本机持有的 passkey 会列在名字框下方的密码旁,点击唤起系统面板并完成登录;未选择前任何信息都不会到达站点;frame 中的站点不提供 passkey。
  • 查找位置提示与计数:Find on Page 显示「3 of 17」并可从最后一个匹配循环回第一个;菜单可限定 Match case 或 Whole words。不勾 Match case 时,无重音字母也能命中重音词(ete 命中 été)。超长页面计数到 1000 后显示「1000+」,直到 Next 继续深入(同 Safari);PDF 只提示是否有匹配,不计数。
  • 查找全页高亮:页面上的每个匹配涂黄色、当前匹配涂橙色(同 Safari/Chrome);此前只有选中态的浅灰,难看清。输入框内的匹配仅保留其选中态。
  • 下载暂停与续传:Downloads 面板可暂停/恢复;自行中断的下载保留原因,服务器允许时可断点续传,否则重新开始;环形进度、Dock 与 Finder 沿用已下载部分。仅在 Search 运行期间有效;表单触发的下载不会被重复询问。
  • 网站通知(类 Safari):站点请求时在自己页面上的卡片给出 Allow / Don't allow;通知以 macOS 系统通知呈现(署名站点、带站点图标),点击将其标签页带回前台。Settings › Privacy 列出已允许站点(各带 Remove),并可在 Let sites ask to send notifications 下整体关闭;Forget choices 一键全部撤销;隐私标签页从不被询问。
  • 屏幕录制扩展可用:Loom、Screencastify、Awesome Screenshot,以及从离屏页面录制的 Tella、ScreenPal、Vidyard 等。首次请求时 Search 询问并具名;此后在「刚用过该扩展」之外会再次询问。录制/使用相机或麦克风期间,屏幕底部出现带 Stop 的小药丸(pill),其标签页带标记;网站共享屏幕也显示药丸。Settings › Extensions 列出允许录制的扩展(各带 Remove)。WebKit 无法提供的能力:单独录制单个标签页(回退到整窗录制的工具如 Loom 只能录窗口)、以及屏幕或标签页的声音。

修复(Fixed)

Unreleased 的修复条目横跨性能、扩展兼容、隐私与细节,重点包括:

  • 直播视频不再每隔几秒跳动:X 等站点会在正常速度与「略快」之间频繁切换以追赶直播;每次切回正常速度都会让 WebKit 重建音频并使画面停顿。现在一旦页面调整过视频速度,Search 就将其正常速度播放为偏离精确 1 的微小值(每秒千分之一毫秒),切换因此无中断,而页面读到的仍是它请求的速度。
  • 扩展 popup 自答:windows.getCurrent 返回 popup 自身窗口而非前台窗口,Bitwarden 的 passkey 窗口因此能正确定位与调尺寸。
  • 浮窗视频填满窗口:Twitch 类播放器(祖先带 transform/filter/containment)曾把视频放进自己的盒子里导致画面缺失,或只画在屏上/淡出导致黑窗。
  • 大量标签不再拖慢标签栏:开启标签组后每个标签计算其他所有标签的宽度,300 个标签的空间切换需 1 秒多,现只需几百分之一秒;回到某个 Space 也不再整体重读其文件。
  • GitHub passkey 登录恢复:Touch ID 后站点读不到 Search 回传的 passkey(其登录代码在 Search 设为只读的对象上设置方法),现已修复。
  • 游戏按键不再让 Mac 蜂鸣:此前只静音了最后一个按键,快速连按或长按仍会蜂鸣;现在按下的键会回到页面。箭头键翻页、Page Up/Down 与空格滚动照常。
  • 体积控制:Search 为体积做了优化(启动、滚动、打字与 1.0.4 并行实测),图标目录打包更紧且保留全部 Dock 样式;本版本新增内容全部塞进 6.3 MB(1.0.4 为 6.1 MB)。
  • 大文件导入后台化:大导出文件与文件夹在后台导入,带进度与 Cancel;文件夹导入只访问所选文件夹及其直接子目录;取消会停止后续工作并说明已导入内容。
  • 持续变化页面的性能:聊天逐字输出、滚动填充的信息流等页面此前每次变化都全页扫描登录表单,长对话越写越慢(3000 词从 0.3 s 涨到 3.7 s);现在变化后 0.25 秒才查一次、最多每秒 4 次,滚动时不再逐帧检查(除非光标在输入框内)。
  • 扩展收到后台发给其页面的消息:WebKit 原本不投递这些消息,导致 Bitwarden 的 passkey 窗口空白、同步超时;现在每条消息都会传给扩展的各页面。
  • popup 遵循页面请求的宽度(更窄与更宽均可);扩展自身页面的密码不再被建议保存(如 Bitwarden 解锁 PIN);windows.update 可移动/调整窗口尺寸(Bitwarden 弹出窗口不再报错)。
  • 历史记录区分仅协议/端口/路径大小写不同的页面:localhost:3000 与 localhost:4000 不再互相覆盖,输入仍不区分大小写匹配;地址中夹带的用户名密码不再进入历史。
  • Check for Updates… 跟随更新进展:更新设为等待时显示 Install Update,下载中显示 Downloading Update…,无法自替换时显示 Download Update…,就绪后显示 Restart to Update;窗口底部行指向该处。
  • 扩展安装失败不殃及现役副本:安装/更新/重载失败时保留原可用副本(含设置),只有完整落地的副本才会替换。
  • 书签夹内书签恢复站点图标;全屏时标签栏与列起始于边缘(不再给被 macOS 收走的窗口按钮留空角);Copy Image 支持页面自绘图片(WhatsApp Web 的照片,仅存在于页面内,现可读取);拖动固定标签跟手;Tampermonkey 可从 Greasy Fork / OpenUserJS / GitHub / GitLab 等链接安装(规则此前不是 WebKit 接受的形式);新建空白标签按 Esc 关闭并返回原标签(键入内容或它是唯一标签则保留);未发送的输入在新标签间往返不丢失(仅内存保留);扩展页面可在标签中运行 scripting.executeScript(Aino 网页剪辑恢复);SingleFile 恢复保存;书签列表对齐(拖放指示线不再残留);离屏文档扩展(Lokal 等)就绪后再使用;地址编辑随光标滚动、站点卡片在上方无空间时向上弹出、不同端口站点各自图标、站点换图标后及时更新、从 Arc 带入的固定标签即刻戴图标。

1.0.4 — 27 September 2026:多窗口、AppleScript 与导入

1.0.4 是发布后功能最密集的版本之一,与 NOTES.md 的对应段落一致。

新增(Added)要点

  • 常驻下载按钮:Settings › Downloads › Always show the downloads button 开启后按钮常驻、单击打开 Downloads;下载时仍显示填充进度。
  • 站点卡片播放声音:Play Sound by Itself 允许站点自启带声视频(默认全站关闭;隐私标签页不记忆;Settings › General 开启 Videos wait for a click 时任何站点都不自播)。
  • 浮窗视频停靠屏幕边缘(类 Dia):Settings › General › Flick the floating video to a corner 开启后,双指在窗口靠边侧重拉可停靠,足够强的滑动将其滑出屏幕只留一绺;滑回、点绺或横向滚轮刻度唤回;关闭后重开回到原位;屏幕另一侧有显示器时不在此停靠。
  • 更新后的「新内容」卡片:显示新开关(含说明与开关本身)以及之前版本仍关闭的开关;关闭后该版本不再弹出;全新安装显示欢迎页;Settings › About › What's New… 有全部版本的分条说明。
  • 多窗口:⌘N(或 Dock 图标菜单 New Window)打开同 Space 的新窗口,各自独立标签与 Space;菜单与快捷键作用于前台窗口;其他应用的链接在前台窗口打开;关闭最后一个窗口后 Search 保持运行(同 Safari),Dock 图标/⌘N/链接可带回全部标签。固定标签在所有窗口同步(钉住/取消/移动一处即处处同步),但每窗口各自保有每颗固定标签的页面。标签可拖出到另一窗口或新窗口(Move to Window)。扩展可见全部窗口(windows.getAll、windows.create、windows.onFocusChanged 可用,每个标签声明所属窗口)。
  • AppleScript 读取标签(Safari 词汇):URL of current tab of front window、name、tabs、count 在全部窗口可用,Raycast、Alfred、sesh 类脚本可取得当前页面。只读:不能打开/关闭/修改/运行页面;隐私标签页永不显示(前台是隐私标签时窗口无 current tab);仅系统设置 › 隐私与安全 › 自动化 中允许的应用可询问。相关声明见 Search.sdef。
  • 站点快捷指令:搜索词前的自定义词将搜索发送到该站点——yt cats 去 YouTube 搜索。Settings › General › Site shortcuts 接受「词 + 含 %s 的站点搜索地址」,只保存含一个 %s 的 http/https 地址;默认一个都没有。
  • 后台标签按需加载:⌘-click/中键点击链接、中键打开书签、其他应用批量链接可在你前往前不加载(上次会话带回的标签本就如此);前台打开的标签(含 ⇧⌘-click)与扩展打开的标签总是立即加载。开关:Settings › Tabs › Load background tabs when you go to them。
  • 书签手动排序、地址栏命令词(settings、new tab、bookmarks、history、downloads、passwords、sidebar 等作为首条建议,仅当只输入该词时,Return 直达;默认关闭:Settings › General › Address bar commands)、⌘Return 在后台新标签打开、按住后退/前进滑动选历史页(类 Dia)、⇧⌘B 书签编辑卡片、书签搜索、建议条中引擎图标、视频等待点击(类 Safari Never Auto-Play)、Space 名称短暂显示、双击固定标签回到钉住页、固定标签加载环、下载进度圆环、每小时自动检查更新、三个开关默认开启(Show where links go、Peek at a link with a shift-click、Flick the floating video to a corner;已关闭的不受影响)、WebAuthn PRF 扩展(passkey 解密站点加密内容,macOS 15+)、外部链接小窗(类 Arc Little Arc)(Settings › General › Open links from other apps in a small window)、⌥⌘R 从源站重载、⇧⌘⌫ 直达历史清理、Reduce Motion 即时响应、书签/文件夹重命名、中键书签后台开标签、标签移动到其他 Space、侧向滚轮切 Space、空白处双击新建标签、默认页面缩放、后退/前进/重载按钮可居左、从 Helium / Comet / Chrome Beta / Dev / Canary / Opera / Opera GX / Firefox / Zen 导入(Firefox/Zen 密码从 key4.db 解密 AES-256 或 3DES)、从导出文件导入(.html 书签页、.csv 密码、Safari 导出)、统一导入面板(./bench import-preview 显示数量,./bench import --profile NAME|all 执行;Chrome Web Store 扩展可一并安装,逐个经签名校验并征求同意)、⌃Tab 卡片式标签切换(最近使用优先,全程可用无开关)、标签组(Settings › Tabs,默认关闭)、Prevent cross-site tracking 可关闭(隐私标签页保持开启)、侧栏可居右(Settings › Tabs › Sidebar position)、自定义书签文件夹、自定义键盘快捷键(Settings › Shortcuts,含扩展快捷键)、Put to Sleep 手动休眠标签、⌘Return 保留 Peek 为标签、固定标签均匀排布(最多每行四个)、File › Bring Things Over… 随时导入、导入记录与「替换上次导入」、Arc 的 Spaces 与固定标签整体迁入、Arc 文件夹转为同名标签组。

修复(Fixed)要点

  • 安全加固(第二轮私密安全报告,感谢 Vahagn Yengibaryan):扩展对网站的访问不触及另一扩展的页面;扩展不能从后台/popup/登录流程把标签送往 javascript: 或 file: 地址;从 Chrome Web Store 页安装的就是该页所示扩展;downloads.open 需要权限且只能打开扩展自己的下载;search、notifications、idle、power、text-to-speech 各有权限要求;Search 自身的消息只接受来自扩展本体。后台标签的 alert/confirm/prompt 等到你前往才弹出;站点卡片与密码建议跟随屏幕页面而非仍在加载的页面;登录框下账户列表前 0.5 秒不可点;Android 应用导入的登录不再当作网站登录;相机/麦克风按站点保存且隐私标签页不保留;隐私标签页下载不进入列表;Clear History 清除站点图标;被禁用/移除的扩展的离屏页与保活一并清理;非测试运行下列表不显示隐私标签。
  • 更多防线:扩展不能打开隐私窗口;本机保存的页面文件(主页文件夹/磁盘顶层)只获得自身访问权。
  • Figma 扩展按钮、当前固定标签高亮(更深灰)、全屏视频切换应用不再黑屏、取消固定标签归位、浮窗视频进出更平稳、全屏侧栏按钮时序、Window › Move & Resize 与系统平铺、「tabs」权限扩展看到全部标签、扩展书签 API 尊重 index、Figma 登录回调(chromiumapp.org)、标签栏折叠后顶边拖动窗口、中键在拦截冒泡的页面上仍开新标签、折叠侧栏指针甩出边缘即出、下载型链接的标签自动关闭、窗口位置尺寸先恢复再显示、画布类页面双指横向平移而非后退、更新 feed 签名校验(与 app 同一 Developer ID)、输入框滚动不逐帧查钥匙串、加载标签不再耗五分之一核心、滚动开销减半、会话/书签/下载保存按序落盘、退出时隐私/空白标签带回前一标签、⌘K 全局打开页面列表、识别 Vivaldi/Opera 的 NativeMessagingHosts、折叠栏 × 可关闭标签、Zoom/Teams/Slack「从应用加入」恢复、滚动重绘大幅削减、隐藏启动先加载扩展再回页、Electron 应用(Notion)链接置前、0.0.0.0 / [::1] / 局域网设备地址正确打开、⌘←/⌘→ 恢复后退/前进、popup 从自身地址加载、Bitwarden 自托管变更实时同步、页面开窗按站点署名、外部链接/固定标签链接插到固定区之后、快捷键卡片补 ⇧⌘C、设置侧栏底色、模块化 worker 扩展先获 Chrome 层、浮窗视频 transform 居中与 Netflix 字幕、iCloud Passwords 配对稳定、Passwords 面板瞬时打开、清理陈旧的扩展 worker、导入更稳健(SQLite WAL、增量去重、缺失 profile 提示)、Bitwarden 缺失 Symbol.dispose 修复、点击标签显示真实地址、扩展按钮二次点击关闭 popup、1Password 弹出不再空转、NordPass 登录完成、Passbolt popup 非空、Claude 扩展启动、右键菜单措辞 Open Link in New Tab、⌥⌫ 删除末词、地址建议随长历史线性扩展、站点卡片展示证书、Web Inspector 随标签驻留、浮窗视频首次点击即移动、PDF 保存按钮生效、坏书签不再让 Search 退出、bench 截图改存用户私有临时目录、书签列表悬停不折叠列、标签图标不错挂、扩展快捷键避让系统键、损坏的 Firefox/Zen profile 导入安全结束、⌘F 聚焦查找框、macOS 26 新 Dock 样式图标、广告位折叠不留空盒、外部链接唤回 Dock 中的窗口、Finder 本地页面保持样式、替换导入不误删、页面内 Print 生效。

1.0.3 — 24 September 2026:安全加固与滚轮

1.0.3 篇幅最短但定位明确——安全与输入体验。

  • 更新可选等待:Settings › About › Install updates on its own 默认开启;关闭后仍每天检查并提示,但只在按下 Install 时才取回、校验并安装。
  • 安全加固(首轮私密报告):更新仅当满足已发布版签名要求的 Developer ID 且校验和一致时才安装;扩展更新在其可做之事、可达站点、Search 应答的 API 上全面比对,包不得提供 Search 专属写入的文件;扩展只可请求其 manifest 声明的权限;「Let a script drive Search」需在 Settings 中开启才生效。
  • Bitwarden 自托管登录:popup 与「pop out」页面在打开期间能收到变更事件(此前 WebKit 不投递),因此不会误登 bitwarden.com。
  • 鼠标滚轮滚动页面监听者(轮播、x.com):不再用自定义样式压住页面反弹,改由 WebKit 关闭反弹、页面样式不动、侧向反弹保留给后退/前进滑动。
  • 账户只填入其页面、历史面板秒开、Mail 等应用链接置前、Web Inspector 随窗口缩放驻留、证书错误仅对本机静默豁免(localhost、127.x.x.x、::1)、用户脚本只读扩展自身包内、外部应用链接需点击且先询问、复制保存密码先验证身份并 90 秒后清除剪贴板、音乐/视频/直播跨 Space 续播、Chrome Web Store 版本号误读修复(此前每天重下近 10 MB 的 uBlock Origin Lite 并重载)、https 保存的密码不提供给 http 页面、钥匙串条目仅动 Search 自己的(加 web form 标记)、页面 window.open 需点击或按键、扩展重载权限变更重新询问、⌘W 不再在两个固定标签间弹跳、历史按 query 区分文章/视频、YouTube 全屏不再黑屏、后退/前进/重载按钮留白。

1.0.2 — 24 September 2026:Passkeys、隐私与扩展体系

  • 书签栏(类 Chrome/Safari):Settings › Tabs › Show the bookmarks bar 或 Bookmarks › Show Bookmarks Bar,随标签栏一起折叠。
  • Peek 链接(类 Arc):⇧-click 在阅读页上打开面板;Esc/⌘W/点旁边收起;另一按钮将其保留为旁边标签且不重复加载。默认关闭:Settings › General › Peek at a link with a shift-click。
  • 浮窗视频开关化:Settings › General › Float the video when you switch tabs(默认开启);⇧⌘P 仍手动浮动。
  • 站点卡片:点击当前标签的地址弹出卡片——连接是否私密(逐步查看证书)、Copy Address、Print、页面缩放;输入即收起。右键标签 › Site Information… 同样打开;列与顶部栏均可用,且不新增第二行。
  • 静音标签(按标签尾部的扬声器或右键 Mute Tab)、File › Share…(走 macOS 共享面板)、120 Hz 页面渲染(Settings › General › Pages at 120 Hz,默认关闭,更耗电)、Brave Search 与 Qwant 加入引擎列表、中键链接后台开标签、Copy as Markdown Link(title)、切换应用时视频跟随浮窗(默认关闭)、鼠标侧键导航、浮窗视频甩角(默认关闭)、顶部标签栏切 Space(双指上下或滚轮切进下一个 Space,越过最后一个即在栏内新建)、每个标签右键菜单加 Reopen Closed Tab、扩展允许上隐私标签页(Settings › Extensions › Allow on private tabs,默认关闭,只作用于开启后新建的隐私标签)、中键滚动(Settings › General › Scroll with the middle button)、Homebrew 安装(brew install --cask driceroland/tap/search)、⌘S 折叠顶部标签栏、Show where links go 悬停显示目标地址(默认关闭)。
  • Passkeys 里程碑:站点「Sign in with a passkey / Create a passkey」唤起本机 passkey 面板(Touch ID + iCloud Keychain 或密码应用、iPhone 二维码、安全密钥),此前在多数站点以「authentication failed」收场;Search 自己承载 passkey 传递(同 Chrome),永不悬挂未完成的请求,首次使用 macOS 会询问授权;若更新后仍失败,文档提示重启一次 Mac。密码管理器(1Password、Bitwarden、Proton Pass)回传的对象能到达 Search 的 passkeys,其补丁先于它们运行。
  • 修复亮点:本机 .html/.xhtml 双击打开、Gmail 附件下载、跟随链接离开后图片右键菜单恢复、Logi Options+ 鼠标侧键、页面不再看到 Search 注入的 window.webkit(解决 Google 间歇 CAPTCHA 与「此浏览器或应用可能不安全」提示;用户代理如实报告本机 Safari 版本)、更短的后退/前进滑动(70 点)、滚动更顺滑、拖标签跟手、密码仅限本站(按公共后缀列表区分,alice.github.io 不再串到其他 github.io)、侧栏悬停逻辑、长列滚动条不压关闭按钮、Search with… 选中文本在当前浏览器新标签打开、⌘⇧V 无格式粘贴、面板光标不被页面 cursor: none 吞掉、扩展页作为新标签时地址栏可用、扩展 API 受 manifest 权限约束、符号链接扩展包拒绝安装、bench 只应答自己开的标签、图片右键菜单仅限 http/https/data/blob、扩展登录流只由发起标签完成、popup 按记忆尺寸打开、隐私标签派生标签保持隐私、按本机 Safari 版本播报 UA、导入扫描不遍历缓存、首启提前 50 ms、可设为默认浏览器(补 XHTML 声明)、二进制重定向跟随(youtube.com 的 application/binary)、Esc 关闭 Downloads、标签标题延伸到行尾、扩展按钮二次点击收起 popup、1Password 完全可用(worker 的 WebSocket 改由 Search 提供)、1Password passkeys 一次成功、Bitwarden 离屏文档不再 10 秒一存、Proton Pass 表单检测获得 requestIdleCallback、浮窗视频记住位置尺寸、后台红绿灯不再重绘、空标签不再空转 CPU、窗口不再等扩展加载、海量书签下启动更快、macOS 15.4 前不显示无效的 Add to Search、隐藏启动带窗、新标签 10 ms 内开始加载、书签列表即时收起、粘贴即时显示、⌘⇧N 不叠空隐私标签、Space 登录选择完整显示、密码不串站、侧栏/顶部栏悬停跟随指针(即使他应用在前)。

1.0.1 — 23 September 2026:首发后的第一次迭代

  • 新增:中键关闭标签(含固定标签落位)、标签重命名(Tabs › Rename Tab,名称随标签迁移且跨退出保留,清空恢复页面标题)、侧栏自动隐藏(Settings › Tabs › Hide the sidebar until the pointer reaches the edge,⌘S 仍可常驻唤出)、Spaces(同一窗口内多组标签,各带图标与可选独立下载目录,可在创建时选择沿用其他 Space 登录或全新 cookie/登录;Settings › Tabs 开启,⌃1–⌃9 / 图标 / 侧栏双指横向切换)、Web Inspector(Inspect Element、⌥⌘I / ⌥⌘J / ⌥⌘C,键位同 Chrome/Arc)、⌘S 折叠侧栏、自选搜索引擎(Settings › General › Search with:DuckDuckGo、Bing、Ecosia、Startpage、Kagi,或任意含 %s 的地址;默认 Google)、阅读进度灰条开关(Settings › Tabs › Show how far you've read)、./bench 技能(教编码 Agent 用命令行驱动 Search)、扩展可从 Settings › Extensions 钉到工具栏。
  • 修复:macOS 14 启动恢复、超长标签列滚动到固定区与脚部之间、⌘T 不留双空标签、点击外部保留标签内编辑、折叠唤出完整、双击顶边全屏、⌘←/⌘→ 编辑移动与 ⇧ 选择、扩展页内面板不重载页面、拖标签不拖窗、新安装跟随系统外观、新标签地址栏不跳动、1Password Sign in 按钮、浮窗视频播放成本与标签一致、表单 Tab 键、⌘1–⌘9 全键盘布局(含 AZERTY)、隐私标签不进入 Recently Closed、⌘L Return 保留 query、YouTube 浮窗完整画面、深色模式无白闪、页面未聚焦输入框时输入不蜂鸣。

1.0 — 23 September 2026:首发版本

The first version. A browser for the Mac with nothing in the way: tabs in a row or down the side, pinned tabs that keep their place, and one field for addresses and searches. Ads blocked before they load, passwords and passkeys in your keychain, anything on a page hidden for good, reading mode, floating video, Chrome extensions from the Chrome Web Store (macOS 15.4 or later), and tabs that sleep after half an hour. 2.9 MB, on the engine already in macOS.

1.0 奠定了整个产品形态:顶部或左侧的标签行、保持位置的固定标签、地址与搜索合一的输入框;加载前拦截广告、钥匙串中的密码与 passkey、页面元素永久隐藏、阅读模式、浮动视频、Chrome Web Store 扩展(macOS 15.4+)、半小时无操作休眠的标签。约 2.9 MB,运行在 macOS 自带的引擎(WebKit)之上。README 的 For developers 一节补充了实现骨架:约 42,000 行 Swift、零第三方依赖、每文件一职责(Vault.swift 钥匙串、Shield.swift 广告拦截、Curtain.swift 隐藏元素、Session.swift 会话恢复、Updater.swift 更新、Bench.swift 测试 socket);扩展跑在 WKWebExtension 之上,由 Crx.swift 从 Chrome Web Store 取包并校验 CRX3 签名,ExtensionShims.swift 在安装时注入脚本补齐 WebKit 缺失的 Chrome API。

版本节奏背后的工程机制(源码级佐证)

更新器:一个 JSON feed 驱动的自更新

CHANGELOG 中反复出现的更新行为(每小时检查、Install/Download/Restart 状态、签名校验、Intel 独立 feed)在 Updater.swift 中有完整实现。要点包括:

  • 无框架、无守护进程:一个位于下载旁的小 JSON 文件(build.sh 在构建 DMG/ZIP 时同时写出 build/appcast.json),启动、每小时及手动检查时读取;若命名了更新的构建,就静默取回 ZIP、校验并放入 bundle 旁,下次启动即新版本。绝不自动重启,不打断正在阅读的页面。
  • 不动用户数据:~/Library/Application Support/Search、com.officecommun.search 的 defaults 与钥匙串一概不读不写;只替换 bundle,且保留 bundle id 与签名身份,使旧构建写入的钥匙串条目对新构建开放;更新器只删除自己创建的暂存目录与被换下的 .old bundle。
  • 签名与校验:Release 结构携带 sha256 与 dmgSha256、notes、minimumSystemVersion;runsHere 依据最低系统版本决定该构建对当前 Mac 是否「更新」。1.0.4 起 feed 文件本身以与 app 相同的 Developer ID 签名,命名的版本仅在签名成立时才取回;app 无法自替换时自行下载磁盘镜像,且仅当哈希与签名都符合才打开。
  • 阶段状态机:Stage 枚举(none / fetching / ready / offered / waiting)正是 CHANGELOG 中 Search › Check for Updates… 各个文案(Downloading Update… / Restart to Update / Install Update)的映射;SEARCH_FEED 环境变量仅在测试运行时允许测试 feed 走明文 http,用户使用的浏览器始终只读 Office Commun 的正式 feed。
  • 架构隔离:Intel 与 Apple Silicon 各自持有 feed(officecommun.com/search/intel/appcast.json 与 officecommun.com/search/appcast.json),通过编译期 #if arch(x86_64) 选择,正是 Unreleased 中「两类 Mac 各有下载、绝不会拿到对方构建」的实现基础。

测试与可驱动性:bench 与测试脚本

CHANGELOG 多处提到 ./bench(导入预览、扩展驱动、安全约束「只应答自己开的标签」)。其实现位于 Bench.swift:

  • 默认关闭,须在 Settings › General › Let a script drive Search 开启;开启后 app 在本目录监听一个 Unix socket(仅本用户可读,读取前校验对方 uid);
  • 协议为「一行一个 JSON 对象进、一行一个出、一次连接一个请求」;
  • 它打开的标签带烧瓶标记、绝不替你选中、不进会话与历史、脚本说关才关——README 给出了实测用法(./bench open、./bench wait、./bench text、./bench shot、./bench click、./bench probe、./bench close all);
  • 脚本打开的页面在屏幕外的自有窗口中排版绘制,保证截图有内容;
  • 仓库根目录的 bench 可执行文件即该协议的 shell 客户端,skill/search-bench/SKILL.md 是教编码 Agent 使用它的技能文档;Tests 目录下的 split_view.py、site_search.py、tab_switcher.py 等 Python 脚本通过隐藏测试运行(自己的设置与文件、结束后清理)验证 Split View、站点搜索、标签切换等 Unreleased 特性。

AI 功能:可选、默认关闭、本机优先

Unreleased 的 AI 条目在 AI.swift 中有精确对应:AIProvider 的 isLocal 区分本机(On this Mac / Ollama / LM Studio)与远程(Anthropic / OpenAI / Google Gemini / OpenRouter),base 给出各服务商地址,AIKeys 把密钥以 provider@host 为账户存入数据保护钥匙串(仅 Search 签名可读,永不落盘到设置文件、日志或错误信息),且「本地服务商不需要密钥」。回答面板在 AIAssist.swift 与 AIPage.swift 中实现,本机引擎位于 AIEngine.swift(Apple Silicon 默认 Qwen3 1.7B,使用前校验),请求封装在 AIClient.swift,登录流程在 AISignIn.swift——整个 AI 子系统的文件布局与 CHANGELOG 描述的功能一一对应。

总结

从 CHANGELOG 可以读出 Search 的三个工程性格:高频小步迭代(1.0 到 1.0.4 仅四天,Unreleased 持续累积)、默认关闭的功能开关文化(几乎每个新特性都「Off unless you turn it on」,尊重现有用户)、安全与隐私的一等公民地位(每轮版本都带安全加固,钥匙串、签名校验、隐私标签隔离贯穿始终)。对于希望复刻或研究这一模式的开发者,这份 changelog 连同 NOTES.md(每版要点)、ROADMAP.md(计划与取舍)、README.md(架构总览)与 Sources/Search 的按职责拆分源码,构成了一套自洽、可追溯、可验证的浏览器开发档案。

登录后查看全文
Search