Home
Softono
clawmetry

clawmetry

Open source MIT Python
371
Stars
57
Forks
119
Issues
7
Watchers
1 week
Last Commit

About clawmetry

See your agent think. Real-time observability for 12 AI agent runtimes โ€” OpenClaw, NVIDIA NemoClaw, Claude Code, Codex & 8 more.

Platforms

Web Self-hosted

Languages

Python

๐Ÿฆž ClawMetry

PyPI Downloads PyPI Downloads/week PyPI version GitHub stars License: MIT

ClawMetry - #5 Product of the Day on Product Hunt

See your agent think. Real-time observability for 12 AI agent runtimes: OpenClaw, NVIDIA NemoClaw, Claude Code, OpenAI Codex & 8 more. One dashboard for your whole agent fleet.

๐ŸŒ Read this in: English ยท ็ฎ€ไฝ“ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด ยท Espaรฑol ยท Portuguรชs (BR) ยท Franรงais ยท Deutsch ยท เคนเคฟเคจเฅเคฆเฅ€ ยท ุงู„ุนุฑุจูŠุฉ ยท ะ ัƒััะบะธะน ยท more โ†’

One command. Zero config. Auto-detects everything.

pip install clawmetry && clawmetry

Opens at http://localhost:8900 and you're done.

Flow Visualization

Works with 12 agent runtimes

ClawMetry started as observability for OpenClaw, and now meters your whole agent fleet in one dashboard, auto-detecting each runtime on your machine:

๐Ÿฆž OpenClaw ยท ๐ŸŸฉ NVIDIA NemoClaw ยท โ—† Claude Code ยท โฌก OpenAI Codex ยท Cursor ยท ๐Ÿชฟ Goose ยท โšก Hermes ยท opencode ยท โ—ˆ Qwen Code ยท Aider ยท NanoClaw ยท PicoClaw

OpenClaw and NemoClaw are free in the open-source app; the other runtimes light up with ClawMetry Cloud or a self-hosted Pro license. Switch runtimes from the header and every tab โ€” cost, tokens, tools, traces โ€” re-scopes to that runtime.

What You Get

  • Flow โ€” Live animated diagram showing messages flowing through channels, brain, tools, and back
  • Overview โ€” Health checks, activity heatmap, session counts, model info
  • Usage โ€” Token and cost tracking with daily/weekly/monthly breakdowns
  • Sessions โ€” Active agent sessions with model, tokens, last activity
  • Crons โ€” Scheduled jobs with status, next run, duration
  • Logs โ€” Color-coded real-time log streaming
  • Memory โ€” Browse SOUL.md, MEMORY.md, AGENTS.md, daily notes
  • Transcripts โ€” Chat-bubble UI for reading session histories
  • Alerts โ€” Budget caps, error-rate triggers, agent-offline detection; routes to Slack, Discord, PagerDuty, Telegram, Email
  • Approvals โ€” Gate destructive deletes, force pushes, DB mutations, sudo, package installs, network calls behind one-click sign-off

Screenshots

๐Ÿง  Brain โ€” Live agent event stream

Brain tab

๐Ÿ“Š Overview โ€” Token usage & session summary

Overview tab

โšก Flow โ€” Real-time tool call feed

Flow tab

๐Ÿ’ฐ Tokens โ€” Cost breakdown by model & session

Tokens tab

๐Ÿงฌ Memory โ€” Workspace file browser

Memory tab

๐Ÿ” Security โ€” Posture & audit log

Security tab

๐Ÿšจ Alerts โ€” Budget caps, error-rate triggers, webhooks to Slack / Discord / PagerDuty / Email

Alerts tab

โœ‹ Approvals โ€” Gate risky tool calls behind manual sign-off; policy-backed protection rules

Approvals tab

Install

One-liner (recommended):

curl -sSL https://raw.githubusercontent.com/vivekchand/clawmetry/main/install.sh | bash

pip:

pip install clawmetry
clawmetry

From source:

git clone https://github.com/vivekchand/clawmetry.git
cd clawmetry && pip install flask && python3 dashboard.py

v2 Frontend Development

The v2 React app lives in frontend/ and is served at /v2 when the Flask server is started with v2 enabled.

Use two terminals while developing:

# Terminal 1: Flask API/server on :8900
CLAWMETRY_V2=1 python3 dashboard.py
# Terminal 2: Vite dev server on :5173
cd frontend
nvm use
npm ci
npm run dev

Open http://localhost:5173/v2/. Vite proxies /api requests to http://localhost:8900, so the React app can talk to the local Flask server without extra CORS setup.

To build the bundle that ships with the Python package:

cd frontend
npm run build

The production bundle is written to clawmetry/static/v2/dist/.

Runtime / Agent Compatibility

ClawMetry observes many AI-agent runtimes, not just OpenClaw. Each non-OpenClaw runtime ships a dedicated reader adapter that translates its native session format into ClawMetry's unified shapes; the daemon ingests them into the same DuckDB store + cloud snapshot, tagged with the runtime, and the Session replay tab shows a runtime switcher when more than one is present. See docs/compatibility.md for the full matrix + a guide to adding runtimes, and docs/RUNTIME_FAMILY.md for the OpenClaw-family primer.

Runtime / Agent Status Notes
OpenClaw Native Reference runtime, auto-detected
PicoClaw Beta adapter Flat providers.Message JSONL (~/.picoclaw/workspace/sessions). Transcripts, model, tool calls.
NanoClaw Beta adapter Per-session SQLite (data/v2-sessions). Transcripts + message counts.
Hermes Beta adapter SQLite ~/.hermes/state.db. Transcripts, model, tokens/cost.
Claude Code Beta adapter JSONL ~/.claude/projects/.../<id>.jsonl. Transcripts, model, tool calls + thinking, token usage.
Codex Beta adapter Rollout JSONL ~/.codex/sessions/.... Transcripts, model, tool calls, token usage.
Cursor Beta adapter SQLite state.vscdb. Chat/composer transcripts, model.
Aider Beta adapter .aider.chat.history.md per project. Transcripts, model, token counts.
Goose Beta adapter SQLite ~/.local/share/goose. Transcripts, model, tool calls, token totals.
opencode Beta adapter SQLite ~/.local/share/opencode. Transcripts, model, tool calls, tokens + cost.
Qwen Code Beta adapter JSONL ~/.qwen/projects/.../chats. Transcripts, model, tool calls, token usage.

"Beta adapter" means ClawMetry ships a reader for that runtime's real on-disk format, each built + verified against a real install on a real machine (see tests/fixtures/runtimes/<rt>/). Adapters are read-only; each is honest about what its runtime actually stores (e.g. PicoClaw/NanoClaw/Cursor don't write token cost to disk). When several runtimes run on one node, the runtime switcher scopes the sessions view to one for a clean deep-dive.

Track any SDK agent โ€” out-loop cost attribution

The runtimes above all write sessions to disk. Your own production agent โ€” the one you built on the OpenAI Agents SDK, LangChain, the Vercel AI SDK, LlamaIndex, E2B, or a plain httpx loop โ€” doesn't. ClawMetry's zero-config interceptor still captures its LLM calls (cost, tokens, latency, errors) by monkey-patching httpx/requests:

import clawmetry.track            # activate the interceptor
clawmetry.track.set_source("support-agent")   # name this product

# ...your agent runs as normal; every LLM call is now tracked + attributed.

set_source() (or the CLAWMETRY_SOURCE=support-agent env var) tags each call with a named source, so every product you run shows up as its own first-class, cost-attributable line in the dashboard's ๐Ÿ”Œ Out-loop sources card on Overview โ€” calls, providers, latency, error rate per agent. No source set? The calls are still tracked; the card just stays hidden.

CLAWMETRY_SOURCE=billing-agent python my_agent.py

This is the same data layer the runtime adapters feed (DuckDB โ†’ cloud snapshot), so out-loop sources sync to the cloud dashboard the same as everything else, E2E-encrypted.

OpenTelemetry โ€” vendor-neutral, send your traces anywhere

ClawMetry speaks OpenTelemetry in both directions, using the GenAI semantic conventions, so your agent traces are never locked into one tool.

Export every session โ€” LLM calls, tools, sub-agents, tokens, cost โ€” as OTLP/HTTP GenAI spans to any collector (Datadog, Grafana, Honeycomb, or your own OTel Collector):

clawmetry --otel-export http://localhost:4318/v1/traces
# equivalently:
CLAWMETRY_OTEL_EXPORT_ENDPOINT=http://localhost:4318/v1/traces clawmetry

Auth headers and poll interval are optional env vars:

CLAWMETRY_OTEL_EXPORT_HEADERS='{"X-API-Key":"โ€ฆ"}'   # extra HTTP headers
CLAWMETRY_OTEL_EXPORT_INTERVAL=60                    # seconds (default 60)

Ingest โ€” the built-in OTLP receiver accepts traces and metrics from anything else at /v1/traces and /v1/metrics (pip install clawmetry[otel] for protobuf ingest).

You get the zero-config, local-first ClawMetry dashboard and your data in whatever backend your team already runs โ€” no lock-in, no second agent to install.

Configuration

Most people don't need any config. ClawMetry auto-detects your workspace, logs, sessions, and crons.

If you do need to customize:

clawmetry --port 9000              # Custom port (default: 8900)
clawmetry --host 127.0.0.1         # Bind to localhost only
clawmetry --workspace ~/mybot      # Custom workspace path
clawmetry --name "Alice"           # Your name in Flow visualization

All options: clawmetry --help

Supported Channels

ClawMetry shows live activity for every OpenClaw channel you have configured. Only channels that are actually set up in your openclaw.json appear in the Flow diagram โ€” unconfigured ones are automatically hidden.

Click any channel node in the Flow to see a live chat bubble view with incoming/outgoing message counts.

Channel Status Live Popup Notes
๐Ÿ“ฑ Telegram โœ… Full โœ… Messages, stats, 10s refresh
๐Ÿ’ฌ iMessage โœ… Full โœ… Reads ~/Library/Messages/chat.db directly
๐Ÿ’š WhatsApp โœ… Full โœ… Via WhatsApp Web (Baileys)
๐Ÿ”ต Signal โœ… Full โœ… Via signal-cli
๐ŸŸฃ Discord โœ… Full โœ… Guild + channel detection
๐ŸŸช Slack โœ… Full โœ… Workspace + channel detection
๐ŸŒ Webchat โœ… Full โœ… Built-in web UI sessions
๐Ÿ“ก IRC โœ… Full โœ… Terminal-style bubble UI
๐Ÿ BlueBubbles โœ… Full โœ… iMessage via BlueBubbles REST API
๐Ÿ”ต Google Chat โœ… Full โœ… Via Chat API webhooks
๐ŸŸฃ MS Teams โœ… Full โœ… Via Teams bot plugin
๐Ÿ”ท Mattermost โœ… Full โœ… Self-hosted team chat
๐ŸŸฉ Matrix โœ… Full โœ… Decentralized, E2EE support
๐ŸŸข LINE โœ… Full โœ… LINE Messaging API
โšก Nostr โœ… Full โœ… Decentralized NIP-04 DMs
๐ŸŸฃ Twitch โœ… Full โœ… Chat via IRC connection
๐Ÿ”ท Feishu/Lark โœ… Full โœ… WebSocket event subscription
๐Ÿ”ต Zalo โœ… Full โœ… Zalo Bot API

Auto-detection: ClawMetry reads your ~/.openclaw/openclaw.json and only renders the channels you've actually configured. No manual setup required.

Docker Deployment

Want to run ClawMetry in a container? No problem! ๐Ÿณ

Quick start with Docker:

# Build the image
docker build -t clawmetry .

# Run with default settings
docker run -p 8900:8900 clawmetry

# Or mount your agent's data dir (shown: OpenClaw's ~/.openclaw)
docker run -p 8900:8900 \
  -v ~/.openclaw:/root/.openclaw \
  -v /tmp/moltbot:/tmp/moltbot \
  clawmetry

Docker Compose example:

version: '3.8'
services:
  clawmetry:
    build: .
    ports:
      - "8900:8900"
    volumes:
      - ~/.openclaw:/root/.openclaw:ro
      - /tmp/moltbot:/tmp/moltbot:ro
    restart: unless-stopped

Note: When running in Docker, mount your agent's data + log directories (e.g. ~/.openclaw, ~/.claude, ~/.codex) so ClawMetry can auto-detect your setup.

Requirements

  • Python 3.8+
  • Flask (installed automatically via pip)
  • An AI agent runtime on the same machine: OpenClaw, NVIDIA NemoClaw, Claude Code, Codex, Cursor, Goose, Hermes, opencode, Qwen Code, Aider, NanoClaw, or PicoClaw (or mounted volumes for Docker)
  • Linux or macOS

NemoClaw / OpenShell Support

ClawMetry automatically detects NemoClaw โ€” NVIDIA's enterprise security wrapper for OpenClaw that runs agents inside sandboxed OpenShell containers.

No extra configuration is needed in most cases. The sync daemon auto-discovers session files whether they live in ~/.openclaw/ on the host or inside an OpenShell container.

How it works

ClawMetry detects NemoClaw in two ways:

  1. Binary detection โ€” checks for the nemoclaw CLI and runs nemoclaw status to get sandbox info
  2. Container detection โ€” scans running Docker containers for openshell, nemoclaw, or ghcr.io/nvidia/ images, then reads sessions via volume mounts or docker cp

Session files synced from NemoClaw containers are tagged with runtime=nemoclaw and container_id metadata in the cloud dashboard, so you can tell them apart from standard OpenClaw sessions at a glance.

Recommended setup: sync daemon on the HOST

For the best experience, run ClawMetry's sync daemon on the host machine (not inside the sandbox). This avoids NemoClaw network policy restrictions.

# On the host (outside the sandbox)
pip install clawmetry
clawmetry connect
clawmetry sync

The sync daemon will automatically find sessions inside any running OpenShell containers.

Optional: explicit sandbox name

If auto-detection doesn't work, point ClawMetry at the right sandbox:

export NEMOCLAW_SANDBOX=my-sandbox-name
clawmetry sync

Running inside the sandbox (advanced)

If you must run the sync daemon inside the OpenShell sandbox, add this egress rule to your NemoClaw network policy so it can reach the ClawMetry ingest API:

# nemoclaw-policy.yaml
network:
  egress:
    - host: ingest.clawmetry.com
      port: 443
      protocol: https

Apply with:

nemoclaw policy apply --file nemoclaw-policy.yaml

Ports and endpoints

Endpoint Port Protocol Required
ingest.clawmetry.com 443 HTTPS Yes (sync daemon โ†’ cloud)
localhost:8900 8900 HTTP Yes (local dashboard UI)
Docker socket (/var/run/docker.sock) โ€” Unix socket For container session discovery

The sync daemon only makes outbound HTTPS calls to ingest.clawmetry.com. No inbound ports are required.


Cloud Deployment

See the Cloud Testing Guide for SSH tunnels, reverse proxy, and Docker.

Testing

This project is tested with BrowserStack.

BrowserStack

Telemetry

ClawMetry sends a single anonymous "first run" ping to https://app.clawmetry.com/api/install the first time you run the clawmetry CLI on a new machine. We use this to count installs (the only marketing metric we have for an OSS project) and to learn which agent frameworks our users have installed.

Exactly one POST per install, containing:

Field Example Why
install_id random UUID stored at ~/.clawmetry/install_id dedup; not linked to your email or api_key
version 0.12.167 what versions are in the wild
os / os_version Darwin / 25.3.0 platform support priorities
python 3.11.15 Python version support matrix
agent openclaw / nemoclaw / hermes / none which agents we should integrate with next
is_ci / ci_provider true / github_actions separate human installs from CI noise

What we do NOT send: IP (cloud derives the country code server-side from the request, then discards the IP), hostname, username, workspace path, file contents, your api_key, your email, anything PII or workspace-specific. The wire payload is auditable in clawmetry/telemetry.py.

Opt out (any one of these disables it permanently):

export CLAWMETRY_NO_TELEMETRY=1                # per-shell
export DO_NOT_TRACK=1                          # W3C cross-tool standard
touch ~/.clawmetry/notelemetry                 # persistent file marker

A network failure here never blocks clawmetry from running โ€” the ping is fire-and-forget on a daemon thread with a 3 s timeout.

Star History

Star History Chart

License

MIT


๐Ÿฆž See your agent think
Built by @vivekchand ยท clawmetry.com ยท Part of the OpenClaw ecosystem