mrkeyoor.com_
Tue 01 Sept 17:42 UTC
Automationevaluationupdated 26 Aug 2026

OpenWA review

OpenWA is a self-hosted REST, webhook, dashboard, and MCP gateway for WhatsApp automation. It runs unofficial reverse-engineered clients through either whatsapp-web.js or Baileys, giving developers multi-session messaging without Meta's official Cloud API.

+335stars / 7d
Verdict

Our OpenWA run passed 5,897 of 5,903 Jest tests after a 59-second install, but npm audit still found 5 high-severity vulnerabilities. It is a capable gateway for disposable-number hobby and internal automation when you accept that a successful API response may not mean delivery. Use Meta's official API for customer-critical or regulated messaging, and keep MCP read-only unless an agent truly needs permission to send.

We ran it

Lab card: what happened when we ran OpenWAScreenshot of OpenWA (www.open-wa.org)
Install✓ · 59s1293 packages · 913 MB
Build✓ · 20s
Tests✓ · 77s5897 passed · 0 failed · 6 skipped of 5903 (jest)
Known vulns50 critical · 5 high · 0 moderate · 0 low (npm audit)
Repo1581 files~219,509 lines of source · 16.5 MB · 9 CI workflows · Dockerfile · tests dir

Answers from our run

Does OpenWA build from source?

Dependencies installed in 59 seconds (1293 packages), and the build succeeded in 20 seconds. We cloned commit ac4cda9 into a clean Debian container with 3 CPUs and no project-specific setup.

Do OpenWA's tests pass?

Yes: 5897 of 5903 passed when we ran the project's own test command (jest). Some failures need services or credentials a bare container does not have.

Does OpenWA have known vulnerabilities in its dependencies?

npm audit flagged 5 known advisories in the dependency tree at the time of our run.

Who should not use OpenWA?

Regulated, authentication-critical, or revenue-critical messaging: the README explicitly directs those workloads to Meta's official Cloud API.

What are the alternatives to OpenWA?

WhatsApp Cloud API, WPPConnect Server, WAHA. Our OpenWA run passed 5,897 of 5,903 Jest tests after a 59-second install, but npm audit still found 5 high-severity vulnerabilities.

Setup3/5Docker path is clear; 1,293 packages and session linking remain
Docs5/5Risk, engines, deployment, API, MCP, and security are detailed
Community4/513,225 stars with active August 2026 maintenance
Maturity3/5Large passing suite, offset by unofficial protocol and 5 high advisories

Who it’s for

Hobbyists and internal-tool teams using a dedicated WhatsApp number they can afford to lose.
Developers who need webhooks, API keys, sessions, groups, and media behind one self-hosted API.
Operators comfortable running Docker, a database, backups, and browser or socket sessions.
MCP users who will keep the default 25-tool read-only surface and use a scoped key.

Who it’s NOT for

Regulated, authentication-critical, or revenue-critical messaging: the README explicitly directs those workloads to Meta's official Cloud API.
Anyone automating a primary personal or business number: the maintainers say unofficial automation always carries restriction or ban risk.
Cold outreach systems that need delivery truth: issue 830 says a first message can receive API success and still never reach the recipient.
Workflows that require every inbound attachment: issue 1466 reports media webhooks arriving without a media field after a download failure.
Teams that cannot absorb dependency remediation: our npm audit found 5 high-severity known vulnerabilities.
Public MCP deployments needing OAuth 2.1: the README says OAuth is not built and advises a fronting authentication proxy.

Setup reality

Our sandbox installed 1,293 npm packages in 59 seconds and used 913 MB. The build passed in 20 seconds, then Jest reported 5,897 passed, 0 failed, and 6 skipped out of 5,903 in 77 seconds. npm audit found 5 high-severity known vulnerabilities.

A usable deployment needs Node.js 22 or Docker, an API key, one or more linked WhatsApp numbers, and persistent session storage. PostgreSQL, Redis, and S3-compatible storage are optional. Public traffic also needs TLS and a reverse proxy.

whatsapp-web.js uses a headless browser and more memory per session; Baileys is lighter but easier for WhatsApp to fingerprint. Account policy, protocol changes, QR or passkey linking, and delivery behavior remain outside OpenWA's full control.

Two unofficial engines trade account risk for memory

OpenWA turns WhatsApp sessions into an HTTP API with a dashboard, webhooks, API keys, group operations, labels, media, and delivery events. It supports multiple sessions in one instance and lets operators choose SQLite or PostgreSQL, optional Redis, and local or S3-compatible storage. The default whatsapp-web.js engine controls a headless Chromium session. Baileys speaks the multi-device protocol directly and avoids the browser.

Neither engine is Meta's official business API. The README says whatsapp-web.js has a lower fingerprinting risk but uses about 300 to 500 MB of RAM per session, while Baileys uses about 30 to 80 MB and carries higher risk. Those are project-stated ranges, not our measurements. A dedicated number, conservative sending, opted-in recipients, and a fallback channel are operating requirements. They do not eliminate restriction or ban risk.

API success can still mean the recipient saw nothing

Issue 830 documents first messages to brand-new contacts that return a message ID and successful HTTP status but never arrive. The project attributes the behavior to WhatsApp's server-side trust policy after OpenWA hands off the message. Existing conversations work in the reported cases, and delivery may begin once the recipient writes first. OpenWA cannot make an unofficial client override that policy.

This breaks a common assumption in automation: a 200 response is acceptance by the gateway, not proof of delivery to the phone. Workflows should wait for delivery events, expose an unresolved state, and switch to SMS, email, or the official API when the message matters. Cold outreach is a poor fit. The README says regulated, healthcare, finance, large commercial, and EU or EEA compliance-sensitive deployments should treat OpenWA as unapproved.

What happened when we ran it

Our sandbox installed 1,293 npm packages in 59 seconds and consumed 913 MB on disk. The build succeeded in 20 seconds. Jest then reported 5,897 passed, 0 failed, and 6 skipped out of 5,903 in 77 seconds. We tested commit ac4cda9 with Node.js 22, 3 CPUs, 8 GB of RAM, and no secrets. npm audit found 5 known vulnerabilities, all high severity.

The checkout contained 1,581 files and about 219,509 lines of source. We found 9 CI workflow files, a Dockerfile, a compose file, and a tests directory. The clean build and large passing suite are meaningful for the application code. Our sandbox did not link a phone, start Chromium, connect to WhatsApp, send a message, receive media, restore a session, or test a platform ban. The 77-second suite does not verify live protocol compatibility.

Docker is straightforward, while state needs deliberate care

The recommended development path starts a bundled API and dashboard on port 2785. Production Compose profiles can add PostgreSQL, Redis, and MinIO. The Node process drops privileges after the entrypoint fixes volume ownership. A Docker socket proxy limits enabled API paths, but the README warns that POST access can still make a compromised application container equivalent to host root because container-create payloads are not finely constrained. Disable built-in datastore orchestration if that gateway is unnecessary.

Persistent credentials and session state are the harder part. Operators need backups, secret rotation, TLS, a reverse proxy, webhook HMAC checking, and monitoring for relink-required states. Version 0.23.3 fixed duplicate session auto-start, stale QR behavior, and several Baileys pairing races. The release also warns that forcing Bull Board's obliterate action can delete active jobs without recording their final delivery failures. Administrative convenience can erase audit evidence.

Inbound media can reach a webhook without media

Issue 1466 reports that version 0.23.0 sometimes emitted an inbound image or video webhook with the correct message type but no media object after whatsapp-web.js failed to download the attachment. The reporter ran 4 sessions on a host where the container used about 5.9 of 7.6 GiB and logged a Puppeteer-side error. Those conditions do not establish one cause, but the payload was incomplete.

Consumers should treat type and content as separate fields. If a media event lacks media bytes or an explicit omission reason, queue it for recovery through another endpoint and alert after a bounded retry. Never acknowledge a customer document as processed merely because the webhook arrived. OpenWA's storage backend handles backup and migration; the README says message media is returned inline and is not automatically persisted there. Downstream storage is your responsibility.

MCP starts with 25 read-only tools for good reason

Setting MCP_ENABLED=true adds a Streamable HTTP endpoint to the same server. The default surface has 25 read-only tools for sessions, messages, contacts, groups, webhooks, labels, and automation rules. Disabling read-only mode expands it to 51 tools, including sends, replies, and group changes. Every call uses OpenWA's API key roles and session scoping.

The safest agent key is non-admin, limited to one session, and subject to a separate rate limit. The README rejects keys with IP allow-lists over MCP because the transport has no genuine client IP. It also says not to expose the endpoint publicly without an authentication proxy; OAuth 2.1 is not implemented. An agent that can read chats already handles sensitive data. An agent that can send creates financial, privacy, and account-reputation risk, so read-only should remain the default.

August releases are active, while Meta sets the ceiling

GitHub showed 13,225 stars, 11 combined issues and pull requests, and a last push on August 24, 2026. Version 0.23.3 was released that day, with new pull requests active on August 26. The queue includes media delivery, older CPU support, and role customization. This is a maintained codebase, and the 5,897 passing tests support that view.

Maintenance cannot control WhatsApp's device-linking and anti-abuse changes. Issue 560 reports a phased passkey requirement that blocked both QR and pairing-code flows for one account across both engines. The right adoption question is whether the convenience of a self-hosted unofficial gateway outweighs that platform dependency. For personal and internal automation on a disposable number, it may. For an order, login, or regulated conversation, the official API is the responsible choice.

Alternatives

ProjectWhat it isPick it when
WhatsApp Cloud APIMeta's supported business messaging API with official account and compliance paths.pick this instead when delivery, policy support, regulated use, or a business-critical number matters.
WPPConnect ServerA self-hosted HTTP server built around the WPPConnect WhatsApp client stack.pick this instead when its client compatibility and API shape fit an existing WPPConnect deployment.
WAHAA Docker-oriented WhatsApp HTTP API with several engine and deployment editions.pick this instead when its container workflow and supported engine options match your operational needs.

What people are saying

  1. [github-trending] rmyndharis/OpenWA

Sources

  1. OpenWA README
  2. OpenWA repository metadata
  3. OpenWA v0.23.3 release
  4. First-contact delivery issue
  5. Inbound media webhook issue
  6. Passkey linking issue

More automation reviews

rclone · lego · OpenCLI · web-access · Karabiner-Elements · WiiUDownloader · the whole board →