shuzhi.zone

dowse:Sourcegraph と GitHub Code Search に代わるローカルコード検索ツール

dowse は、手元のディスクにある複数の Git リポジトリを、デスクトップアプリやコマンドラインからまとめて横断検索できるツールです。GitHub code search や grep.app が GitHub 上のコードに対して提供している体験——1 つの検索窓から全リポジトリをミリ秒単位で高速検索する体験を、ローカル環境にそのまま持ち込みます。GitHub code search と同じ検索構文が使え、バックエンドには Microsoft が公開したトライグラム(trigram)インデックス型 grep エンジン tgrep を採用。Zoekt のようにリポジトリ単位でインデックスを保持し、専用サーバーの起動も一切不要です。

12 個の公開リポジトリをリアルタイムに検索する dowse:クエリ入力と同時にミリ秒単位で結果を返し、ファセットで Rust に絞り込んでテーブル表示

dowse は Windows、macOS、Linux で動作します。完全無料で、MIT ライセンスのオープンソースです。

最新バージョンをダウンロード

探しているコードは、1 つのリポジトリに収まっていない

関数の呼び出し箇所を調べたいとき、設定キーがどこで参照されているか追いたいとき、あるいはライブラリの古いバージョンに依存しているサービスを洗い出したいとき、その答えはたいてい数十ものリポジトリに散らばっています。日常的に手を入れている開発用の作業コピー、チームの他サービスを追従しているミラー、依存している各種ライブラリなどです。これらを検索するための既存ツールには、それぞれ強みと同時に制約があります。

  • GitHub code search は高速で検索構文も優れていますが、GitHub 上のコードしか検索できず、対象も各リポジトリのデフォルトブランチに限られます。また 1 回の検索で最大 100 件しか結果が返りません。ローカルで作業中のフィーチャーブランチや、まだプッシュしていない手元の変更、他のホスティング先にあるリポジトリは検索できません。
  • grep.app は GitHub の公開リポジトリが対象です。社内のプライベートコードは存在しませんし、載せるべきでもありません。
  • Sourcegraph は最も機能が充実したコード検索プラットフォームで、コードジャンプやバッチ変更まで備えています。しかし本質的にサーバー製品であり、誰かがデプロイし、リポジトリ連携を設定し、運用し続ける必要があります。エンジニア組織全体への投資としては有益ですが、1 人のエンジニアがノート PC 上のフォルダを検索したいだけの用途には、あまりにも大掛かりです。
  • Zoekt は Sourcegraph の検索を支えるオープンソースのトライグラムエンジンで、極めて高速です。ただしこれも、自分でインデクサーとサーバーを運用し、データを投入し続ける構成になっています。
  • Entrian Source Search は Visual Studio 向けに全文インデックスを提供してくれますが、IDE の中に閉じており、開発者ごとのライセンス費用が発生します。
  • ripgrep や git grep は準備ゼロですぐ使えますが、検索のたびに 1 つのツリーの全ファイルを愚直に走査します。数十のリポジトリを対象にすると、もはや「即座に結果が出る」とは言えなくなります。

欲しかったのは、github.com で得られる快適な検索体験を、手元のローカルディスク上のリポジトリ群に対して再現することでした。main を追従しているミラーも、現在コードを書いている作業コピーも、未コミットの変更も含めて一括で検索できる環境です。dowse はまさにそのために作りました。

dowse の主な機能

ローカルのクローンに対して GitHub code search 構文が使える

クエリは入力するそばからパースされ、GitHub code search と同じ構文で評価されます。検索語句の組み合わせは「行単位」ではなく「ファイル単位」で判定されるため、たとえば parse config と入力すると、その両方の単語をどこかに含むファイルを特定し、該当するいずれかの単語を含む行をスニペットとして表示します。

parse config 両方の単語を含むファイル
parse OR config いずれかの単語を含むファイル
parse NOT test parse を含むが test は含まないファイル
"fn main()" 完全一致の文字列
/fn \w+_test/ 正規表現にマッチする行
path:src/*.rs language:rust パスの glob と言語による絞り込み
repo:api branch:main 対象リポジトリとブランチの指定
-path:tests -lang:md 条件にマッチするものを除外

path:*.proto のように修飾子(qualifiers)だけで検索した場合は、ファイル本文を読み出すことなくファイル一覧を高速に返します。大文字小文字の区別(Case)、単語単位の一致(Word)、正規表現のオン/オフはショートカットキー(Alt+C、Alt+W、Alt+R)で瞬時に切り替えられます。

tgrep、Zoekt、Google codesearch、Hound、Django、Go を対象に trigram index -path:test を実行した dowse の検索結果。リポジトリ、ブランチ、所有者、言語の各ファセットが並ぶ

検索結果は tree-sitter の文法ハイライトを適用したスニペットで表示されます。行をクリックすると結果の横にファイル全体のプレビューが開き、F4 でマッチ箇所を順に巡回できます。Ctrl+Click を押せば、普段使っている VS Code、Cursor、Zed、Sublime Text などのエディタでその行を直接開けます。

検索結果の横に Google codesearch の cindex.go を表示し、クエリのマッチ箇所をすべてハイライトしている dowse のプレビューペイン

タグで検索対象を選び、ファセットで結果を絞り込む

ワークスペースとは複数のリポジトリをまとめた集合のことで、VS Code のワークスペースのように .dowse-workspace ファイルとして保存されます。リポジトリには柔軟にタグを付けられます。mirror や dev といったシンプルなタグも、owner:alice や project:billing のようなキーバリュー形式のタグも使えます。さらに、全リポジトリにはチェックアウト中のブランチを示す branch:<名前> タグが自動付与され、ブランチを切り替えると自動で更新されます。

スコープバーで検索対象のタグを選択できます。同じグループ内のタグは OR 条件(owner:alice または owner:bob)になり、異なるグループ間は AND 条件(dev かつ owner:alice)として機能します。検索結果が出揃うと、grep.app のようにリポジトリ、ブランチ、タグ、プログラミング言語、トップレベルディレクトリごとにマッチ件数がファセット集計され、現在適用されているフィルタと連動して件数が更新されます。

正規表現のキャプチャグループを列にしたテーブル表示

テーブル表示(Alt+T)に切り替えると、マッチした 1 行ごとに「リポジトリ、ブランチ、パス、行番号、列番号、言語、マッチ部分、該当行の全文」が 1 レコードとして並びます。クエリの正規表現に名前付きキャプチャグループを含めると、そのグループがそのまま独立した列として展開されます。たとえば次のクエリを使えば、管理下の全リポジトリで使われている crate のバージョン一覧を即座に作成できます。

/^version = "(?<version>[^"]+)"/ path:Cargo.toml

dowse のテーブル表示:ripgrep、regex、tokio、serde、tgrep の Cargo.toml 内のバージョン行が一覧化され、名前付きキャプチャグループから version 列が生成されている様子

GitHub code search は 100 件で打ち切られますが、dowse のテーブル表示は約 20,000 行まで対応します。任意の列で並べ替えができ、CSV、TSV、Markdown、JSON としてエクスポートしたり、スプレッドシートに直接貼り付けたりできます。「どのサービスがまだこの旧 API を叩いているか」「各サービスでログレベルがどう設定されているか」といった調査も、検索結果をスクロールし続けることなく、1 枚のデータテーブルとして把握できます。

GitHub Organization を丸ごとクローンし、常に最新に保つ

リポジトリ管理ページでは、GitHub CLI を経由して指定したアカウントや Organization のリポジトリ一覧を取得します。そのため、dowse 自身に GitHub の認証情報を渡す必要はありません(事前にターミナルで gh auth login を済ませておくだけです)。一覧取得は並列で行われ、2,000 個規模のリポジトリを抱える組織でも数秒でリストアップされます。一部または全体を選択すると、dowse がバックグラウンドで <フォルダ>/<オーナー>/<名前> へクローンし、owner:<オーナー> タグを付与して自動インデックスを作成します。

クローンはデフォルトで blobless クローン(BLOB なしのクローン)を採用しています。全コミット履歴を保持しつつ、現在チェックアウトされているファイルのデータのみを取得するため、巨大なリポジトリでも高速にクローンでき、git の履歴参照も問題なく行えます。

dowse のリポジトリ管理ページ:クローン済みの 12 個のリポジトリについて、ブランチ、オーナー、mirror タグ、各インデックスのファイル数を表示

リポジトリごとに pull の実行間隔(15m、1h、3d など)を設定しておけば、dowse がスケジュールに沿って自動同期します。この pull 処理はバックグラウンドで origin を fetch し、「デフォルトブランチをチェックアウト中」「追跡対象ファイルに変更がない」「未プッシュのローカルコミットが存在しない」という条件がすべて満たされたときだけ fast-forward を実行します。条件を満たさない場合は fetch のみに留め、その理由(on feature/x, not main や uncommitted changes など)を画面上に分かりやすく通知します。勝手に merge や rebase、stash を行うことは一切ないため、ミラーだけでなく普段コードを書いている作業コピーをそのまま登録しても安心です。

エンジンは Microsoft 製の高速トライグラム grep「tgrep」

dowse のコアエンジンには、Microsoft が今年オープンソース化したトライグラムインデックス型 grep ツール tgrep を採用しています。GitHub Copilot CLI の検索バックエンドでも使われている技術です。トライグラムインデックスとは、あらゆる 3 文字の並びがどのファイルに含まれているかをあらかじめ記録しておく仕組みです。検索クエリが来るとそれをトライグラムに分解し、ポスティングリストの積集合を取ることで、一致する可能性のあるファイルだけを瞬時に特定して正規表現エンジンで精密検証します。これは Zoekt や、かつての Google Code Search と同等のアプローチです。tgrep 公式のベンチマーク(18 通りのリポジトリとプラットフォームの組み合わせ)では、17 項目で ripgrep より高速で、最大 51.9 倍もの速度差を記録しています。

本記事のスクリーンショットでは、GitHub からクローンした 12 個の公開リポジトリ(tgrep、ripgrep、Zoekt、Google codesearch、Hound、tokio、serde、regex、VS Code、Django、FastAPI、Go、計 45,629 ファイル)を対象にしています。trigram index -path:test を実行すると 6 つのリポジトリから 72 ファイルがマッチしますが、dowse が実際にディスクから読み出したのはわずか 73 ファイル、所要時間は 10 ミリ秒でした。前述の Cargo.toml バージョン一覧の生成に至っては 3.2 ミリ秒です。42,000 ファイル(1.3 GB の Rust crate ソースコード)規模のさらに大きなツリーでも、インデックス作成は約 6 秒、通常の検索は 20〜60 ミリ秒程度で完了します。

tgrep 単体は単一のディレクトリツリーを CLI や専用サーバーから検索する設計です。dowse はその背後にある複数のツリーを 1 つの検索窓にまとめ上げ、GitHub 構文のパース、複数リポジトリにまたがるタグ・ファセット、テーブル表示、プレビュー、GitHub からのクローンと定期同期といった実用的な機能を上乗せしました。インデックスの実体は tgrep そのものであり、各リポジトリ直下の .tgrep フォルダに格納されます。これは tgrep index や tgrep serve が使用するパスと同じなため、dowse と tgrep CLI でリポジトリごとに同じインデックスを共有できます。

再構築不要で常に最新を保つインデックス

インデックスは手元のファイル内容と一致していて初めて意味を持ちます。そのため、dowse は変更を検知するために重い全体再構築を待つ必要がありません。

  • リポジトリごとにファイル監視機構(file watcher)が常駐し、直前ビルド以降に変更されたファイルを追跡して検索時に直接読み取ります。ミラー先で git pull した場合も、エディタで 1 秒前に保存した編集も、次の検索に即座に反映されます。
  • アプリを起動すると、dowse が動いていなかった間に発生したファイルの追加・削除・リネームなどの差分を自動スキャンします。
  • インデックスの更新時は変更されたファイルのみを読み込み、インデックスの複製へストリーミング書き込みを行います。245,000 ファイル・インデックス容量 1.7 GB の巨大リポジトリでも、全体構築には約 9 分かかるところ、更新なら約 10 秒で完了します。更新処理中も検索機能は中断することなく利用可能です。

デスクトップアプリの UI は、Zed エディタの基盤でもある GPU 描画フレームワーク GPUI で作られたネイティブ実装です。ブラウザや Electron を介さないため、極めて軽快に動作します。

開発者と AI コーディングエージェントのためのコマンドライン

dowse search や dowse repos などの CLI サブコマンドは、稼働中のデスクトップアプリと通信して動作するため、メモリ上で温まっているウォームインデックスとファイル監視の恩恵をそのまま共有できます。アプリが起動していない場合は、最初のコマンド実行時にバックグラウンドでヘッドレス起動します。

Terminal window
dowse search 'parse_config lang:rust' # 管理下の全リポジトリを検索
dowse search --here 'parse_config' # カレントディレクトリのリポジトリのみ検索
dowse search -t owner:my-org -l 'LegacyClient' # 特定組織のリポジトリに絞り、パスのみ出力
dowse repos clone --from my-org --pull-every 1h

CLI の出力形式は人間にとって読みやすいだけでなく、Claude Code、Codex、Cursor といった AI コーディングエージェントが利用することを前提に設計されています。大規模なコードツリーに対してエージェントが素の grep を走らせると、ディスク I/O に長い時間を取られるだけでなく、大量のテキストでコンテキストウィンドウが埋め尽くされてしまいます。tgrep は GitHub Copilot CLI 内で単一リポジトリにおける前者の課題を解決しましたが、dowse はあらゆるエージェントに対して全リポジトリ横断のインデックスを提供し、出力トークン数のバジェット管理も行います。

  • マッチ結果は標準出力(stdout)へ、集計や所要時間、補足情報は標準エラー出力(stderr)へ出力されます。マッチ時は終了ステータス 0、マッチなしの場合は 1 を返します。

  • 出力はデフォルトで最大 100 行、1 ファイルあたり最大 20 行に制限され、フッターに全体合計が表示されます。結果が切り詰められた場合、フッターには結果を効果的に絞り込める修飾子の候補と、それぞれ何ファイルに絞られるかの推定件数が提示されます。

    narrow with: repo:api (120) language:Rust (80) path:src/** (64)
  • --json でファイルごとのマッチ情報と要約を JSON 形式で出力できます。また --table csv でテーブル表示の内容を CSV 形式で出力可能です。

  • dowse guide を実行すると、エージェント向けの簡潔な利用ガイドが表示されます。これをプロジェクトの AGENTS.md や CLAUDE.md に記載しておけば、エージェントは起動元のリポジトリだけでなく、ローカルにあるあらゆるリポジトリを縦横無尽に検索できるようになります。

比較項目dowsetgrepGitHub code searchSourcegraphZoektEntrian Source Search
動作環境ローカルマシンローカルマシンgithub.com 上自身でデプロイしたサーバー自身でデプロイしたサーバーVisual Studio 内
検索対象複数のローカルクローン、全ブランチ、未コミット変更1 つのディレクトリツリーGitHub 上のリポジトリ(デフォルトブランチのみ)連携済みのコードホスティングインデックス投入済みリポジトリソリューション内のファイル
検索構文GitHub code search 構文正規表現、grep 互換GitHub code search 構文Sourcegraph 独自Zoekt 独自Entrian 独自
インデックストライグラム(tgrep)、監視機構で自動追従トライグラムGitHub 独自Zoektトライグラム全文インデックス
インターフェースデスクトップアプリ&CLICLI&サーバーWeb 画面Web 画面Web 画面&APIIDE パネル
料金・ライセンス無料、MIT無料、MITGitHub に付属商用製品無料、Apache-2.0開発者ごとの有償ライセンス

要約すると、ターミナルから単一リポジトリを最速で grep したいなら tgrep が最適です。チーム全体でブラウザから横断検索したいなら Sourcegraph や Zoekt の導入を検討してください。コードがすべて GitHub 上にありデフォルトブランチだけで十分なら、標準の GitHub code search で事足ります。そして、手元のマシンにある何十ものリポジトリやブランチを、未コミットの変更も含めて、専用サーバーを立てずにサクサク検索したいなら——デスクトップからも AI エージェントのターミナルからも使える dowse がベストな選択肢です。

dowse をダウンロードする

Releases ページ にて最新のビルド済みバイナリを配布しています。改ざん検証用のハッシュ値は SHA256SUMS に記載されています。ファイル名は dowse、バージョン番号、プラットフォーム名の形式です。

プラットフォーム配布ファイル
Windows (x64)…-windows-x86_64.zip
macOS 11+(Apple silicon および Intel)…-macos-universal.zip
Linux (x64)…-linux-x86_64.tar.gz
Linux (arm64)…-linux-aarch64.tar.gz

ダウンロードして解凍したら、リポジトリが置かれている親フォルダを登録します。

Terminal window
dowse ~/src ~/mirrors

複数の Git リポジトリが含まれるフォルダを指定すると、内部のリポジトリがすべて自動登録されます。Windows では、リポジトリ管理画面からエクスプローラーの右クリックメニューに「Add to dowse」を追加することも可能です。

なお、有償の商用コードサイニング証明書による署名は行っていないため、初回起動時に Windows SmartScreen や macOS Gatekeeper の警告画面が出ることがあります。実行を許可する手順については README をご確認ください。ソースコードからビルドしたい場合は、最新の安定版 Rust 環境で cargo run --release を実行してください。

よくある質問(FAQ)

dowse は Sourcegraph の代替になりますか?

ローカルにある自分のクローンを検索したい個人開発者にとっては、代替になります。dowse は「サーバーを立てずに、複数リポジトリを対象に高速な正規表現や文字列検索を行う」という Sourcegraph のコア機能を満たしています。ただし、Sourcegraph が備えるコードインテリジェンス(高度な型解析)、バッチ変更、チーム向けの共有 Web UI などを置き換えるものではありません。

dowse は tgrep の単なる GUI ラッパーですか?

一部はその通りです。dowse は tgrep のインデックスをそのまま利用し、同じ .tgrep ディレクトリを読み書きするため、tgrep のデスクトップフロントエンドとして機能します。しかしそれに加えて、複数リポジトリの一括検索、GitHub code search 構文の解釈、タグやファセット、テーブル表示、ファイルのインラインプレビュー、GitHub からのリポジトリ一括クローンや自動同期など、tgrep 単体にはない多くの機能を追加しています。

Zoekt との違いは何ですか?

どちらもトライグラムインデックスを採用している点は共通です。Zoekt はバックグラウンドサービスとして常時起動し、外部からインデックスを供給してもらうアーキテクチャです。一方 dowse は、手元のディスクにあるリポジトリをアプリ自身が直接インデックス化し、ファイル監視と差分更新で常に最新状態を保ち、洗練されたデスクトップ UI と CLI を提供するスタンドアロンアプリです。

ローカルの検索で GitHub code search の構文が本当に使えますか?

はい。dowse は GitHub code search の主要な構文(AND、OR、NOT、引用符によるフレーズ検索、/regex/ 正規表現、path:、language:、repo:、branch: 修飾子、および - による除外指定)に対応しています。

未コミットの変更や別ブランチのコードも検索できますか?

はい。ディスク上の実ファイルを直接走査するため、チェックアウトされているブランチの内容や、まだコミットしていない手元の作業中の変更もすべて検索対象になります。各リポジトリには現在のブランチ名がタグ付けされるため、branch:main を指定すれば main ブランチのリポジトリだけに絞り込めます。

Visual Studio 以外でも使える Entrian Source Search のようなツールはありますか?

dowse は特定の IDE に縛られるプラグインではなく、単体のデスクトップアプリ兼 CLI です。検索結果からは、普段愛用している VS Code、Cursor、Zed、Sublime Text などのエディタを直接呼び出して該当行を開けます。単一のソリューション内だけでなく複数リポジトリを横断して検索でき、完全無料・オープンソースです。

dowse が自分のコードを外部に送信することはありますか?

一切ありません。インデックスは各リポジトリ直下の .tgrep フォルダ内に保存され、すべての検索処理はお使いのマシン上で完結します。外部ネットワークと通信するのは、ユーザーが明示的にリポジトリ一覧の取得、クローン、pull などの Git / GitHub CLI 操作を要求したときだけです。


dowse は GitHub で公開されています。もし開発作業の効率化に役立ったら、Star を付けて応援していただけると他の開発者にも届きやすくなります。改善要望や不具合報告があれば、気軽に Issue を立ててください。