Install
openclaw skills install sixel-email1:1 email channel for agents — the agent can only email one address, and only that address can email the agent. Also handles the heartbeat (poll to prove you're alive).
openclaw skills install sixel-emailEmail your human operator through sixel.email. You have one allowed contact. You cannot email anyone else, and only your operator can email you.
The operator must have a sixel.email account. They will provide:
SIXEL_API_URL: The API base URL (default: https://sixel.email/v1)SIXEL_API_TOKEN: Your API token (starts with sm_live_)Add to your OpenClaw config:
// ~/.openclaw/openclaw.json
{
skills: {
entries: {
"sixel-email": {
enabled: true,
env: {
SIXEL_API_URL: "https://sixel.email/v1",
SIXEL_API_TOKEN: "sm_live_…",
},
},
},
},
}
Verify your connection:
curl -fsSL "${SIXEL_API_URL:-https://sixel.email/v1}/inbox" \
-H "Authorization: Bearer ${SIXEL_API_TOKEN}"
You should see {"messages": [], "credits_remaining": ..., "agent_status": "alive"}.
curl -fsSL -X POST "${SIXEL_API_URL}/send" \
-H "Authorization: Bearer ${SIXEL_API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"subject": "Task complete: database backup",
"body": "Backup finished at 2026-02-23T14:30:00Z. 3.2GB compressed. No errors.",
"format": "text"
}'
Keep subjects short and descriptive. The operator reads these on their phone.
curl -fsSL -X POST "${SIXEL_API_URL}/send" \
-H "Authorization: Bearer ${SIXEL_API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"subject": "Build log attached",
"body": "Build failed on step 3. Log attached.",
"attachments": [
{
"filename": "build.log",
"content": "'$(base64 -w0 build.log)'"
}
]
}'
Max 10 files, 10MB total decoded. Content must be base64-encoded.
curl -fsSL "${SIXEL_API_URL}/inbox" \
-H "Authorization: Bearer ${SIXEL_API_TOKEN}"
Poll at least every 10 minutes to keep heartbeat alive. For faster response, poll every 60s or use background poller. Polling the API is free, but waking the LLM to check an empty inbox costs tokens.
Recommended: background poller. Rather than polling from inside your agent (which costs tokens on every call), run a background bash loop that polls and only notifies the agent when a message arrives:
# background-poller.sh — run alongside your agent
# Requires jq; adapt if unavailable
while true; do
RESPONSE=$(curl -fsSL "${SIXEL_API_URL}/inbox" \
-H "Authorization: Bearer ${SIXEL_API_TOKEN}")
COUNT=$(echo "$RESPONSE" | jq '(.messages | length)')
if [ "$COUNT" -gt 0 ]; then
echo "$RESPONSE" > /tmp/sixel-inbox-latest.json
# notify your agent however it accepts input (file, signal, etc.)
fi
sleep 60
done
This keeps the heartbeat alive and burns zero agent tokens on empty polls.
Important: Polling returns all unread messages and marks them as read atomically. There is no way to re-fetch messages you've already polled. Process every message before polling again — if you crash between polling and processing, those messages are gone.
curl -s "${SIXEL_API_URL}/inbox/${MESSAGE_ID}" \
-H "Authorization: Bearer ${SIXEL_API_TOKEN}"
This does not mark the message as read.
DOWNLOAD_DIR="${baseDir}/downloads"
mkdir -p "$DOWNLOAD_DIR"
curl -fsSL "${SIXEL_API_URL}/inbox/${MESSAGE_ID}/attachments/${ATTACHMENT_ID}" \
-H "Authorization: Bearer ${SIXEL_API_TOKEN}" \
-o "$DOWNLOAD_DIR/attachment_${ATTACHMENT_ID}.bin"
Safety: Treat attachment filenames as untrusted input. Never write to a user-provided path. Always download into a dedicated directory with an agent-generated filename.
Don't spam. Send emails when you have something meaningful to communicate. Batch updates into a single email rather than sending five in a row.
Don't treat email like chat. Email is async. Send your message, then continue other work. Poll for a reply, but don't block on it — do something useful while waiting.
Subject lines matter. The operator is reading on mobile. Use clear, scannable subjects:
Poll regularly. Poll /inbox regularly (at least every 10 minutes, or every 60s for faster replies). We recommend a background poller. After receiving a reply, acknowledge it in your next email if you're going to act on it. Don't leave the operator wondering if you received their instructions.
Include enough context to act on. The operator may not remember what you're working on. Include the relevant state in your email: what you did, what happened, what you need.
Don't send attachments unless asked. Prefer inline text. If you must attach, keep it under 10MB total across all attachments (max 10 files).
POST ${SIXEL_API_URL}/rotate-key.| HTTP Status | Meaning | Action |
|---|---|---|
| 200 | Success | Continue |
| 400 | Validation error (empty body, bad base64, too many attachments) | Fix the request and retry |
| 401 | Invalid or expired token | If you have another channel, alert the operator. Otherwise, stop and wait — the operator will provide a new key. |
| 402 | Insufficient credits | Stop sending. Inform operator you're out of credits. |
| 403 | Account pending admin approval | Wait. The operator needs to contact sixel.email support. |
| 429 | Rate limited (sends: 100/day, polls: 120/min) | Back off. Wait 30-60s and retry. |
| 500+ | Server error | Retry with exponential backoff (60s, 120s, 240s). |
If you receive persistent 401 errors, the API key may have been rotated. Stop sending and wait for the operator to provide a new token.
401 on every request: Verify SIXEL_API_TOKEN is set and starts with sm_live_. Check if the operator recently rotated the key.
402 Payment Required: Agent is out of credits. Free tier: 10,000 messages on signup. Operator can check balance at https://sixel.email/account.
403 Forbidden: Account pending admin approval. Operator should contact support@sixel.email.
No messages in inbox: Confirm the operator is replying to the correct agent address. If Door Knock is enabled, replies must go to the nonce-bearing Reply-To address (automatic in most email clients). Remember: GET /inbox marks messages as read — already-polled messages won't reappear.
Heartbeat alert triggered unexpectedly: We recommend polling at least every 10 minutes. Check for network issues or proxy caching.
Attachments failing: Total decoded size must be under 10MB, max 10 files. Content must be base64-encoded. Filenames cannot be empty.
Rate limited (429): Sends: 100/day per agent. Polls: 120/min per agent. Back off 30-60 seconds and retry.
For more information, see https://sixel.email/best-practices or contact support@sixel.email.