Files
clawdbot/docs/clawd.md
Peter Steinberger f790f3f3ba fix/heartbeat ok delivery filter (#246)
* cron: skip delivery for HEARTBEAT_OK responses

When an isolated cron job has deliver:true, skip message delivery if the
response is just HEARTBEAT_OK (or contains HEARTBEAT_OK at edges with
short remaining content <= 30 chars). This allows cron jobs to silently
ack when nothing to report but still deliver actual content when there
is something meaningful to say.

Media is still delivered even if text is HEARTBEAT_OK, since the
presence of media indicates there's something to share.

* fix(heartbeat): make ack padding configurable

* chore(deps): update to latest

---------

Co-authored-by: Josh Lehman <josh@martian.engineering>
2026-01-05 22:52:13 +00:00

6.0 KiB
Raw Blame History

summary, read_when
summary read_when
End-to-end guide for running Clawdbot as a personal assistant with safety cautions
Onboarding a new assistant instance
Reviewing safety/permission implications

Building a personal assistant with CLAWDBOT (Clawd-style)

CLAWDBOT is a WhatsApp + Telegram + Discord gateway for Pi agents. This guide is the “personal assistant” setup: one dedicated WhatsApp number that behaves like your always-on agent.

⚠️ Safety first

Youre putting an agent in a position to:

  • run commands on your machine (depending on your Pi tool setup)
  • read/write files in your workspace
  • send messages back out via WhatsApp/Telegram/Discord

Start conservative:

  • Always set whatsapp.allowFrom (never run open-to-the-world on your personal Mac).
  • Use a dedicated WhatsApp number for the assistant.
  • Keep heartbeats disabled until you trust the setup (omit agent.heartbeat or set agent.heartbeat.every: "0m").

Prerequisites

  • Node 22+
  • CLAWDBOT available on PATH (recommended during development: from source + global link)
  • A second phone number (SIM/eSIM/prepaid) for the assistant

From source (recommended while the npm package is still settling):

pnpm install
pnpm build
pnpm link --global

You want this:

Your Phone (personal)          Second Phone (assistant)
┌─────────────────┐           ┌─────────────────┐
│  Your WhatsApp  │  ──────▶  │  Assistant WA   │
│  +1-555-YOU     │  message  │  +1-555-CLAWD   │
└─────────────────┘           └────────┬────────┘
                                       │ linked via QR
                                       ▼
                              ┌─────────────────┐
                              │  Your Mac       │
                              │  (clawdbot)      │
                              │    Pi agent     │
                              └─────────────────┘

If you link your personal WhatsApp to CLAWDBOT, every message to you becomes “agent input”. Thats rarely what you want.

5-minute quick start

  1. Pair WhatsApp Web (shows QR; scan with the assistant phone):
clawdbot login
  1. Start the Gateway (leave it running):
clawdbot gateway --port 18789
  1. Put a minimal config in ~/.clawdbot/clawdbot.json:
{
  whatsapp: {
    allowFrom: ["+15555550123"]
  }
}

Now message the assistant number from your allowlisted phone.

Give the agent a workspace (AGENTS.md)

Clawd reads operating instructions and “memory” from its workspace directory.

By default, Clawdbot uses ~/clawd as the agent workspace, and will create it (plus starter AGENTS.md, SOUL.md, TOOLS.md) automatically on setup/first agent run.

Tip: treat this folder like Clawds “memory” and make it a git repo (ideally private) so your AGENTS.md + memory files are backed up.

clawdbot setup

Optional: choose a different workspace with agent.workspace (supports ~).

{
  agent: {
    workspace: "~/clawd"
  }
}

The config that turns it into “an assistant”

CLAWDBOT defaults to a good assistant setup, but youll usually want to tune:

  • persona/instructions in SOUL.md
  • thinking defaults (if desired)
  • heartbeats (once you trust it)

Example:

{
  logging: { level: "info" },
  agent: {
    model: "anthropic/claude-opus-4-5",
    workspace: "~/clawd",
    thinkingDefault: "high",
    timeoutSeconds: 1800,
    // Start with 0; enable later.
    heartbeat: { every: "0m" }
  },
  whatsapp: {
    allowFrom: ["+15555550123"],
    groups: {
      "*": { requireMention: true }
    }
  },
  routing: {
    groupChat: {
      mentionPatterns: ["@clawd", "clawd"]
    }
  },
  session: {
    scope: "per-sender",
    resetTriggers: ["/new", "/reset"],
    idleMinutes: 10080
  }
}

Sessions and memory

  • Session files: ~/.clawdbot/sessions/{{SessionId}}.jsonl
  • Session metadata (token usage, last route, etc): ~/.clawdbot/sessions/sessions.json (legacy: ~/.clawdbot/sessions.json)
  • /new or /reset starts a fresh session for that chat (configurable via resetTriggers). If sent alone, the agent replies with a short hello to confirm the reset.

Heartbeats (proactive mode)

When agent.heartbeat.every is set to a positive interval, CLAWDBOT periodically runs a heartbeat prompt (default: HEARTBEAT).

  • If the agent replies with HEARTBEAT_OK (optionally with short padding; see agent.heartbeat.ackMaxChars), CLAWDBOT suppresses outbound delivery for that heartbeat.
{
  agent: {
    heartbeat: { every: "30m" }
  }
}

Media in and out

Inbound attachments (images/audio/docs) can be surfaced to your command via templates:

  • {{MediaPath}} (local temp file path)
  • {{MediaUrl}} (pseudo-URL)
  • {{Transcript}} (if audio transcription is enabled)

Outbound attachments from the agent: include MEDIA:<path-or-url> on its own line (no spaces). Example:

Heres the screenshot.
MEDIA:/tmp/screenshot.png

CLAWDBOT extracts these and sends them as media alongside the text.

Operations checklist

clawdbot status          # local status (creds, sessions, queued events)
clawdbot status --deep   # also probes the running Gateway (WA connect + Telegram)
clawdbot health --json   # gateway health snapshot (WS)

Logs live under /tmp/clawdbot/ (default: clawdbot-YYYY-MM-DD.log).

Next steps