Search – 一款小巧、快速的 macOS WebKit 浏览器

Hacker News Top 产品

摘要

Search 是一款基于 WebKit 构建的 macOS 小巧快速网页浏览器,强调隐私和简洁,内置广告拦截且无遥测功能。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/09/24 19:12

Search

来源:https://github.com/driceroland/Search

Search

一款专为Mac打造的小巧、快捷、安静的网页浏览器,由Office Commun(https://officecommun.com)开发。Search将标签页置于左侧,剩余空间用于显示页面内容。

下载 macOS 版 → (https://officecommun.com/search)

  • 需要 macOS 14 或更高版本
  • 免费
  • 大小约 3 MB

或者通过 Homebrew(https://brew.sh)安装: brew install --cask driceroland/tap/search


这是什么

Search是一款纯粹无干扰的浏览器。一排标签页——横跨顶部或沿左侧排列,由你选择——以及页面本身。没有工具栏,没有起始页,没有推荐侧边栏,没有需要登录的账户,没有任何分散你注意力的东西。你在一个输入框里键入网址或几个词,即可直达页面。

它使用WebKit引擎,这是每台Mac内置的引擎(Safari也基于它运行)。因此,整个应用在磁盘上仅占约3MB空间,并能即时启动:无需下载、更新或占用内存来运行第二份Chromium内核。

这款浏览器由一家整天沉浸在浏览器中的设计工作室打造,他们厌倦了那些已经变成复杂产品的浏览器。Search是一件工具。

它能做什么

  • 单一输入框。 输入网址则前往该地址;输入词语则进行搜索。它能根据你的历史记录补全网址,并且在你按下回车键之前,不会将你输入的任何内容发送到别处。
  • 不打扰的标签页。 固定你全天保持打开的页面,它们会缩小为一个字母或图标。你上次会话的标签页会立即恢复,且在你点击之前不占用任何资源。按下 ⌘K 可按名称列出你打开的标签页。
  • 阅读模式。 使用 ⇧⌘R 可将页面精简为纯文章内容。
  • 永久隐藏任何元素。 使用 ⇧⌘H,然后点击一个Cookie横幅、新闻通讯弹窗或一栏“相关”内容——它会立即消失,并且下次访问该网站时,在页面绘制第一帧之前,它就已经不在了。
  • 在页面加载前运行的广告拦截器。 第三方跟踪器和广告网络在网络层面即被阻止,因此没有需要渲染的内容,也没有拖慢速度的东西。默认开启,如果某个网站因此出现问题,可按站点关闭。
  • 跟随你的视频。 使用 ⇧⌘P 可将视频从页面中提取到一个悬浮小窗口,该窗口始终保持在最顶层,包括其他应用程序之上。
  • 密码,存储于你的钥匙串。 Search会在登录成功后提示保存凭证,并在你点击输入框时,像Safari一样,在下方提供你已保存的账户选项——绝不会自行填充任何信息。所有内容都存储在macOS钥匙串中,由系统加密,只有Search可以读取。你可以一键从Chrome、Arc、Dia、Brave或Edge导入;所有数据仅保留在你的Mac上。
  • 亮色、暗色,或跟随Mac系统设置。 窗口框架和页面外观会随之切换。
  • 书签、历史记录、下载 —— 各自为独立面板,均可搜索,一键即可访问。
  • Chrome扩展,无需Chrome本体。 在设置 > 扩展 中粘贴Chrome网上应用店的链接,或在Search中打开扩展页面并点击添加。它运行在WebKit自身的扩展引擎上——与Safari相同。对于Chrome有而WebKit没有的API(书签、历史记录、下载、侧边栏、离屏文档、字体、通知、语音、OAuth登录等),Search会自行填补实现。它们位于拼图按钮后面;固定你常用的扩展。 正在开发自己的扩展?将其文件夹作为未打包扩展加载,每次更改后按重新加载,与Chrome的开发者模式类似。需要 macOS 15.4 或更高版本。
  • 自动静默更新。 每天检查一次新版本,下载后验证其由Office Commun签名,然后在下次启动时替换。没有任何东西会自行重启。

它不做什么

有意为之:

  • 无需安装任何扩展即可获得完整体验。 广告拦截、隐藏杂乱元素、阅读模式、画中画和密码管理功能均已内置;扩展用于满足其他一切需求。
  • 无同步、无账户、无云端。 你的标签页、历史记录和密码只保存在你的Mac上,不在其他任何地方。
  • 无遥测、无分析、无崩溃报告发送。 唯一离开你Mac的东西,是你请求访问的页面、它们的图标,以及每天一次用于检查是否有新版本的小请求。
  • 单窗口。 标签页是唯一的“新建”方式。

隐私,具体来说

项目存储位置谁可以读取
密码macOS登录钥匙串中,作为标记为Search的普通钥匙串项目Search(由Office Commun签名)。任何其他应用触发时,系统会弹出权限对话框。
历史记录、书签、打开的标签页、隐藏的元素位于 ~/Library/Application Support/Search/ 的小型JSON文件你自己。
Cookies和网站数据应用专用的WebKit存储区设置它们的网站,与在任何浏览器中一样。
扩展解压至 ~/Library/Application Support/Search/Extensions/,数据存储在WebKit的扩展存储区每个扩展,在你添加时所接受的权限范围内。
其他任何数据不存在。没有服务器。—

隐私标签页 (⇧⌘N) 拥有独立的Cookie存储,关闭后不留下任何痕迹。

快捷键

⌘L 地址栏 · ⌘K 切换标签 · ⌘T 新建标签 · ⌘W 关闭 · ⇧⌘T 重新打开⌘[ ⌘] 后退、前进 · ⇧⌘[ ⇧⌘] 上一个、下一个标签 · ⌘1–⌘9 跳转
⇧⌘S 标签页置于顶部或左侧 · ⌘S 折叠侧边栏 · ⇧⌘B 将当前页加入书签⇧⌘R 阅读模式 · ⇧⌘P 悬浮视频 · ⇧⌘H 隐藏某元素 · ⇧⌘U 显示隐藏内容
⌘F 查找 · ⌘D 复制标签页 · ⇧⌘C 复制地址 · ⇧⌘V 粘贴并前往⌘Y 历史记录 · ⇧⌘J 下载 · ⌘, 设置 · ⌥⌘L 密码

⌃Tab 和 ⌃⇧Tab 在标签页行中前后切换;Tab 键则用于在页面内的表单元素间移动。esc 关闭当前打开的任何界面。


致开发者

源代码为何在此

这样,任何人都可以确切了解一个处理他们密码和历史记录的浏览器正在做什么,可以自行构建,或者修复令他们困扰的问题。代码量小到足以真正阅读——约12,700行Swift代码,除Apple随macOS提供的依赖外无其他外部依赖,每个功能对应一个文件。

构建它

  • macOS 14 或更高版本,Xcode 16 / Swift 6 工具链
  • swift build —— 直接从SwiftPM二进制文件运行应用
  • ./build.sh —— 在 build/ 目录中组装一个真实的、可双击运行的 Search.app,采用临时签名,可在你自己的Mac上运行。

你自己构建的版本不会经过公证或携带Office Commun的开发者ID,因此首次启动需要右键点击 -> 打开(或在系统设置 -> 隐私与安全性中允许)。这是预期的行为——任何非来自App Store或公证过的DMG的应用首次运行都会遇到相同情况。

你自己的构建也会将其密码与签名版Search分开存储:钥匙串通过其签名来区分两者。

./build.sh release dmg 同时生成 Search.dmg / Search.zip。 ./build.sh release ship 额外进行公证和订立(staple)——此步骤需要开发者ID证书和Apple凭据,因此实际上只为Office Commun自己的发布版本执行。

构建原理

  • SwiftUI 用于所有绘制内容,AppKit 用于处理SwiftUI在macOS上无法覆盖的少数几项功能(窗口标题栏、通过标签行空白区域拖动窗口),WKWebView 用于显示页面。
  • 每个页面对应一个 Tab。其视图采用惰性构建——从上次会话恢复的标签页在你切换到它之前不会启动进程。这就是为什么即使打开二十个标签页启动仍然即时的原因。
  • 每个页面在WebKit自身的内容进程中运行,如同Safari;关闭的标签页会真正消失。
  • 广告拦截器是一个 WKContentRuleList,在启动时编译一次,并在网络请求发出前于WebKit的网络层强制执行——与JavaScript拦截器不同,运行时成本为零。
  • 隐藏元素是每个网站的选择器列表,作为样式表在文档开始时注入,因此用户永远不会看到元素出现又消失。
  • Design.swift 中定义了每种颜色的亮色/暗色配对,由窗口的外观解析;代码中的其他部分无需知道当前处于哪种模式。
  • 扩展运行在 WKWebExtension(macOS 15.4+)上。Crx.swift 从Chrome网上应用店的公共更新地址获取扩展,并在解压任何内容前,根据扩展ID检查CRX3签名。
  • Extensions.swift 是浏览器实现WebKit扩展契约(标签页、窗口、权限、弹出窗口)的部分。ExtensionShims.swift 在安装时向扩展的工作线程、页面和内容脚本添加一个小型脚本:它将WebKit缺少的Chrome API(如 userScripts、privacy、browsingData、sessions、旧版FileSystem API等)定义为由Search原生响应调用,并修复WebKit与Chrome行为不一致的地方:无响应的页面回复、工作线程启动后添加的监听器、WebKit丢失的工作线程、以及WebKit省略的成员和常量。
  • 扩展页面从 chrome-extension:/// 提供服务(这是它们在Chrome中的地址),因此服务器和网站可以识别它们。
  • ./bench ext-* 通过shell驱动所有这些测试操作。ExtensionNative.swift 与注册在Chrome NativeMessagingHosts 文件夹中的主机进行Chrome原生消息通信。
  • Sources/Search/ 下每个文件对应一个功能:Vault.swift 是钥匙串,Shield.swift 是广告拦截器,Curtain.swift 是隐藏元素,Session.swift 处理启动时恢复的内容,Updater.swift 负责更新,Bench.swift 是测试套接字,等等。无需先学习自己的框架。

不关闭应用进行测试

启用 设置 > 通用 > 允许脚本驱动Search 后,运行中的应用会在其自身文件夹中监听一个Unix套接字(仅你的用户可读)。

在仓库根目录下运行 ./bench 即可与它通信:

./bench open https://example.com        # 在你的标签行末尾打开一个新标签页,标记为烧瓶图标
./bench wait 2e7e7e89                   # 等待它加载完成
./bench text 2e7e7e89                   # 获取页面文本
./bench shot 2e7e7e89 out.png          # 截取页面图片
./bench click 2e7e7e89 "button.go"     # 通过页面自身的事件进行点击、输入、提交
./bench probe                           # 窗口状态:打开的面板、模态框、每个窗口
./bench close all                       # 关闭所有测试标签页

测试标签页不会被选中,不会进入会话或历史记录,并在脚本指令下关闭。这就是这个浏览器在用户使用期间进行测试的方式。

贡献

我们真诚欢迎提交问题和拉取请求——请参阅 CONTRIBUTING.md 了解如何审核以及哪些内容倾向于被合并。简而言之:小改动、无新依赖、无回拨功能。 发现安全问题?请私下报告,如 SECURITY.md 所述。

许可证

MIT —— 请参阅 LICENSE。你可以自由使用这段代码。 “Search“和应用图标是Office Commun的;请在以其他名称分发你的分支之前将其重命名。

相似文章

Kagi 发布的 Orion 浏览器

Hacker News Top

Orion 是一款由 Kagi 开发的注重隐私的网页浏览器,具备原生 WebKit 速度,支持 Safari、Chrome 和 Firefox 扩展,且零遥测数据收集。目前可在 macOS、iOS、iPadOS 及 Linux(测试版)上使用,Windows 版本即将推出。

Searchad.ai

Product Hunt

Searchad.ai 是一款工具,让用户通过AI驱动的聊天界面管理Apple Search Ads。