HN 日本語サマリー

← 一覧へ戻る
Web開発

Search – macOS向けの小さく高速なWebKitブラウザ

Search – A small, fast WebKit browser for macOS (github.com)

52 pointsby metrofun19 コメント

要約

Searchは、macOS向けの軽量で高速なWebブラウザです。タブ表示やアドレス入力フィールドなど、必要最低限の機能に絞り込み、広告ブロックやリーディングモード、ピクチャーインピクチャーなどの機能を内蔵しています。Chrome拡張機能にも対応しており、プライバシーを重視した設計が特徴です。

全文翻訳

Search

Office Commun による、Mac 用の小型で高速、静かなWebブラウザ。

[画像: 左側にタブ、残りの部分をページが占めるSearchの画面]

macOS 用ダウンロード → · macOS 14 以降 · 無料 · 約 7 MB

または Homebrew で: brew install --cask driceroland/tap/search


これは何か

Search は、邪魔なものが一切ないブラウザです。タブの列 — 上部または左側、選択可能 — とページだけがあります。ツールバー、スタートページ、提案のサイドバー、サインインするアカウント、注意を引きたいものは何もありません。1つのフィールドにアドレスまたは数語を入力すると、そのページに移動します。

これは WebKit を使用しています。これは、すべての Mac に既に搭載されているエンジンです(Safari が動作する基盤です)。そのため、アプリ全体でディスク容量は約 3 MB で、すぐに開きます。Chromium のコピーをダウンロード、更新、メモリに保持する二重の手間がありません。

一日中ブラウザを使っているデザインスタジオが、製品になり果てたブラウザにうんざりして開発しました。これはツールです。

何ができるか

  • 単一フィールド。 アドレスを入力すればそこへ移動し、単語を入力すれば検索します。自分の履歴からアドレスを補完し、Return キーを押すまで入力内容をどこにも送信しません。
  • 邪魔にならないタブ。 一日中開いておくページをピン留めすると、文字またはアイコンに縮小されます。前回のセッションのタブは即座に復元され、クリックされるまで何も消費しません。⌘K で開いているタブを名前で一覧表示します。
  • 重要なサイトを実行し続ける。 設定 › タブ で「選択したサイトをスリープさせない」を有効にし、サイトカードで「このサイトを起こしておく」を選択します。メモリ使用量が増える代わりに、スリープや自動終了を防ぎます。プライベートタブの選択は、そのタブ内でのみ有効です。手動でのタブの閉じ操作は引き続き機能します。
  • 2つのページを並べて表示。 設定 › タブ でスプリットビューをオンにし、タブをページにドラッグするか、タブ › 現在のページを分割 を選択します。区切り線をドラッグしてペインのサイズを変更します。アウトライン表示されたペインがページコマンドを受け取ります。ペアとその幅は、スペース(デスクトップ)と共に、再起動後も復元されます。
  • リーディングモード。 ⇧⌘R でページを記事だけに絞り込みます。
  • 何でも、永久に隠す。 ⇧⌘H を押し、次にクッキーバナー、ニュースレターのオーバーレイ、「関連」のくだらないレールなどをクリックすると、それらは消え、次回そのサイトでページが描画される前に、再び表示されることはありません。
  • ページより先に動作する広告ブロッカー。 サードパーティのトラッカーと広告ネットワークはネットワークレベルで停止されるため、レンダリングするものがなく、遅延もありません。デフォルトで有効ですが、問題が発生した場合はサイトごとに無効にできます。
  • 動画があなたについてくる。 ⇧⌘P で動画をページから切り離し、他のアプリの上にも表示される小さなウィンドウに移動させます。
  • パスワードはキーチェーンに。 Search は、サインインが実際に成功した後に保存を提案し、フィールドをクリックしたときに保存されたアカウントとサイトのパスキーを Safari のように表示します。何も自動で入力することはありません。すべて macOS のキーチェーンに保存され、システムによって暗号化され、Search からのみ読み取り可能です。Chrome、Arc、Dia、Brave、Edge からワンクリックでインポートできます。何も Mac から離れることはありません。
  • ライト、ダーク、または Mac の設定に合わせる。 フレームとページが追従します。
  • ブックマーク、履歴、ダウンロード — それぞれがパネルになり、検索可能で、キーボードショートカットでアクセスできます。
  • Chrome 拡張機能、Chrome なしで。 設定 › 拡張機能 で Chrome ウェブストアのリンクを貼り付けるか、Search で拡張機能のページを開いて「追加」を押します。これは Safari が使用する WebKit 独自の拡張機能エンジンで動作します。Chrome にはありますが WebKit にない API(ブックマーク、履歴、ダウンロード、サイドパネル、オフスクリーン ドキュメント、フォント、通知、音声、OAuth サインイン)については、Search が独自に補完します。これらはパズルボタンの後ろにあり、よく使うものはピン留めできます。自作の拡張機能は? Chrome の開発者モードのように、フォルダをアンパックされていない拡張機能としてロードし、変更ごとに「リロード」を押してください。macOS 15.4 以降が必要です。
  • 静かに自己更新。 1日に一度、新しいビルドがないかチェックし、ダウンロードして、Office Commun によって署名されていることを確認し、次回の起動時に置き換えます。何も自動で再起動することはありません。

何をしないか

意図的に:

  • 使い慣れた環境にするためにインストールが必要な拡張機能はありません。広告ブロック、 clutter の非表示、リーディングモード、ピクチャーインピクチャー、パスワード管理は組み込まれています。拡張機能はそれ以外のすべてのためにあります。
  • 同期、アカウント、クラウドはありません。タブ、履歴、パスワードは Mac 上にあり、それ以外の場所にはありません。
  • テレメトリ、アナリティクス、クラッシュレポートはどこにも送信されません。Mac から送信されるのは、要求したページ、そのアイコン、そして新しいバージョンがあるかを確認するための1日1回の小さなリクエストだけです。
  • 1つのウィンドウ。タブだけが「新しい」という概念です。

プライバシー、具体的に

内容保存場所誰が読めるか
パスワードmacOS のログインキーチェーン、通常のキーチェーンアイテムとして Search タグ付きSearch(Office Commun 署名付き)。他のアプリはシステムの許可ダイアログをトリガーします。
履歴、ブックマーク、開いているタブ、非表示要素~/Library/Application Support/Search/ 内の小さな JSON ファイルあなた。
Cookie およびサイトデータアプリ用の WebKit 独自のストアそれを設定したサイト(どのブラウザでも同様)。
拡張機能~/Library/Application Support/Search/Extensions/ 内に展開、データは WebKit の拡張機能ストアに各拡張機能(追加時に許可した権限の範囲内)。
その他すべてどこにもありません。サーバーはありません。—

プライベートタブ (⇧⌘N) は独自の Cookie ジャーを持ち、閉じるときに何も残しません。

システム設定 › プライバシーとセキュリティ › 自動化 で許可したアプリは、AppleScript を使用してタブのアドレスとタイトルを読み取ることができます。プライベートタブは決して表示されません。

キーボードショートカット

⌘L アドレス · ⌘K タブ切り替え · ⌘T 新規タブ · ⌘W 閉じる · ⇧⌘T 再オープン⌘[ ⌘] 戻る、進む · ⇧⌘[ ⇧⌘] 前のタブ、次のタブ · ⌘1–⌘9 ジャンプ
⇧⌘S タブを上部または左側に · ⌘S サイドバーを折りたたむ · ⇧⌘B このページをブックマーク⇧⌘R リーディングモード · ⇧⌘P 動画をフローティング表示 · ⇧⌘H 要素を隠す · ⇧⌘U 隠された要素を表示
⌘F 検索 · ⌘D タブを複製 · ⇧⌘C アドレスをコピー · ⇧⌘V ペーストして移動⌘Y 履歴 · ⇧⌘J ダウンロード · ⌘, 設定 · ⌥⌘L パスワード

スペースキー(デフォルトでは Control+1–9)とリンクをプレビューするための修飾キーは、これらの機能が有効な場合に設定 › ショートカットで変更できます。

⌘R はページをリロードします。⌥⌘R はキャッシュされたすべてをサイトと再確認しながらオリジンからリロードします。これは Safari の「オリジンからページをリロード」と同様で、リロードボタンを右クリックしても選択できます。

⌃Tab と ⌃⇧Tab はタブの行を移動します。Tab はページのフォーカスを維持し、フォーム内を移動するために使用されます。esc は開いているものをすべて閉じます。

スプリットビューがオンの場合、⌥⌘N は現在のページを分割し、⌃⌘← / ⌃⌘→ はページ間を移動します。⌘W はフォーカスされたタブを閉じ、残りのページに全体領域を与えます。タブ › スプリットタブを分離 は両方のタブを開いたまま個別に保持します。


開発者向け

ソースコードがここにある理由

パスワードや履歴を処理するブラウザが何をしているかを誰でも正確に読めるように、自分でビルドしたり、気になる点を修正したりできるようにするためです。コードは実際に読むのに十分な小ささです — Swift で約 42,000 行、Apple が macOS に同梱しているもの以外の依存関係はなく、関心事ごとに1つのファイルです。

ビルド方法
  • macOS 14 以降、Xcode 16 / Swift 6 ツールチェーン
  • swift build — SwiftPM バイナリから直接アプリを実行します
  • ./build.sh — build/ に実際のダブルクリック可能な Search.app を作成します。アドホック署名されているため、自分の Mac で実行できます。

自分でビルドしたものは、公証済みではなく、Office Commun の Developer ID を持たないため、初回起動時には右クリック → 開く(またはシステム設定 → プライバシーとセキュリティで許可)が必要です。これは、App Store や公証済みの DMG 以外のアプリで起こることと同じです。また、自分でビルドしたものは、署名された Search のパスワードとは別に保存されます。キーチェーンが署名によって両者を区別します。

./build.sh release dmg は Search.dmg / Search.zip も作成します。./build.sh release ship はさらに公証とステープルを行います — このステップには Developer ID 証明書と Apple の認証情報が必要なため、Office Commun 自身のリリースにのみ実際に機能します。

どのように構成されているか
  • SwiftUI で描画されるすべて、AppKit は SwiftUI が macOS でカバーできないごく一部のこと(ウィンドウのタイトルバー、タブ行の空の部分でのウィンドウのドラッグ)、WKWebView はページ用です。
  • ページごとに1つの Tab。その Web ビューは遅延して構築されます — 前回のセッションから復元されたタブは、切り替えるまでプロセスを消費しません。これが、20個のタブで起動してもインスタントであることのほとんどの理由です。各ページは Safari と同様に WebKit 独自のコンテンツプロセスで実行されます。閉じられたタブは本当に消えます。
  • 広告ブロッカーは、起動時に一度コンパイルされる WKContentRuleList で、WebKit のネットワーク内で強制されます。リクエストが行われる前に — JavaScript ブロッカーとは異なり、実行時のコストはゼロです。
  • 非表示要素は、ドキュメント開始時にスタイルシートとして注入されるサイトごとのセレクタリストであり、何も表示されて消えることはありません。
  • すべての色は Design.swift 内のライト/ダークペアで、ウィンドウの外観によって解決されます。コードの他の部分はどのモードであるかを知りません。
  • 拡張機能は WKWebExtension (macOS 15.4+) で実行されます。Crx.swift は Chrome ウェブストアの公開アップデートアドレスから拡張機能をフェッチし、展開前に CRX3 署名を拡張機能 ID に対してチェックします。Extensions.swift はブラウザ側の WebKit の契約です — タブ、ウィンドウ、権限、ポップアップ。ExtensionShims.swift は、インストール時に拡張機能のワーカー、ページ、コンテンツスクリプトに小さなスクリプトを追加します。これは、WebKit が欠いている Chrome API — userScripts、privacy、browsingData、sessions、古い FileSystem API など — を Search がネイティブで応答する呼び出しとして定義し、WebKit が Chrome とは異なる動作をする場所を修正します — 応答しないページからの応答、ワーカー開始後にアドされたリスナー、WebKit が追跡を失ったワーカー、WebKit が省略したメンバーや定数。拡張機能ページは、Chrome でのそれらと同じ chrome-extension://<id>/ から提供されるため、サーバーやサイトはそれらを認識します。./bench ext-* はシェルからテスト実行に対してすべてを駆動します。ExtensionNative.swift は、Chrome の NativeMessagingHosts フォルダに登録されたホストと通信します。
  • Sources/Search/ は関心事ごとに1つのファイルです: 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

Bench タブは決して選択されず、セッションや履歴に入らず、スクリプトが指示したときに消えます。これは、誰かがこのブラウザを使用している間にテストされる方法です。

python3 Tests/split_view.py は、./build.sh の後、独自のセッティングとファイルを持つ非表示のテスト実行で、アプリ独自のモデルを通じてスプリットビューをチェックし、すべて後で削除されます。ウィンドウを作成したり表示したりすることはありません。見えるもの(ページのエッジへのドラッグ、ポインター下の区切り線、動き)は、リリース候補で手動でチェックされます。

貢献

Issue とプルリクエストは本当に歓迎します — レビュー方法とマージされやすいものについては、CONTRIBUTING.md を参照してください。要約:小さな変更、新しい依存関係なし、電話してくるものなし。セキュリティ上の問題を見つけましたか? SECURITY.md に記載されている通り、プライベートに報告してください。

ライセンス

MIT — LICENSE を参照してください。コードでやりたいことを何でもしてください。「Search」とアプリのアイコンは Office Commun のものです。配布する際は、フォークの名前を変更してください。