| name | clawra-selfie |
| description | Generate AI images using MiniMax or fal.ai (Grok Imagine) and send to messaging channels via OpenClaw |
| allowed-tools | Bash(npm:*) Bash(npx:*) Bash(openclaw:*) Bash(curl:*) Read Write WebFetch |
Clawra Selfie
Generate AI images using either MiniMax or xAI's Grok Imagine model and distribute them across messaging platforms (WhatsApp, Telegram, Discord, Slack, etc.) via OpenClaw.
💡 Tip: The enhanced script automatically detects which API key is available (MiniMax takes priority by default).
Reference Image
The skill uses a fixed reference image hosted on jsDelivr CDN:
https://cdn.jsdelivr.net/gh/SumeLabs/clawra@main/assets/clawra.png
When to Use
- User says "send a pic", "send me a pic", "send a photo", "send a selfie"
- User says "send a pic of you...", "send a selfie of you..."
- User asks "what are you doing?", "how are you doing?", "where are you?"
- User describes a context: "send a pic wearing...", "send a pic at..."
- User wants Clawra to appear in a specific outfit, location, or situation
Quick Reference
Required Environment Variables
Option 1: fal.ai (Grok Imagine)
FAL_KEY=your_fal_api_key
Option 2: MiniMax (Recommended - usually faster/more reliable)
MINIMAX_API_KEY=your_minimax_api_key
Common:
OPENCLAW_GATEWAY_TOKEN=your_token
⚠️ Security Note: Never hardcode API keys in scripts. Use environment variables.
Workflow
- Get user prompt for how to edit the image
- Edit image via fal.ai Grok Imagine Edit API with fixed reference
- Extract image URL from response
- Send to OpenClaw with target channel(s)
Step-by-Step Instructions
Step 1: Collect User Input
Ask the user for:
- User context: What should the person in the image be doing/wearing/where?
- Mode (optional):
mirror or direct selfie style
- Target channel(s): Where should it be sent? (e.g.,
#general, @username, channel ID)
- Platform (optional): Which platform? (discord, telegram, whatsapp, slack)
Prompt Modes
Mode 1: Mirror Selfie (default)
Best for: outfit showcases, full-body shots, fashion content
make a pic of this person, but [user's context]. the person is taking a mirror selfie
Example: "wearing a santa hat" →
make a pic of this person, but wearing a santa hat. the person is taking a mirror selfie
Mode 2: Direct Selfie
Best for: close-up portraits, location shots, emotional expressions
a close-up selfie taken by herself at [user's context], direct eye contact with the camera, looking straight into the lens, eyes centered and clearly visible, not a mirror selfie, phone held at arm's length, face fully visible
Example: "a cozy cafe with warm lighting" →
a close-up selfie taken by herself at a cozy cafe with warm lighting, direct eye contact with the camera, looking straight into the lens, eyes centered and clearly visible, not a mirror selfie, phone held at arm's length, face fully visible
Mode Selection Logic
| Keywords in Request | Auto-Select Mode |
|---|
| outfit, wearing, clothes, dress, suit, fashion | mirror |
| cafe, restaurant, beach, park, city, location | direct |
| close-up, portrait, face, eyes, smile | direct |
| full-body, mirror, reflection | mirror |
Step 2: Generate Image
You have two options for image generation:
Option A: MiniMax API (Recommended)
export MINIMAX_API_KEY="your_minimax_api_key"
/home/honestqiao/.openclaw/workspace/skills/clawra-selfie/scripts/clawra-selfie-enhanced.sh \
"A girl wearing a red dress, smiling, at a beach sunset" \
"telegram" \
"Beach vibes! 🌊" \
"minimax"
MiniMax API Details:
- Endpoint:
https://api.minimaxi.com/v1/image_generation
- Model:
image-01
- Response: Base64 encoded image
- Aspect ratios supported: 1:1, 3:4, 4:3, 9:16, 16:9, 21:9
Option B: fal.ai (Grok Imagine)
REFERENCE_IMAGE="https://cdn.jsdelivr.net/gh/SumeLabs/clawra@main/assets/clawra.png"
PROMPT="make a pic of this person, but <USER_CONTEXT>. the person is taking a mirror selfie"
PROMPT="a close-up selfie taken by herself at <USER_CONTEXT>, direct eye contact with the camera, looking straight into the lens, eyes centered and clearly visible, not a mirror selfie, phone held at arm's length, face fully visible"
JSON_PAYLOAD=$(jq -n \
--arg image_url "$REFERENCE_IMAGE" \
--arg prompt "$PROMPT" \
'{image_url: $image_url, prompt: $prompt, num_images: 1, output_format: "jpeg"}')
curl -X POST "https://fal.run/xai/grok-imagine-image/edit" \
-H "Authorization: Key $FAL_KEY" \
-H "Content-Type: application/json" \
-d "$JSON_PAYLOAD"
Response Format:
{
"images": [
{
"url": "https://v3b.fal.media/files/...",
"content_type": "image/jpeg",
"width": 1024,
"height": 1024
}
],
"revised_prompt": "Enhanced prompt text..."
}
Step 3: Send Image via OpenClaw
Use the OpenClaw messaging API to send the edited image:
openclaw message send \
--action send \
--channel "<TARGET_CHANNEL>" \
--message "<CAPTION_TEXT>" \
--media "<IMAGE_URL>"
Alternative: Direct API call
curl -X POST "http://localhost:18789/message" \
-H "Authorization: Bearer $OPENCLAW_GATEWAY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"action": "send",
"channel": "<TARGET_CHANNEL>",
"message": "<CAPTION_TEXT>",
"media": "<IMAGE_URL>"
}'
Complete Script Example
#!/bin/bash
if [ -z "$FAL_KEY" ]; then
echo "Error: FAL_KEY environment variable not set"
exit 1
fi
REFERENCE_IMAGE="https://cdn.jsdelivr.net/gh/SumeLabs/clawra@main/assets/clawra.png"
USER_CONTEXT="$1"
CHANNEL="$2"
MODE="${3:-auto}"
CAPTION="${4:-Edited with Grok Imagine}"
if [ -z "$USER_CONTEXT" ] || [ -z "$CHANNEL" ]; then
echo "Usage: $0 <user_context> <channel> [mode] [caption]"
echo "Modes: mirror, direct, auto (default)"
echo "Example: $0 'wearing a cowboy hat' '#general' mirror"
echo "Example: $0 'a cozy cafe' '#general' direct"
exit 1
fi
if [ "$MODE" == "auto" ]; then
if echo "$USER_CONTEXT" | grep -qiE ;
MODE=
| grep -qiE ;
MODE=
MODE=
[ == ];
EDIT_PROMPT=
EDIT_PROMPT=
JSON_PAYLOAD=$(jq -n \
--arg image_url \
--arg prompt \
)
RESPONSE=$(curl -s -X POST \
-H \
-H \
-d )
IMAGE_URL=$( | jq -r )
[ == ] || [ -z ];
1
openclaw message send \
--action send \
--channel \
--message \
--media
Node.js/TypeScript Implementation
import { fal } from "@fal-ai/client";
import { exec } from "child_process";
import { promisify } from "util";
const execAsync = promisify(exec);
const REFERENCE_IMAGE = "https://cdn.jsdelivr.net/gh/SumeLabs/clawra@main/assets/clawra.png";
interface GrokImagineResult {
images: Array<{
url: string;
content_type: string;
width: number;
height: number;
}>;
revised_prompt?: string;
}
type SelfieMode = "mirror" | "direct" | "auto";
function detectMode(userContext: string): "mirror" | "direct" {
const mirrorKeywords = /outfit|wearing|clothes|dress|suit|fashion|full-body|mirror/i;
const directKeywords = /cafe|restaurant|beach|park|city|close-up|portrait|face|eyes|smile/i;
if (directKeywords.test(userContext)) return "direct";
if (mirrorKeywords.(userContext)) ;
;
}
(): {
(mode === ) {
;
}
;
}
(): <> {
fal.({
: process..!
});
actualMode = mode === ? (userContext) : mode;
.();
editPrompt = (userContext, actualMode);
.();
result = fal.(, {
: {
: ,
: editPrompt,
: ,
:
}
}) { : };
imageUrl = result..[].;
.();
messageCaption = caption || ;
(
);
.();
imageUrl;
}
(
,
,
,
);
(
,
,
);
(, , );
Supported Platforms
OpenClaw supports sending to:
| Platform | Channel Format | Example |
|---|
| Discord | #channel-name or channel ID | #general, 123456789 |
| Telegram | @username or chat ID | @mychannel, -100123456 |
| WhatsApp | Phone number (JID format) | 1234567890@s.whatsapp.net |
| Slack | #channel-name | #random |
| Signal | Phone number | +1234567890 |
| MS Teams | Channel reference | (varies) |
Grok Imagine Edit Parameters
| Parameter | Type | Default | Description |
|---|
image_url | string | required | URL of image to edit (fixed in this skill) |
prompt | string | required | Edit instruction |
num_images | 1-4 | 1 | Number of images to generate |
output_format | enum | "jpeg" | jpeg, png, webp |
Setup Requirements
1. Install fal.ai client (for Node.js usage)
npm install @fal-ai/client
2. Install OpenClaw CLI
npm install -g openclaw
3. Configure OpenClaw Gateway
openclaw config set gateway.mode=local
openclaw doctor --generate-gateway-token
4. Start OpenClaw Gateway
openclaw gateway start
Error Handling
- FAL_KEY missing: Ensure the API key is set in environment
- Image edit failed: Check prompt content and API quota
- OpenClaw send failed: Verify gateway is running and channel exists
- Rate limits: fal.ai has rate limits; implement retry logic if needed
Tips
-
Mirror mode context examples (outfit focus):
- "wearing a santa hat"
- "in a business suit"
- "wearing a summer dress"
- "in streetwear fashion"
-
Direct mode context examples (location/portrait focus):
- "a cozy cafe with warm lighting"
- "a sunny beach at sunset"
- "a busy city street at night"
- "a peaceful park in autumn"
-
Mode selection: Let auto-detect work, or explicitly specify for control
-
Batch sending: Edit once, send to multiple channels
-
Scheduling: Combine with OpenClaw scheduler for automated posts