One curl to push. One URL to watch. Real-time dashboards for scripts, cron jobs, AI agents, and anything that runs unattended. No signup required.
# Push data — board is created on first request $ curl 'https://statb.io/b/my-board/push?steps=+1&loss=0.0031&gpu_temp=71' {"ok":true} # Read via API $ curl 'https://statb.io/b/my-board/get' {"board_id":"my-board","data":{"steps":4217.0,"loss":0.0023,"gpu_temp":72.0}, ...} # Or just open the board $ open https://statb.io/board.html?board=my-board
No dashboarding frameworks. No time-series databases. No YAML configs. Just HTTP GET and a board that updates itself.
Any language that can make an HTTP GET can push data. curl, wget, Python urllib, fetch — all work. Query string is the API.
No signup, no API keys, no config files. Pick a board name, start pushing. Your board is created on first request.
Board viewer connects via WebSocket. Every push triggers a live delta — sub-second latency, animated transitions.
Perfect for AI agents, background workers, CI pipelines, IoT sensors. Anything unattended that needs a heartbeat.
Use +N and -N syntax to accumulate counters without reading current state.
Server is a single Python file using only stdlib asyncio. Self-host in seconds. No Redis, no Postgres, no Docker.
Everything you need to integrate statb into your workflow.
Send numeric key-value pairs to any board. The board is created automatically on first push. Both GET and POST work.
GET /b/{board_id}/push?key=value&key2=+1&key3=-0.5
POST /b/{board_id}/push?key=value
board_id can be any URL-safe string. Think of it as a namespace for your metrics.
| Syntax | Behavior | Example |
|---|---|---|
42 | Set — overwrite with value | ?cpu=72.5 |
+N | Increment — add N (starts at 0) | ?requests=+1 |
-N | Decrement — subtract N | ?stock=-3 |
Retrieve the current state of a board. Optionally filter to a single key.
GET /b/{board_id}/get
GET /b/{board_id}/get?key=requests
{
"board_id": "my-agent",
"data": { "steps": 4217.0, "loss": 0.0031, "gpu_temp": 71.0 },
"updated_at": 1718900000.12,
"created_at": 1718890000.45
}
404 if the board has not been created or has expired.Connect to receive live updates. The board viewer uses this internally.
ws://HOST/b/{board_id}/ws
On connect → full snapshot. After that → deltas with only changed keys.
// Full state on connect
{"type":"snapshot","board_id":"demo","data":{...},"updated_at":...,"created_at":...}
// Changed keys only
{"type":"delta","board_id":"demo","data":{"requests":148.0},"updated_at":...}
// Request full re-sync at any time
{"type":"snapshot"}
Open /board.html?board=your-board in any browser.
Live cards, animated values, trend badges, stale detection, fullscreen mode.
Works with anything that can make an HTTP request. No SDK needed.
# Monitor nightly backup
curl "https://statb.io/b/backups/push?last_run=$(date +%s)&size_mb=2048"
import urllib.request
url = f"https://statb.io/b/agent-7/push?epoch=+1&loss={loss:.4f}"
urllib.request.urlopen(url)
while true; do
T=$(cat /sys/class/thermal/thermal_zone0/temp)
curl -s "https://statb.io/b/rpi/push?temp_c=$(echo "$T/1000"|bc -l)"
sleep 60
done
Boards are created on first push. If no push arrives within the TTL window (default 60 min on free tier), the board is garbage-collected. Connected viewers receive an empty snapshot on expiry.
_stats board is never collected.
View live server metrics at /board.html?board=_stats.
Single-file server, zero dependencies. Python 3.11+ stdlib only.
git clone https://github.com/user/statb.git && cd statb
python3 statb-server.py --port 8000 --ttl 60
| Flag | Default | Description |
|---|---|---|
--host | 0.0.0.0 | Bind address |
--port | 8000 | Bind port |
--ttl | 60 | Board idle TTL (minutes) |
Each board is billed independently. Start free, upgrade the boards that matter.
For quick experiments and personal scripts
For production workloads and teams
Need custom limits, SSO, or on-prem? Contact us