| name | secure-openclaw-ai-assistant |
| description | Deploy and configure Secure OpenClaw, a 24/7 AI assistant on WhatsApp, Telegram, Signal, and iMessage with Claude, tool access, and 500+ app integrations |
| triggers | ["set up secure openclaw assistant","deploy openclaw to digitalocean","configure whatsapp bot with claude","add telegram integration to openclaw","set up ai assistant with memory","configure composio tool router","deploy personal ai assistant remotely","set up openclaw reminders and scheduling"] |
Secure OpenClaw AI Assistant
Skill by ara.so — Hermes Skills collection.
Secure OpenClaw is a personal 24/7 AI assistant that runs on messaging platforms (WhatsApp, Telegram, Signal, iMessage) powered by Claude with full tool access, persistent memory, scheduled reminders, and integrations with 500+ apps via Composio.
Installation
git clone https://github.com/composio-community/secure-openclaw.git
cd secure-openclaw
npm install
Prerequisites
Install AI Provider
Claude Code (recommended):
npm install -g @anthropic-ai/claude-code
claude
Opencode (alternative):
curl -fsSL https://opencode.ai/install | bash
Set API Keys
export ANTHROPIC_API_KEY=sk-ant-...
export COMPOSIO_API_KEY=your-key
echo 'export ANTHROPIC_API_KEY=sk-ant-...' >> ~/.zshrc
echo 'export COMPOSIO_API_KEY=your-key' >> ~/.zshrc
Quick Start
Local Development
node cli.js
node cli.js chat
node cli.js start
Remote Deployment (DigitalOcean)
ssh root@YOUR_DROPLET_IP
fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
curl -fsSL https://get.docker.com | sh
git clone https://github.com/YOUR_USERNAME/secure-openclaw.git
cd secure-openclaw
cp .env.example .env
nano .env
docker compose up -d --build
ufw allow 4096
Configuration
config.js Structure
module.exports = {
agentId: 'secure-openclaw',
whatsapp: {
enabled: true,
allowedDMs: ['+1234567890'],
allowedGroups: ['*'],
respondToMentionsOnly: true
},
telegram: {
enabled: false,
token: process.env.TELEGRAM_BOT_TOKEN,
allowedDMs: ['*'],
allowedGroups: []
},
signal: {
enabled: false,
phoneNumber: '+1234567890',
signalCliPath: 'signal-cli',
allowedDMs: ['*']
},
imessage: {
enabled: false,
allowedDMs: ['user@icloud.com'],
allowedGroups: []
},
agent: {
workspace: '~/secure-openclaw',
maxTurns: 100,
allowedTools: ['Read', 'Write', , , , ],
: ,
: {
: ,
: ,
:
}
}
};
Environment Variables (.env)
ANTHROPIC_API_KEY=sk-ant-...
COMPOSIO_API_KEY=your-composio-key
TELEGRAM_BOT_TOKEN=123456:ABC-DEF...
SIGNAL_PHONE_NUMBER=+1234567890
NODE_ENV=production
PORT=4096
Messaging Platform Setup
WhatsApp
No bot token needed — uses QR authentication:
whatsapp: {
enabled: true,
allowedDMs: ['+1234567890', '+0987654321'],
allowedGroups: ['Group Name', 'Another Group'],
respondToMentionsOnly: true
}
Start gateway, scan QR in terminal or visit http://localhost:4096/qr. Session persists in auth_whatsapp/.
Telegram
export TELEGRAM_BOT_TOKEN=123456:ABC-DEF...
telegram: {
enabled: true,
token: process.env.TELEGRAM_BOT_TOKEN,
allowedDMs: ['*'],
allowedGroups: []
}
Signal
brew install signal-cli
apt-get install signal-cli
signal-cli -u +1234567890 register
signal-cli -u +1234567890 verify CODE_FROM_SMS
signal: {
enabled: true,
phoneNumber: '+1234567890',
signalCliPath: 'signal-cli',
allowedDMs: ['*']
}
iMessage (macOS only)
brew install steipete/formulae/imsg
imessage: {
enabled: true,
allowedDMs: ['user@icloud.com', '+1234567890'],
allowedGroups: []
}
Core Features
Terminal Chat
node cli.js chat
Commands:
/model — Switch AI model
/memory — View or search memories
/clear — Clear conversation
/help — Show commands
/exit — Exit chat
Memory System
Persistent memory at ~/secure-openclaw/:
~/secure-openclaw/
MEMORY.md # Long-term: preferences, people, decisions
memory/
2026-07-29.md # Daily logs
project-alpha.md # Topic-specific notes
Usage:
User: Remember that I prefer meetings after 2pm
Assistant: [Writes to MEMORY.md]
User: What are my meeting preferences?
Assistant: [Reads MEMORY.md] You prefer meetings after 2pm.
Scheduling and Reminders
User: Remind me in 30 minutes to check the oven
Assistant: [Creates one-time cron job]
User: Every day at 9am send me a standup reminder
Assistant: [Creates cron: 0 9 * * *]
User: Every weekday at 8am
Assistant: [Creates cron: 0 8 * * 1-5]
Jobs persist in ~/.secure-openclaw/cron-jobs.json.
Tool Approvals
When assistant needs permission to run tools:
Terminal chat:
🔧 Claude wants to use: Bash
Command: npm install axios
Approve? (y/n): y
Messaging platforms:
Claude wants to use Bash to install axios.
Reply Y to allow, N to deny.
Timeout: 2 minutes. Configure in agent.allowedTools.
Composio Integration
500+ app integrations (Gmail, Slack, GitHub, Calendar, etc.):
curl -fsSL https://composio.dev/install | bash
composio login
composio add gmail
composio add slack
composio add github
composio apps
Usage in chat:
User: Send an email to john@example.com about the meeting
Assistant: [Uses Gmail integration]
User: Create a GitHub issue in my-repo: "Fix login bug"
Assistant: [Uses GitHub integration]
User: Add "Team standup" to my calendar at 9am tomorrow
Assistant: [Uses Google Calendar integration]
Code Examples
Custom Gateway Adapter
const { EventEmitter } = require('events');
class DiscordAdapter extends EventEmitter {
constructor(config) {
super();
this.config = config;
this.client = null;
}
async start() {
const { Client, GatewayIntentBits } = require('discord.js');
this.client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent
]
});
this.client.on('messageCreate', async (message) => {
if (message.author.bot) return;
if (!this.isAllowed(message.., message..)) {
;
}
.(, {
: message.,
: message..,
: message..,
: ,
: (reply) => {
message..(reply);
}
});
});
..(..);
}
() {
{ allowedDMs, allowedChannels } = .;
(allowedDMs.()) ;
allowedDMs.(userId) || allowedChannels.(channelId);
}
() {
(.) ..();
}
}
. = ;
Register in Gateway
const DiscordAdapter = require('./adapters/discord');
class Gateway extends EventEmitter {
constructor(config) {
super();
this.adapters = [];
if (config.discord?.enabled) {
const adapter = new DiscordAdapter(config.discord);
this.adapters.push(adapter);
adapter.on('message', (msg) => this.handleMessage(msg));
}
}
}
Custom Tool Permission Handler
class Agent {
async requestPermission(tool, args, context) {
const { platform, sender } = context;
const safeLists = ['Read', 'Glob', 'Grep'];
if (safeLists.includes(tool)) return true;
if (platform === 'whatsapp') {
return new Promise((resolve) => {
this.pendingApprovals.set(sender, {
resolve,
tool,
args,
timeout: setTimeout(() => {
this.pendingApprovals.delete(sender);
resolve(false);
}, 120000)
});
this.sendMessage(sender,
`Claude wants to use ${tool}.\nReply Y to allow, N to deny.`
);
});
}
return false;
}
handleApprovalResponse(sender, response) {
pending = ..(sender);
(!pending) ;
(pending.);
..(sender);
approved = response.().();
pending.(approved);
}
}
Docker Deployment
Dockerfile
FROM node:18-alpine
RUN apk add --no-cache bash curl git python3 make g++
# Install Claude Code
RUN npm install -g @anthropic-ai/claude-code
# Install Opencode
RUN curl -fsSL https://opencode.ai/install | bash
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
# Create volumes for persistence
VOLUME ["/root/.secure-openclaw", "/app/auth_whatsapp"]
EXPOSE 4096
CMD ["node", "cli.js", "start"]
docker-compose.yml
version: '3.8'
services:
openclaw:
build: .
environment:
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- COMPOSIO_API_KEY=${COMPOSIO_API_KEY}
- TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
- NODE_ENV=production
ports:
- "4096:4096"
volumes:
- openclaw-memory:/root/.secure-openclaw
- whatsapp-auth:/app/auth_whatsapp
restart: unless-stopped
volumes:
openclaw-memory:
whatsapp-auth:
Deploy Commands
docker compose up -d --build
docker compose logs -f
docker compose logs -f --tail 50
docker compose down && docker compose up -d
docker compose exec openclaw sh
git pull && docker compose up -d --build
Troubleshooting
WhatsApp QR Not Scanning
docker compose logs -f | grep "Gateway Ready"
ufw allow 4096
curl http://YOUR_IP:4096/qr
Out of Memory During Build
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
free -h
Claude Authentication Failed
claude
docker compose exec openclaw env | grep ANTHROPIC_API_KEY
Telegram Bot Not Responding
curl https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getMe
docker compose logs -f | grep telegram
Signal Messages Not Sending
signal-cli -u +1234567890 send -m "test" +0987654321
signal-cli -u +1234567890 unregister
signal-cli -u +1234567890 register
signal-cli -u +1234567890 verify CODE
Memory Not Persisting
docker compose exec openclaw ls -la /root/.secure-openclaw
agent: {
workspace: '~/secure-openclaw'
}
Tool Execution Failing
agent: {
allowedTools: [
'Read', 'Write', 'Edit',
'Bash',
'Glob', 'Grep'
]
}
CLI Reference
node cli.js
node cli.js chat
node cli.js start
node cli.js setup
node cli.js config
node cli.js test
node cli.js provider claude
node cli.js provider opencode
Common Patterns
Multi-Platform Deployment
module.exports = {
whatsapp: { enabled: true, allowedDMs: ['*'] },
telegram: { enabled: true, allowedDMs: ['*'] },
signal: { enabled: true, allowedDMs: ['*'] },
imessage: { enabled: true, allowedDMs: ['*'] }
};
Restrict to Specific Users
whatsapp: {
enabled: true,
allowedDMs: ['+1234567890'],
allowedGroups: ['Family', 'Work Team'],
respondToMentionsOnly: true
}
Production with Auto-Restart
services:
openclaw:
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:4096/"]
interval: 30s
timeout: 10s
retries: 3
Custom Memory Structure
async loadMemory() {
const memories = [
fs.readFileSync(`${this.workspace}/MEMORY.md`, 'utf8'),
fs.readFileSync(`${this.workspace}/memory/preferences.md`, 'utf8'),
fs.readFileSync(`${this.workspace}/memory/contacts.md`, 'utf8')
];
return memories.join('\n\n');
}
This skill enables AI agents to deploy and configure Secure OpenClaw for personal AI assistant functionality across multiple messaging platforms with full tool access and app integrations.