中文 | English
BrowerClaw 是一个把 openclaw 运行时搬进浏览器的演示仓库,方便开发者在前端页面里直接启动一个“浏览器内 OpenClaw 服务”,用于调试 UI、验证技能装载链路,以及观察 browser runtime 的启动过程。
它由两个子项目组成:
openclaw/:裁剪后的本地优先 agent runtime,提供agent、chat、serve、skills等核心能力。weRunOpenClaw/:React + Vite 前端,负责在浏览器中启动weNode,并把openclaw构建产物装载到虚拟文件系统中运行。
- Node.js
>=22.12.0 pnpm >=10- 支持
Web Workers与SharedArrayBuffer的现代浏览器
虽然 weRunOpenClaw 自身声明 Node >=18.18.0,但由于整个开发流程依赖 openclaw 的构建产物,建议统一使用 Node 22。
cd openclaw
pnpm install
cd ../weRunOpenClaw
pnpm installcd ../openclaw
pnpm build这一阶段会生成 openclaw/dist/。如果没有这个目录,前端虽然能启动,但浏览器里的虚拟运行时没有可执行的 OpenClaw 入口。
cd ../weRunOpenClaw
cp .env.example .env.local至少确认这些变量可用:
VITE_OPENCLAW_GEMINI_BASE_URLVITE_OPENCLAW_GEMINI_API_KEYVITE_OPENCLAW_LAST_TOUCHED_ATVITE_OPENCLAW_LAST_TOUCHED_VERSION
这些值会被写入浏览器内虚拟的 ~/.openclaw/openclaw.json。
pnpm dev默认访问:
http://localhost:5173
首次打开页面时,前端会在浏览器内部完成运行时引导、依赖安装和服务启动,所以首屏等待时间通常明显长于普通 React 页面。
BrowserClaw 不是“前端请求本机后端”的传统模式,而是把一个可运行的 OpenClaw 服务直接放进浏览器环境中启动。
flowchart TD
A[开发者打开 weRunOpenClaw 页面] --> B[前端调用 WeNode.boot]
B --> C[浏览器内启动虚拟运行时]
C --> D[写入 openclaw dist/package.json/skills 等文件]
D --> E[写入 ~/.openclaw/openclaw.json]
E --> F[在虚拟环境执行 npm install --omit=dev]
F --> G[执行 node /workspace/openclaw/dist/index.js serve --port 3187]
G --> H[浏览器内 OpenClaw API 启动完成]
H --> I[页面通过 3187 与 agent 对话]
- 浏览器打开
weRunOpenClaw页面。 - 前端调用
WeNode.boot(),创建浏览器内虚拟运行时。 - 前端把
openclaw/dist、openclaw/package.json、openclaw/skills/**、模板文档等写入虚拟文件系统。 - 前端再写入运行所需配置,例如
~/.openclaw/openclaw.json。 - 虚拟运行时内部执行
npm install --omit=dev,安装裁剪后的运行时依赖。 - 随后执行
node /workspace/openclaw/dist/index.js serve --port 3187。 - UI 最终通过浏览器内的
3187虚拟服务与 agent 通信。
weRunOpenClaw 并不是直接引用 openclaw/src,而是依赖它的构建产物。因此开发顺序固定为:
- 先安装
openclaw依赖 - 执行
openclaw构建 - 再启动或构建
weRunOpenClaw
可以把它理解成:前端只是“搬运 + 启动” openclaw/dist,并不替代 openclaw 的编译工作。
BrowerClaw/
├─ Dockerfile
├─ openclaw/ # TypeScript CLI/runtime
└─ weRunOpenClaw/ # Browser UI + weNode runtime host
weRunOpenClaw的 Vite dev server 默认端口是5173- 浏览器内 OpenClaw API 固定使用
3187 - 页面必须带
COOP/COEP响应头,否则SharedArrayBuffer/weNode无法启动
当前相关配置已在这些文件中处理:
weRunOpenClaw/vite.config.tsDockerfile
BrowserClaw 不会在 weNode 中安装完整的 openclaw 生产依赖,而是使用一个 browser runtime dependency profile 裁剪运行时依赖集合。
这样做的目标是:
- 只保留浏览器场景真正需要的聊天、配置、技能、预览主链路
- 避免某些服务端型或渠道型依赖继续触发额外联网安装
- 降低首次启动失败率,缩短首启准备时间
因此,一些偏服务端或渠道接入的依赖不会进入浏览器内安装集合,例如部分 WhatsApp、Slack、Telegram 相关依赖,以及其他重型服务端包。
pnpm build
pnpm test
pnpm lint
pnpm openclaw agent --message "Summarize this project"
pnpm openclaw serve --port 3187pnpm dev
pnpm build
pnpm preview
pnpm typecheck根目录 Dockerfile 会完成以下事情:
- 安装
openclaw与weRunOpenClaw依赖 - 构建
openclaw - 构建
weRunOpenClaw - 用 Nginx 托管
weRunOpenClaw/dist
示例:
docker build \
--build-arg VITE_OPENCLAW_GEMINI_BASE_URL=https://your-model-host.example.com/v1 \
--build-arg VITE_OPENCLAW_GEMINI_API_KEY=your-key \
--build-arg VITE_OPENCLAW_LAST_TOUCHED_AT=2026-04-12T00:00:00.000Z \
--build-arg VITE_OPENCLAW_LAST_TOUCHED_VERSION=2026.1.0 \
-t browerclaw .
docker run --rm -p 8080:80 browerclaw访问:
http://localhost:8080
openclaw/src/index.ts:CLI 入口openclaw/src/agents/mini-agent.ts:agent/chat/serve/skills主实现weRunOpenClaw/src/pages/BrowserClawPage.tsx:主页面与任务/面板编排weRunOpenClaw/src/ui/Terminal/weNodeBootstrap.ts:浏览器内weNode + openclaw引导逻辑weRunOpenClaw/vite.config.ts:dev server 与 COOP/COEP 配置Dockerfile:生产构建与静态部署入口
优先检查这几项:
- 是否已经在
openclaw/下执行过pnpm build - 浏览器是否支持
SharedArrayBuffer - 当前响应头是否包含
Cross-Origin-Opener-Policy: same-origin - 当前响应头是否包含
Cross-Origin-Embedder-Policy: credentialless - 首次页面加载时,浏览器内
npm install是否因为网络策略被阻断
因为首启不只是加载前端资源,还会在浏览器内完成:
- 启动
weNode - 写入虚拟文件系统
- 安装运行时依赖
- 启动
openclaw serve
VITE_OPENCLAW_GEMINI_API_KEY 会被打进前端 bundle。若用于真实生产环境,建议改为服务端代理,而不是直接暴露在浏览器侧。
- 仓库中通常不会自带最新的
openclaw/dist/,开发前应主动执行一次构建 weRunOpenClaw/dist/不能替代openclaw/dist/的作用- 浏览器内会执行一次依赖安装,因此网络条件会直接影响首启成功率
- 当前实现追求的是“浏览器内最小可运行 OpenClaw”,而不是完整复刻服务端运行环境