← Back to Skills
Communication

whatsapp-ultimate

globalcaos By globalcaos 👁 6 views ▲ 0 votes

Complete WhatsApp integration β€” messages, media, polls, stickers, voice notes, reactions, FTS5 history search, voice transcription. Native Baileys, zero Docker.

GitHub
---
name: whatsapp-ultimate
version: 1.8.1
description: "Complete WhatsApp integration for OpenClaw agents β€” send messages, media, polls, stickers, voice notes, reactions & replies. Search chat history with full-text search (SQLite + FTS5). Download & transcribe voice messages. Import chat exports. Full history resync. NEW: πŸ€” Thinking Reaction β€” visible progress indicator that works in groups (workaround for WhatsApp's broken typing indicator on linked devices). Owner voice messages bypass prefix filters. Native Baileys β€” zero Docker, zero external tools. Works alongside OpenClaw's built-in WhatsApp channel."
homepage: https://github.com/globalcaos/clawdbot-moltbot-openclaw
repository: https://github.com/globalcaos/clawdbot-moltbot-openclaw
metadata:
  openclaw:
    emoji: "πŸ“±"
    requires:
      channels: ["whatsapp"]
    tags:
      - whatsapp
      - messaging
      - chat
      - voice-notes
      - group-management
      - message-history
      - search
      - media
      - polls
      - stickers
      - reactions
      - thinking-indicator
      - progress-indicator
      - typing-indicator
      - voice-messages
      - baileys
---

# WhatsApp Ultimate

**Send messages, media, polls, voice notes, and manage groups β€” all from your AI agent. Search your entire WhatsApp history instantly.**

The most complete WhatsApp skill for OpenClaw. Native Baileys integration β€” no Docker, no CLI tools, no external services. Just connect and go.

---

## Prerequisites

- OpenClaw with WhatsApp channel configured
- WhatsApp account linked via QR code (`openclaw whatsapp login`)

---

## Capabilities Overview

| Category         | Features                                                                    |
| ---------------- | --------------------------------------------------------------------------- |
| **Messaging**    | Text, media, polls, stickers, voice notes, GIFs                             |
| **Interactions** | Reactions, replies/quotes, edit, unsend                                     |
| **Groups**       | Create, rename, icon, description, participants, admin, invite links        |
| **Progress**     | πŸ€” Thinking reaction (visible processing indicator for groups)              |
| **Media Bypass** | Owner voice/media messages bypass prefix filters in groups                  |
| **History**      | Persistent SQLite storage, FTS5 full-text search, import historical exports |
| **Resync**       | Full history re-sync via re-link, automatic backup & restore                |

**Total: 24 distinct actions + searchable history**

---

## πŸ€” Thinking Reaction (Progress Indicator)

**The problem:** WhatsApp linked devices (Baileys, Web API) cannot show "typing..." indicators in group chats. This is a WhatsApp server-side limitation β€” the protocol sends the `chatstate` XML node correctly, but WhatsApp's servers don't relay composing presence from companion devices to group participants. Confirmed in [Baileys #866](https://github.com/WhiskeySockets/Baileys/issues/866).

**The solution:** When your agent starts processing a message, it instantly reacts with πŸ€” on the triggering message. When the reply is ready, the reaction is automatically removed. This gives users immediate visual feedback that the agent is working β€” no more wondering if your message was received.

**How it works:**
1. Message arrives β†’ agent reacts with πŸ€” (instant, <100ms)
2. Agent processes (tools, thinking, API calls...)
3. Reply delivered β†’ πŸ€” removed automatically

**Works in:** Groups βœ… | DMs βœ… | All chat types

This is the **only WhatsApp skill** that solves the invisible-typing-indicator problem. Every other WhatsApp integration leaves users staring at silence while the agent thinks.

---

## Owner Media Bypass

Voice messages and media from the bot owner now bypass the `triggerPrefix` filter in groups. Previously, a voice note sent in a group with `triggerPrefix: "Jarvis"` would be silently dropped because audio can't carry a text prefix. Now owner media messages are automatically routed to the agent.

---

## Messaging

### Send Text

```
message action=send channel=whatsapp to="+34612345678" message="Hello!"
```

### Send Media (Image/Video/Document)

```
message action=send channel=whatsapp to="+34612345678" message="Check this out" filePath=/path/to/image.jpg
```

Supported: JPG, PNG, GIF, MP4, PDF, DOC, etc.

### Send Poll

```
message action=poll channel=whatsapp to="+34612345678" pollQuestion="What time?" pollOption=["3pm", "4pm", "5pm"]
```

### Send Sticker

```
message action=sticker channel=whatsapp to="+34612345678" filePath=/path/to/sticker.webp
```

Must be WebP format, ideally 512x512.

### Send Voice Note

```
message action=send channel=whatsapp to="+34612345678" filePath=/path/to/audio.ogg asVoice=true
```

**Critical:** Use OGG/Opus format for WhatsApp voice notes. MP3 may not play correctly.

### Send GIF

```
message action=send channel=whatsapp to="+34612345678" filePath=/path/to/animation.mp4 gifPlayback=true
```

Convert GIF to MP4 first (WhatsApp requires this):

```bash
ffmpeg -i input.gif -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4 -y
```

---

## Interactions

### Add Reaction

```
message action=react channel=whatsapp chatJid="[email protected]" messageId="ABC123" emoji="πŸš€"
```

### Remove Reaction

```
message action=react channel=whatsapp chatJid="[email protected]" messageId="ABC123" remove=true
```

### Reply/Quote Message

```
message action=reply channel=whatsapp to="[email protected]" replyTo="QUOTED_MSG_ID" message="Replying to this!"
```

### Edit Message (Own Messages Only)

```
message action=edit channel=whatsapp chatJid="[email protected]" messageId="ABC123" message="Updated text"
```

### Unsend/Delete Message

```
message action=unsend channel=whatsapp chatJid="[email protected]" messageId="ABC123"
```

---

## Group Management

### Create Group

```
message action=group-create channel=whatsapp name="Project Team" participants=["+34612345678", "+34687654321"]
```

### Rename Group

```
message action=renameGroup channel=whatsapp groupId="[email protected]" name="New Name"
```

### Set Group Icon

```
message action=setGroupIcon channel=whatsapp groupId="[email protected]" filePath=/path/to/icon.jpg
```

### Set Group Description

```
message action=setGroupDescription channel=whatsapp groupJid="[email protected]" description="Team chat for Q1 project"
```

### Add Participant

```
message action=addParticipant channel=whatsapp groupId="[email protected]" participant="+34612345678"
```

### Remove Participant

```
message action=removeParticipant channel=whatsapp groupId="[email protected]" participant="+34612345678"
```

### Promote to Admin

```
message action=promoteParticipant channel=whatsapp groupJid="[email protected]" participants=["+34612345678"]
```

### Demote from Admin

```
message action=demoteParticipant channel=whatsapp groupJid="[email protected]" participants=["+34612345678"]
```

### Leave Group

```
message action=leaveGroup channel=whatsapp groupId="[email protected]"
```

### Get Invite Link

```
message action=getInviteCode channel=whatsapp groupJid="[email protected]"
```

Returns: `https://chat.whatsapp.com/XXXXX`

### Revoke Invite Link

```
message action=revokeInviteCode channel=whatsapp groupJid="[email protected]"
```

### Get Group Info

```
message action=getGroupInfo channel=whatsapp groupJid="[email protected]"
```

Returns: name, description, participants, admins, creation date.

---

## Access Control

### DM Policy

Control who can DM your agent in `openclaw.json`:

```json
{
  "channels": {
    "whatsapp": {
      "dmPolicy": "allowlist",
      "allowFrom": ["+34612345678", "+14155551234"],
      "triggerPrefix": "Jarvis"
    }
  }
}
```

| Policy        | Behavior                                |
| ------------- | --------------------------------------- |
| `"open"`      | Anyone can DM                           |
| `"allowlist"` | Only numbers in `allowFrom` can DM      |
| `"pairing"`   | Unknown senders get pairing code prompt |
| `"disabled"`  | No DMs accepted                         |

### Group Policy

```json
{
  "channels": {
    "whatsapp": {
      "groupPolicy": "open",
      "groupAllowFrom": ["+34612345678", "+14155551234"]
    }
  }
}
```

| Policy        | Behavior                              |
| ------------- | ------------------------------------- |
| `"open"`      | Responds to mentions in any group     |
| `"allowlist"` | Only from senders in `groupAllowFrom` |
| `"disabled"`  | Ignores all group messages            |

### Self-Chat Mode

```json
{
  "channels": {
    "whatsapp": {
      "selfChatMode": true
    }
  }
}
```

Allows messaging yourself (your "Note to Self" chat) to interact with the agent.

### Trigger Prefix

```json
{
  "channels": {
    "whatsapp": {
      "triggerPrefix": "Jarvis"
    }
  }
}
```

Messages must start with this prefix to trigger the agent. Works in:

- Self-chat
- Allowed DMs
- Any DM where you (the owner) message with the prefix

---

## JID Formats

WhatsApp uses JIDs (Jabber IDs) internally:

| Type       | Format                    | Example                      |
| ---------- | ------------------------- | ---------------------------- |
| Individual | `<number>@s.whatsapp.net` | `[email protected]` |
| Group      | `<id>@g.us`               | `[email protected]`    |

When using `to=` with phone numbers, OpenClaw auto-converts to JID format.

---

## Tips

### Resolving Group Names

The history database often has `NULL` for `chat_name`. To get a group's display name, use:

```
message action=getGroupInfo channel=whatsapp target="<group-jid>"
```

Returns: `subject` (group name), `description`, full participant list with admin roles.

**Always refer to groups by name when talking to humans** β€” JIDs are internal identifiers only.

### Voice Notes

Always use OGG/Opus format:

```bash
ffmpeg -i input.wav -c:a libopus -b:a 64k outp

... (truncated)
communication

Comments

Sign in to leave a comment

Loading comments...