On this page
On this page
Setup guides and reference
Personal assistant setup
OpenClaw is a self-hosted gateway that connects Discord, Google Chat, iMessage, Matrix, Microsoft Teams, Signal, Slack, Telegram, WhatsApp, Zalo, and more to AI agents. This guide covers the "personal assistant" setup: a dedicated WhatsApp number that behaves like your always-on AI assistant. Setting up a shared gateway for several people instead? See Team setup.
Good defaults first
A connected agent is a capable one: depending on your tool policy it can run commands, work with files in its workspace, and message people on your behalf. The defaults keep that power scoped to you; a few settings are worth confirming up front:
- Always set
channels.whatsapp.allowFrom(never run open-to-the-world on your personal Mac). - Use a dedicated WhatsApp number for the assistant.
- Review the jobs in
openclaw automations list --all. Setup creates an ordinary proactive-check job once for the ambient owner; disable it withopenclaw automations disable <job-id>while you evaluate the setup. Immediate event-driven follow-ups can still run, so keep tool policy and sandboxing conservative until you trust the setup.
Prerequisites
- OpenClaw installed and onboarded - see Getting Started if you haven't done this yet
- The WhatsApp plugin installed, or WhatsApp chosen during onboarding. WhatsApp is an official plugin that installs on demand. See WhatsApp
- A second phone number (SIM/eSIM/prepaid) for the assistant
The two-phone setup (recommended)
You want this:
flowchart TB
A["<b>Your Phone (personal)<br></b><br>Your WhatsApp<br>+1-555-YOU"] -- message --> B["<b>Second Phone (assistant)<br></b><br>Assistant WA<br>+1-555-ASSIST"]
B -- linked via QR --> C["<b>Your Mac (openclaw)<br></b><br>AI agent"]If you link your personal WhatsApp to OpenClaw, every message to you becomes "agent input". That's rarely what you want.
5-minute quick start
- Pair WhatsApp Web (shows QR; scan with the assistant phone):
- Start the Gateway (leave it running):
- Put a minimal config in
~/.openclaw/openclaw.json:
Now message the assistant number from your allowlisted phone.
When onboarding finishes, OpenClaw auto-opens the dashboard and prints a clean (non-tokenized) link. If the dashboard prompts for auth, paste the configured shared secret into Control UI settings. Onboarding uses a token by default (gateway.auth.token), but password auth works too if you switched gateway.auth.mode to password. To reopen later: openclaw dashboard.
Give the agent a workspace (AGENTS)
OpenClaw reads operating instructions and "memory" from its workspace directory.
By default, OpenClaw uses ~/.openclaw/workspace as the agent workspace, and creates it (plus starter AGENTS.md, SOUL.md, IDENTITY.md, USER.md) automatically on onboarding or first agent run. Put environment-specific tool notes in the ## Tools section of AGENTS.md. BOOTSTRAP.md is only created for a brand-new workspace and should not come back after you delete it. MEMORY.md is optional and never auto-created; when present, it loads for normal sessions. Subagent sessions only inject AGENTS.md.
To create the workspace and config folders without running the full onboarding wizard:
(Bare openclaw setup is an alias for openclaw onboard and runs the full interactive wizard.)
Full workspace layout + backup guide: Agent workspace Memory workflow: Memory
Optional: choose a different workspace with agents.defaults.workspace (supports ~).
If you already ship your own workspace files from a repo, you can disable bootstrap file creation entirely:
The config that turns it into "an assistant"
OpenClaw defaults to a good assistant setup, but you'll usually want to tune:
- persona/instructions in
SOUL.md - thinking defaults (if desired)
- proactive automation jobs (once you trust it)
Example:
Sessions and memory
- Session rows, transcript rows, and metadata (token usage, last route, etc):
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite - Legacy/archive transcript artifacts:
~/.openclaw/agents/<agentId>/sessions/ - Legacy row migration source:
~/.openclaw/agents/<agentId>/sessions/sessions.json /newor/resetstarts a fresh session for that chat (configurable viasession.resetTriggers). If sent alone, OpenClaw acknowledges the reset without invoking the model./compact [instructions]compacts the session context and reports the remaining context budget.
Proactive automations
Proactive checks are ordinary editable Automations. Explicit setup provisions a default check once for the ambient owner, normally every 30 minutes. When that agent uses Anthropic OAuth/token authentication, including Claude CLI reuse, the provider's setup default is one hour. Later provider changes do not rewrite an existing job's schedule.
The default check uses the owner's main conversation, gives foreground work
priority, and delivers to a positively identified owner DM. Its instructions
ask it to follow its scratch checklist and relevant context, avoid repeating old
tasks, and return NO_REPLY when nothing needs attention. Edit its schedule,
prompt, active hours, or delivery on the Automations page or through the CLI:
The default job sets skipIfScratchEmpty: explicitly empty scratch (blank lines,
comments, headings, fence markers, or empty checklist stubs) skips a run. Missing
scratch still runs. Use --direct-policy block to block DM delivery, or
--no-deliver to disable runner fallback delivery. These policies are stored on
the job, not under agent heartbeat configuration.
Run openclaw doctor --fix to migrate supported July 2026 and later heartbeat
configuration and checklists. After migration, edit or remove the job itself;
restarts, config reloads, and later Doctor runs do not recreate a deleted job.
See Heartbeat migration.
Checks run full agent turns, so shorter intervals use more tokens. Immediate events such as background exec completion use normal session execution and do not depend on a periodic job being enabled.
Media in and out
Inbound attachments (images/audio/docs) can be surfaced to your command via templates:
{{AttachmentPath}}(local temp file path){{AttachmentUrl}}(original URL or provider reference){{AttachmentContentType}}(MIME content type){{AttachmentDir}}(directory containing the local path){{AttachmentIndex}}(zero-based source fact index){{Transcript}}(if audio transcription is enabled)
The older {{MediaPath}}, {{MediaUrl}}, {{MediaType}}, and {{MediaDir}}
names remain available as deprecated compatibility aliases.
Outbound attachments from the agent use structured media fields on the message tool or reply payload, such as media, mediaUrl, mediaUrls, path, or filePath. Example message-tool arguments:
OpenClaw sends structured media alongside the text. Legacy final assistant replies may still be normalized for compatibility, but tool output, browser output, streaming blocks, and message actions do not parse text as attachment commands.
If you must use a legacy final-reply MEDIA: line, keep it as standalone plain
text. Markdown wrappers, code fences, and inline prose such as
**MEDIA:/path.png**, `MEDIA:/path.png`, or
Here is the image: MEDIA:/path.png stay text and do not attach media. See
Rich output protocol.
Local-path behavior follows the same file-read trust model as the agent:
- If
tools.fs.workspaceOnlyistrue, outbound local media paths stay restricted to the OpenClaw temp root, the media cache, agent workspace paths, and files generated in the active session sandbox. Files in sibling sandboxes remain inaccessible. - If
tools.fs.workspaceOnlyisfalse, outbound local media can use host-local files the agent is already allowed to read. - Local paths can be absolute, workspace-relative, or home-relative with
~/. - Host-local sends still only allow media and supported document types (images, audio, video, PDF, Office documents including macro-enabled Excel
.xlsm, and validated text documents such as Markdown/MD, TXT, JSON, YAML, and YML). This is an extension of the existing host-read trust boundary, not a secret scanner: if the agent can read a host-localsecret.txtorconfig.json, it can attach that file when the extension and content validation match. File-type validation does not establish that an attached workbook's macros are safe to run.
Keep sensitive files outside the agent-readable filesystem, or keep tools.fs.workspaceOnly: true for stricter local-path sends.
When the message tool cannot stage an attachment for the current conversation, its error identifies the file and the reported reason, such as a missing file or an unsupported local format. Being inside the workspace does not make every file type eligible for host-local attachment reads.
Operations checklist
Logs live under /tmp/openclaw/: openclaw-YYYY-MM-DD.log for the default
profile and openclaw-<profile>-YYYY-MM-DD.log for named profiles.
Next steps
- WebChat: WebChat
- Gateway ops: Gateway runbook
- Cron + wakeups: Cron jobs
- macOS menu bar companion: OpenClaw macOS app
- iOS node app: iOS app
- Android node app: Android app
- Windows Hub: Windows
- Linux status: Linux app
- Security: Security
