{
  "schemaVersion": "1.0",
  "item": {
    "slug": "openclaw-browser-2",
    "name": "OpenClaw Native Browser",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/yungookim/openclaw-browser-2",
    "canonicalUrl": "https://clawhub.ai/yungookim/openclaw-browser-2",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/openclaw-browser-2",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=openclaw-browser-2",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/openclaw-browser-2"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/openclaw-browser-2",
    "agentPageUrl": "https://openagent3.xyz/skills/openclaw-browser-2/agent",
    "manifestUrl": "https://openagent3.xyz/skills/openclaw-browser-2/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/openclaw-browser-2/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "OpenClaw Native Browser",
        "body": "A real native browser (WKWebView) for OpenClaw agents. Opens a visible window with tab management, URL bar, and login helpers — every website works, including Perplexity, Grok, Claude, and ChatGPT.\n\nReplaces flaky relay-based browser controls with a stable native macOS browser."
      },
      {
        "title": "Installation",
        "body": "Clone the repository and install:\n\ngit clone https://github.com/yungookim/openclaw-browser.git ~/clawd/openclaw-browser\ncd ~/clawd/openclaw-browser\npip install -e .\n\nVerify installation:\n\npython -c \"import sys; sys.path.insert(0, '/Users/$USER/clawd/openclaw-browser'); from src import OpenClawBrowserSkill, __version__; print(f'openclaw-browser v{__version__} ready')\""
      },
      {
        "title": "Quick Start",
        "body": "import sys\nsys.path.insert(0, '/Users/<username>/clawd/openclaw-browser')\nfrom src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\n\n# Load any website (native WKWebView — all sites work)\nskill.load('https://perplexity.ai')\n\n# Read page content\ntitle = skill.get_title()\nhtml = skill.get_dom('body')\n\n# Execute JavaScript\nresult = skill.execute_js('document.title')\n\n# Interact with page\nskill.click('button.submit')\nskill.type_text('input[name=\"query\"]', 'Hello world')\n\n# Tab management\ntab_id = skill.browser.new_tab('https://example.com')\nskill.browser.switch_tab(tab_id)\nskill.browser.close_tab(tab_id)\n\n# Close when done\nskill.close()"
      },
      {
        "title": "Why Use This?",
        "body": "By default, OpenClaw gateway uses the Brave Search API for web search, which:\n\nRequires a paid API key\nOnly supports search (no interaction)\nCannot log into websites\nCannot interact with authenticated web apps\n\nopenclaw-browser solves this by providing:\n\n✅ No API keys required\n✅ Click, type, login, scrape\n✅ Persistent cookies & multi-site sessions\n✅ JavaScript execution\n✅ Screenshot capture\n✅ Works with Perplexity, Claude, ChatGPT, Grok"
      },
      {
        "title": "Disable Built-in Web Tools (Recommended)",
        "body": "To avoid missing_brave_api_key errors and ensure OpenClaw routes web tasks through openclaw-browser, disable the built-in web tools:\n\nEdit ~/.openclaw/openclaw.json:\n\n{\n  \"tools\": {\n    \"web\": {\n      \"search\": {\n        \"enabled\": false\n      },\n      \"fetch\": {\n        \"enabled\": false\n      }\n    }\n  }\n}\n\nOr run:\n\nopenclaw configure --section tools\n\nand disable both web.search and web.fetch."
      },
      {
        "title": "What It Does",
        "body": "Native WKWebView — real macOS browser engine, every website works (no headless quirks)\nTwo-window architecture — frameless toolbar (tab bar + URL bar) + native content windows per tab\nSingleton browser — one instance, reused across calls, with tab management\nLogin helpers — built-in flows for Perplexity, Grok, Claude, ChatGPT\nSubprocess isolation — browser runs in a child process so it never blocks your agent"
      },
      {
        "title": "Architecture",
        "body": "OpenClaw Agent\n│\n▼\nOpenClawBrowserSkill (skill_wrapper.py)\n│ - lazy init, login helpers, convenience methods\n▼\nNativeBrowser (browser_engine.py, singleton)\n│ - IPC over stdin/stdout JSON\n▼\nChild Process (pywebview main thread)\n├── Toolbar Window (frameless, always-on-top, chrome_ui.py)\n│   ├── Tab bar\n│   ├── URL bar\n│   └── nav buttons\n└── Content Windows (one native WKWebView per tab)\n    ├── load_url()\n    ├── execute_js()\n    └── get_dom()"
      },
      {
        "title": "Navigation & Page Interaction",
        "body": "MethodDescriptionskill.load(url, wait=2.0)Load URL in active tabskill.execute_js(code)Run JavaScript, return resultskill.get_dom(selector)Get innerHTML of elementskill.get_title()Get page titleskill.get_url()Get current URLskill.snapshot()Full page HTML + metadata dict"
      },
      {
        "title": "Interactions",
        "body": "MethodDescriptionskill.click(selector, wait=1.0)Click elementskill.type_text(selector, text)Type into inputskill.wait_for_element(selector, timeout=10)Wait for element to appearskill.scroll_to_bottom()Scroll to page bottomskill.scroll_to_element(selector)Scroll element into view"
      },
      {
        "title": "Cookies & Session",
        "body": "MethodDescriptionskill.get_cookies()Get all cookiesskill.set_cookie(name, value)Set a cookie"
      },
      {
        "title": "Login Helpers",
        "body": "MethodDescriptionskill.login_perplexity(email, pw)Login to Perplexity.aiskill.login_grok(user, pw)Login to Grok (X.com)skill.login_claude(email, pw)Login to Claude.aiskill.login_chatgpt(email, pw)Login to ChatGPT"
      },
      {
        "title": "Tab Management",
        "body": "MethodDescriptionskill.browser.new_tab(url)Open new tabskill.browser.switch_tab(id)Switch to tabskill.browser.close_tab(id)Close tabskill.browser.get_tabs()List all tabs"
      },
      {
        "title": "Close",
        "body": "MethodDescriptionskill.close()Close browser"
      },
      {
        "title": "Example: Load and Read a Page",
        "body": "from src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\nskill.load('https://example.com')\n\n# Get page content\ntitle = skill.get_title()\nprint(f\"Page title: {title}\")\n\n# Execute JavaScript\nresult = skill.execute_js('document.querySelector(\"h1\").textContent')\nprint(f\"H1 text: {result}\")\n\nskill.close()"
      },
      {
        "title": "Example: Fill a Form",
        "body": "from src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\nskill.load('https://example.com/contact')\n\n# Wait for form to load\nskill.wait_for_element('input[name=\"email\"]')\n\n# Fill form\nskill.type_text('input[name=\"email\"]', 'user@example.com')\nskill.type_text('textarea[name=\"message\"]', 'Hello from OpenClaw!')\nskill.click('button[type=\"submit\"]')\n\n# Wait for confirmation\nskill.wait_for_element('.success-message')\n\nskill.close()"
      },
      {
        "title": "Example: Login to Perplexity",
        "body": "from src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\n\n# Built-in login helper\nskill.login_perplexity('your-email@example.com', 'your-password')\n\n# Now you can use Perplexity\nskill.load('https://perplexity.ai')\nskill.type_text('textarea[placeholder=\"Ask anything...\"]', 'What is quantum computing?')\nskill.click('button[aria-label=\"Submit\"]')\n\nskill.close()"
      },
      {
        "title": "Example: Multi-Tab Workflow",
        "body": "from src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\n\n# Open multiple tabs\ntab1 = skill.browser.new_tab('https://github.com')\ntab2 = skill.browser.new_tab('https://stackoverflow.com')\n\n# Switch between tabs\nskill.browser.switch_tab(tab1)\ntitle1 = skill.get_title()\n\nskill.browser.switch_tab(tab2)\ntitle2 = skill.get_title()\n\nprint(f\"Tab 1: {title1}, Tab 2: {title2}\")\n\n# Close individual tabs\nskill.browser.close_tab(tab1)\nskill.browser.close_tab(tab2)\n\nskill.close()"
      },
      {
        "title": "Requirements",
        "body": "macOS 10.14+ (Mojave or later)\nPython 3.12+\npywebview >= 5.1 (the only dependency)"
      },
      {
        "title": "Important Notes",
        "body": "The browser is a singleton — calling OpenClawBrowserSkill() again reuses the same window. Use new_tab() for additional pages.\nSubprocess isolation — the browser runs in a child process, so it never blocks your agent.\nCSS selectors — all interaction methods use CSS selectors (e.g., 'button.submit', 'input[name=\"email\"]')\nCookies persist — login sessions are maintained across skill invocations"
      },
      {
        "title": "Testing",
        "body": "Run the test suite:\n\n# GUI test suite (9 tests, needs display)\npython test_gui_browser.py\n\n# pytest suite\npytest tests/ -v"
      },
      {
        "title": "Troubleshooting",
        "body": "Browser doesn't appear: Make sure you're running on macOS 10.14+\nElement not found: Use execute_js() to inspect the page structure\nLogin fails: Check credentials and website changes\nPerformance issues: The browser is a native app, so it should be fast. If slow, check system resources."
      },
      {
        "title": "Reporting Issues",
        "body": "Open an issue at: https://github.com/yungookim/openclaw-browser"
      },
      {
        "title": "License",
        "body": "MIT — see LICENSE"
      }
    ],
    "body": "OpenClaw Native Browser\n\nA real native browser (WKWebView) for OpenClaw agents. Opens a visible window with tab management, URL bar, and login helpers — every website works, including Perplexity, Grok, Claude, and ChatGPT.\n\nReplaces flaky relay-based browser controls with a stable native macOS browser.\n\nInstallation\n\nClone the repository and install:\n\ngit clone https://github.com/yungookim/openclaw-browser.git ~/clawd/openclaw-browser\ncd ~/clawd/openclaw-browser\npip install -e .\n\n\nVerify installation:\n\npython -c \"import sys; sys.path.insert(0, '/Users/$USER/clawd/openclaw-browser'); from src import OpenClawBrowserSkill, __version__; print(f'openclaw-browser v{__version__} ready')\"\n\nQuick Start\nimport sys\nsys.path.insert(0, '/Users/<username>/clawd/openclaw-browser')\nfrom src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\n\n# Load any website (native WKWebView — all sites work)\nskill.load('https://perplexity.ai')\n\n# Read page content\ntitle = skill.get_title()\nhtml = skill.get_dom('body')\n\n# Execute JavaScript\nresult = skill.execute_js('document.title')\n\n# Interact with page\nskill.click('button.submit')\nskill.type_text('input[name=\"query\"]', 'Hello world')\n\n# Tab management\ntab_id = skill.browser.new_tab('https://example.com')\nskill.browser.switch_tab(tab_id)\nskill.browser.close_tab(tab_id)\n\n# Close when done\nskill.close()\n\nWhy Use This?\n\nBy default, OpenClaw gateway uses the Brave Search API for web search, which:\n\nRequires a paid API key\nOnly supports search (no interaction)\nCannot log into websites\nCannot interact with authenticated web apps\n\nopenclaw-browser solves this by providing:\n\n✅ No API keys required\n✅ Click, type, login, scrape\n✅ Persistent cookies & multi-site sessions\n✅ JavaScript execution\n✅ Screenshot capture\n✅ Works with Perplexity, Claude, ChatGPT, Grok\nDisable Built-in Web Tools (Recommended)\n\nTo avoid missing_brave_api_key errors and ensure OpenClaw routes web tasks through openclaw-browser, disable the built-in web tools:\n\nEdit ~/.openclaw/openclaw.json:\n\n{\n  \"tools\": {\n    \"web\": {\n      \"search\": {\n        \"enabled\": false\n      },\n      \"fetch\": {\n        \"enabled\": false\n      }\n    }\n  }\n}\n\n\nOr run:\n\nopenclaw configure --section tools\n\n\nand disable both web.search and web.fetch.\n\nWhat It Does\nNative WKWebView — real macOS browser engine, every website works (no headless quirks)\nTwo-window architecture — frameless toolbar (tab bar + URL bar) + native content windows per tab\nSingleton browser — one instance, reused across calls, with tab management\nLogin helpers — built-in flows for Perplexity, Grok, Claude, ChatGPT\nSubprocess isolation — browser runs in a child process so it never blocks your agent\nArchitecture\nOpenClaw Agent\n│\n▼\nOpenClawBrowserSkill (skill_wrapper.py)\n│ - lazy init, login helpers, convenience methods\n▼\nNativeBrowser (browser_engine.py, singleton)\n│ - IPC over stdin/stdout JSON\n▼\nChild Process (pywebview main thread)\n├── Toolbar Window (frameless, always-on-top, chrome_ui.py)\n│   ├── Tab bar\n│   ├── URL bar\n│   └── nav buttons\n└── Content Windows (one native WKWebView per tab)\n    ├── load_url()\n    ├── execute_js()\n    └── get_dom()\n\nAPI Reference\nNavigation & Page Interaction\nMethod\tDescription\nskill.load(url, wait=2.0)\tLoad URL in active tab\nskill.execute_js(code)\tRun JavaScript, return result\nskill.get_dom(selector)\tGet innerHTML of element\nskill.get_title()\tGet page title\nskill.get_url()\tGet current URL\nskill.snapshot()\tFull page HTML + metadata dict\nInteractions\nMethod\tDescription\nskill.click(selector, wait=1.0)\tClick element\nskill.type_text(selector, text)\tType into input\nskill.wait_for_element(selector, timeout=10)\tWait for element to appear\nskill.scroll_to_bottom()\tScroll to page bottom\nskill.scroll_to_element(selector)\tScroll element into view\nCookies & Session\nMethod\tDescription\nskill.get_cookies()\tGet all cookies\nskill.set_cookie(name, value)\tSet a cookie\nLogin Helpers\nMethod\tDescription\nskill.login_perplexity(email, pw)\tLogin to Perplexity.ai\nskill.login_grok(user, pw)\tLogin to Grok (X.com)\nskill.login_claude(email, pw)\tLogin to Claude.ai\nskill.login_chatgpt(email, pw)\tLogin to ChatGPT\nTab Management\nMethod\tDescription\nskill.browser.new_tab(url)\tOpen new tab\nskill.browser.switch_tab(id)\tSwitch to tab\nskill.browser.close_tab(id)\tClose tab\nskill.browser.get_tabs()\tList all tabs\nClose\nMethod\tDescription\nskill.close()\tClose browser\nExamples\nExample: Load and Read a Page\nfrom src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\nskill.load('https://example.com')\n\n# Get page content\ntitle = skill.get_title()\nprint(f\"Page title: {title}\")\n\n# Execute JavaScript\nresult = skill.execute_js('document.querySelector(\"h1\").textContent')\nprint(f\"H1 text: {result}\")\n\nskill.close()\n\nExample: Fill a Form\nfrom src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\nskill.load('https://example.com/contact')\n\n# Wait for form to load\nskill.wait_for_element('input[name=\"email\"]')\n\n# Fill form\nskill.type_text('input[name=\"email\"]', 'user@example.com')\nskill.type_text('textarea[name=\"message\"]', 'Hello from OpenClaw!')\nskill.click('button[type=\"submit\"]')\n\n# Wait for confirmation\nskill.wait_for_element('.success-message')\n\nskill.close()\n\nExample: Login to Perplexity\nfrom src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\n\n# Built-in login helper\nskill.login_perplexity('your-email@example.com', 'your-password')\n\n# Now you can use Perplexity\nskill.load('https://perplexity.ai')\nskill.type_text('textarea[placeholder=\"Ask anything...\"]', 'What is quantum computing?')\nskill.click('button[aria-label=\"Submit\"]')\n\nskill.close()\n\nExample: Multi-Tab Workflow\nfrom src import OpenClawBrowserSkill\n\nskill = OpenClawBrowserSkill()\n\n# Open multiple tabs\ntab1 = skill.browser.new_tab('https://github.com')\ntab2 = skill.browser.new_tab('https://stackoverflow.com')\n\n# Switch between tabs\nskill.browser.switch_tab(tab1)\ntitle1 = skill.get_title()\n\nskill.browser.switch_tab(tab2)\ntitle2 = skill.get_title()\n\nprint(f\"Tab 1: {title1}, Tab 2: {title2}\")\n\n# Close individual tabs\nskill.browser.close_tab(tab1)\nskill.browser.close_tab(tab2)\n\nskill.close()\n\nRequirements\nmacOS 10.14+ (Mojave or later)\nPython 3.12+\npywebview >= 5.1 (the only dependency)\nImportant Notes\nThe browser is a singleton — calling OpenClawBrowserSkill() again reuses the same window. Use new_tab() for additional pages.\nSubprocess isolation — the browser runs in a child process, so it never blocks your agent.\nCSS selectors — all interaction methods use CSS selectors (e.g., 'button.submit', 'input[name=\"email\"]')\nCookies persist — login sessions are maintained across skill invocations\nTesting\n\nRun the test suite:\n\n# GUI test suite (9 tests, needs display)\npython test_gui_browser.py\n\n# pytest suite\npytest tests/ -v\n\nTroubleshooting\nBrowser doesn't appear: Make sure you're running on macOS 10.14+\nElement not found: Use execute_js() to inspect the page structure\nLogin fails: Check credentials and website changes\nPerformance issues: The browser is a native app, so it should be fast. If slow, check system resources.\nReporting Issues\n\nOpen an issue at: https://github.com/yungookim/openclaw-browser\n\nLicense\n\nMIT — see LICENSE"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/yungookim/openclaw-browser-2",
    "publisherUrl": "https://clawhub.ai/yungookim/openclaw-browser-2",
    "owner": "yungookim",
    "version": "0.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/openclaw-browser-2",
    "downloadUrl": "https://openagent3.xyz/downloads/openclaw-browser-2",
    "agentUrl": "https://openagent3.xyz/skills/openclaw-browser-2/agent",
    "manifestUrl": "https://openagent3.xyz/skills/openclaw-browser-2/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/openclaw-browser-2/agent.md"
  }
}