dots — открытый веб-агент с браузером, который не блокируют
📂 Исходный код на GitHubОткрытый веб-агент с собственным браузером на движке Firefox. Диалог и браузер в одном локальном окне, модель выбирается через OpenRouter, есть режим работы через MCP-сервер. Лицензия MIT.
dots — это открытый AI-агент для работы с сайтами, у которого есть собственный браузер. Вы пишете задачу обычным языком, а агент сам открывает страницы, заполняет формы и кликает. Браузер и диалог показываются в одном локальном окне: слева переписка, справа браузер, и всё это сразу, без ожидания.
Главная мысль автор проекта звучит так: любой AI-агент — это модель плюс браузер. Модель меняется одним флагом, а вот браузер — это то, что видит сайт. Именно браузер чаще всего и ломает работу агента.
Репозиторий написан на Python, распространяется под лицензией MIT и уже собрал около тысячи звёзд. При этом проект совсем молодой: первый коммит и последняя отправка в репозиторий — 29 сентября 2026 года, а всего коммитов четыре. Об этом стоит помнить, когда вы решаете, можно ли сразу класть его в рабочие задачи.
Почему всё упирается в браузер
Когда веб-агент не справляется с задачей, причина обычно не в модели. Страница просто не загрузилась. Или сайт показал проверку, что вы робот. Или истёк срок входа в аккаунт. Или клик просто не попал в кнопку. Всё это происходит в браузере — до того, как модель вообще начинает думать.
Поэтому dots построен вокруг одного настоящего браузера, а не вокруг набора скриптов. Ниже перечислено то, что заявляет автор. Сравнительных тестов со сторонними конкурентами в репозитории нет.
- Настоящий движок Firefox, пропатченный на C++. Отпечаток браузера (набор признаков, по которому сайт узнаёт программу посетителя) выбирается внутри движка, а не рисуется поверх скриптом на JavaScript, который страница может проверить.
- Одна личность на каждое значение
--seed. Разрешение экрана, шрифты, видеокарта, часовой пояс и язык согласованы между собой. Один и тот же seed даёт того же самого «человека» при каждом запуске. - Странице нечего находить. Нет флага WebDriver, нет протокола DevTools, в странице нет глобальных переменных, которые оставляет автоматизация.
- Руки живого человека. Указатель мыши реально движется к элементу, по которому кликают, а клавиши нажимаются по одной. Поэтому все события, которые получает страница, выглядят доверенными.
- Браузер помнит. Флаг
--profile-dirсохраняет логины и cookies между запусками. - Выход определяет, кто вы. С флагом
--proxyчасовой пояс и язык подстраиваются под адрес, с которого выходите.
Установка и запуск
Проект не нужно ставить вручную. Он запускается одной командой через uvx, а нужные зависимости подтягиваются сами. На Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uvx --from git+https://github.com/feder-cr/dots dots --openrouter-key sk-or-...
На Windows в PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"
uvx --from git+https://github.com/feder-cr/dots dots --openrouter-key sk-or-...
После запуска откройте http://127.0.0.1:8765. Страница откроется локально. Наружу уходят только запросы к модели и к тем сайтам, куда вы просите агента сходить.
Нужен ключ OpenRouter. Это значит, что модель выбирается не локально, а через облачный шлюз OpenRouter. Моделей там много, конкретную выбирает флаг --model. Подключить свою локальную модель нельзя — проект для этого не предназначен.
Как выглядит задача
Формулировка задачи обычная, на человеческом языке. Пример из README — поиск авиабилетов:
Go to
<paste the URL>. One way, Milan to Lisbon, economy, one adult. Check every date from the 12th to the 16th of next month and read the cheapest fare for each day. If a date has no availability, say so. Do not guess a number.
Обратите внимание на последнюю фразу. Автор прямо просит агента не выдумывать цифры, а сказать, если данных нет. Это простая и полезная привычка: чем строже вы формулируете «не придумывай», тем меньше шансов получить от агента правдоподобную выдумку.
Тот же браузер в вашем ассистенте
Если запускать отдельное окно не нужно, тот же браузер можно отдать вашему ассистенту как MCP-сервер. Он называется invisible_playwright_mcp и работает с Claude Code, Codex, Gemini CLI и любым другим клиентом, который умеет говорить с MCP.
Отдельно стоит понять, как устроен проект. dots — не самостоятельный агент. В коде программы прямо написано, что она запускает подкоманду ui из пакета invisible-playwright-mcp и больше ничего своего не делает. То есть dots — это просто удобное имя и короткий запуск для того же пакета. Пакет закреплён в зависимостях точной версией 0.70.2, без автоматического обновления: автор обновляет версию вручную и прогоняет тесты.
Что внутри репозитория
Код очень маленький. Всё содержимое — файл конфигурации pyproject.toml, лицензия, README, тесты и три файла в src/dots/. Основной из них — cli.py, там около двадцати строк.
Посмотреть состав проекта можно по ссылкам:
- pyproject.toml — зависимости, требуемая версия Python и список ключевых слов проекта
- cli.py — точка входа, она же вся программа
- LICENSE — текст лицензии MIT
Нужен Python 3.11 или новее. Поддерживаются Windows и Linux. Тесты написаны на pytest и разделены на две группы: unit — чистая логика, без сети и браузера; integration — реальный запуск команды в отдельном процессе, тоже без сети и браузера.
Релизов на PyPI у проекта нет, и это сделано намеренно: автор пишет, что имя dots на PyPI уже занято другим проектом. Поэтому запуск всегда идёт через uvx --from git+..., а не через pip install dots. Все ключи командной строки видны в dots --help.
Кому это пригодится
Проект имеет смысл, если вам нужно, чтобы агент ходил по сайтам, где обычная автоматизация ловится: собирать данные с защитой от роботов, проверять цены, заполнять формы под аккаунтом, в который вы уже вошли. Флаги --profile-dir и --proxy решают ровно эти задачи — сохранить вход и зайти с нужного адреса.
Чего ожидать не стоит. Это не инструмент для написания кода. И не конструктор, из которого собирают агентов. Это тонкая обёртка над другим пакетом с очень короткой историей коммитов. Перед использованием в рабочих задачах стоит прочитать исходники пакета invisible-playwright-mcp и проверить, что его лицензия и условия вам подходят.
Проект не связан с OpenAI — это написано в README прямым текстом. Сходство названия случайное.
Источник: https://github.com/feder-cr/dots