핵심 요약
- dots는 OpenAI가 2026년 9월 29일 공개한 상시 에이전트 dots와 이름만 같은 오픈소스 프로젝트로, 내 PC에서 웹 UI를 실행하고 OpenRouter 모델이 패치된 Firefox를 조작하게 하는 로컬 브라우저 에이전트입니다.
- dots 저장소의 코드는
invisible-playwright-mcp ui명령을 다른 이름으로 호출하는 20줄 남짓의 진입점이고, 에이전트 루프와 MCP 서버, 브라우저 엔진은 모두 같은 저자의 다른 저장소에 있습니다. - 브라우저 지문(fingerprint)을 페이지에 JavaScript로 덮어쓰지 않고 Firefox C++ 소스 단계에서 정하며, 시드(seed) 하나로 화면, 글꼴, GPU, 시간대, 언어를 서로 맞물리게 만든다는 것이 저자가 내세우는 차별점입니다.
- 엔진 바이너리가 Windows x86_64와 Linux(x86_64, arm64)용으로만 배포되어 macOS에서는 브라우저를 띄울 수 없고, 실행하려면 OpenRouter API 키가 필요합니다.
dots 소개
웹 에이전트가 실패하는 이유는 대부분 모델이 아니라 브라우저 쪽에 있다는 것이 dots 저자의 진단입니다. 페이지가 끝까지 열리지 않거나, 봇 확인 화면이 뜨거나, 로그인이 풀리거나, 클릭이 엉뚱한 곳에 떨어지는 일은 모델이 판단을 시작하기도 전에 일어난다는 것입니다. 이번에 소개하는 dots는 이 진단에서 출발해, 봇 탐지에 잘 걸리지 않도록 패치한 Firefox를 중심에 두고 OpenRouter의 모델을 붙여 쓰는 로컬 브라우저 에이전트입니다.
dots를 실행하면 http://127.0.0.1:8765 에 웹 UI가 열리고, 왼쪽에는 대화가, 오른쪽에는 에이전트가 조작하는 브라우저 화면이 실시간으로 표시됩니다. 모델은 OpenRouter에 있는 것이라면 --model 옵션 하나로 바꿀 수 있고, 브라우저는 매 실행마다 같은 시드로 같은 신원을 재현하거나 프로필 디렉토리에 로그인 상태를 보존할 수 있습니다. 저자는 이 구성을 "모델은 플래그 하나로 바꿀 수 있지만, 웹사이트가 보는 것은 브라우저"라는 문장으로 요약합니다.
dots 저장소 자체에는 기능 구현이 거의 없습니다. src/dots/cli.py는 같은 저자의 invisible_playwright_mcp 패키지가 제공하는 ui 명령을 그대로 호출하고, pyproject.toml은 그 패키지를 invisible-playwright-mcp==0.70.2 로 정확히 고정합니다. 패키지 설명에는 dots를 "invisible-playwright-mcp's interface, under the name people search for" 라고 적어 두었고, 저장소가 만들어진 시각도 OpenAI dots 발표 당일인 2026년 9월 29일(UTC)입니다. dots는 OpenAI와 관계없는 프로젝트이며, 이미 있던 브라우저 에이전트를 검색되는 이름으로 다시 내놓은 진입점입니다. README 마지막 줄도 "Not affiliated with OpenAI." 로 이를 밝히고 있습니다.
dots vs. OpenAI dots
OpenAI dots는 DevDay 2026에서 발표되었고, 발표 전체는 OpenAI DevDay 2026 발표 25가지 총정리 글에 정리되어 있습니다. OpenAI의 Introducing dots 발표문을 기준으로 두 프로젝트를 비교하면 다음과 같습니다:
| 항목 | dots (feder-cr/dots) | OpenAI dots |
|---|---|---|
| 형태 | 내 PC에서 실행하는 로컬 웹 UI | ChatGPT 안의 상시 에이전트 |
| 실행 환경 | 사용자의 Windows 또는 Linux 머신 | dot마다 할당되는 OpenAI 클라우드 컴퓨터 |
| 모델 | OpenRouter의 모델 중 선택 (--model) |
GPT-6 Astra |
| 브라우저 | C++ 단계에서 지문을 정하도록 패치한 Firefox | dot 전용 클라우드 브라우저 |
| 다른 앱 연결 | 없음 (브라우저만 사용) | 플러그인으로 4,000개 이상의 앱 연결 |
| 동작 방식 | 사용자가 보낸 작업을 실행하고 멈춤 | 연결된 앱을 읽기 전용으로 살피는 백그라운드 작업 포함 |
| 비용 | 무료 코드 + OpenRouter 사용료 | Pro, Business Premium 요금제에 첫 dot 포함 |
두 프로젝트가 공유하는 것은 "에이전트에게 자기 브라우저를 준다"는 발상 정도입니다. OpenAI dots는 상시 실행과 앱 연동이 핵심이고, feder-cr의 dots는 웹사이트가 자동화 브라우저를 알아보지 못하게 하는 데 집중합니다.
dots를 사용하면 좋을 사용자
dots는 로그인이 필요하거나 봇 확인 화면이 자주 나타나는 웹 페이지에서 반복 조회 작업을 맡기고 싶은 Windows, Linux 사용자에게 맞습니다. 이미 Claude Code, Codex, Gemini CLI 같은 MCP 클라이언트를 쓰고 있다면 dots의 웹 UI 대신 같은 브라우저를 MCP 서버로 붙이는 편이 더 자연스럽고, 모델 없이 코드로 직접 브라우저를 다루려는 개발자에게는 아래에서 설명할 invisible_playwright 라이브러리가 더 맞습니다.
macOS만 쓰는 사용자나, OpenAI dots처럼 클라우드에서 계속 돌아가는 비서를 기대한 사용자에게는 dots가 적절한 선택지가 아닙니다. 대상 사이트의 이용약관이 자동화된 접근을 금지한다면 탐지를 피할 수 있는지와 별개로 쓸 수 없다는 점도 함께 고려해야 합니다.
dots의 구조: 실행 명령 아래의 네 저장소
dots를 실행하면 실제로 동작하는 코드는 모두 같은 저자의 다른 저장소에 있습니다. 위에서 아래로 정리하면 다음과 같습니다:
| 계층 | 저장소 | 역할 |
|---|---|---|
| 실행 명령 | feder-cr/dots | dots 명령으로 invisible-playwright-mcp ui 를 호출 |
| 에이전트와 MCP 서버 | feder-cr/invisible_playwright_mcp | 웹 UI, 에이전트 루프, 16개 브라우저 도구를 가진 MCP 서버 |
| 브라우저 라이브러리 | feder-cr/invisible_playwright | Playwright API와 호환되는 Python 라이브러리(tracing, HAR, CDP 등 일부 기능 제외), 사람 같은 입력 생성 |
| 지문 설정 | feder-cr/invisible_core | 시드에서 지문, Firefox 설정값, 프록시와 지역 정보를 계산 |
| 브라우저 엔진 | feder-cr/firefox_antidetect_patch | mozilla-central에 C++ 패치를 적용해 빌드한 Firefox 151 |
invisible_playwright_mcp의 에이전트 루프는 모델에게 MCP(Model Context Protocol) 도구 목록을 넘기고, 모델이 답을 낼 때까지 도구 호출을 반복합니다. 도구는 browser_open, browser_navigate, browser_read_text, browser_snapshot, browser_click_at, browser_type, browser_evaluate 등 16개입니다. 도구는 main 과 support 두 브라우저를 다루며, support 는 가입 인증 메일을 받을 일회용 메일함처럼 main 의 쿠키와 지문이 섞이면 안 되는 작업에 쓰는 보조 브라우저입니다. 서버가 모델에 주는 안내문은 셀렉터, 좌표, 스크린샷, browser_evaluate 순으로 시도하라고 지시하고, browser_evaluate 로 값을 대입하거나 click() 을 호출하는 조작은 isTrusted 가 false인 이벤트를 만든다는 이유로 거부합니다. 기본 모델은 z-ai/glm-5.3-flash 이고, 루프에는 최대 단계 수가 없습니다. 저자는 agent.py의 주석에서 예전의 25단계 상한이 잘 진행되던 긴 작업을 끊었기 때문에 없앴고, 대신 화면의 전송 버튼이 작업 중에는 중지 버튼으로 바뀐다고 설명합니다. 작업을 멈추는 시점과 그에 따른 OpenRouter 비용은 사용자가 직접 관리해야 합니다.
dots가 invisible-playwright-mcp 패키지를 정확한 버전으로 고정한 것도 실사용에서 의미가 있습니다. 저자는 cli.py 가 공개 API가 아닌 명령 그룹을 호출하므로 새 버전은 테스트를 거쳐 의도적으로만 올린다고 적어 두었습니다. 그래서 invisible_playwright_mcp에 새 수정이 나와도 dots의 고정 버전이 바뀌기 전까지는 dots로 받을 수 없고, 최신 버전이 필요하면 uvx invisible-playwright-mcp ui 를 직접 실행하면 됩니다. 두 명령은 같은 웹 UI를 띄웁니다.
invisible_playwright_mcp 저장소의 이력도 알아 둘 만합니다. 이 저장소는 원래 저자가 2024년 8월에 만든 AIHawk 구직 지원 자동화 프로젝트였고, 예전 주소인 feder-cr/Jobs_Applier_AI_Agent_AIHawk 는 지금 이 저장소로 연결됩니다. 브라우저 에이전트 패키지는 2026년 8월 19일에 aihawk 라는 이름으로 처음 만들어졌고, 저장소는 9월 22일 aihawk_mcp_server 를 거쳐 invisible_playwright_mcp 로, 패키지와 명령은 다음 날 invisible-playwright-mcp 로 이름이 바뀌었습니다. invisible_playwright README에는 아직 uvx aihawk 같은 옛 이름의 명령이 남아 있으므로, 문서를 따라 할 때는 현재 이름인 invisible-playwright-mcp 를 기준으로 삼는 것이 안전합니다.
dots의 탐지 회피 방식
dots README는 브라우저 쪽 설계를 여섯 가지로 정리합니다:
- C++로 패치한 Firefox 엔진: 지문을 페이지가 검사할 수 있는 JavaScript로 덧칠하지 않고 엔진 안에서 정합니다. invisible_playwright README에 따르면 navigator, 화면, GPU/WebGL, 캔버스, 글꼴, 오디오, WebRTC, 시간대가 그 대상입니다.
- 시드 하나에 신원 하나: 화면, 글꼴, GPU, 시간대, 언어가 서로 모순되지 않게 묶여 있고,
--seed를 주면 매 실행마다 같은 신원이 재현됩니다. - 자동화 흔적 제거: WebDriver 플래그, DevTools 프로토콜, 페이지 안의 자동화용 전역 변수가 없습니다.
- 사람 같은 입력: 포인터가 클릭 대상까지 곡선으로 이동하고 키를 하나씩 누르므로, 페이지가 받는 이벤트가 모두 신뢰된(trusted) 이벤트가 됩니다.
- 기억하는 브라우저:
--profile-dir로 로그인과 쿠키를 실행 사이에 보존합니다. - 접속 위치와 신원 일치:
--proxy를 쓰면 시간대와 언어가 프록시 출구 위치를 따라갑니다.
아래 GIF는 invisible_playwright README에 실린 탐지 테스트 결과로, 저자가 2026년 5월에 만든 캡처입니다. reCAPTCHA v3, FingerprintJS Pro, CreepJS, BrowserLeaks의 WebRTC 테스트, bot.sannysoft.com 다섯 곳을 통과했다고 표시되어 있습니다:

캡처 속 FingerprintJS 화면의 브라우저는 Firefox 146.0이고 현재 배포되는 엔진은 Firefox 151이므로, 이 결과는 당시 버전에서 저자가 측정한 값입니다. 상용 봇 차단 서비스는 계속 판정 방식을 바꾸므로 "차단되지 않는다"는 표현은 보장이 아니라 저자의 주장으로 읽는 것이 맞습니다.
Firefox를 C++ 단계에서 패치하는 접근은 Camoufox와 같은 계열입니다. invisible_playwright README는 Camoufox를 패치 범위가 더 넓고 지문 데이터베이스를 함께 배포하는 프로젝트로, invisible_playwright는 시드에서 지문을 계산하는 프로젝트로 구분합니다. Camoufox를 에이전트용 서버로 감싼 프로젝트는 camofox-browser 글에서, 같은 문제를 Rust 기반 헤드리스(headless) 브라우저로 푼 사례는 Obscura 글에서 볼 수 있습니다.
dots 설치와 사용
dots는 PyPI에 올라가 있지 않습니다. PyPI의 dots 라는 이름은 이미 관계없는 다른 프로젝트가 쓰고 있어서, uv의 uvx 로 GitHub 저장소에서 직접 받아 실행합니다. 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-...
처음 실행할 때 GitHub 릴리스에서 패치된 Firefox를 내려받습니다. invisible_playwright README 기준으로 압축 파일이 240MB(Windows), 262MB(Linux x86_64), 253MB(Linux arm64)이고 풀면 약 550MB입니다. 실행 후 http://127.0.0.1:8765 를 열고 작업을 입력하면 됩니다. 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.
dots --help 로 확인한 주요 옵션은 다음과 같습니다:
| 옵션 | 설명 |
|---|---|
--openrouter-key |
OpenRouter API 키 (환경 변수 OPENROUTER_API_KEY 로도 지정 가능) |
--model |
OpenRouter 모델 ID (환경 변수 INVISIBLE_MCP_MODEL) |
--proxy |
브라우저가 쓸 프록시 URL |
--seed |
지문을 고정하는 정수 시드 |
--profile-dir |
로그인과 쿠키를 보존할 프로필 디렉토리 |
--headed |
브라우저 창을 화면에 표시 |
--binary |
이미 받아 둔 엔진 바이너리 경로 (고정된 빌드와 같아야 실행됨) |
--host, --port |
웹 UI 주소 (기본값 127.0.0.1, 8765) |
실행 전에 확인할 점이 네 가지 있습니다. 먼저 --openrouter-key 로 키를 넘기면 셸 기록과 Linux의 프로세스 목록에 키가 남으므로, invisible_playwright_mcp README는 실행 디렉토리의 .env 파일이나 환경 변수에 OPENROUTER_API_KEY 를 두라고 권합니다. 다음으로 웹 UI에는 인증이 없어서, --host 를 루프백 밖으로 바꾸면 인증 없는 인터페이스가 그 주소로 그대로 노출됩니다. 또한 웹 UI는 대화와 에이전트가 페이지에서 읽은 내용을 사용자의 키로 OpenRouter에 보냅니다. 마지막으로 엔진은 브라우저 프로세스가 시작될 때마다 GitHub 릴리스에서 실행 횟수를 세는 한 줄짜리 파일을 받아 오는데, 저자는 이 요청에 식별자가 담기지 않으며 GitHub에는 일반 HTTPS 요청처럼 IP 주소만 보인다고 밝히고 있습니다. firefox_antidetect_patch README는 invisible_firefox.usage_ping.enabled 설정을 false 로 두면 이 요청을 끌 수 있다고 안내합니다.
같은 브라우저를 웹 UI가 아닌 MCP 서버로 쓰려면 Claude Code에서는 다음 두 줄로 플러그인을 설치합니다. Codex와 Gemini CLI용 명령은 invisible_playwright_mcp README에 있습니다:
claude plugin marketplace add feder-cr/invisible_playwright_mcp
claude plugin install invisible-playwright-mcp@feder-cr
invisible_playwright_mcp README의 사용 안내 절은 대상 사이트의 이용약관을 읽고, 요청 빈도 제한을 지키고, 사람이 읽지 않은 내용을 제출하지 말라고 당부합니다. invisible_playwright README도 이 프로젝트가 교육 목적이며 사용에 따른 책임은 사용자에게 있다고 적고 있습니다.
dots의 라이선스
dots는 MIT 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다. 실제 기능을 담은 invisible_playwright_mcp도 현재 MIT 라이선스입니다.
단, invisible_playwright_mcp에서 2026년 9월 2일 이전에 배포된 버전은 AGPL-3.0으로 공개되었고 그 조건이 그대로 유지되므로, 예전 버전을 가져다 쓸 때는 버전별 라이선스를 확인해야 합니다. 함께 내려받는 패치된 Firefox 바이너리는 Firefox 원본과 같은 MPL-2.0(Mozilla Public License 2.0)을 따릅니다.
dots GitHub 저장소
invisible_playwright_mcp GitHub 저장소 (dots의 기능 본체)
더 읽어보기
-
OpenAI DevDay 2026 발표 25가지 총정리: 상시 에이전트 dots부터 GPT-6.1 Sol, 플러그인 확장까지
-
camofox-browser: AI 에이전트를 위한, 스텔스 헤드리스 브라우저 (feat. Camoufox)
-
Agent Browser: Vercel이 공개한, AI 에이전트를 위한 경량화된 명령줄 브라우저 자동화 도구
-
Browser Harness: LLM이 직접 Chrome을 제어하며 부족한 기능을 스스로 구현하는 자기 치유형 브라우저 자동화 프레임워크
이 글은 GPT 모델로 정리한 초안을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 댓글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. ![]()
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()
