<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: zmy</title>
    <description>The latest articles on DEV Community by zmy (@zmysysz).</description>
    <link>https://dev.to/zmysysz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3964320%2F159920e3-933f-41c4-92a4-04daa061334f.png</url>
      <title>DEV Community: zmy</title>
      <link>https://dev.to/zmysysz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zmysysz"/>
    <language>en</language>
    <item>
      <title>I built a CLI tool so my AI coding agent can browse the web</title>
      <dc:creator>zmy</dc:creator>
      <pubDate>Wed, 10 Jun 2026 09:37:49 +0000</pubDate>
      <link>https://dev.to/zmysysz/i-built-a-cli-tool-so-my-ai-coding-agent-can-browse-the-web-4dlm</link>
      <guid>https://dev.to/zmysysz/i-built-a-cli-tool-so-my-ai-coding-agent-can-browse-the-web-4dlm</guid>
      <description>&lt;h1&gt;
  
  
  I Built a CLI Tool So My AI Coding Agent Can Browse the Web
&lt;/h1&gt;

&lt;p&gt;Here's a problem I kept running into:&lt;/p&gt;

&lt;p&gt;I'd ask Claude Code to build a feature. It writes the code perfectly. Then I'd say, &lt;em&gt;"Now go test it — open the app, fill in the form, submit it, and tell me if it works."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And Claude would say: &lt;em&gt;"I can't interact with browsers."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every. Single. Time.&lt;/p&gt;

&lt;p&gt;My AI assistant could write a full React component from scratch, but couldn't click a button on a webpage. It could generate a Playwright test script, but couldn't &lt;em&gt;run&lt;/em&gt; it. The intelligence was there — the hands weren't.&lt;/p&gt;

&lt;p&gt;So I built the hands.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea Was Simple
&lt;/h2&gt;

&lt;p&gt;What if browser automation was just... shell commands?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-cli navigate https://my-app.com
browser-cli fill &lt;span class="s2"&gt;"#email"&lt;/span&gt; &lt;span class="s2"&gt;"test@example.com"&lt;/span&gt;
browser-cli click &lt;span class="s2"&gt;"button[type=submit]"&lt;/span&gt;
browser-cli text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No scripts. No Node.js setup. No Python virtualenv. Just commands that any AI agent can run as a shell command, with JSON output it can actually parse.&lt;/p&gt;

&lt;p&gt;I called it &lt;strong&gt;browser-cli&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;Browser-CLI wraps Playwright (the browser automation engine) into a Go CLI tool. The architecture is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A background server manages browser instances over Unix sockets&lt;/li&gt;
&lt;li&gt;CLI commands connect, execute, and return JSON&lt;/li&gt;
&lt;li&gt;The server auto-starts when you run your first command — no manual setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every command returns structured JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"navigate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Domain"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means AI agents can call browser-cli, read the response, and decide what to do next. It's a feedback loop: navigate → read → decide → act.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Features I Actually Needed
&lt;/h2&gt;

&lt;p&gt;I didn't start with a feature list. I started with my own frustrations and built what I needed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Login persistence.&lt;/strong&gt; I got tired of logging into GitHub every time I wanted to scrape something. So I added a &lt;code&gt;login&lt;/code&gt; command that opens a visible browser, lets you log in manually, and saves the entire state (cookies + localStorage) to a file. Next time, you just pass &lt;code&gt;--state ./github-state.json&lt;/code&gt; and you're already logged in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-cli login https://github.com
&lt;span class="c"&gt;# ... log in manually, press Ctrl+C when done ...&lt;/span&gt;

&lt;span class="c"&gt;# Reuse forever&lt;/span&gt;
browser-cli &lt;span class="nt"&gt;--state&lt;/span&gt; ./github-state.json navigate https://github.com/settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stealth mode.&lt;/strong&gt; Half the sites I tried to automate blocked Playwright immediately. So I built in anti-detection: override &lt;code&gt;navigator.webdriver&lt;/code&gt;, fake plugins and mimeTypes, add &lt;code&gt;window.chrome&lt;/code&gt;, disable automation flags. Now it works on Google sign-in, Cloudflare-protected sites, and most bot detectors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session isolation.&lt;/strong&gt; Sometimes I'd have two AI agents working on different tasks simultaneously, and they'd interfere with each other's browser state. The &lt;code&gt;--session&lt;/code&gt; flag gives each agent its own isolated browser instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-cli &lt;span class="nt"&gt;--session&lt;/span&gt; agent-1 navigate https://site-a.com
browser-cli &lt;span class="nt"&gt;--session&lt;/span&gt; agent-2 navigate https://site-b.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Web Components.&lt;/strong&gt; Modern SPAs use custom elements that ignore standard DOM clicks. I added &lt;code&gt;smart-click&lt;/code&gt; that detects internal handlers (&lt;code&gt;_onClick&lt;/code&gt;, &lt;code&gt;handleSubmit&lt;/code&gt;, etc.) and calls them directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Use It Day to Day
&lt;/h2&gt;

&lt;p&gt;Here's my actual workflow with Claude Code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I ask Claude to build a feature&lt;/li&gt;
&lt;li&gt;Claude writes the code&lt;/li&gt;
&lt;li&gt;I say: &lt;em&gt;"Test it with browser-cli"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Claude runs &lt;code&gt;browser-cli navigate http://localhost:3000&lt;/code&gt;, fills in forms, clicks buttons, reads the output&lt;/li&gt;
&lt;li&gt;If something's broken, Claude sees the error and fixes it — without me touching the browser&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's a tight loop. No context switching. No "let me check that manually and get back to you."&lt;/p&gt;

&lt;p&gt;Another thing I do: scraping. I needed to pull data from a dashboard that has no API. Instead of writing a one-off Python script, I just tell Claude: &lt;em&gt;"Go to this dashboard, extract the numbers from the table, and put them in a CSV."&lt;/em&gt; Claude uses browser-cli to navigate, extract, and format the data. Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Go&lt;/strong&gt; — I wanted a single static binary with no runtime dependencies. Go is perfect for this. &lt;code&gt;CGO_ENABLED=0&lt;/code&gt; and it runs anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright&lt;/strong&gt; — The best browser automation engine. Handles Chromium, Firefox, and WebKit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON-RPC over Unix sockets&lt;/strong&gt; — Simple, fast, no HTTP overhead. The server manages browser instances and the CLI is just a thin client.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole thing compiles to one binary. No Node.js. No Python. No runtime dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's Open Source
&lt;/h2&gt;

&lt;p&gt;I put it on GitHub because I figured other people have the same problem:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/zmysysz/browser-cli" rel="noopener noreferrer"&gt;https://github.com/zmysysz/browser-cli&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apache 2.0 license. Free to use, modify, and distribute.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/zmysysz/browser-cli
&lt;span class="nb"&gt;cd &lt;/span&gt;browser-cli
make build
make setup-browsers
browser-cli navigate https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Integration files are included for Claude Code, OpenAI Codex, Cursor, and generic AI agents. Just copy the right file to the right directory and you're set.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CDP endpoint support&lt;/strong&gt; — Connect to an externally-launched Chrome for sites with strict bot detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better element discovery&lt;/strong&gt; — Making it easier for AI agents to find the right selectors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More integrations&lt;/strong&gt; — Windsurf, Aider, and other AI coding tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it, I'd love to hear what you think. Open an issue, drop a star, or just tell me what workflow you'd automate first.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What would you do if your AI coding assistant could browse the web?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sideprojects</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to Give Your AI Agent Browser Superpowers with Browser-CLI</title>
      <dc:creator>zmy</dc:creator>
      <pubDate>Tue, 09 Jun 2026 10:20:08 +0000</pubDate>
      <link>https://dev.to/zmysysz/how-to-give-your-ai-agent-browser-superpowers-with-browser-cli-31f4</link>
      <guid>https://dev.to/zmysysz/how-to-give-your-ai-agent-browser-superpowers-with-browser-cli-31f4</guid>
      <description>&lt;h1&gt;
  
  
  How to Give Your AI Agent Browser Superpowers with Browser-CLI
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Your AI coding assistant just wrote perfect code. Now you need it to test the login flow on your staging site.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You ask Claude Code: &lt;em&gt;"Go to staging.example.com, log in with &lt;a href="mailto:test@example.com"&gt;test@example.com&lt;/a&gt;, and verify the dashboard loads."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Claude's response: &lt;em&gt;"I can't interact with web browsers. I can write Playwright scripts for you, but I can't run them."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is the missing piece.&lt;/strong&gt; Your AI agent has all the intelligence to navigate websites, fill forms, and extract data — but no hands to actually do it.&lt;/p&gt;

&lt;p&gt;Browser-CLI fixes this. It's a command-line tool that gives AI agents direct browser control through simple shell commands. No scripts. No complex setup. Just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-cli navigate https://staging.example.com
browser-cli fill &lt;span class="s2"&gt;"#email"&lt;/span&gt; &lt;span class="s2"&gt;"test@example.com"&lt;/span&gt;
browser-cli fill &lt;span class="s2"&gt;"#password"&lt;/span&gt; &lt;span class="s2"&gt;"secret"&lt;/span&gt;
browser-cli click &lt;span class="s2"&gt;"button[type=submit]"&lt;/span&gt;
browser-cli &lt;span class="nb"&gt;wait&lt;/span&gt; &lt;span class="s2"&gt;".dashboard"&lt;/span&gt;
browser-cli screenshot result.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every command returns structured JSON that AI agents can parse and act on. The result? Your AI agent can now browse the web, test your apps, and automate repetitive tasks — all by itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why You Need This
&lt;/h2&gt;

&lt;p&gt;If you use any AI coding assistant (Claude Code, Cursor, Codex, Windsurf, etc.), you've probably hit these walls:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;AI Agent Can Do It?&lt;/th&gt;
&lt;th&gt;Why Not?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Log into a website and scrape data&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;No browser access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fill out and submit forms&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;No browser access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Take screenshots of pages&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;No browser access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test web apps end-to-end&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;No browser access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automate repetitive web tasks&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;No browser access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Existing solutions don't fit AI agents:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puppeteer/Playwright&lt;/strong&gt;: Require writing JavaScript/Python scripts. AI agents can generate these scripts, but running them requires a Node.js/Python environment, proper setup, and error handling. It's fragile and slow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;browser-use&lt;/strong&gt;: A Python library that uses LLMs to control browsers. But it's designed for Python developers, not as a tool for AI coding assistants to call directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actionbook&lt;/strong&gt;: Similar concept, but requires specific integrations and doesn't have the AI-first design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Browser-CLI is different.&lt;/strong&gt; It's designed from the ground up for AI agents to call as a shell command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Zero-code&lt;/strong&gt;: Just CLI commands, no scripts to write or maintain&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;JSON output&lt;/strong&gt;: Structured responses that AI agents can parse reliably&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Auto-managed server&lt;/strong&gt;: No manual server start/stop, it just works&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Session isolation&lt;/strong&gt;: Multiple agents can run in parallel without conflicts&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Login persistence&lt;/strong&gt;: Log in once manually, reuse forever in automation&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Stealth mode&lt;/strong&gt;: Bypasses bot detection on sites like Google, Cloudflare&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quick Start: 5 Minutes to Browser Superpowers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/zmysysz/browser-cli
&lt;span class="nb"&gt;cd &lt;/span&gt;browser-cli
make build
make setup-browsers  &lt;span class="c"&gt;# Downloads Playwright browsers (first time only)&lt;/span&gt;
make &lt;span class="nb"&gt;install&lt;/span&gt;         &lt;span class="c"&gt;# Adds to PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; Go 1.21+ (for building). The binary is fully static — no CGO, no runtime dependencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Try It
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Navigate to a page (server auto-starts)&lt;/span&gt;
browser-cli navigate https://example.com

&lt;span class="c"&gt;# Extract page content&lt;/span&gt;
browser-cli text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Domain&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;This domain is for use in illustrative examples..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Domain"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Integrate with Your AI Tool
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Claude Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude/commands/
&lt;span class="nb"&gt;cp &lt;/span&gt;integrations/claude/browser.md .claude/commands/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OpenAI Codex:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.codex/skills/
&lt;span class="nb"&gt;cp &lt;/span&gt;integrations/codex/browser-cli.md ~/.codex/skills/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor / Windsurf / Others:&lt;/strong&gt; The &lt;code&gt;AGENTS.md&lt;/code&gt; file at the project root is automatically read by most AI coding tools.&lt;/p&gt;

&lt;p&gt;Now just ask your AI: &lt;em&gt;"Use browser-cli to check the top 5 posts on Hacker News"&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Automated Web Scraping
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Navigate to Hacker News&lt;/span&gt;
browser-cli navigate https://news.ycombinator.com

&lt;span class="c"&gt;# Extract the top 5 post titles using JavaScript&lt;/span&gt;
browser-cli &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"JSON.stringify(
  Array.from(document.querySelectorAll('.titleline &amp;gt; a'))
    .slice(0, 5)
    .map(a =&amp;gt; ({title: a.textContent, link: a.href}))
)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eval"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Show HN: I built a CLI tool for AI agents&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;link&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;https://github.com/...&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}, ...]"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 2: Login and Scrape Protected Content
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# First time: log in manually (opens a visible browser)&lt;/span&gt;
browser-cli login https://github.com
&lt;span class="c"&gt;# ... complete login in the browser window ...&lt;/span&gt;
&lt;span class="c"&gt;# Press Ctrl+C when done — state is saved to ./github-state.json&lt;/span&gt;

&lt;span class="c"&gt;# Now automate using the saved login state&lt;/span&gt;
browser-cli &lt;span class="nt"&gt;--state&lt;/span&gt; ./github-state.json navigate https://github.com/settings
browser-cli text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The login state persists forever.&lt;/strong&gt; You can reuse it across sessions, projects, and even different AI agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 3: Form Submission
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-cli navigate https://httpbin.org/forms/post

&lt;span class="c"&gt;# Fill multiple fields&lt;/span&gt;
browser-cli fill &lt;span class="s2"&gt;"input[name='custname']"&lt;/span&gt; &lt;span class="s2"&gt;"John Doe"&lt;/span&gt;
browser-cli fill &lt;span class="s2"&gt;"input[name='custtel']"&lt;/span&gt; &lt;span class="s2"&gt;"555-1234"&lt;/span&gt;
browser-cli fill &lt;span class="s2"&gt;"input[name='custemail']"&lt;/span&gt; &lt;span class="s2"&gt;"john@example.com"&lt;/span&gt;
browser-cli fill &lt;span class="s2"&gt;"textarea[name='comments']"&lt;/span&gt; &lt;span class="s2"&gt;"This is a test submission"&lt;/span&gt;

&lt;span class="c"&gt;# Select radio button&lt;/span&gt;
browser-cli click &lt;span class="s2"&gt;"input[value='medium']"&lt;/span&gt;

&lt;span class="c"&gt;# Submit&lt;/span&gt;
browser-cli click &lt;span class="s2"&gt;"button[type=submit]"&lt;/span&gt;

&lt;span class="c"&gt;# Get the result&lt;/span&gt;
browser-cli text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 4: Multi-Step Workflow in One Command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-cli run &lt;span class="s2"&gt;"navigate https://example.com; click a; text; screenshot result.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;run&lt;/code&gt; command executes multiple actions in a single round-trip, reducing latency for complex workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 5: Handle JavaScript Dialogs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-cli navigate https://example.com/delete
browser-cli click &lt;span class="s2"&gt;".delete-button"&lt;/span&gt;

&lt;span class="c"&gt;# Check if a dialog appeared&lt;/span&gt;
browser-cli dialog-status
&lt;span class="c"&gt;# → {"dialog": {"type": "confirm", "message": "Are you sure?"}}&lt;/span&gt;

&lt;span class="c"&gt;# Accept or dismiss&lt;/span&gt;
browser-cli dialog-accept
&lt;span class="c"&gt;# or: browser-cli dialog-dismiss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Feature Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🥷 Stealth Mode: Bypass Bot Detection
&lt;/h3&gt;

&lt;p&gt;Browser-CLI includes built-in stealth mode that overrides automation fingerprints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;navigator.webdriver&lt;/code&gt;&lt;/strong&gt; — Set to &lt;code&gt;undefined&lt;/code&gt; instead of &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;navigator.plugins&lt;/code&gt;&lt;/strong&gt; — Faked with realistic entries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;navigator.mimeTypes&lt;/code&gt;&lt;/strong&gt; — Includes PDF viewer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;window.chrome&lt;/code&gt;&lt;/strong&gt; — Added to match real Chrome&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions API&lt;/strong&gt; — Auto-grants notifications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chromium flags&lt;/strong&gt; — Disables &lt;code&gt;AutomationControlled&lt;/code&gt; blink feature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This lets you automate sites that normally block bots, like Google sign-in, Cloudflare-protected pages, and banking sites.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use system Chrome for even better stealth&lt;/span&gt;
browser-cli &lt;span class="nt"&gt;--chrome&lt;/span&gt; navigate https://accounts.google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🍪 Login Persistence: Set and Forget
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;login&lt;/code&gt; command opens a visible browser for you to log in manually. Once done, the entire browser state (cookies + localStorage) is saved to a JSON file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Log in once&lt;/span&gt;
browser-cli login https://twitter.com
&lt;span class="c"&gt;# → saves to ./twitter-login.json&lt;/span&gt;

&lt;span class="c"&gt;# Reuse forever&lt;/span&gt;
browser-cli &lt;span class="nt"&gt;--state&lt;/span&gt; ./twitter-login.json navigate https://twitter.com/home
browser-cli text  &lt;span class="c"&gt;# You're already logged in!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔗 Session Isolation: Parallel Agents
&lt;/h3&gt;

&lt;p&gt;Multiple AI agents can run simultaneously without interfering with each other:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Agent 1 works on site A&lt;/span&gt;
browser-cli &lt;span class="nt"&gt;--session&lt;/span&gt; agent-1 navigate https://site-a.com

&lt;span class="c"&gt;# Agent 2 works on site B (completely isolated)&lt;/span&gt;
browser-cli &lt;span class="nt"&gt;--session&lt;/span&gt; agent-2 navigate https://site-b.com

&lt;span class="c"&gt;# List all active sessions&lt;/span&gt;
browser-cli session-list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each session gets its own browser instance, cookies, and storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 Web Components Support
&lt;/h3&gt;

&lt;p&gt;Modern web apps use custom elements that don't respond to standard clicks. Browser-CLI's &lt;code&gt;smart-click&lt;/code&gt; detects and triggers internal handlers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Normal click might not work on custom elements&lt;/span&gt;
browser-cli click &lt;span class="s2"&gt;"my-custom-button"&lt;/span&gt;  &lt;span class="c"&gt;# ❌ May fail&lt;/span&gt;

&lt;span class="c"&gt;# Smart-click finds and calls internal methods&lt;/span&gt;
browser-cli smart-click &lt;span class="s2"&gt;"my-custom-button"&lt;/span&gt;  &lt;span class="c"&gt;# ✅ Works!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Detection patterns: &lt;code&gt;_on*&lt;/code&gt;, &lt;code&gt;_handle*&lt;/code&gt;, &lt;code&gt;handle*&lt;/code&gt;, &lt;code&gt;_click&lt;/code&gt;, &lt;code&gt;_submit&lt;/code&gt;, &lt;code&gt;_action&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📸 Screenshots, PDFs, and More
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Screenshot&lt;/span&gt;
browser-cli screenshot page.png

&lt;span class="c"&gt;# Full page PDF (Chromium only)&lt;/span&gt;
browser-cli pdf report.pdf

&lt;span class="c"&gt;# Screenshot specific element&lt;/span&gt;
browser-cli elements &lt;span class="s2"&gt;".chart"&lt;/span&gt;
browser-cli &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"document.querySelector('.chart').scrollIntoView()"&lt;/span&gt;
browser-cli screenshot chart.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Comparison with Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Browser-CLI&lt;/th&gt;
&lt;th&gt;Puppeteer&lt;/th&gt;
&lt;th&gt;Playwright&lt;/th&gt;
&lt;th&gt;browser-use&lt;/th&gt;
&lt;th&gt;Actionbook&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI-friendly output&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON by default&lt;/td&gt;
&lt;td&gt;JS API&lt;/td&gt;
&lt;td&gt;JS/Python API&lt;/td&gt;
&lt;td&gt;Natural language&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zero-code usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ CLI commands&lt;/td&gt;
&lt;td&gt;❌ Scripts&lt;/td&gt;
&lt;td&gt;❌ Scripts&lt;/td&gt;
&lt;td&gt;✅ LLM-driven&lt;/td&gt;
&lt;td&gt;✅ Actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session isolation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Login persistence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stealth mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;td&gt;❌ Plugin&lt;/td&gt;
&lt;td&gt;❌ Plugin&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web Components&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ smart-click&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Go (single binary)&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Node/Python&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runtime deps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Node/Python&lt;/td&gt;
&lt;td&gt;Python + deps&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setup complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;When to use Browser-CLI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want AI agents to control browsers directly&lt;/li&gt;
&lt;li&gt;You need a simple, script-free automation solution&lt;/li&gt;
&lt;li&gt;You want login state persistence&lt;/li&gt;
&lt;li&gt;You need to bypass bot detection&lt;/li&gt;
&lt;li&gt;You want parallel agent execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to use Puppeteer/Playwright:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're writing traditional test scripts&lt;/li&gt;
&lt;li&gt;You need fine-grained control over browser behavior&lt;/li&gt;
&lt;li&gt;You're building a testing framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to use browser-use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want natural language browser control&lt;/li&gt;
&lt;li&gt;You're building an LLM-powered application&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  All Commands Reference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Navigation
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;navigate &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Navigate to URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;back&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go back in history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;forward&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go forward in history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reload current page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Interaction
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;click &amp;lt;selector&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Click element&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;smart-click &amp;lt;selector&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Click Web Components&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fill &amp;lt;selector&amp;gt; &amp;lt;value&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fill input field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type &amp;lt;selector&amp;gt; &amp;lt;text&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Type character by character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;select &amp;lt;selector&amp;gt; &amp;lt;value&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Select dropdown option&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hover &amp;lt;selector&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hover over element&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;keyboard &amp;lt;key&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Press key (e.g., &lt;code&gt;Ctrl+A&lt;/code&gt;, &lt;code&gt;Enter&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;upload &amp;lt;selector&amp;gt; &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upload file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eval &amp;lt;script&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Extraction
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;text&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extract page text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;screenshot [path]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Take screenshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;elements &amp;lt;selector&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Find elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pdf [file]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Save as PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Utility
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wait &amp;lt;selector&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wait for element&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`scroll &amp;lt;up\&lt;/td&gt;
&lt;td&gt;down&amp;gt;`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pick &amp;lt;x&amp;gt; &amp;lt;y&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inspect element at coordinates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Tabs &amp;amp; Sessions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tab-new&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create new tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tab-list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List all tabs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tab-switch &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Switch to tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;session-list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List active sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stop server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Call to Action
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Star the repo:&lt;/strong&gt; &lt;a href="https://github.com/zmysysz/browser-cli" rel="noopener noreferrer"&gt;https://github.com/zmysysz/browser-cli&lt;/a&gt; ⭐&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/zmysysz/browser-cli
&lt;span class="nb"&gt;cd &lt;/span&gt;browser-cli &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make setup-browsers
browser-cli navigate https://example.com
browser-cli text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Integrate with your AI tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Copy &lt;code&gt;integrations/claude/browser.md&lt;/code&gt; to &lt;code&gt;.claude/commands/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Codex: Copy &lt;code&gt;integrations/codex/browser-cli.md&lt;/code&gt; to &lt;code&gt;~/.codex/skills/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Others: Check the &lt;code&gt;integrations/&lt;/code&gt; folder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Have questions or feature requests?&lt;/strong&gt; Open an issue on GitHub or drop a comment below!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Browser-CLI is open source under Apache 2.0. Built with Go + Playwright. No CGO required — works on Linux, macOS, and Windows.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>automation</category>
      <category>cli</category>
    </item>
    <item>
      <title>Browser-CLI: Let Your AI Agent Control the Browser from the Command Line</title>
      <dc:creator>zmy</dc:creator>
      <pubDate>Tue, 02 Jun 2026 10:07:18 +0000</pubDate>
      <link>https://dev.to/zmysysz/browser-cli-let-your-ai-agent-control-the-browser-from-the-command-line-2p4n</link>
      <guid>https://dev.to/zmysysz/browser-cli-let-your-ai-agent-control-the-browser-from-the-command-line-2p4n</guid>
      <description>&lt;p&gt;Ever wanted your AI coding assistant to actually &lt;em&gt;use&lt;/em&gt; a browser? Not just read web pages, but click buttons, fill forms, take screenshots, and extract data — all from the terminal?&lt;/p&gt;

&lt;p&gt;That's exactly why I built &lt;strong&gt;Browser-CLI&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is it?
&lt;/h2&gt;

&lt;p&gt;Browser-CLI is a Go-based command-line tool that wraps Playwright to give AI agents full browser control through simple shell commands. No API keys, no browser extensions, no complex setup — just run a command and you're off.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/zmysysz/browser-cli" rel="noopener noreferrer"&gt;https://github.com/zmysysz/browser-cli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ Stars and feedback are appreciated!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
git clone https://github.com/zmysysz/browser-cli
&lt;span class="nb"&gt;cd &lt;/span&gt;browser-cli &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;install
&lt;/span&gt;make setup-browsers  &lt;span class="c"&gt;# first time only&lt;/span&gt;

&lt;span class="c"&gt;# Use&lt;/span&gt;
browser-cli navigate https://example.com
browser-cli fill &lt;span class="s2"&gt;"#search"&lt;/span&gt; &lt;span class="s2"&gt;"hello world"&lt;/span&gt;
browser-cli click &lt;span class="s2"&gt;"button[type=submit]"&lt;/span&gt;
browser-cli text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why not just use Playwright directly?
&lt;/h2&gt;

&lt;p&gt;Playwright is great, but it's a library — you need to write code to use it. Browser-CLI turns it into a &lt;strong&gt;universal CLI interface&lt;/strong&gt; that any AI agent can call without writing a single line of automation code.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; can browse the web&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Codex&lt;/strong&gt; can fill forms and extract data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; can take screenshots and interact with pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any AI agent&lt;/strong&gt; can automate browser tasks through shell commands&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI-First Design&lt;/strong&gt; — Structured JSON output, auto-managed server, clear command semantics&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;Session Isolation&lt;/strong&gt; — Each agent gets its own browser instance via &lt;code&gt;--session&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🍪 &lt;strong&gt;Cookie Persistence&lt;/strong&gt; — Auto save/load, login states preserved across sessions&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Proxy Support&lt;/strong&gt; — &lt;code&gt;--proxy http://host:port&lt;/code&gt; for restricted networks&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Web Components&lt;/strong&gt; — &lt;code&gt;smart-click&lt;/code&gt; and &lt;code&gt;pick&lt;/code&gt; for custom elements and Shadow DOM&lt;/li&gt;
&lt;li&gt;⌨️ &lt;strong&gt;Full Keyboard&lt;/strong&gt; — Shortcuts, combos, Tab/Enter/Escape, Ctrl+A/C/V&lt;/li&gt;
&lt;li&gt;📄 &lt;strong&gt;PDF &amp;amp; Screenshot&lt;/strong&gt; — Export pages as PDF or PNG&lt;/li&gt;
&lt;li&gt;📁 &lt;strong&gt;File Upload&lt;/strong&gt; — Upload files to any &lt;code&gt;&amp;lt;input type="file"&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  30 Commands at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Commands&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Navigate&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;navigate&lt;/code&gt;, &lt;code&gt;back&lt;/code&gt;, &lt;code&gt;forward&lt;/code&gt;, &lt;code&gt;reload&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Click&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;click&lt;/code&gt;, &lt;code&gt;click-js&lt;/code&gt;, &lt;code&gt;smart-click&lt;/code&gt;, &lt;code&gt;right-click&lt;/code&gt;, &lt;code&gt;dblclick&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fill&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;select&lt;/code&gt;, &lt;code&gt;keyboard&lt;/code&gt;, &lt;code&gt;upload&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extract&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;text&lt;/code&gt;, &lt;code&gt;screenshot&lt;/code&gt;, &lt;code&gt;elements&lt;/code&gt;, &lt;code&gt;eval&lt;/code&gt;, &lt;code&gt;pdf&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Utility&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;wait&lt;/code&gt;, &lt;code&gt;scroll&lt;/code&gt;, &lt;code&gt;pick&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tabs&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;tab-new&lt;/code&gt;, &lt;code&gt;tab-list&lt;/code&gt;, &lt;code&gt;tab-switch&lt;/code&gt;, &lt;code&gt;tab-close&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dialogs&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dialog-status&lt;/code&gt;, &lt;code&gt;dialog-accept&lt;/code&gt;, &lt;code&gt;dialog-dismiss&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;status&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;session-list&lt;/code&gt;, &lt;code&gt;cookie&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Integration with AI Tools
&lt;/h2&gt;

&lt;p&gt;Browser-CLI ships with ready-to-use integration files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;How to Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;integrations/claude/browser.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Copy to &lt;code&gt;.claude/commands/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;integrations/codex/browser-cli.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OpenAI Codex&lt;/td&gt;
&lt;td&gt;Copy to &lt;code&gt;~/.codex/skills/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cursor, Windsurf&lt;/td&gt;
&lt;td&gt;Already in project root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skills/browser-cli/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GAL&lt;/td&gt;
&lt;td&gt;Copy to &lt;code&gt;~/.gal/skills/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real-World Example
&lt;/h2&gt;

&lt;p&gt;Here's how an AI agent can search GitHub and extract results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Navigate to GitHub&lt;/span&gt;
browser-cli navigate https://github.com/search?q&lt;span class="o"&gt;=&lt;/span&gt;browser+automation

&lt;span class="c"&gt;# Extract search results&lt;/span&gt;
browser-cli &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"JSON.stringify(
  Array.from(document.querySelectorAll('.repo-list-item a.v-align-middle'))
  .map(a =&amp;gt; ({name: a.textContent.trim(), url: a.href}))
)"&lt;/span&gt;

&lt;span class="c"&gt;# Take a screenshot&lt;/span&gt;
browser-cli screenshot github-results.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;Browser-CLI uses a client-server architecture over Unix sockets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Agent → shell command → browser-cli (client) → Unix socket → server → Playwright → Browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server auto-starts on first command and stays running. Multiple agents can connect simultaneously with isolated sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  No CGO Required
&lt;/h2&gt;

&lt;p&gt;Pure Go binary, compiles with &lt;code&gt;CGO_ENABLED=0&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Static Linux build&lt;/span&gt;
make build-static

&lt;span class="c"&gt;# Cross-compile for Windows&lt;/span&gt;
&lt;span class="nv"&gt;CGO_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="nv"&gt;GOOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;windows &lt;span class="nv"&gt;GOARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amd64 go build &lt;span class="nt"&gt;-o&lt;/span&gt; browser-cli.exe &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Cross-compile for macOS&lt;/span&gt;
&lt;span class="nv"&gt;CGO_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="nv"&gt;GOOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;darwin &lt;span class="nv"&gt;GOARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;arm64 go build &lt;span class="nt"&gt;-o&lt;/span&gt; browser-cli-mac &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/zmysysz/browser-cli
&lt;span class="nb"&gt;cd &lt;/span&gt;browser-cli &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;install
&lt;/span&gt;make setup-browsers
browser-cli navigate https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Star ⭐ the repo if you find it useful! Feedback and contributions welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was drafted with the help of an AI agent — but the tool itself was built by hand. 😉&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
