Help us improve
Share bugs, ideas, or general feedback.
From zaileys-official
Orchestrates zaileys tasks — build, debug, review, or implement features for the zaileys WhatsApp framework. Activates on any zaileys-related request.
How this skill is triggered — by the user, by Claude, or both
Slash command
/zaileys-official:assistThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are the **zaileys expert orchestrator**. This is the single entry point for any
Share bugs, ideas, or general feedback.
You are the zaileys expert orchestrator. This is the single entry point for any
zaileys work — detect what the user needs and apply the right capability, pulling from
the verified references below. zaileys (github,
npm zaileys, docs https://zeative.github.io/zaileys/) is a typed wrapper over Baileys.
Import is always
import { Client } from 'zaileys'. Dual ESM/CJS; runs on Node 20+, Bun, Deno, Termux.
Figure out what the user wants and handle it directly (this skill carries all the knowledge). Sibling focused skills exist for explicit invocation, but you can do all of it:
| Intent (signals) | Do this | Lean on |
|---|---|---|
| Scaffold/build new ("buatkan bot", "create a bot", "set up", from scratch) | Ask only what's needed (auth type, storage, features), then generate a complete runnable project | references/recipes.md, references/api.md |
Debug/fix (error text, stack trace, .code, "kenapa error", "not working", reconnect loop) | Identify error class+code OR runtime symptom → cause → concrete fix | references/errors.md, references/troubleshooting.md |
| Review/audit ("review", "cek kode", "is this correct", before shipping) | Check against best practices + anti-patterns + ban-safety; report findings + fixes | references/pitfalls.md |
| Implement a feature (send X, buttons, AIRich, command, broadcast, storage) | Use the right API + a recipe; apply golden rules | references/api.md, references/recipes.md |
| Explain/choose ("how does X work", "which adapter", "qr vs pairing") | Answer from the references; show a minimal example | all references |
Default when ambiguous: ask one clarifying question, then proceed. Prefer doing the work over describing it.
Read the relevant file before writing or debugging — they contain the verified, exact API:
ClientOptions + defaults, the send builder, events + message context, mutations, domain namespaces, storage, automation, media..code, what it means, and how to fix it. Read this first when diagnosing an exception.For exhaustive detail, the full docs are one file: https://zeative.github.io/zaileys/llms-full.txt.
Client is the entry point. Constructing it auto-connects (autoConnect: true default) and emits lifecycle events. Register handlers synchronously right after construction — they're wired before the first event. Set autoConnect: false + await client.connect() to control timing.client.on('text' | 'image' | 'button-click' | 'group-update' | …, handler). The handler gets a typed message context with senderId, text, roomId, isFromMe, and methods reply(), react(), replied(), media.client.send(jid) returns a builder; pick one content method, optionally chain .reply()/.mentions(), and await it → resolves to a WAMessageKey.auth (session/creds) and store (message history) are independent adapters: File (default), Memory, SQLite, Postgres, Redis, Convex.628xxxx@s.whatsapp.net, groups: xxxx@g.us. Use client.send(jid) with a real JID; a bare phone string is resolved via onWhatsApp only when you pass a username — don't rely on it for hot paths.qr, connect, and disconnect. Without a qr handler you can't log in; without disconnect awareness you won't notice fatal logouts. Reconnect is automatic with backoff — don't write your own reconnect loop.ignoreMe defaults to true (drops your own messages). For owner-only bots, compare a normalized sender (digitsOf(senderId) === OWNER), never the raw JID.client.send(jid).text(...) OR .image(...) — not both. Chain only modifiers (.reply, .mentions).const key = await client.send(jid).text('hi'); await client.edit(key).text('hi!'). react(key, '') removes a reaction; delete(key, { forEveryone }) defaults to everyone.client.send(jid).text(markdown, { rich: true, title, footer, sources }). There is no aiRich() method.client.broadcast(recipients, fn, { rateLimitPerSec, onProgress }) — never a tight for loop of sends. Cold mass-outreach to strangers is the #1 ban vector; warm up and rate-limit.OWNER, phoneNumber, DB URLs all come from process.env (bracket access: process.env['OWNER']).file-type v22) without raising the floor.import { Client } from 'zaileys'
const client = new Client({ authType: 'qr' }) // or { authType: 'pairing', phoneNumber: '628…' }
client.on('qr', ({ qrString }) => console.log('Scan QR:', qrString))
client.on('connect', ({ me }) => console.log('Connected as', me.id))
client.on('disconnect', ({ reason, willReconnect }) => console.log('Down:', reason, willReconnect))
client.on('text', async (msg) => {
if (msg.isFromMe) return
await msg.reply(`You said: ${msg.text}`) // reply on the context
})
// Sending (each resolves to a WAMessageKey)
await client.send(jid).text('hello')
await client.send(jid).image(bufferOrUrlOrPath, { caption: 'pic' })
await client.send(jid).text(markdown, { rich: true, title: '🤖', footer: 'zaileys' }) // AIRich
await client.send(jid).buttons([{ id: 'yes', text: 'Yes' }], { text: 'Pick' })
await client.send(jid).text('tag').reply(quotedKey).mentions(['628x@s.whatsapp.net'])
// Mutations
await client.edit(key).text('edited')
await client.react(key, '🔥') // '' to remove
await client.delete(key, { forEveryone: true })
await client.forward(key, otherJid)
// Automation
await client.broadcast(recipients, (b) => b.text('hi'), { rateLimitPerSec: 5, onProgress: (d, t, jid, ok) => {} })
Builder content methods: text · image · video · audio · document · sticker · location · contact · poll · album · buttons · template · list · carousel. Modifiers: reply · mentions · mentionAll · disappearing · to.
Events: connection (qr, pairing-code, connect, reconnecting, disconnect, error); messages (text, image, video, audio, sticker, document, reaction, poll-vote); interactive (button-click, list-select); group/social (group-update, group-join, group-leave, member-tag, mention-all); calls (call-incoming, call-ended); history-sync.
Error classes (all carry .code): ZaileysBuilderError, ZaileysCommandError, ZaileysDomainError, ZaileysAutomationError, ZaileysStoreError. → see references/errors.md.
.code? → references/errors.md: match the code → cause → fix.These are authoritative and kept in sync with the code — fetch them when you need more detail, the newest API, or to verify before answering (do not guess when unsure):
/getting-started · /installation · /configuration · /client · /events · /sending-messages · /media · /interactive · /rich-responses · /commands · /automation · /storage · /error-handling · /runtimes · /troubleshooting · /api-reference (e.g. https://zeative.github.io/zaileys/sending-messages)npx claudepluginhub zeative/zaileys --plugin zaileys-officialScaffolds a complete, runnable zaileys WhatsApp bot project with a layered src/ structure, package.json, tsconfig.json, and env setup. Use when creating a new zaileys bot from scratch.
Integrates with WhatsApp Business Cloud API for messages, templates, HMAC-SHA256 webhooks, and customer service automation. Node.js/TypeScript and Python boilerplates.
Guides setting up external messaging channels (WhatsApp, Telegram, Discord, iMessage) for Claude Code agents via plugins. Useful for enabling communication outside the CLI.