{
  "schemaVersion": "1.0",
  "item": {
    "slug": "anemone",
    "name": "Anemone",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/EasonC13/anemone",
    "canonicalUrl": "https://clawhub.ai/EasonC13/anemone",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/anemone",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=anemone",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "bin/anemone.mjs",
      "package.json",
      "scripts/healthcheck.sh",
      "scripts/setup-mac.sh"
    ],
    "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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/anemone"
    },
    "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/anemone",
    "agentPageUrl": "https://openagent3.xyz/skills/anemone/agent",
    "manifestUrl": "https://openagent3.xyz/skills/anemone/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/anemone/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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Anemone Browser — Managed Browser for OpenClaw Agents",
        "body": "Headful Chrome with anti-detection, VNC takeover, and multi-session isolation.\nWorks on Mac, Linux, Docker — anywhere OpenClaw runs."
      },
      {
        "title": "macOS",
        "body": "bash scripts/setup-mac.sh\n\nDetects Chrome, configures OpenClaw browser profile. After setup:\n\nopenclaw browser start\n# Agent's browser tool works automatically\n\nNote: macOS setup does NOT include VNC/noVNC. The user is expected to access\nthe Mac via their own remote desktop solution (e.g. macOS Screen Sharing, Tailscale,\nor physical access). VNC takeover with noVNC links is only available on Linux."
      },
      {
        "title": "Linux / Docker",
        "body": "# Install deps (once)\nbash scripts/setup.sh\n\n# Start browser + VNC environment (password is MANDATORY by default)\nbash scripts/start.sh [password] [novnc_port] [cdp_port] [resolution]\n\n# Without specifying password → random 14-char password auto-generated\nbash scripts/start.sh\n\n# Explicitly no password (NOT recommended)\nbash scripts/start.sh --dangerously-no-password [novnc_port] [cdp_port] [resolution]\n\nstart.sh outputs the noVNC URL (with password in URL param), password, and CDP port. Safe to re-run.\nVNC always requires a password. The noVNC URL always includes ?password=... so the user doesn't need to type it. The only way to skip is --dangerously-no-password."
      },
      {
        "title": "OpenClaw Config",
        "body": "Setup scripts configure this automatically. Manual reference:\n\nmacOS:\n\n{\n  \"browser\": {\n    \"enabled\": true,\n    \"defaultProfile\": \"openclaw\",\n    \"headless\": false,\n    \"executablePath\": \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"\n  }\n}\n\nLinux:\n\n{\n  \"browser\": {\n    \"enabled\": true,\n    \"headless\": false,\n    \"noSandbox\": true,\n    \"executablePath\": \"/usr/bin/google-chrome-stable\"\n  }\n}"
      },
      {
        "title": "Multi-Session Window Isolation",
        "body": "Multiple sessions share one Chrome (same cookies/logins) but each gets its own window."
      },
      {
        "title": "Rules (MUST follow):",
        "body": "On session start — open your own tab, save the targetId:\nbrowser action=open targetUrl=\"https://example.com\" profile=openclaw\n# Returns targetId — THIS IS YOURS, save it\n\n\n\nALL subsequent calls — always include your targetId:\nbrowser action=snapshot profile=openclaw targetId=\"<your-targetId>\"\nbrowser action=navigate profile=openclaw targetId=\"<your-targetId>\" targetUrl=\"...\"\nbrowser action=act profile=openclaw targetId=\"<your-targetId>\" ...\n\n\n\nOn session end — close your tab:\nbrowser action=close targetId=\"<your-targetId>\"\n\n\n\nNEVER operate without targetId — you'll land on another session's tab.\n\n\nNEVER pick another session's tab from browser action=tabs."
      },
      {
        "title": "Opening a new window (not tab) via CDP:",
        "body": "import json, asyncio, websockets, urllib.request\n\nasync def open_new_window(cdp_port, url):\n    version = json.loads(urllib.request.urlopen(f\"http://127.0.0.1:{cdp_port}/json/version\").read())\n    async with websockets.connect(version[\"webSocketDebuggerUrl\"]) as ws:\n        await ws.send(json.dumps({\n            \"id\": 1, \"method\": \"Target.createTarget\",\n            \"params\": {\"url\": url, \"newWindow\": True}\n        }))\n        resp = json.loads(await ws.recv())\n        return resp[\"result\"][\"targetId\"]"
      },
      {
        "title": "Architecture:",
        "body": "Chrome (one instance, one profile, shared cookies)\n├── Window targetId=AAA → Session A\n├── Window targetId=BBB → Session B\n└── Window targetId=CCC → Session C"
      },
      {
        "title": "VNC Takeover (CRITICAL)",
        "body": "When hitting a CAPTCHA, login wall, or any blocker, send the user a noVNC link:\n\nhttps://<IP>:<NOVNC_PORT>/vnc.html?password=<PASSWORD>&autoconnect=true&resize=scale"
      },
      {
        "title": "Constructing the link:",
        "body": "Linux/Docker (from start.sh output):\n\nhttps://57.129.90.145:10150/vnc.html?password=e0GGP4xeMUL5ga&autoconnect=true&resize=scale\n\nIP: server's public or Tailscale IP\nPort + password: from start.sh output\n\nmacOS: VNC takeover is NOT available. The user must access the Mac directly\n(physical access, macOS Screen Sharing, or their own remote desktop solution)."
      },
      {
        "title": "Takeover flow:",
        "body": "Agent detects blocker (CAPTCHA, login, 2FA)\nAgent sends noVNC link to user\nUser opens link → sees Chrome → solves the problem\nUser confirms done → agent continues"
      },
      {
        "title": "Anti-Detection",
        "body": "Headful Chrome — no HeadlessChrome in UA\n--disable-blink-features=AutomationControlled — no navigator.webdriver=true\nUA override via CDP if needed:\n{\"method\": \"Network.setUserAgentOverride\", \"params\": {\n  \"userAgent\": \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/131.0.0.0 Safari/537.36\"\n}}"
      },
      {
        "title": "Security",
        "body": "SSL/TLS on noVNC (self-signed cert)\nRandom 14-char password (Linux) or system auth (macOS)\nCDP: localhost only, never exposed to network\nChrome Policy: file://, javascript:, data:text/html blocked; extensions blocked; DevTools disabled"
      },
      {
        "title": "Important: No Kiosk Mode",
        "body": "Do NOT use Chrome's --kiosk flag. It hides the tab bar and address bar, making multi-window unusable via VNC. Use --start-maximized instead."
      },
      {
        "title": "Chrome window not visible in VNC",
        "body": "Symptoms: VNC connects but shows only Ubuntu splash screen, no Chrome window.\n\nCommon causes and fixes:\n\nFluxbox crashed (becomes defunct):\n\nCheck: ps aux | grep fluxbox | grep defunct\nFix: Restart fluxbox\nexport DISPLAY=:99\nfluxbox &\n\n\n\n\n\nStale X display lock files:\n\nCheck: ls -la /tmp/.X*lock\nFix: Use a different display number, or remove lock if no Xvfb running\nrm -f /tmp/.X99-lock\n\n\n\n\n\nChrome window minimized or hidden:\n\nCheck: xwininfo -root -tree to find Chrome window ID\nFix: Use python-xlib to raise and resize:\nfrom Xlib.display import Display\nd = Display(':99')\nwindow = d.create_resource_object('window', 0x800001)  # Chrome's window ID\nwindow.configure(x=0, y=0, width=1920, height=1040)\nwindow.configure(stack_mode='Above')\nd.sync()\n\n\n\n\n\nX11vnc not capturing properly:\n\nRestart x11vnc after fluxbox:\npkill x11vnc\nx11vnc -display :99 -forever -shared -rfbauth ~/.vnc/passwd -rfbport 5900 -bg"
      },
      {
        "title": "Complete restart procedure",
        "body": "If all else fails, kill and restart everything:\n\n# Kill all\npkill -9 -u $USER chrome\npkill -9 -u $USER x11vnc\npkill -9 -u $USER Xvfb\npkill -9 -u $USER fluxbox\npkill -9 -u $USER websockify\nsleep 2\n\n# Start fresh (use new display number to avoid stale locks)\nrm -f /tmp/.X30-lock\nXvfb :30 -screen 0 1920x1080x24 &\nsleep 2\nexport DISPLAY=:30\nfluxbox &\nsleep 2\ngoogle-chrome-stable --no-sandbox --disable-gpu ... &\nsleep 4\nx11vnc -display :30 -forever -shared -rfbauth ~/.vnc/passwd -rfbport 5900 -bg\nsleep 1\nwebsockify --web=/usr/share/novnc --cert=~/.vnc/combined.pem 15005 localhost:5900 -D"
      },
      {
        "title": "Auto-Recovery (healthcheck.sh)",
        "body": "start.sh automatically installs a cron job that runs healthcheck.sh every 2 minutes.\nIt monitors all 5 components and auto-restarts any that crash or become defunct:\n\nXvfb — cleans stale lock files, restarts display\nfluxbox — detects defunct (zombie) state, kills and restarts\nx11vnc — restarts VNC server\nwebsockify — restarts noVNC proxy\nChrome — restarts with same CDP port and anti-detection flags\n\nLogs: /tmp/anemone-healthcheck.log\n\nManual run:\n\nbash /root/healthcheck.sh [display_num] [vnc_port] [novnc_port] [cdp_port]\n# defaults: 99 5900 6080 9222\n\nTo check status:\n\ntail -20 /tmp/anemone-healthcheck.log\n\nTo disable:\n\ncrontab -l | grep -v healthcheck | crontab -"
      }
    ],
    "body": "Anemone Browser — Managed Browser for OpenClaw Agents\n\nHeadful Chrome with anti-detection, VNC takeover, and multi-session isolation. Works on Mac, Linux, Docker — anywhere OpenClaw runs.\n\nSetup\nmacOS\nbash scripts/setup-mac.sh\n\n\nDetects Chrome, configures OpenClaw browser profile. After setup:\n\nopenclaw browser start\n# Agent's browser tool works automatically\n\n\nNote: macOS setup does NOT include VNC/noVNC. The user is expected to access the Mac via their own remote desktop solution (e.g. macOS Screen Sharing, Tailscale, or physical access). VNC takeover with noVNC links is only available on Linux.\n\nLinux / Docker\n# Install deps (once)\nbash scripts/setup.sh\n\n# Start browser + VNC environment (password is MANDATORY by default)\nbash scripts/start.sh [password] [novnc_port] [cdp_port] [resolution]\n\n# Without specifying password → random 14-char password auto-generated\nbash scripts/start.sh\n\n# Explicitly no password (NOT recommended)\nbash scripts/start.sh --dangerously-no-password [novnc_port] [cdp_port] [resolution]\n\n\nstart.sh outputs the noVNC URL (with password in URL param), password, and CDP port. Safe to re-run. VNC always requires a password. The noVNC URL always includes ?password=... so the user doesn't need to type it. The only way to skip is --dangerously-no-password.\n\nOpenClaw Config\n\nSetup scripts configure this automatically. Manual reference:\n\nmacOS:\n\n{\n  \"browser\": {\n    \"enabled\": true,\n    \"defaultProfile\": \"openclaw\",\n    \"headless\": false,\n    \"executablePath\": \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"\n  }\n}\n\n\nLinux:\n\n{\n  \"browser\": {\n    \"enabled\": true,\n    \"headless\": false,\n    \"noSandbox\": true,\n    \"executablePath\": \"/usr/bin/google-chrome-stable\"\n  }\n}\n\nMulti-Session Window Isolation\n\nMultiple sessions share one Chrome (same cookies/logins) but each gets its own window.\n\nRules (MUST follow):\n\nOn session start — open your own tab, save the targetId:\n\nbrowser action=open targetUrl=\"https://example.com\" profile=openclaw\n# Returns targetId — THIS IS YOURS, save it\n\n\nALL subsequent calls — always include your targetId:\n\nbrowser action=snapshot profile=openclaw targetId=\"<your-targetId>\"\nbrowser action=navigate profile=openclaw targetId=\"<your-targetId>\" targetUrl=\"...\"\nbrowser action=act profile=openclaw targetId=\"<your-targetId>\" ...\n\n\nOn session end — close your tab:\n\nbrowser action=close targetId=\"<your-targetId>\"\n\n\nNEVER operate without targetId — you'll land on another session's tab.\n\nNEVER pick another session's tab from browser action=tabs.\n\nOpening a new window (not tab) via CDP:\nimport json, asyncio, websockets, urllib.request\n\nasync def open_new_window(cdp_port, url):\n    version = json.loads(urllib.request.urlopen(f\"http://127.0.0.1:{cdp_port}/json/version\").read())\n    async with websockets.connect(version[\"webSocketDebuggerUrl\"]) as ws:\n        await ws.send(json.dumps({\n            \"id\": 1, \"method\": \"Target.createTarget\",\n            \"params\": {\"url\": url, \"newWindow\": True}\n        }))\n        resp = json.loads(await ws.recv())\n        return resp[\"result\"][\"targetId\"]\n\nArchitecture:\nChrome (one instance, one profile, shared cookies)\n├── Window targetId=AAA → Session A\n├── Window targetId=BBB → Session B\n└── Window targetId=CCC → Session C\n\nVNC Takeover (CRITICAL)\n\nWhen hitting a CAPTCHA, login wall, or any blocker, send the user a noVNC link:\n\nhttps://<IP>:<NOVNC_PORT>/vnc.html?password=<PASSWORD>&autoconnect=true&resize=scale\n\nConstructing the link:\n\nLinux/Docker (from start.sh output):\n\nhttps://57.129.90.145:10150/vnc.html?password=e0GGP4xeMUL5ga&autoconnect=true&resize=scale\n\nIP: server's public or Tailscale IP\nPort + password: from start.sh output\n\nmacOS: VNC takeover is NOT available. The user must access the Mac directly (physical access, macOS Screen Sharing, or their own remote desktop solution).\n\nTakeover flow:\nAgent detects blocker (CAPTCHA, login, 2FA)\nAgent sends noVNC link to user\nUser opens link → sees Chrome → solves the problem\nUser confirms done → agent continues\nAnti-Detection\nHeadful Chrome — no HeadlessChrome in UA\n--disable-blink-features=AutomationControlled — no navigator.webdriver=true\nUA override via CDP if needed:\n{\"method\": \"Network.setUserAgentOverride\", \"params\": {\n  \"userAgent\": \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/131.0.0.0 Safari/537.36\"\n}}\n\nSecurity\nSSL/TLS on noVNC (self-signed cert)\nRandom 14-char password (Linux) or system auth (macOS)\nCDP: localhost only, never exposed to network\nChrome Policy: file://, javascript:, data:text/html blocked; extensions blocked; DevTools disabled\nImportant: No Kiosk Mode\n\nDo NOT use Chrome's --kiosk flag. It hides the tab bar and address bar, making multi-window unusable via VNC. Use --start-maximized instead.\n\nTroubleshooting\nChrome window not visible in VNC\n\nSymptoms: VNC connects but shows only Ubuntu splash screen, no Chrome window.\n\nCommon causes and fixes:\n\nFluxbox crashed (becomes defunct):\n\nCheck: ps aux | grep fluxbox | grep defunct\nFix: Restart fluxbox\nexport DISPLAY=:99\nfluxbox &\n\n\nStale X display lock files:\n\nCheck: ls -la /tmp/.X*lock\nFix: Use a different display number, or remove lock if no Xvfb running\nrm -f /tmp/.X99-lock\n\n\nChrome window minimized or hidden:\n\nCheck: xwininfo -root -tree to find Chrome window ID\nFix: Use python-xlib to raise and resize:\nfrom Xlib.display import Display\nd = Display(':99')\nwindow = d.create_resource_object('window', 0x800001)  # Chrome's window ID\nwindow.configure(x=0, y=0, width=1920, height=1040)\nwindow.configure(stack_mode='Above')\nd.sync()\n\n\nX11vnc not capturing properly:\n\nRestart x11vnc after fluxbox:\npkill x11vnc\nx11vnc -display :99 -forever -shared -rfbauth ~/.vnc/passwd -rfbport 5900 -bg\n\nComplete restart procedure\n\nIf all else fails, kill and restart everything:\n\n# Kill all\npkill -9 -u $USER chrome\npkill -9 -u $USER x11vnc\npkill -9 -u $USER Xvfb\npkill -9 -u $USER fluxbox\npkill -9 -u $USER websockify\nsleep 2\n\n# Start fresh (use new display number to avoid stale locks)\nrm -f /tmp/.X30-lock\nXvfb :30 -screen 0 1920x1080x24 &\nsleep 2\nexport DISPLAY=:30\nfluxbox &\nsleep 2\ngoogle-chrome-stable --no-sandbox --disable-gpu ... &\nsleep 4\nx11vnc -display :30 -forever -shared -rfbauth ~/.vnc/passwd -rfbport 5900 -bg\nsleep 1\nwebsockify --web=/usr/share/novnc --cert=~/.vnc/combined.pem 15005 localhost:5900 -D\n\nAuto-Recovery (healthcheck.sh)\n\nstart.sh automatically installs a cron job that runs healthcheck.sh every 2 minutes. It monitors all 5 components and auto-restarts any that crash or become defunct:\n\nXvfb — cleans stale lock files, restarts display\nfluxbox — detects defunct (zombie) state, kills and restarts\nx11vnc — restarts VNC server\nwebsockify — restarts noVNC proxy\nChrome — restarts with same CDP port and anti-detection flags\n\nLogs: /tmp/anemone-healthcheck.log\n\nManual run:\n\nbash /root/healthcheck.sh [display_num] [vnc_port] [novnc_port] [cdp_port]\n# defaults: 99 5900 6080 9222\n\n\nTo check status:\n\ntail -20 /tmp/anemone-healthcheck.log\n\n\nTo disable:\n\ncrontab -l | grep -v healthcheck | crontab -"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/EasonC13/anemone",
    "publisherUrl": "https://clawhub.ai/EasonC13/anemone",
    "owner": "EasonC13",
    "version": "1.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/anemone",
    "downloadUrl": "https://openagent3.xyz/downloads/anemone",
    "agentUrl": "https://openagent3.xyz/skills/anemone/agent",
    "manifestUrl": "https://openagent3.xyz/skills/anemone/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/anemone/agent.md"
  }
}