<?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: Ajnas N B</title>
    <description>The latest articles on DEV Community by Ajnas N B (@ajnasnb7717).</description>
    <link>https://dev.to/ajnasnb7717</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%2F4045989%2F3a4d7187-8891-45a9-bfef-c07f85bca6c3.png</url>
      <title>DEV Community: Ajnas N B</title>
      <link>https://dev.to/ajnasnb7717</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajnasnb7717"/>
    <language>en</language>
    <item>
      <title>I gave open claw and codex the whole internet without any api keys using this tool and it was never performed better</title>
      <dc:creator>Ajnas N B</dc:creator>
      <pubDate>Fri, 24 Jul 2026 18:48:02 +0000</pubDate>
      <link>https://dev.to/ajnasnb7717/i-gave-open-claw-and-codex-the-whole-internet-without-any-api-keys-using-this-tool-and-it-was-never-4c38</link>
      <guid>https://dev.to/ajnasnb7717/i-gave-open-claw-and-codex-the-whole-internet-without-any-api-keys-using-this-tool-and-it-was-never-4c38</guid>
      <description>&lt;p&gt;AI agents can reason about the web.&lt;/p&gt;

&lt;p&gt;But giving an agent unrestricted browser or network access creates a serious authority problem.&lt;/p&gt;

&lt;p&gt;The obvious solution is to restrict the tools available to the agent.&lt;/p&gt;

&lt;p&gt;Then I kept running into the opposite problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Once the tool became sufficiently restricted, it lost many of the capabilities required to complete real work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wanted both sides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enough power to crawl, render, navigate, extract, capture, and investigate the web&lt;/li&gt;
&lt;li&gt;Explicit operator control over origins, credentials, budgets, browser hooks, profiles, and evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;strong&gt;Cockroach Crawler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is an open-source Node.js and TypeScript toolkit for AI agents, RAG pipelines, documentation indexing, research, QA, and web-data workflows.&lt;/p&gt;

&lt;p&gt;I connected it to &lt;strong&gt;OpenClaw&lt;/strong&gt; and &lt;strong&gt;Codex&lt;/strong&gt;, and the difference was honestly wild.&lt;/p&gt;

&lt;p&gt;Instead of giving the agents one narrow search tool, I gave them a bounded web-research layer that could crawl websites, inspect JavaScript applications, extract structured data, process PDFs, take screenshots, generate PDFs, inspect public sources, and return evidence with provenance.&lt;/p&gt;

&lt;p&gt;And for many public workflows, I did not need to configure a separate API key for every source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/AjnasNB/cockroach-crawler" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://cockroachcrawler.com/docs/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/cockroach-crawler" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What changed after I connected it to OpenClaw and Codex?
&lt;/h2&gt;

&lt;p&gt;Before this, the agents could reason well, but their web access was limited.&lt;/p&gt;

&lt;p&gt;They could answer questions, write code, and work with the context I gave them. But once a task required deeper live-web investigation, I still had to manually combine several tools.&lt;/p&gt;

&lt;p&gt;After connecting Cockroach Crawler, they could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crawl public websites&lt;/li&gt;
&lt;li&gt;Render JavaScript-heavy pages&lt;/li&gt;
&lt;li&gt;Follow sitemaps&lt;/li&gt;
&lt;li&gt;Search and map documentation sites&lt;/li&gt;
&lt;li&gt;Extract readable Markdown&lt;/li&gt;
&lt;li&gt;Extract structured fields with CSS, XPath, or restricted regular expressions&lt;/li&gt;
&lt;li&gt;Read local and remote PDFs&lt;/li&gt;
&lt;li&gt;Generate PDFs&lt;/li&gt;
&lt;li&gt;Take screenshots&lt;/li&gt;
&lt;li&gt;Handle bounded clicks and scrolling&lt;/li&gt;
&lt;li&gt;Inspect open Shadow DOM&lt;/li&gt;
&lt;li&gt;Read same-origin iframe content&lt;/li&gt;
&lt;li&gt;Collect canonical URLs and redirect history&lt;/li&gt;
&lt;li&gt;Preserve content hashes and retrieval metadata&lt;/li&gt;
&lt;li&gt;Return warnings, failures, and crawl statistics&lt;/li&gt;
&lt;li&gt;Work through MCP&lt;/li&gt;
&lt;li&gt;Use Docker or a local dashboard&lt;/li&gt;
&lt;li&gt;Inspect public provider availability before dispatch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It stopped feeling like I had given the agents a simple browser.&lt;/p&gt;

&lt;p&gt;It felt like I had given them an actual web-research system.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core idea
&lt;/h2&gt;

&lt;p&gt;The design principle is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Give AI agents the web. Keep the keys.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent gets useful capabilities.&lt;/p&gt;

&lt;p&gt;The host application keeps authority.&lt;/p&gt;

&lt;p&gt;That means model-facing input can narrow a job, but it cannot silently add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New origins&lt;/li&gt;
&lt;li&gt;New credentials&lt;/li&gt;
&lt;li&gt;New proxy endpoints&lt;/li&gt;
&lt;li&gt;New browser hooks&lt;/li&gt;
&lt;li&gt;New persistent profiles&lt;/li&gt;
&lt;li&gt;Larger resource limits&lt;/li&gt;
&lt;li&gt;Broader network authority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because an agent should not be able to expand its own permissions simply by generating a more aggressive tool call.&lt;/p&gt;




&lt;h2&gt;
  
  
  What can Cockroach Crawler do?
&lt;/h2&gt;

&lt;p&gt;Cockroach Crawler currently provides &lt;strong&gt;50 documented capabilities&lt;/strong&gt; across crawling, browser automation, extraction, providers, agent integration, deployment, and security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Crawling and discovery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Static HTTP crawling&lt;/li&gt;
&lt;li&gt;Multiple crawl seeds&lt;/li&gt;
&lt;li&gt;Breadth-first traversal&lt;/li&gt;
&lt;li&gt;Depth-first traversal&lt;/li&gt;
&lt;li&gt;Best-first traversal&lt;/li&gt;
&lt;li&gt;Adaptive relevance traversal&lt;/li&gt;
&lt;li&gt;Sitemap discovery&lt;/li&gt;
&lt;li&gt;Include and exclude filters&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;robots.txt&lt;/code&gt; enforcement&lt;/li&gt;
&lt;li&gt;Redirect validation&lt;/li&gt;
&lt;li&gt;Persistent hash-verified cache&lt;/li&gt;
&lt;li&gt;Searchable site maps&lt;/li&gt;
&lt;li&gt;Crawl deadlines and cancellation&lt;/li&gt;
&lt;li&gt;Explicit concurrency and politeness controls&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Browser rendering and capture
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript rendering with Chromium&lt;/li&gt;
&lt;li&gt;Selector waits&lt;/li&gt;
&lt;li&gt;Bounded clicks&lt;/li&gt;
&lt;li&gt;Infinite and virtual scrolling&lt;/li&gt;
&lt;li&gt;Open Shadow DOM flattening&lt;/li&gt;
&lt;li&gt;Readable same-origin iframe flattening&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;PDF generation&lt;/li&gt;
&lt;li&gt;Persistent browser profiles&lt;/li&gt;
&lt;li&gt;Explicit operator-supplied page hooks&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Readable Markdown&lt;/li&gt;
&lt;li&gt;CSS extraction&lt;/li&gt;
&lt;li&gt;XPath extraction&lt;/li&gt;
&lt;li&gt;Restricted regular-expression extraction&lt;/li&gt;
&lt;li&gt;Optional host-model schema extraction&lt;/li&gt;
&lt;li&gt;Local PDF parsing&lt;/li&gt;
&lt;li&gt;Links and metadata&lt;/li&gt;
&lt;li&gt;Content hashes&lt;/li&gt;
&lt;li&gt;Provenance records&lt;/li&gt;
&lt;li&gt;Retrieval warnings and failures&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Public sources and providers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Public GitHub reads&lt;/li&gt;
&lt;li&gt;YouTube search without a developer API key through an optional reviewed provider&lt;/li&gt;
&lt;li&gt;RSS and Atom parsing&lt;/li&gt;
&lt;li&gt;Official provider routes&lt;/li&gt;
&lt;li&gt;Read-only session routes&lt;/li&gt;
&lt;li&gt;Provider doctor and deterministic routing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Native MCP server&lt;/li&gt;
&lt;li&gt;Strict agent-tool adapter&lt;/li&gt;
&lt;li&gt;Capability inspection&lt;/li&gt;
&lt;li&gt;Maqam integration for policy, approvals, traces, and evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Authenticated Docker API&lt;/li&gt;
&lt;li&gt;Dashboard and playground&lt;/li&gt;
&lt;li&gt;Bounded asynchronous jobs&lt;/li&gt;
&lt;li&gt;Restricted Cloudflare Worker deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security and authority
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Public-network admission&lt;/li&gt;
&lt;li&gt;Private-network blocking&lt;/li&gt;
&lt;li&gt;Redirect validation&lt;/li&gt;
&lt;li&gt;DNS validation&lt;/li&gt;
&lt;li&gt;Explicit origin policy&lt;/li&gt;
&lt;li&gt;Credential isolation&lt;/li&gt;
&lt;li&gt;Resource ceilings&lt;/li&gt;
&lt;li&gt;Challenge-aware escalation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Start with one command
&lt;/h2&gt;

&lt;p&gt;Install the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;cockroach-crawler@0.5.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run a bounded crawl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cockroach-crawl https://example.com/docs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-pages&lt;/span&gt; 20 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-requests&lt;/span&gt; 80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--jsonl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result includes extracted content plus the information an agent or developer needs to verify it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Canonical URL&lt;/li&gt;
&lt;li&gt;Parent URL&lt;/li&gt;
&lt;li&gt;Crawl depth&lt;/li&gt;
&lt;li&gt;Redirect history&lt;/li&gt;
&lt;li&gt;Response status&lt;/li&gt;
&lt;li&gt;Content type&lt;/li&gt;
&lt;li&gt;Content hash&lt;/li&gt;
&lt;li&gt;Retrieval metadata&lt;/li&gt;
&lt;li&gt;Warnings&lt;/li&gt;
&lt;li&gt;Failures&lt;/li&gt;
&lt;li&gt;Crawl statistics&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Use it from JavaScript
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;crawlDetailed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cockroach-crawler&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;crawlDetailed&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/docs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;maxPages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxRequests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxDurationMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentHash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;failures&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application owns the limits.&lt;/p&gt;

&lt;p&gt;The model can request less.&lt;/p&gt;

&lt;p&gt;It cannot silently request more.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deep crawling strategies
&lt;/h2&gt;

&lt;p&gt;Different jobs need different traversal behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breadth-first crawling
&lt;/h3&gt;

&lt;p&gt;Use breadth-first crawling when you want broad coverage near the seed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;crawlDetailed&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/docs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bfs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxPages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Depth-first crawling
&lt;/h3&gt;

&lt;p&gt;Use depth-first crawling for narrow or hierarchical documentation paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;crawlDetailed&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/docs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dfs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxPages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Best-first and adaptive relevance crawling
&lt;/h3&gt;

&lt;p&gt;Best-first and adaptive traversal prioritize pages that appear more useful for the current task while remaining inside the configured crawl budget.&lt;/p&gt;

&lt;p&gt;This is useful when an agent needs to investigate a large documentation site without blindly downloading everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Render JavaScript applications
&lt;/h2&gt;

&lt;p&gt;Static HTTP is fast, but many modern applications require a real browser.&lt;/p&gt;

&lt;p&gt;Cockroach Crawler provides optional Playwright integration for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript rendering&lt;/li&gt;
&lt;li&gt;Waiting for selectors or page states&lt;/li&gt;
&lt;li&gt;Explicit clicks&lt;/li&gt;
&lt;li&gt;Bounded scrolling&lt;/li&gt;
&lt;li&gt;Shadow DOM inspection&lt;/li&gt;
&lt;li&gt;Readable same-origin frames&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;PDF output&lt;/li&gt;
&lt;li&gt;Dedicated profiles&lt;/li&gt;
&lt;li&gt;Reviewed page hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install the optional browser peer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;cockroach-crawler playwright
npx playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Browser mode still uses explicit origins and resource ceilings.&lt;/p&gt;

&lt;p&gt;Enabling Chromium does not give the agent unrestricted operating-system or network authority.&lt;/p&gt;




&lt;h2&gt;
  
  
  Extract structured data
&lt;/h2&gt;

&lt;p&gt;Readable Markdown is useful for agents and RAG pipelines.&lt;/p&gt;

&lt;p&gt;But many applications need deterministic fields.&lt;/p&gt;

&lt;p&gt;Cockroach Crawler supports bounded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS extraction&lt;/li&gt;
&lt;li&gt;XPath extraction&lt;/li&gt;
&lt;li&gt;Restricted regular-expression extraction&lt;/li&gt;
&lt;li&gt;Optional model-assisted schema extraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model-assisted route still remains host-controlled.&lt;/p&gt;

&lt;p&gt;The operator supplies the model adapter, and the final output must pass JSON Schema validation.&lt;/p&gt;

&lt;p&gt;Model input cannot choose arbitrary credentials, origins, hooks, or execution authority.&lt;/p&gt;




&lt;h2&gt;
  
  
  Search and map an entire site
&lt;/h2&gt;

&lt;p&gt;The crawler can create compact, fetch-validated site maps and optionally search them.&lt;/p&gt;

&lt;p&gt;This is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation discovery&lt;/li&gt;
&lt;li&gt;Migration inventories&lt;/li&gt;
&lt;li&gt;Support knowledge bases&lt;/li&gt;
&lt;li&gt;RAG ingestion&lt;/li&gt;
&lt;li&gt;Broken-link investigation&lt;/li&gt;
&lt;li&gt;Product audits&lt;/li&gt;
&lt;li&gt;Content audits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike a sitemap assembled only from discovered links, entries can retain retrieval state and source identity for later verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  Connect it to OpenClaw, Codex, or another agent through MCP
&lt;/h2&gt;

&lt;p&gt;Cockroach Crawler includes a native MCP stdio server.&lt;/p&gt;

&lt;p&gt;Example configuration:&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;"mcpServers"&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;"cockroach-crawler"&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;"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;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cockroach-crawler@0.5.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cockroach-mcp"&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;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;The MCP surface exposes bounded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crawling&lt;/li&gt;
&lt;li&gt;Site mapping&lt;/li&gt;
&lt;li&gt;Structured extraction&lt;/li&gt;
&lt;li&gt;Capability inspection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MCP client does not receive control over operator-owned credentials, browser hooks, proxy endpoints, persistent profiles, or origin ceilings.&lt;/p&gt;

&lt;p&gt;That was the important part for me.&lt;/p&gt;

&lt;p&gt;I wanted OpenClaw and Codex to become much more capable without allowing the model to decide its own security boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Inspect providers before dispatch
&lt;/h2&gt;

&lt;p&gt;The provider doctor reports what the current machine can actually use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--package&lt;/span&gt; cockroach-crawler@0.5.2 &lt;span class="se"&gt;\&lt;/span&gt;
  cockroach-sources doctor &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It distinguishes between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public routes&lt;/li&gt;
&lt;li&gt;Official API routes&lt;/li&gt;
&lt;li&gt;Optional no-key routes&lt;/li&gt;
&lt;li&gt;Explicit read-only session routes&lt;/li&gt;
&lt;li&gt;Missing configuration&lt;/li&gt;
&lt;li&gt;Unsupported operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A provider is not considered available just because its name appears in a configuration file.&lt;/p&gt;

&lt;p&gt;The route must actually be usable in the current environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker and self-hosting
&lt;/h2&gt;

&lt;p&gt;Cockroach Crawler includes an authenticated Node.js and Docker API with a dashboard and playground.&lt;/p&gt;

&lt;p&gt;It can also run bounded process-local jobs with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status inspection&lt;/li&gt;
&lt;li&gt;Cancellation&lt;/li&gt;
&lt;li&gt;Result ceilings&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Fixed deployment authority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For edge deployments, the package includes a separate Cloudflare Worker profile for fixed deployment-owned HTTPS origins.&lt;/p&gt;

&lt;p&gt;That Worker is intentionally treated as a different security boundary from the local Node.js crawler.&lt;/p&gt;




&lt;h2&gt;
  
  
  Public benchmark evidence
&lt;/h2&gt;

&lt;p&gt;The current package was evaluated on all &lt;strong&gt;511 held-out pages&lt;/strong&gt; of the pinned &lt;strong&gt;WCEB v1.0&lt;/strong&gt; test split.&lt;/p&gt;

&lt;p&gt;The published run produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0.7653&lt;/code&gt; macro word F1&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0.9041&lt;/code&gt; recall&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;87.13%&lt;/code&gt; required-snippet recall&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;25/25&lt;/code&gt; adapted robots dispatch vectors passed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;101/101&lt;/code&gt; applicable credential-free WPT HTTP(S) URL cases passed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The evaluator, dataset revision, source fingerprint, page-level rows, and machine-readable results are committed to the repository.&lt;/p&gt;

&lt;p&gt;These results describe performance on the named test corpus.&lt;/p&gt;

&lt;p&gt;They are not a claim of universal extraction quality.&lt;/p&gt;

&lt;p&gt;Benchmark details:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cockroachcrawler.com/benchmark/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/benchmark/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What it is not designed to do
&lt;/h2&gt;

&lt;p&gt;Cockroach Crawler is not designed to bypass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CAPTCHAs&lt;/li&gt;
&lt;li&gt;Access controls&lt;/li&gt;
&lt;li&gt;Private-network restrictions&lt;/li&gt;
&lt;li&gt;Explicit robots policies&lt;/li&gt;
&lt;li&gt;Authentication boundaries&lt;/li&gt;
&lt;li&gt;Platform challenges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is designed to provide useful web capabilities while keeping authority visible, bounded, and operator-owned.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this made OpenClaw and Codex feel completely different
&lt;/h2&gt;

&lt;p&gt;The real improvement was not simply that they could fetch more pages.&lt;/p&gt;

&lt;p&gt;It was that they could perform an entire evidence-backed workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discover the relevant pages&lt;/li&gt;
&lt;li&gt;Render the pages when necessary&lt;/li&gt;
&lt;li&gt;Extract the useful content&lt;/li&gt;
&lt;li&gt;Process PDFs&lt;/li&gt;
&lt;li&gt;Capture screenshots or generated PDFs&lt;/li&gt;
&lt;li&gt;Preserve canonical URLs and hashes&lt;/li&gt;
&lt;li&gt;Return failures instead of silently hiding them&lt;/li&gt;
&lt;li&gt;Stay within explicit origin and budget limits&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That changed the agents from systems that merely &lt;em&gt;talked about the web&lt;/em&gt; into systems that could actually &lt;em&gt;investigate it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And honestly, this was the first time it felt like I had given them the whole internet without giving away the keys.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try to break it
&lt;/h2&gt;

&lt;p&gt;If you are building an AI agent, research system, RAG pipeline, documentation indexer, or browser-assisted workflow, test it on something real.&lt;/p&gt;

&lt;p&gt;Open an issue with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operating system&lt;/li&gt;
&lt;li&gt;Node.js version&lt;/li&gt;
&lt;li&gt;Public test URL&lt;/li&gt;
&lt;li&gt;Smallest reproducible command&lt;/li&gt;
&lt;li&gt;Expected behavior&lt;/li&gt;
&lt;li&gt;Actual behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;cockroach-crawler@0.5.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/AjnasNB/cockroach-crawler" rel="noopener noreferrer"&gt;https://github.com/AjnasNB/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://cockroachcrawler.com/docs/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Capability index: &lt;a href="https://cockroachcrawler.com/docs/capabilities/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/docs/capabilities/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Security model: &lt;a href="https://cockroachcrawler.com/security/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/security/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Benchmark: &lt;a href="https://cockroachcrawler.com/benchmark/" rel="noopener noreferrer"&gt;https://cockroachcrawler.com/benchmark/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/cockroach-crawler" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/cockroach-crawler&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Give AI agents the web. Keep the keys.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>browser</category>
      <category>agents</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
