
GitHub: https://github.com/rmyndharis/openwa
OpenWA 是一个把 WhatsApp Web 协议封成完整 self-hostable 产品的 NestJS 网关——HTTP API + React Dashboard + Webhook UI + 多 Session + Postgres + Swagger 一体交付,免费开源,作为付费版 WAHA Plus 的直接对手定位。
IWhatsAppEngine 抽象层(100+ 方法契约)、EngineFactory + 插件清单、SSRF 守卫(带 hex-hextet IPv4-mapped IPv6 检测——绝大多数同类守卫会漏这个绕过)、双 DataSource 隔离 + 迁移回归测试——这些通常只见于成熟项目。
维度 | 数据 |
|---|---|
GitHub | https://github.com/rmyndharis/openwa |
Star / Fork | 9,052 / 1,996(fork/star = 22%,异常) |
代码行数 | 52,780 行(22k 真业务 TS/TSX,22k 是 lockfile / env / changelog 等数据文件) |
项目年龄 | 4.3 个月(首次 commit ~2026-02) |
开发阶段 | 密集开发(最近 30 天 79 commit,月度曲线 2→0→7→29→51,前倾) |
贡献模式 | 职业单人项目(Yudhi 64%,含同人异账号 17%,外部贡献者 16 人合计仅 ~6%) |
热度定位 | 大众热门(爆发型增长,单日 151 stars) |
质量评级 | 代码 8/10 · 文档 6/10(CHANGELOG 极好但官方文档与功能存在漂移)· 测试 2/10(覆盖率阈值 30%,e2e 仅冒烟,0 单元测试) |
当前版本 | v0.2.7(发布密集 8 个 minor 版集中 06-15/16) |
License | MIT |
Yudhi Armyndharis,13 年 GitHub 老号(2008 年起),自述 「I turn coffee into code」,base 在印尼 Batam。这不是传统大公司背景的开发者——没有 WPPConnect 团队那种咨询公司履历,也非 Evolution API 那种巴西 SaaS 团队结构。Yudhi 同源仓库还有 antigravity-skills(854 stars)和 OpenWA-n8n 节点,证明其核心身份是「做 WhatsApp 网关 + 配套自动化」。
作者明确把目标客户定为「受够 WAHA Plus 付费墙、需要全控制权但又不想自己写 Whatsapp-web.js 适配」的开发者。这是个真实痛点:WAHA 2024 年起把多 Session、Typebot 集成、官方支持等核心功能移入 Plus 订阅,开源社区虽然能自己拼,但「5 个 docker 容器 + 3 个数据库 + 1 个反代 + 1 套 Webhook 路由」的搭建成本对中小团队是劝退门槛。
OpenWA 的哲学是「产品化胜过灵活性」——不追求最广泛的协议覆盖(不实现 Baileys,只走 whatsapp-web.js 一条路),而追求这条路上「部署 → 管理 → 监控 → 文档」的整条体验。作者明确不做什么(来自 docs/13 与 docs/19):不做水平扩缩容、不做插件沙箱、不发布独立 SDK。这条克制路线和 Evolution API 的「生态广度优先」路线形成清晰对照。
典型 OSS 增长飞轮:免费 → 攒星 → 引流到付费配套(n8n 节点、企业版、托管服务)。Yudhi 的 antigravity-skills 已经验证过这套打法(854 stars + 自有付费产品)。OpenWA 大概率是同源策略的 WhatsApp 复制版。
官方无独立技术博客,关键决策散落在
CHANGELOG.md注释(顶级质量:每个版本都带 issue 编号 + 根因 + 修复说明)和docs/目录里。
IWhatsAppEngine 抽象层 + 引擎插件清单(provides: ['whatsapp-engine', ...])—— 干净地把 whatsapp-web.js 封到 100+ 方法的契约后面,配合 EngineFactory 让 Baileys / 自研引擎切换不再动业务代码。这是 OpenWA 区别于「薄封装」项目的核心架构。::ffff:7f00:1 这类 IPv4-mapped IPv6 写法,OpenWA 自己实现了 hex-hextet 解析。feat(messaging): typing simulation (anti-ban) + fix duplicate dashboard messages(#264)解决了真实运营场景下「消息送达率下降」的硬问题。WWEBJS_WEB_VERSION 协议版本 pin——给运营方一个「协议死锁时的逃生口」(手动锁版避免被上游 hang 死),是 Whatsapp-web.js 用户最想要的开关之一。TypeOrmModule.forRootAsync 同时挂 main(auth/audit)和 data(业务)两个命名连接,用回归测试保证「无论如何升级,auth schema 永远在」。process env wins 注释——.env.example / .env.minimal / process.env 的优先级用注释说清,避免新人踩坑。customHeaders first, system headers second——避免用户自定义 header 被系统/中间件覆盖引发的「我配了不生效」问题。维度 | OpenWA | Evolution API | WAHA | whatsapp-web.js | Baileys |
|---|---|---|---|---|---|
类型 | 完整产品(API+UI) | 完整产品 | 完整产品 | 库 | 库 |
自托管门槛 | 极低(一键 docker-compose) | 极低 | 极低 | 高(自己拼) | 高(自己拼) |
Dashboard | 内置 React | 内置 | 内置(Plus 版) | 无 | 无 |
协议后端 | whatsapp-web.js | whatsapp-web.js + Baileys | whatsapp-web.js | whatsapp-web.js | Baileys |
数据库 | SQLite/Postgres | Postgres | 多选 | 无 | 无 |
付费墙 | 无 | 无 | 有(Plus) | 无 | 无 |
多 Session | 内置 | 内置 | Plus 版 | 自实现 | 自实现 |
生态集成 | n8n 节点 | Typebot/Chatwoot/Dify 直连 | Plus 才有 | 无 | 无 |
工程深度 | 极高(SSRF/双 DS/反封号) | 中 | 中 | 低(库) | 低(库) |
测试覆盖 | 极低(30% 阈值、e2e 冒烟) | 中 | 中 | 中 | 中 |
项目年龄 | 4.3 个月 | 2 年+ | 3 年+ | 5 年+ | 3 年+ |
维护模式 | 1 人 + 社区 | 团队 | 团队 | 社区 | 社区 |
风险 | 单点维护 / 协议适配 | 商业公司主导 | 商业公司主导 | 协议跟上游 | 协议跟上游 |
whatsapp-web.js 上游对协议变更的响应速度——OpenWA 自己的 Issue #199/#263 已经在反映这个痛(LID 迁移导致群发静默失败)。whatsapp-web.js 维护者下棋一步错,整个生态都翻车。在 WhatsApp 网关的「产品化」层(区别于纯 SDK 库),OpenWA 与 Evolution API、WAHA 形成三国杀。它的差异化轴是「无付费墙 + 个人开发者驱动的工程深度」——既不是企业级商业产品,也不是社区维护的薄库,是个人 OSS 项目里「工程深度反常高」的那个极端样本。
whatsapp-web.js 一条路上——协议层任何大变化都可能让项目停摆数周。src/modules/whatsapp/engines/ 下 IWhatsAppEngine 接口定义和 whatsapp-web-js.adapter.ts 适配器(架构学习的最好入口)。src/common/security/ssrf.guard.ts —— 几乎所有多协议适配器都能借鉴的 SSRF 模式。src/database/ —— 双 DataSource 隔离 + auth 表迁移回归测试是范式级解法。CHANGELOG.md —— 怎么写带 issue 编号 + 根因 + 修复的 changelog,看这一份就够了。EngineFactory 钩子,缺的只是实现)。sdk/ 目录是 placeholder,monorepo 拆包就能发)。资源 | 链接 |
|---|---|
DeepWiki | 未收录 |
Zread.ai | 抓取被 Cloudflare 拦截(403),未验证 |
关联论文 | 无(应用型项目,无学术对应) |
在线 Demo | 无公开 demo(需自托管) |
协议层参考 | whatsapp-web.js / Baileys |
同源项目 | antigravity-skills / OpenWA-n8n |