【开源】ClawApp — 给 OpenClaw 做了个手机聊天客户端,纯 JS 3700 行,一键部署,无需依赖各种聊天渠道,原生支持!

各位佬友好,之前发过一帖 OpenClaw 中文汉化版的部署教程,感谢大家的反馈和支持

项目地址:GitHub - qingchencloud/clawapp: 📱 ClawApp — Mobile H5 chat client for OpenClaw AI Agent platform. 用手机和你的 AI 智能体聊天。

用了一段时间之后发现一个痛点:虽然 OpenClaw 官方原生支持 WhatsApp、Telegram、Discord、QQ 机器人、企业微信、飞书等各种渠道,但配置起来有一定门槛,需要申请 Bot Token、配置 Webhook 之类的,有时候就是想拿手机随便问两句,不想折腾那些渠道配置

所以自己又撸了一个——ClawApp,算是中文汉化版的配套项目,不需要配置任何渠道,部署完直接用,相当于给 OpenClaw 多加了一个自由可控的聊天入口

ClawApp 是什么

一句话:用手机浏览器和你的 OpenClaw AI 智能体聊天,不需要装 App

架构很简单,就是一个 WebSocket 代理:

手机浏览器
    ↓ WebSocket
ClawApp Server(端口 3210)
    ↓ WebSocket
OpenClaw Gateway(端口 18789)

代理服务端自动完成 Gateway 的握手认证,同时提供一个 H5 聊天页面,手机打开浏览器输入地址就能用

技术栈

没用 React/Vue 那些,纯原生 JavaScript + Vite 构建,总共 3700 行左右:

server/index.js      — Express + WebSocket 代理 + Gateway 握手    436 行
h5/src/chat-ui.js    — 聊天 UI + 会话管理                         756 行
h5/src/ws-client.js  — WebSocket 协议层 + 重连                    266 行
h5/src/main.js       — 入口 + 连接页                              206 行
h5/src/i18n.js       — 中英文国际化                               264 行
h5/src/markdown.js   — Markdown 渲染 + 代码高亮                   145 行
h5/src/commands.js   — 快捷指令面板                               134 行
样式文件              — style.css + components.css                1229 行

选择原生 JS 主要是因为:

  1. 项目不大,没必要上框架
  2. 打包体积小,手机加载快
  3. 维护简单,不用跟框架版本

功能

做这个的初衷就是想在手机上有接近桌面端的体验,所以功能没有缩水

聊天体验

  • 流式输出,打字机效果逐字显示,30ms 节流渲染不卡顿
  • 完整的 Markdown 渲染——标题、列表、加粗斜体、链接、图片都支持
  • 代码块语法高亮,支持十几种语言关键字识别,一键复制
  • 图片发送,支持 JPEG/PNG/GIF/WebP,4MB 以内,发之前有缩略图预览
  • 发送中可以随时点停止按钮中断 AI 回复
  • 消息队列机制,AI 还在回复的时候你可以继续打字发送,会自动排队

快捷指令面板

左下角闪电按钮点开,6 组指令一目了然:

  • /model list 列出可用模型、/model xxx 一键切换
  • /new 新建会话、/reset 重置、/compact 压缩上下文
  • /think off/low/medium/high 四档思考强度调节
  • /skill xxx 直接调用 OpenClaw 技能
  • /status /whoami /context 查看系统状态
  • /verbose on/off 开关详细输出

点指令直接发送,带参数的会自动填到输入框等你补全

会话管理

点顶部标题栏弹出会话列表:

  • 多会话切换,每个会话独立上下文
  • 新建自定义会话(debug、research 之类随便起名)
  • 删除不需要的会话,有二次确认不怕误删
  • 自动记住上次使用的会话,重连后恢复

工具调用可视化

AI 调用工具的时候不是黑盒,每个工具调用都有实时状态卡片——执行中转圈、完成打勾、失败标红,能看到 AI 在干什么

连接稳定性

  • 25s 应用层心跳 + 30s 服务端心跳,双重保活
  • 断线自动重连,指数退避策略,最长 30s 间隔
  • 断连时顶部横幅提示,支持手动点击立即重连
  • wsId 实例隔离机制,彻底解决新旧连接事件交叉的问题

其他

  • 亮色 / 暗色 / 跟随系统三种主题
  • 中英文切换,自动检测浏览器语言
  • 新用户首次打开有功能引导
  • PWA 支持,添加到主屏幕当原生 App 用,支持离线访问
  • Android APK 自动构建(Capacitor + GitHub Actions),Release 页面直接下载

软件截图

其他图片

部署

提供了三种方式,挑一个顺手的就行

一键脚本(推荐,最省事,但是网络不好的话,还是建议下载后部署):

Mac / Linux:

curl -fsSL https://raw.githubusercontent.com/qingchencloud/clawapp/main/install.sh | bash

Windows PowerShell:

irm https://raw.githubusercontent.com/qingchencloud/clawapp/main/install.ps1 | iex

脚本会自动检测环境、克隆仓库、安装依赖、构建前端,还会交互式配置 Token,如果本地已装 OpenClaw 会自动读取 Gateway Token

Docker:

git clone https://github.com/qingchencloud/clawapp.git
cd clawapp

# 创建 .env
echo 'PROXY_TOKEN=你设一个密码' > .env
echo 'OPENCLAW_GATEWAY_TOKEN=你的gateway-token' >> .env

docker compose up -d --build

手动运行:

git clone https://github.com/qingchencloud/clawapp.git
cd clawapp
npm run install:all
npm run build:h5
cp server/.env.example server/.env
# 编辑 server/.env 填入 token
npm start

启动后手机浏览器打开 http://你的电脑IP:3210 就行了

外网访问

不在同一个 WiFi 也能用,几种方案:

  • Cloudflare Tunnel — 免费,自动 HTTPS,最推荐,缺点是依赖 CF 服务
  • SSH 隧道 — 简单,一行命令搞定,缺点是需要公网服务器,隧道可能断
  • Nginx 反代 — 完全可控,自定义域名,缺点是需要自己配 SSL

Cloudflare Tunnel 最简单:

cloudflared tunnel --url http://localhost:3210

会给你一个 https://xxx.trycloudflare.com 地址,手机直接访问,WebSocket 自动走 WSS 加密

一些技术细节

写这个项目过程中踩了几个坑,分享一下:

1. Gateway 握手协议

OpenClaw Gateway 的 WebSocket 连接不是标准的 connect-and-go,有一套握手流程,服务端需要先等 challenge(有些版本没有),然后发送 connect 帧带上 token,等 hello-ok 回来才算连接成功,中间还要处理消息缓存——握手完成前客户端发的消息先存着,握手成功后再批量发出去

2. WebSocket 重连的坑

最开始重连逻辑有 bug:旧的 WebSocket 实例 关闭时触发 onclose,又去创建新连接,新连接的事件和旧连接的事件交叉,导致状态混乱,后来加了一个 wsId 做实例隔离,每次创建新连接 wsId++,事件回调里先检查 wsId 是否匹配,不匹配就忽略

3. Docker 里连宿主机

Docker 容器里要连宿主机的 Gateway,不能用 localhost,docker-compose.yml 里用了 host.docker.internal:host-gateway 映射,Gateway URL 自动设为 ws://host.docker.internal:18789

项目信息

欢迎 Star、Fork、提 Issue,有问题也可以在评论区聊

纯开源项目,MIT 协议,没有任何商业目的,和 中文汉化版 搭配使用体验最佳,希望对佬友们有帮助

150 个赞

支持大佬

1 个赞

支持佬友,新年大吉

1 个赞

大佬真的厉害了 这个非常好 自建IM

1 个赞

厉害了,星一下

2 个赞

牛逼大佬,大佬请教一下,有个不用的手机,是否可以直接刷机装个 openclaw

4 个赞

太有实力辣佬,向你学习

1 个赞

感谢大佬!

2 个赞

火钳刘明

1 个赞

大佬太强了

1 个赞

大佬牛逼!

1 个赞

暂时没有时间搞这个,先留言做个标记

2 个赞

支持佬!感谢分享!

2 个赞

大佬牛逼

2 个赞

大佬牛逼呀

1 个赞

大佬:ox::beer_mug: 马上体验下

2 个赞

感谢佬的分享

1 个赞

这种风格的就很喜欢!大佬牛逼。

2 个赞

不需要刷机啊,直接装就行

2 个赞

如果是从聊天的话,我感觉我这个应该好点 :laughing:





7 个赞