dowse: локальная альтернатива Sourcegraph и GitHub Code Search
dowse ищет код одновременно по множеству Git-репозиториев — как через настольное приложение, так и прямо из командной строки. Он делает для локальных клонов на вашем диске то же, что GitHub code search и grep.app делают для GitHub: одна строка поиска, все ваши репозитории и результат за считаные миллисекунды. dowse использует привычный синтаксис запросов GitHub code search, работает на базе открытого поискового движка tgrep от Microsoft с триграммным индексированием, хранит по отдельному индексу на каждый репозиторий на манер Zoekt и абсолютно не требует никакого сервера.

dowse работает под Windows, macOS и Linux. Он полностью бесплатен и распространяется под лицензией MIT.
Нужный код редко лежит в одном репозитории
Когда требуется выяснить, где именно вызывается функция, в каком месте считывается ключ конфигурации или какие микросервисы все еще привязаны к устаревшей версии библиотеки, ответ обычно разбросан по десяткам репозиториев: ваши текущие рабочие копии, локальные зеркала сервисов вашей команды и сторонние зависимости. Существующие инструменты закрывают эту потребность лишь частично:
- GitHub code search работает быстро и поддерживает отличный синтаксис, но ищет исключительно то, что загружено на GitHub, ограничен веткой по умолчанию каждого репозитория и отдает не более 100 результатов за запрос. Ветка с новой функциональностью, над которой вы трудитесь прямо сейчас, локальные незапушенные правки и репозитории на других хостингах туда попросту не попадают.
- grep.app индексирует исключительно публичные репозитории на GitHub. Закрытый код вашей компании там не появится, да и не должен.
- Sourcegraph — наиболее функциональная платформа для поиска по кодовой базе, поддерживающая семантическую навигацию и пакетные изменения (batch changes). Однако это тяжелое серверное решение: его необходимо развертывать, интегрировать с системами контроля версий и постоянно сопровождать. Для инженерного департамента крупной компании это оправданные затраты, но для отдельного разработчика с рабочим ноутбуком это неоправданно сложная инфраструктура ради поиска по локальным папкам.
- Zoekt — триграммный движок, на котором построен поиск Sourcegraph. Он открыт и невероятно быстр, но тоже представляет собой комплекс из индексаторов и сервисов, которые нужно запускать, настраивать и снабжать данными.
- Entrian Source Search добавляет полнотекстовый индекс в Visual Studio, однако жестко привязан к среде разработки и требует платной лицензии на каждого разработчика.
- ripgrep и
git grepне требуют никакой подготовки, но при каждом поиске заново считывают с диска каждый файл и работают только в пределах одного дерева каталогов. Когда репозиториев становится больше пятидесяти, мгновенный отклик исчезает.
Мне хотелось получить то, что дает поиск на 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), dowse выведет список подходящих файлов мгновенно, даже не открывая их содержимое. Учет регистра, поиск целых слов и поддержка регулярных выражений переключаются горячими клавишами (Alt+C, Alt+W, Alt+R).

Результаты выводятся в виде сниппетов с подсветкой синтаксиса через tree-sitter. Клик по строке открывает предпросмотр всего файла прямо рядом со списком найденного; клавиша F4 переключает совпадения по очереди, а по Ctrl+Click нужная строка сразу открывается в VS Code, Cursor, Zed или Sublime Text.

Теги задают область поиска, фасеты детализируют результаты
Рабочая область (workspace) объединяет набор репозиториев (по аналогии с рабочими областями в VS Code) и сохраняется в файле .dowse-workspace. Репозиториям можно назначать произвольные теги: простые вроде mirror или dev, либо пары «ключ-значение» вроде owner:alice или project:billing. Кроме того, каждому репозиторию автоматически присваивается тег текущей активной ветки branch:<имя>, который обновляется при ее переключении.
Панель области поиска позволяет выбирать теги для фильтрации. Теги внутри одной группы работают по правилу ИЛИ (owner:alice или owner:bob), а разные группы объединяются по правилу И (dev и owner:alice). После вывода результатов интерфейс, как и grep.app, строит фасетную статистику с подсчетом совпадений по репозиториям, веткам, тегам, языкам программирования и корневым каталогам — с пересчетом под все активные фильтры.
Табличный вид: именованные группы захвата regex как колонки таблицы
Табличный режим (Alt+T) отображает каждое найденное вхождение как отдельную строку таблицы: репозиторий, ветка, путь к файлу, строка, колонка, язык, совпавший фрагмент и вся строка целиком. Если в регулярном выражении запроса используются именованные группы захвата (named capture groups), каждая такая группа становится отдельной колонкой с соответствующим заголовком. Например, следующий запрос мгновенно формирует сводную таблицу всех версий крейтов во всех ваших проектах:
/^version = "(?<version>[^"]+)"/ path:Cargo.toml
В то время как GitHub code search ограничен первой сотней результатов, таблица dowse вмещает до 20 000 строк. Любую колонку можно отсортировать, а всю таблицу экспортировать в CSV, TSV, Markdown, JSON или скопировать прямо в электронную таблицу. Вопросы вроде «какие сервисы все еще обращаются к старому API?» или «какие уровни логирования где выставлены?» решаются просмотром одной структурированной таблицы вместо бесконечного скроллинга выдачи.
Клонирование организаций GitHub целиком и автоматическая синхронизация
Вкладка репозиториев получает список проектов пользователя или организации через официальный GitHub CLI, поэтому dowse вообще не взаимодействует с вашими учетными данными: достаточно один раз выполнить gh auth login в терминале. Запрос страниц идет параллельно, так что список даже из 2 000 репозиториев формируется за считаные секунды. Выберите несколько или сразу все найденные проекты, и dowse в фоновом режиме склонирует их по пути <папка>/<owner>/<name>, присвоит тег owner:<owner> и тут же проиндексирует.
По умолчанию клонирование выполняется в режиме без blob-объектов (blobless clones): скачивается вся история коммитов, но содержимое файлов загружается только для текущей рабочей ревизии. Благодаря этому даже огромные репозитории клонируются очень быстро, а история Git остается полностью функциональной.

Задайте репозиторию интервал обновления (15m, 1h, 3d), и dowse будет автоматически подтягивать изменения по расписанию. Операция pull выполняет fetch из origin и делает fast-forward только при соблюдении всех условий безопасности: активна ветка по умолчанию, отслеживаемые файлы не имеют локальных правок и нет невыгруженных локальных коммитов. Если хотя бы одно условие не выполнено, dowse ограничивается операцией fetch и сообщает понятную причину (on feature/x, not main, uncommitted changes). Приложение никогда не производит автоматических merge, rebase или stash, поэтому в него абсолютно безопасно добавлять не только зеркала, но и рабочие каталоги вашей повседневной разработки.
Движок tgrep: триграммный поиск от Microsoft
Сердцем dowse является tgrep — высокопроизводительный поисковый инструмент на основе триграммных индексов, который Microsoft открыла в этом году и который обеспечивает поиск кода в GitHub Copilot CLI. Триграммный индекс фиксирует, в каких файлах встречается каждая трехсимвольная последовательность. При поступлении запроса tgrep разбивает его на триграммы, берет пересечение их инвертированных списков и считывает с диска только те файлы, которые гарантированно могут содержать совпадение, после чего проверяет их полноценным regex-движком. По этому же принципу работают Zoekt и легендарный Google Code Search. В собственных бенчмарках Microsoft tgrep опередил ripgrep в 17 из 18 тестовых конфигураций (разные репозитории и платформы), показав ускорение вплоть до 51,9 раза.
Для иллюстраций к этой статье dowse проиндексировал 12 открытых проектов, склонированных с GitHub: tgrep, ripgrep, Zoekt, Google codesearch, Hound, tokio, serde, regex, VS Code, Django, FastAPI и Go — всего 45 629 файлов. Запрос trigram index -path:test нашел 72 файла в шести репозиториях; для этого dowse потребовалось прочитать с диска всего 73 файла, а общее время составило 10 мс. Таблица версий из Cargo.toml сформировалась за 3,2 мс. На еще более крупной кодовой базе из 42 000 файлов (1,3 ГБ исходного кода на Rust) построение индекса занимает около 6 секунд, а типичный поиск отрабатывает за 20–60 мс.
Сам по себе tgrep рассчитан на индексацию одного дерева каталогов и поиск по нему через консоль или локальный сервер. dowse объединяет множество независимых репозиториев за единым интерфейсом и добавляет все, что требуется для масштабной работы: поддержку синтаксиса GitHub, сквозные теги и фасеты, табличный вид, предпросмотр кода, а также клонирование и обновление с GitHub. Индексы полностью совместимы с форматом tgrep и лежат в каталоге .tgrep каждого репозитория — ровно там же, где их создают tgrep index и tgrep serve, благодаря чему dowse и CLI-утилита tgrep могут использовать общий индекс.
Актуальный индекс без длительных перестроений
Индекс полезен только тогда, когда он строго соответствует файлам на диске. Поэтому dowse не требует долгого полного перестроения:
- Фоновый процесс отслеживания файлов (file watcher) для каждого репозитория фиксирует изменения с момента последней сборки индекса, и поисковые запросы сразу обращаются к измененным файлам. Любой
git pullв зеркале или правка, сохраненная секунду назад в редакторе, мгновенно учитываются при следующем поиске. - При открытии репозитория dowse автоматически сканирует файлы, изменившиеся, удаленные или переименованные за время, пока приложение было закрыто.
- Обновление индекса обрабатывает только модифицированные файлы и потоково вносит правки в копию индекса. В репозитории на 245 000 файлов с индексом объемом 1,7 ГБ такое обновление занимает порядка 10 секунд (вместо 9 минут на полную пересборку). При этом поиск продолжает работать без пауз прямо во время обновления.
Интерфейс приложения полностью нативный: он написан на GPUI — графическом фреймворке с аппаратным GPU-рендерингом, на котором построен редактор Zed. Никаких веб-оболочек или Electron здесь нет.
Командная строка для разработчиков и ИИ-агентов
Команды dowse search, dowse repos и другие обращаются напрямую к работающему настольному приложению, переиспользуя его горячие индексы в оперативной памяти и активные службы наблюдения за файлами. Если приложение еще не запущено, первая же консольная команда незаметно поднимет его в фоновом режиме без открытия окон.
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Формат консольного вывода оптимизирован как для людей, так и для ИИ-агентов написания кода (Claude Code, Codex, Cursor). Когда агент выполняет обычный grep по крупному проекту, он теряет время на дисковые операции и быстро забивает контекстное окно бесконечными простынями текста. tgrep решает первую проблему в GitHub Copilot CLI на уровне одного проекта; dowse предоставляет любому агенту такой же сверхбыстрый индекс сразу по всем локальным репозиториям с четким контролем объема вывода:
-
Результаты направляются в stdout; статистика, время выполнения и подсказки — в stderr. Код возврата равен 0 при наличии совпадений и 1, если ничего не найдено.
-
По умолчанию вывод ограничен 100 строками совпадений и не более 20 строк на один файл с итоговой сводкой внизу. При обрезке вывода в футере появляются конкретные предложения квалификаторов для сужения поиска с указанием количества файлов:
narrow with: repo:api (120) language:Rust (80) path:src/** (64) -
Флаг
--jsonвыводит объект по каждому найденному файлу и общую сводку; флаг--table csvпечатает строки табличного представления в формате CSV. -
Команда
dowse guideвыводит краткую инструкцию для агентов. Добавьте ее в свойAGENTS.mdилиCLAUDE.md, и ваш агент сможет искать по всем локальным репозиториям, а не только по той папке, где он был запущен.
Сравнение dowse с tgrep, Sourcegraph, Zoekt, GitHub code search и Entrian Source Search
| Критерий | dowse | tgrep | GitHub code search | Sourcegraph | Zoekt | Entrian Source Search |
|---|---|---|---|---|---|---|
| Где работает | На вашей машине | На вашей машине | На github.com | На вашем сервере | На вашем сервере | Внутри Visual Studio |
| Область поиска | Множество локальных клонов, любые ветки, незакоммиченные файлы | Одно дерево каталогов | Репозитории GitHub, только ветка по умолчанию | Подключенные Git-хостинги | Проиндексированные репозитории | Файлы текущего решения (Solution) |
| Синтаксис | GitHub code search | Regex, стиль grep | GitHub code search | Sourcegraph | Zoekt | Entrian |
| Индекс | Триграммы (tgrep), постоянное автообновление | Триграммы | Проприетарный GitHub | Zoekt | Триграммы | Полнотекстовый |
| Интерфейс | Десктоп-приложение и CLI | CLI и локальный сервер | Веб | Веб | Веб и API | Панель в IDE |
| Цена и лицензия | Бесплатно, MIT | Бесплатно, MIT | Входит в GitHub | Коммерческий продукт | Бесплатно, Apache-2.0 | Платная лицензия на разработчика |
Короткий вывод: если вам нужен максимально быстрый grep по одному репозиторию в консоли — выбирайте tgrep. Если команде требуется централизованный поиск по кодовой базе в браузере — разворачивайте Sourcegraph или Zoekt. Если весь код находится на GitHub и достаточно основной ветки — используйте GitHub code search. А если вам нужен мгновенный поиск по десяткам локальных репозиториев на вашей машине на любых ветках, с незакоммиченными правками, без поднятия серверов, с удобным десктопным интерфейсом и из терминала вашего ИИ-агента — для этого создан dowse.
Загрузка dowse
На странице релизов всегда доступны свежие готовые сборки с контрольными суммами в 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 |
После распаковки архива укажите пути к каталогам с вашими проектами:
dowse ~/src ~/mirrorsЕсли папка содержит несколько Git-репозиториев, dowse подключит их все автоматически. В Windows через страницу управления репозиториями можно также добавить пункт «Add to dowse» в контекстное меню папок Проводника.
Поскольку сборки открытого проекта не подписаны платным коммерческим сертификатом, при первом запуске Windows SmartScreen или macOS Gatekeeper могут показать предупреждение; в README подробно описано, как разрешить запуск. Для сборки из исходников запустите cargo run --release в среде со стабильным свежим компилятором Rust.
Часто задаваемые вопросы (FAQ)
Является ли dowse заменой Sourcegraph?
Для индивидуального разработчика, которому нужно искать по собственным локальным клонам — да. dowse полностью закрывает ключевой сценарий Sourcegraph: сверхбыстрый поиск по регулярным выражениям и точным строкам по десяткам репозиториев без поднятия сервера. При этом он не заменяет сложный анализ типов (code intelligence), пакетные правки кодовой базы (batch changes) или коллективный веб-интерфейс для крупных команд.
Является ли dowse просто графической оболочкой для tgrep?
Лишь отчасти. dowse использует формат индексов tgrep и работает с теми же каталогами .tgrep, выступая удобным графическим клиентом. Но сверх этого dowse умеет искать сразу по множеству репозиториев в одном запросе, понимает синтаксис GitHub code search, предоставляет систему тегов и фасетов, табличный вид, быстрый предпросмотр кода, а также автоматическое клонирование и фоновую синхронизацию с GitHub — всего этого в самом tgrep нет.
Чем dowse отличается от Zoekt?
Оба решения используют триграммный индекс. Zoekt задуман как долгоживущий серверный сервис, который необходимо непрерывно поддерживать и снабжать индексами из внешних процессов. dowse — это локальное приложение, которое само индексирует ваши репозитории на диске, поддерживает индекс в актуальном состоянии через file watcher и инкрементальные обновления, предлагая удобный графический интерфейс и продуманный CLI.
Можно ли искать локально с синтаксисом GitHub code search?
Да. dowse поддерживает основные конструкции GitHub code search: логические операторы AND, OR, NOT, фразы в кавычках, регулярные выражения /regex/, а также квалификаторы path:, language:, repo: и branch:, включая исключение через префикс -.
Ищет ли dowse по незакоммиченным правкам и другим веткам?
Да. Поиск идет непосредственно по файлам на диске, поэтому активная ветка и любые еще не сохраненные в Git изменения гарантированно попадают в результаты. Каждый репозиторий помечается тегом текущей ветки, поэтому запрос branch:main легко отфильтрует только основные ветки.
Есть ли альтернатива Entrian Source Search, работающая вне Visual Studio?
dowse — это не плагин к конкретной IDE, а самостоятельное приложение и консольная утилита. Найденные строки можно в один клик открыть в любимом редакторе — VS Code, Cursor, Zed или Sublime Text. Он ищет сразу по многим репозиториям, а не в рамках одного solution, и является полностью бесплатным и открытым.
Отправляет ли dowse мой код куда-либо по сети?
Нет. Индексы находятся исключительно в локальной папке .tgrep каждого репозитория, а все вычисления производятся только на вашем компьютере. Единственные сетевые запросы происходят исключительно тогда, когда вы сами запускаете операции Git или GitHub CLI (получение списка репозиториев организации, их первичное клонирование или плановый pull).
Проект dowse опубликован на GitHub. Если он помогает вам экономить время, звездочка в репозитории поможет другим разработчикам узнать о проекте. Если вы столкнулись с ошибкой или хотите предложить улучшение — создайте issue.