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

whatsapp-web.js review

whatsapp-web.js is a Node.js library that controls a linked WhatsApp account through WhatsApp Web in a managed browser. It lets developers send and receive messages, media, reactions, polls, and group actions without using Meta's official business API.

+25stars / 7d
Verdict

Our run installed 427 packages in 36 seconds, then the tests failed after 9 seconds and npm audit found 20 vulnerabilities, so whatsapp-web.js needs active ownership even before WhatsApp Web changes underneath it. Use it for a personal or internal workflow when its broad Web feature access is worth running Chromium and accepting account risk. Use Meta's official API for customer-critical business messaging where authorization and predictable support matter more.

We ran it

Lab card: what happened when we ran whatsapp-web.jsScreenshot of whatsapp-web.js (wwebjs.dev)
Install✓ · 36s427 packages · 186 MB
Buildn/ano build script
Tests✗ · 9sran, no count parsed
Known vulns200 critical · 17 high · 2 moderate · 1 low (npm audit)
Repo186 files~15,222 lines of source · 2.6 MB · 9 CI workflows · tests dir

Answers from our run

Does whatsapp-web.js build from source?

Dependencies installed in 36 seconds (427 packages), and the project has no separate build step. We cloned commit 942d236 into a clean Debian container with 3 CPUs and no project-specific setup.

Do whatsapp-web.js's tests pass?

The test command failed in our container, and its output did not report a pass or fail count.

Does whatsapp-web.js have known vulnerabilities in its dependencies?

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

Who should not use whatsapp-web.js?

Businesses that require an authorized WhatsApp integration: the README says the project is unofficial, WhatsApp does not allow bots or unofficial clients, and blocking is still possible.

What are the alternatives to whatsapp-web.js?

Baileys, WPPConnect, Evolution API. Our run installed 427 packages in 36 seconds, then the tests failed after 9 seconds and npm audit found 20 vulnerabilities, so whatsapp-web.

Setup3/536s install, then QR auth, browser, and session storage
Docs4/5Useful API and auth guides with clear platform warnings
Community5/522,474 stars, recent pushes, and active issue handling
Maturity3/5v1.34.7 is established, but Web changes break internals

Who it’s for

Node.js developers building personal tools or internal WhatsApp workflows.
Teams that accept QR pairing, a running browser, and unofficial-client risk.
Projects that need WhatsApp Web features such as groups, polls, reactions, or media.
Operators prepared to preserve sessions and watch upstream WhatsApp Web changes.

Who it’s NOT for

Businesses that require an authorized WhatsApp integration: the README says the project is unofficial, WhatsApp does not allow bots or unofficial clients, and blocking is still possible.
Serverless deployments with ephemeral disks that plan to use LocalAuth: the guide says LocalAuth needs a persistent filesystem.
Workflows where incoming media must never fail: open issue #201833 reports downloadMedia() failing on released version 1.34.7 across images and PDFs.
Teams with a zero-high-advisory dependency policy: our npm audit found 17 high-severity vulnerabilities.
Operators unwilling to run Chrome or Chromium: Puppeteer is central, and sending H.264 or AAC video needs a separately installed Chrome browser.

Setup reality

Our npm install succeeded in 36 seconds, adding 427 packages and using 186 MB. The repository has no build script, so build was skipped. Tests failed with exit 1 after 9 seconds, and npm audit reported 20 known vulnerabilities: 17 high, 2 moderate, 1 low, and 0 critical.

Actual use needs Node.js 18 or newer, a WhatsApp account, and an initial QR scan or pairing flow. LocalAuth writes browser session data to persistent storage. RemoteAuth needs an external store such as MongoDB or S3 plus its credentials and additional packages.

Puppeteer launches a browser and headless Linux hosts need Chromium system libraries. The guide suggests disabling Chromium sandboxes in some no-GUI or root setups, which needs a security review. Sending videos and GIFs with H.264 or AAC requires installed Google Chrome because bundled Chromium lacks those codecs.

WhatsApp Web gives broad access without an official contract

whatsapp-web.js wraps WhatsApp Web in a Node.js client. Puppeteer opens a managed browser, the library injects code into the page, and your application receives events for messages and account activity. The published feature table covers text, media, locations, contacts, replies, group administration, reactions, polls, channels, and blocking. Buttons and lists are marked deprecated, while communities are shown only as a future aspiration.

The attraction is obvious for a developer who already uses WhatsApp on a phone. A short example scans a QR code, waits for ready, and replies to !ping. There is no Meta app review in that path. The cost is equally plain in the README: this project is neither affiliated with nor authorized by WhatsApp, bots and unofficial clients are disallowed, and the maintainers cannot guarantee that an account will avoid blocking.

QR authentication needs storage that survives restarts

The default authentication strategy saves nothing, so every restart requires another QR scan. LocalAuth stores a Chromium user directory, including session state, beneath .wwebjs_auth unless you choose another path. It is the easiest documented option for one durable host. The guide explicitly says it does not work out of the box on platforms with ephemeral filesystems. Back up and restrict that directory because it represents a linked account session.

RemoteAuth moves session archives into a separate store. The guide documents MongoDB and S3 adapters, each adding packages, credentials, and recovery behavior. A remote session may take about 1 minute to save after initial pairing, and the ready event does not prove that backup has finished. Multiple clients also need distinct identifiers. These details turn a demo bot into a stateful service that needs storage monitoring and restore tests.

What happened when we ran it

Our sandbox installed commit 942d236 in 36 seconds. Npm added 427 packages and used 186 MB on disk. There is no build script or target in the package, so the lab skipped that step. The checkout itself had 186 files, about 15,222 lines of source, and a 2.6 MB repository footprint. Nine CI workflow files and a tests directory were present; no Dockerfile was present.

The test command failed with exit code 1 after 9 seconds. The supplied log tail contains Node module loading, dynamic import, and Mocha loadFilesAsync frames, followed by no summary lines. It does not show the originating error message, failed assertion, or test count. We can say the suite did not start or finish successfully in that fresh Node 22 container. The log does not support a claim about why.

Npm audit found 20 known vulnerabilities in the installed tree: 17 high, 2 moderate, 1 low, and 0 critical. That result belongs to our measured commit and dependency resolution. It is enough to require an advisory review before deployment, especially because Puppeteer and its browser-facing dependencies process content controlled by incoming messages and WhatsApp Web.

Chromium is part of the production footprint

Puppeteer is a direct dependency, currently pinned in the measured package alongside media and fetch helpers. A headless Linux host needs the browser's system libraries. The installation guide supplies a long Debian package command for that case. It also suggests --no-sandbox and --disable-setuid-sandbox for some no-GUI or root launches. Those flags reduce browser isolation, so a production service should use an unprivileged container or host design that avoids them where possible.

Bundled Chromium also lacks licensed AAC and H.264 support. The attachment guide says video and GIF sending with those codecs requires Google Chrome and an explicit executable path. Incoming files arrive as base64 data and may be missing or unavailable, so handlers must accept an undefined download result, set size limits, catch rejected promises, and keep untrusted media away from unsafe decoders.

WhatsApp Web changes can break media between releases

Open issue #201833 reports that downloadMedia() throws an opaque r: r error for incoming images and PDFs on whatsapp-web.js 1.34.7. The reporter reproduced it with live WhatsApp Web and a strict archived snapshot, while text reception continued. The issue was updated on August 25, 2026. That is a specific warning for archiving, support inboxes, and document workflows that depend on every attachment arriving.

Other current reports and pull requests discuss renamed internal fields, empty chat results, session persistence, and media compatibility. This failure pattern follows the architecture: code injected into a web client depends on internal structures that WhatsApp can change without maintaining a public contract for this library. Pinning npm dependencies helps reproduce your side, but it cannot freeze the remote page unless you also operate and test a compatible web-version cache.

August code activity is newer than the April release

GitHub recorded the last repository push on August 23, 2026 and showed 98 combined issues and pull requests. The latest release, v1.34.7, was published on April 24, 2026. Its notes contain fixes for authentication timeouts, disconnect events, group metadata, media captions, reactions, contacts, and session storage. The newer push and active issue work argue against calling the project abandoned; they also show how much maintenance tracks WhatsApp's moving internals.

Apache 2.0 covers the library code, and 22,474 GitHub stars indicate a large audience. Neither fact changes WhatsApp's platform policy. Adopt whatsapp-web.js only with a disposable test account first, explicit reconnect handling, durable session backups, dependency remediation, and alarms around message or media failures. For an account tied to paid customer service, an official business integration is the safer purchasing decision.

Alternatives

ProjectWhat it isPick it when
BaileysA TypeScript socket client for WhatsApp Web that does not drive a browser.pick this instead when avoiding a resident Chromium process matters and unofficial access is still acceptable.
WPPConnectAnother Node.js layer over WhatsApp Web for messaging and support automation.pick this instead when its session tooling and API shape better match an existing WPPConnect deployment.
Evolution API gh↗A self-hosted HTTP API that packages WhatsApp integrations behind a service.pick this instead when applications need a shared HTTP service instead of embedding a client library.
WhatsApp Cloud APIMeta's official hosted API for approved business messaging workflows.pick this instead when platform authorization, business support, and policy compliance outweigh WhatsApp Web feature access.

What people are saying

  1. [github-trending] wwebjs/whatsapp-web.js

Sources

  1. whatsapp-web.js README
  2. Authentication guide
  3. Attachment handling guide
  4. v1.34.7 release
  5. Media download failure issue #201833

More automation reviews

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