venom is a free, open source ai interaction & interfaces project written in TypeScript and released under Apache-2.0. It has 6,597 GitHub stars, 1,324 forks and 62 open issues, and was last pushed 2 months ago. On this registry it ranks #54 of 156 tracked projects in AI Interaction & Interfaces, with 5 head-to-head comparisons available. It gained 13 stars over the last 30 tracked days.

What is venom?

Venom is an Apache-2.0 TypeScript framework that drives WhatsApp Web through Puppeteer, giving JavaScript and TypeScript developers a programmatic API for chatbots, customer-service flows and message automation.

What it is

Venom is a Node.js library that automates a WhatsApp Web session and exposes it through a JavaScript API. Version 6 is a full rewrite: pure Puppeteer with no puppeteer-extra and no stealth plugins, updated WhatsApp Web modules such as WAWebSocketModel and WAWebConnModel, TypeScript 5.7+ with strict types, a Pino logger for structured logging, and a codebase reduced to six source files from more than eighty. It lives in the npm and Node.js ecosystem, requires Node.js 18 or later, and downloads Chromium automatically at install time.

The concrete problem it solves is the gap between WhatsApp as a closed messaging product and the need to drive it from application code. Instead of manually operating a client, a developer calls methods such as create({ session: 'venom-bot' }), scans a QR code once, and then handles inbound events with client.onMessage while sending text, media, documents, stickers, locations, polls and list menus through named send methods. Sessions persist automatically, so a restart does not require rescanning. It replaces the general-purpose browser-automation scripting that developers would otherwise have to build themselves on top of raw Puppeteer.

Key capabilities

  • Messaging coverage includes sendText, sendImage, sendImageFromBase64, sendFile, sendFileFromBase64, sendVoice, sendImageAsSticker, sendImageAsStickerGif, sendLocation, sendLinkPreview, sendContactVcard, sendContactVcardList, sendPollCreation and sendListMenu.
  • Human-like sending through sendTextViaTyping and sendPhotoVideoViaTyping, which attach typing indicators before delivery.
  • Conversation control with reply to an original message id, forwardMessages for batch forwarding, and sendMentioned for user mentions.
  • Data retrieval from the live session: getAllChats, getAllContacts, getUnreadMessages, getAllMessagesInChat, and getProfilePicFromServer.
  • Session persistence out of the box, with automatic saving so QR scanning is a one-time step per session.
  • Multi-session support for scaling, built on a modular architecture designed to be extended.
  • Deployment of the runtime is handled for the user: Chromium is fetched during npm install, and logging goes through Pino rather than ad-hoc console output.

Who uses it and how

  • Developers building WhatsApp chatbots in JavaScript or TypeScript, using the ai and chatbot topics as the intended framing for conversational flows.
  • Customer-service implementations where inbound messages are read through getUnreadMessages and getAllMessagesInChat and answered with text, documents or menu lists.
  • Media and notification pipelines that push images, audio, video and PDFs to chats via sendImage, sendVoice and sendFile.
  • Teams that need several WhatsApp identities at once, using multi-session support rather than running a separate process per account.
  • The README states the library is battle-tested in production by thousands of developers, with 6,580 stars and 1,331 forks on GitHub, and it is part of the Orkestral ecosystem hosted at orkestral.io.

Getting started

Install with npm install venom-bot on Node.js 18 or later; Chromium downloads automatically during install. Nightly builds are available as venom-bot-nightly.tgz from the releases page, and installation from source uses npm install github:orkestral/venom.

How it compares

No comparable or paid alternative products are named in the facts for this entry, and no replacement list is provided, so Venom stands alone in this registry on the evidence available.

When to use it — and when not to

A self-hoster must operate a Node.js 18+ runtime and hold a live WhatsApp Web session tied to a scanned QR code, and the project depends on WhatsApp Web internals that can change outside its control. Version 6 drops puppeteer-extra and stealth plugins, so workarounds for detection are no longer bundled. Choose something else if a supported, officially sanctioned WhatsApp Business API is a requirement, or if the project must run on Node.js versions below 18.

project readme (upstream, from github) — read inline

Venom

Venom v6

The next generation of WhatsApp automation. Completely rebuilt.

npm node downloads build license


Why Venom?

Venom is not just another library. It's a complete automation platform designed from the ground up for performance, reliability, and developer experience.

Built on top of proven technologies, Venom gives you full control over WhatsApp Web through a clean, intuitive API — whether you're building a simple chatbot or a large-scale enterprise solution.

  Blazing fast message processing
  Session persistence out of the box
  Modular architecture — extend with ease
  Multi-session support for scaling
  Battle-tested in production by thousands of developers

What's new in v6

  Rewritten from scratch — cleaner, simpler codebase
  Pure Puppeteer — no puppeteer-extra, no stealth plugins
  Updated WhatsApp Web modules (WAWebSocketModel, WAWebConnModel, etc.)
  Chromium auto-download on npm install
  Node.js 18+ required
  TypeScript 5.7+ with strict types
  Pino logger — fast, structured logging
  Only 6 source files — down from 83+

Install

Requires Node.js 18+. Chromium is downloaded automatically on install.

npm install venom-bot
🧪 Nightly builds
npm install https://github.com/orkestral/venom/releases/download/nightly/venom-bot-nightly.tgz
📦 Install from source
npm install github:orkestral/venom

Quick Start

Get a fully functional bot running in under 30 seconds.

import { create } from 'venom-bot';

create({ session: 'venom-bot' }).then((client) => {

  client.onMessage(async (message) => {
    if (message.body === 'hello') {
      await client.sendText(message.from, 'Hey there! 👋 I\'m running on Venom.');
    }
  });

});

Scan the QR code that appears in your terminal. Done — you're live.

[!TIP] Sessions are saved automatically. No need to re-scan on every restart.


Capabilities

Messaging

Send anything. Text, images, videos, documents, audio, stickers, locations, polls — you name it.

// Text
await client.sendText(chatId, 'Hello from Venom 🕷️');

// Image with caption
await client.sendImage(chatId, './photo.jpg', 'photo', 'Check this out!');

// Image from base64
await client.sendImageFromBase64(chatId, base64Image, 'image');

// Document
await client.sendFile(chatId, './report.pdf', 'report.pdf', 'Monthly report');

// Document from base64
await client.sendFileFromBase64(chatId, base64File, 'file.pdf', 'Description');

// Audio
await client.sendVoice(chatId, './message.mp3');

// Sticker
await client.sendImageAsSticker(chatId, './sticker.png');

// Animated sticker
await client.sendImageAsStickerGif(chatId, './animation.gif');

// Location
await client.sendLocation(chatId, '-23.5505', '-46.6333', 'São Paulo, Brazil');

// Link with auto-preview
await client.sendLinkPreview(chatId, 'https://github.com/orkestral/venom', 'Venom Bot');

// Contact card
await client.sendContactVcard(chatId, 'contact@c.us', 'John Doe');

// Multiple contact cards
await client.sendContactVcardList(chatId, ['user1@c.us', 'user2@c.us']);

// Poll
await client.sendPollCreation(chatId, {
  name: 'Best framework?',
  options: [{ name: 'Venom' }, { name: 'Others' }],
  selectableOptionsCount: 1
});

// List menu
await client.sendListMenu(chatId, 'Menu', 'Subtitle', 'Choose an option', 'Select', [
  {
    title: 'Category A',
    rows: [{ title: 'Option 1', description: 'First option' }]
  }
]);

Smart Sending

// Send with typing indicator
await client.sendTextViaTyping(chatId, 'This feels more natural...');

// Send photo/video with typing simulation
await client.sendPhotoVideoViaTyping(chatId, './sunset.jpg', 'Beautiful sunset');

// Reply to a message
await client.reply(chatId, 'Got it!', originalMessageId);

// Forward messages
await client.forwardMessages(chatId, [messageId1, messageId2]);

// Mention users
await client.sendMentioned(chatId, 'Hey @5511999999999!', ['5511999999999']);

Data Retrieval

const chats    = await client.getAllChats();
const contacts = await client.getAllContacts();
const unread   = await client.getUnreadMessages();
const messages = await client.getAllMessagesInChat(chatId);
const profile  = await client.getProfilePicFromServer(chatId);
const status   = await client.checkNumberStatus(chatId);
const blocked  = await client.getBlockList();

Group Management

// Create a group
await client.createGroup('Team Chat', ['user1@c.us', 'user2@c.us']);

// Manage participants
await client.addParticipant(groupId, 'user@c.us');
await client.removeParticipant(groupId, 'user@c.us');

// Admin controls
await client.promoteParticipant(groupId, 'user@c.us');
await client.demoteParticipant(groupId, 'user@c.us');

// Group info
await client.getGroupMembers(groupId);
await client.getGroupAdmins(groupId);
await client.getGroupInviteLink(groupId);
await client.setGroupDescription(groupId, 'Our awesome group');

// Join via invite
await client.joinGroup(inviteCode);

// Leave
await client.leaveGroup(groupId);

Profile & Device

await client.setProfileStatus('Building something amazing 🚀');
await client.setProfileName('Venom Bot');
await client.setProfilePic('./avatar.jpg');
await client.getHostDevice();
await client.getConnectionState();
await client.getBatteryLevel();
await client.isConnected();
await client.getWAVersion();

Chat Operations

await client.sendSeen(chatId);
await client.startTyping(chatId);
await client.deleteChat(chatId);
await client.clearChatMessages(chatId);
await client.archiveChat(chatId, true);
await client.pinChat(chatId, true);
await client.blockContact(chatId);
await client.unblockContact(chatId);
await client.sendMute(chatId, 30, 'minutes');

Events

Build reactive bots with powerful event listeners.

// Incoming messages
client.onMessage((msg) => { /* handle message */ });
client.onAnyMessage((msg) => { /* all messages including groups */ });

// Message status tracking
client.onAck((ack) => {
  // -7 MD_DOWNGRADE | -6 INACTIVE | -5 CONTENT_UNUPLOADABLE
  // -4 CONTENT_TOO_BIG | -3 CONTENT_GONE | -2 EXPIRED | -1 FAILED
  //  0 CLOCK | 1 SENT | 2 RECEIVED | 3 READ | 4 PLAYED
});

// Connection state
client.onStateChange((state) => {
  // CONFLICT | CONNECTED | DEPRECATED_VERSION | OPENING | PAIRING
  // PROXYBLOCK | TIMEOUT | TOS_BLOCK | UNLAUNCHED | UNPAIRED
});

// Live location
client.onLiveLocation(chatId, (location) => { /* track location */ });

// Group participants
client.onParticipantsChanged(groupId, (event) => { /* member joined/left */ });

// Added to group
client.onAddedToGroup((chat) => { /* handle new group */ });

// Incoming calls
client.onIncomingCall(async (call) => {
  await client.sendText(call.peerJid, "I'm a bot, can't take calls 📞");
});

File Downloads

Download any media received — images, videos, audio, documents. Fast.

import * as fs from 'fs';
import * as mime from 'mime-types';

client.onMessage(async (message) => {
  if (message.isMedia || message.isMMS) {
    const buffer = await client.decryptFile(message);
    const fileName = `file.${mime.extension(message.mimetype)}`;
    fs.writeFileSync(fileName, buffer);
  }
});

Advanced Configuration

Full control over every aspect of the browser and session.

create({
  session: 'production',

  catchQR: (base64Qr, asciiQR, attempts, urlCode) => {
    console.log(`Scan attempt ${attempts}`);
  },

  statusFind: (status, session) => {
    console.log(`[${session}] Status: ${status}`);
  },

  options: {
    // Browser
    headless: 'new',
    devtools: false,
    browserWS: '',
    browserPathExecutable: '',
    puppeteerOptions: {},
    browserArgs: [''],
    addBrowserArgs: [''],

    // Session
    folderNameToken: 'tokens',
    mkdirFolderToken: '',
    createPathFileToken: false,

    // Logging
    debug: false,
    logQR: true,
    updatesLog: true,
    disableSpins: false,
    disableWelcome: false,

    // Connection
    autoClose: 60000,
    addProxy: [''],
    userProxy: '',
    userPass: ''
  },

  browserInstance: (browser, waPage) => {
    console.log('Browser PID:', browser.process().pid);
  }
});
📋 Session Status Reference
Status Description
isLogged Already authenticated
notLogged Awaiting QR scan
browserClose Browser closed
qrReadSuccess QR scanned successfully
qrReadFail QR scan failed
autocloseCalled Auto-close triggered
desconnectedMobile Phone disconnected
serverClose WebSocket closed
chatsAvailable Chat list loaded
deviceNotConnected Phone not connected
successChat Chat ready
waitForLogin Waiting for login
waitChat Loading chats

Session Resilience

Keep your bot running and handle disconnections gracefully.

client.onStateChange((state) => {
  if (state === 'CONFLICT') client.useHere();   // reclaim session
  if (state === 'UNPAIRED') console.log('Session expired');
});

// Graceful shutdown
process.on('SIGINT', () => client.close());

[!NOTE] Always call client.close() instead of killing the process — this ensures the session is saved properly.


Custom WhatsApp Web Version

create({
  session: 'custom-version',
  webVersion: '2.2402.5'  // pinned version
});

Available versions: wppconnect-team/wa-version


Building from Source

# Clone
git clone https://github.com/orkestral/venom.git && cd venom

# Install dependencies
npm install

# Build individual modules
npm run build:wapi
npm run build:middleware
npm run build:jsQR
npm run build:venom

# Or build everything at once
npm run build

Documentation

The complete documentation is available at orkestral.github.io/venom.

Every method, every parameter, every edge case — fully documented.


Contributing

We love contributions. Open an issue, submit a PR, or help improve the docs.

For major changes, please open an issue first to discuss the approach.


Orkestral — by vynect
Silicon Valley, California

Frequently asked questions

Is venom free to use?

venom is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does venom do?

Venom is a high-performance system developed with JavaScript to create a bot for WhatsApp, support for creating any interaction, such as customer service, media

What is venom written in?

venom is primarily written in TypeScript. Its source is publicly available at https://github.com/vynect/venom, and it has 6,597 GitHub stars.