<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Browser-Automation on recca0120 Tech Notes</title><link>https://recca0120.github.io/en/tags/browser-automation/</link><description>Recent content in Browser-Automation on recca0120 Tech Notes</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 07 Apr 2026 11:34:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/en/tags/browser-automation/index.xml" rel="self" type="application/rss+xml"/><item><title>bb-browser: No Scraping, No API Keys — Your Browser Is the API</title><link>https://recca0120.github.io/en/2026/04/07/bb-browser-your-browser-is-the-api/</link><pubDate>Tue, 07 Apr 2026 11:34:00 +0800</pubDate><guid>https://recca0120.github.io/en/2026/04/07/bb-browser-your-browser-is-the-api/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post bb-browser: No Scraping, No API Keys — Your Browser Is the API" /&gt;&lt;p&gt;Want Twitter search results? Traditional approaches give you three paths: apply for an API key (rate-limited), write a scraper (get IP-banned), or use Playwright with a headless browser (detected as non-human).&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/epiral/bb-browser" target="_blank" rel="noopener"
 &gt;bb-browser&lt;/a&gt; takes a fourth path: use the Chrome you already have open. You&amp;rsquo;re logged into Twitter, the cookies are right there, and bb-browser runs &lt;code&gt;fetch()&lt;/code&gt; inside that tab. From the website&amp;rsquo;s perspective, it&amp;rsquo;s just you browsing.&lt;/p&gt;
&lt;h2 id="how-it-differs-from-scrapers-and-playwright"&gt;&lt;a href="#how-it-differs-from-scrapers-and-playwright" class="header-anchor"&gt;&lt;/a&gt;How It Differs from Scrapers and Playwright
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s get the differences clear.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;bb-browser&lt;/th&gt;
 &lt;th&gt;Playwright / Selenium&lt;/th&gt;
 &lt;th&gt;Scrapers (requests, Scrapy)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Browser&lt;/td&gt;
 &lt;td&gt;Your real Chrome&lt;/td&gt;
 &lt;td&gt;Isolated headless browser&lt;/td&gt;
 &lt;td&gt;No browser&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Login state&lt;/td&gt;
 &lt;td&gt;Already logged in&lt;/td&gt;
 &lt;td&gt;Must re-login or inject cookies&lt;/td&gt;
 &lt;td&gt;Manual cookie handling&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Anti-bot detection&lt;/td&gt;
 &lt;td&gt;Invisible (it IS the real user)&lt;/td&gt;
 &lt;td&gt;Easily detected&lt;/td&gt;
 &lt;td&gt;Easily blocked&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Fingerprint&lt;/td&gt;
 &lt;td&gt;Your real fingerprint&lt;/td&gt;
 &lt;td&gt;Headless browser fingerprint&lt;/td&gt;
 &lt;td&gt;No fingerprint&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The key insight: bb-browser doesn&amp;rsquo;t launch a new browser instance. It connects to your running Chrome via CDP (Chrome DevTools Protocol) and injects code into tabs. The User-Agent, cookies, and TLS fingerprint the website sees are all real — because it is your actual browser.&lt;/p&gt;
&lt;h2 id="architecture"&gt;&lt;a href="#architecture" class="header-anchor"&gt;&lt;/a&gt;Architecture
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AI Agent (Claude Code, Codex, Cursor)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ CLI or MCP (stdio)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser CLI ──HTTP──▶ Daemon ──CDP WebSocket──▶ Real Browser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────┴──────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Per-tab event│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ cache (net, │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ console) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;bb-browser runs a daemon (default &lt;code&gt;127.0.0.1:19824&lt;/code&gt;) that communicates with Chrome via CDP WebSocket. CLI commands go to the daemon, which executes them in the corresponding tab.&lt;/p&gt;
&lt;h2 id="installation-and-basic-usage"&gt;&lt;a href="#installation-and-basic-usage" class="header-anchor"&gt;&lt;/a&gt;Installation and Basic Usage
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g bb-browser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Pull community adapters:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser site update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Try a command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser site zhihu/hot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This opens a Zhihu tab (if you&amp;rsquo;re already logged in), uses your cookies to fetch the trending questions list.&lt;/p&gt;
&lt;h3 id="structured-output"&gt;&lt;a href="#structured-output" class="header-anchor"&gt;&lt;/a&gt;Structured Output
&lt;/h3&gt;&lt;p&gt;All commands support &lt;code&gt;--json&lt;/code&gt; and &lt;code&gt;--jq&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser site xueqiu/hot-stock &lt;span class="m"&gt;5&lt;/span&gt; --jq &lt;span class="s1"&gt;&amp;#39;.items[] | {name, changePercent}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# {&amp;#34;name&amp;#34;:&amp;#34;云天化&amp;#34;,&amp;#34;changePercent&amp;#34;:&amp;#34;2.08%&amp;#34;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# {&amp;#34;name&amp;#34;:&amp;#34;东芯股份&amp;#34;,&amp;#34;changePercent&amp;#34;:&amp;#34;-7.60%&amp;#34;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="browser-operations"&gt;&lt;a href="#browser-operations" class="header-anchor"&gt;&lt;/a&gt;Browser Operations
&lt;/h3&gt;&lt;p&gt;Beyond running adapters, you can directly control the browser:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser open https://example.com &lt;span class="c1"&gt;# Open URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser snapshot -i &lt;span class="c1"&gt;# Accessibility tree snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser click @3 &lt;span class="c1"&gt;# Click element&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser fill @5 &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# Fill input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;document.title&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# Execute JavaScript&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser fetch URL --json &lt;span class="c1"&gt;# Authenticated fetch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bb-browser screenshot &lt;span class="c1"&gt;# Take screenshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="36-platforms-103-commands"&gt;&lt;a href="#36-platforms-103-commands" class="header-anchor"&gt;&lt;/a&gt;36 Platforms, 103 Commands
&lt;/h2&gt;&lt;p&gt;bb-browser&amp;rsquo;s adapters cover a wide range:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search&lt;/strong&gt;: Google, Baidu, Bing, DuckDuckGo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Social&lt;/strong&gt;: Twitter/X, Reddit, Weibo, Xiaohongshu, LinkedIn&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev&lt;/strong&gt;: GitHub, StackOverflow, Hacker News, npm, PyPI, arXiv, V2EX, Dev.to&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;News&lt;/strong&gt;: BBC, Reuters, 36kr, Toutiao&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video&lt;/strong&gt;: YouTube, Bilibili&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finance&lt;/strong&gt;: Xueqiu, Yahoo Finance, Eastmoney&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Knowledge&lt;/strong&gt;: Wikipedia, Zhihu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each adapter is a single JavaScript file, community-driven. To add a new platform, write a JS file and submit it to the &lt;code&gt;bb-sites&lt;/code&gt; repo.&lt;/p&gt;
&lt;h2 id="three-levels-of-adapter-complexity"&gt;&lt;a href="#three-levels-of-adapter-complexity" class="header-anchor"&gt;&lt;/a&gt;Three Levels of Adapter Complexity
&lt;/h2&gt;&lt;p&gt;Not every website is equally straightforward. bb-browser categorizes adapters into three levels:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Level&lt;/th&gt;
 &lt;th&gt;Approach&lt;/th&gt;
 &lt;th&gt;Examples&lt;/th&gt;
 &lt;th&gt;Dev Time&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Level 1&lt;/td&gt;
 &lt;td&gt;Direct fetch with cookies&lt;/td&gt;
 &lt;td&gt;Reddit, GitHub&lt;/td&gt;
 &lt;td&gt;~1 min&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Level 2&lt;/td&gt;
 &lt;td&gt;Bearer token + CSRF extraction&lt;/td&gt;
 &lt;td&gt;Twitter, Zhihu&lt;/td&gt;
 &lt;td&gt;~3 min&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Level 3&lt;/td&gt;
 &lt;td&gt;Webpack injection or Pinia store&lt;/td&gt;
 &lt;td&gt;Twitter search&lt;/td&gt;
 &lt;td&gt;~10 min&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Level 1 is simplest — some sites&amp;rsquo; APIs work with just cookies. Level 3 is most complex, requiring reverse engineering of frontend bundles, extracting data from Webpack&amp;rsquo;s &lt;code&gt;__webpack_require__&lt;/code&gt; or Vue&amp;rsquo;s Pinia store.&lt;/p&gt;
&lt;h2 id="mcp-server-for-ai-agents"&gt;&lt;a href="#mcp-server-for-ai-agents" class="header-anchor"&gt;&lt;/a&gt;MCP Server for AI Agents
&lt;/h2&gt;&lt;p&gt;This is bb-browser&amp;rsquo;s most compelling use case. Configure it as an MCP server, and Claude Code or Cursor can directly access any website your browser can see.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;bb-browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;npx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-y&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bb-browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Once configured, you can tell Claude Code &amp;ldquo;search arXiv for recent RAG papers&amp;rdquo; and it will search through bb-browser using your real browser.&lt;/p&gt;
&lt;p&gt;Without bb-browser, an AI agent can only work with files and the terminal. With bb-browser, it can access the entire internet — as you.&lt;/p&gt;
&lt;p&gt;I previously wrote about &lt;a class="link" href="https://recca0120.github.io/en/2026/03/15/cli-anything-agent-native-cli/" &gt;CLI-Anything&lt;/a&gt;, which wraps desktop software as CLIs for agents to call, and &lt;a class="link" href="https://recca0120.github.io/en/2026/04/07/aionui-ai-cowork-app/" &gt;AionUi&lt;/a&gt;, which provides a unified interface for managing multiple agents. bb-browser extends agent capability from yet another angle: letting it browse the web using your real browser.&lt;/p&gt;
&lt;h2 id="things-to-consider"&gt;&lt;a href="#things-to-consider" class="header-anchor"&gt;&lt;/a&gt;Things to Consider
&lt;/h2&gt;&lt;p&gt;A few things to think through before using it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It uses your real account&lt;/strong&gt;. bb-browser acts on your behalf. If the operation frequency is too high, your account might get flagged. It&amp;rsquo;s not an invisible scraper — it IS you&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;. The daemon binds to localhost by default, but if you open it to &lt;code&gt;0.0.0.0&lt;/code&gt;, anyone who can reach your machine can control your browser. Use Tailscale or ZeroTier for safer remote access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adapter quality varies&lt;/strong&gt;. Community-driven means broad coverage, but some adapters may lag behind website redesigns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;macOS users&lt;/strong&gt;: watch for IPv6 issues — add &lt;code&gt;--host 127.0.0.1&lt;/code&gt; to the daemon command&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-it"&gt;&lt;a href="#when-to-use-it" class="header-anchor"&gt;&lt;/a&gt;When to Use It
&lt;/h2&gt;&lt;p&gt;bb-browser isn&amp;rsquo;t for scraping millions of records. Use Scrapy for that.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s ideal for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Giving AI agents web access without applying for API keys one by one&lt;/li&gt;
&lt;li&gt;Quickly pulling structured data from platforms you&amp;rsquo;re already logged into&lt;/li&gt;
&lt;li&gt;Cross-platform research — query arXiv, Twitter, GitHub, Zhihu, and StackOverflow in under a minute&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One command does what used to require writing a scraper, and it won&amp;rsquo;t get blocked.&lt;/p&gt;
&lt;h2 id="references"&gt;&lt;a href="#references" class="header-anchor"&gt;&lt;/a&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/epiral/bb-browser" target="_blank" rel="noopener"
 &gt;bb-browser GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/nicepkg/bb-sites" target="_blank" rel="noopener"
 &gt;bb-sites Community Adapters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://chromedevtools.github.io/devtools-protocol/" target="_blank" rel="noopener"
 &gt;Chrome DevTools Protocol Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://modelcontextprotocol.io/" target="_blank" rel="noopener"
 &gt;Model Context Protocol Specification&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>