Files
openclaw-market/skill/openclaw-reporter/SKILL.md

6.5 KiB

name, description, requirements, hooks
name description requirements hooks
openclaw-reporter Opt-in reporter for the OpenClaw global claw heatmap. On first use, ASKS the user for consent before registering. Sends heartbeats (platform + model only) and generic task summaries to https://kymr.top/. Heartbeats are sent automatically via hooks at session start — no LLM action needed. Task reports are sent automatically via hooks when the agent stops responding. Data collected: user-chosen claw name, OS platform, model name, generic task category. Credentials: the server returns an apiKey on registration, which is stored locally in ~/.openclaw/config.json and sent as a Bearer token in subsequent requests. No file paths, code, or project-specific data is ever sent.
network writeFiles binaries env
true
~/.openclaw/config.json
curl
python3
uname
name required description
CLAUDE_MODEL false Current Claude model identifier. Used to report which model is active. Falls back to 'unknown' if not set.
SessionStart Stop
hooks
type command timeout once
command if [ -f ~/.openclaw/config.json ]; then KEY=$(python3 -c "import json; print(json.load(open('$HOME/.openclaw/config.json'))['apiKey'])") && curl -s -o /dev/null --max-time 5 -X POST 'https://kymr.top/api/v1/heartbeat' -H 'Content-Type: application/json' -H "Authorization: Bearer $KEY" -d "{"platform":"$(uname -s | tr '[:upper:]' '[:lower:]')","model":"${CLAUDE_MODEL:-unknown}"}"; fi 10 true
hooks
type command timeout
command if [ -f ~/.openclaw/config.json ]; then KEY=$(python3 -c "import json; print(json.load(open('$HOME/.openclaw/config.json'))['apiKey'])") && curl -s -o /dev/null --max-time 5 -X POST 'https://kymr.top/api/v1/task' -H 'Content-Type: application/json' -H "Authorization: Bearer $KEY" -d "{"summary":"Completed a task","model":"${CLAUDE_MODEL:-unknown}"}"; fi 10

OpenClaw Reporter

This skill lets you participate in the OpenClaw global claw activity heatmap. It reports anonymous, non-identifying activity data to visualize worldwide AI agent usage.

How It Works

  • Heartbeat: Sent automatically at session start via a SessionStart hook — no manual action needed.
  • Task report: Sent automatically when the agent finishes responding via a Stop hook.
  • Registration: One-time setup requiring explicit user consent (see below).

Data Disclosure

This skill sends the following data to https://kymr.top/:

Data Field Example Purpose
Claw Name CoolClaw42 (user-chosen) Your display name on the heatmap
Platform darwin, linux OS type for heatmap stats
Model claude-sonnet-4-6 Model usage stats
Task summary "Completed a task" Generic activity indicator

Stored locally: Registration returns an apiKey from the server, saved in ~/.openclaw/config.json with chmod 600 (owner-only access). This token is sent as Authorization: Bearer header in heartbeat and task report requests. The endpoint URL (https://kymr.top/) is hardcoded in hooks — not read from the config file — so a modified config cannot redirect telemetry. The CLAUDE_MODEL environment variable is read (if available) to identify the active model — it falls back to "unknown" if not set.

Never sent: system usernames, file paths, code snippets, project names, secrets, IP-derived geolocation beyond what the server naturally receives.

Configuration

Config is stored at ~/.openclaw/config.json (permissions 600). The hooks check for this file before sending any requests — if it doesn't exist, nothing is sent. The endpoint is hardcoded to https://kymr.top/ in the hook commands and is not configurable via the config file.

If ~/.openclaw/config.json does not exist, follow these steps:

Use the AskUserQuestion tool:

  • Question: "OpenClaw Reporter wants to register a claw name and send activity heartbeats to https://kymr.top/ for the global heatmap. The server will issue an API key stored locally at ~/.openclaw/config.json. No file paths, code, or project data is sent. Allow?"
  • Options: "Yes, register" / "No, skip"

If the user selects "No, skip": do NOT register and do NOT ask again in this session. Stop here.

Step 2: Ask for a claw name

If the user consented, use AskUserQuestion again:

  • Question: "Pick a name for your claw on the heatmap! (e.g. CoolClaw, NightCrawler, CodeClaw)"
  • Let the user type a custom name via the "Other" option (no preset options needed, but provide a few fun suggestions as options)
  • Options: "CoolClaw" / "CodeClaw" / "NightCrawler"

Use whatever the user provides as the claw name.

Step 3: Register

After receiving the name (stored as CLAW_NAME):

# Create config directory
mkdir -p ~/.openclaw

OPENCLAW_ENDPOINT="https://kymr.top"
CLAW_NAME="USER_CHOSEN_NAME_HERE"

RESPONSE=$(curl -s -X POST "$OPENCLAW_ENDPOINT/api/v1/register" \
  -H "Content-Type: application/json" \
  -d "{
    \"name\": \"$CLAW_NAME\",
    \"platform\": \"$(uname -s | tr '[:upper:]' '[:lower:]')\",
    \"model\": \"$(echo $CLAUDE_MODEL 2>/dev/null || echo 'unknown')\"
  }")

# Save config (no endpoint stored — hooks use a hardcoded URL)
echo "$RESPONSE" | python3 -c "
import json, sys, os
data = json.load(sys.stdin)
config = {
    'clawId': data.get('clawId', ''),
    'apiKey': data.get('apiKey', ''),
    'name': '$CLAW_NAME'
}
path = os.path.expanduser('~/.openclaw/config.json')
with open(path, 'w') as f:
    json.dump(config, f, indent=2)
os.chmod(path, 0o600)
print('Registered as:', '$CLAW_NAME')
"

Opt-Out / Unregister

To stop all OpenClaw reporting, delete the config file:

rm -f ~/.openclaw/config.json
rmdir ~/.openclaw 2>/dev/null

After deletion, no heartbeats or task reports will be sent. The hooks silently skip when the config file is absent. The skill will ask for consent again if re-enabled.

Behavior Rules

  1. User consent is REQUIRED before first registration — never register silently
  2. If the user declines registration, respect the decision and do not ask again in the same session
  3. Hooks run automatically — do NOT manually execute heartbeat or task report commands
  4. If any OpenClaw request fails, continue normally — never interrupt the user's workflow
  5. Never include identifying information in task summaries