Custom metrics dashboard and Nostr relay monitoring platform. Push any time-series data to numbrs via a simple HTTP API, visualize it on drag-and-drop dashboards, and monitor your Nostr relays for latency and uptime.
Live at numbrs.lol.
- Relay health monitoring — probe WebSocket connect latency, event latency, and uptime for any Nostr relay
- Custom metric ingestion — push any numeric time-series via a single HTTP POST
- Dashboard builder — drag-and-drop grid with line charts, area charts, stat numbers, and gauge panels
- Uptime monitoring — HTTP endpoint checks with history and incident tracking
- Alerts — threshold-based notifications for relay metrics
- Public sharing — share any dashboard via a read-only link
- Templates — one-click dashboards for common setups (see below)
- API key management — generate and revoke ingest keys
| Layer | Tech |
|---|---|
| Frontend | React 18, TypeScript, Vite |
| Styling | Tailwind CSS, shadcn/ui (Radix UI) |
| Charts | Recharts |
| Animation | Framer Motion |
| Backend | Supabase (PostgreSQL, Auth, Edge Functions) |
| Auth | Email/password + Nostr NIP-07 signing |
Send a POST to the ingest endpoint with your API key:
curl -X POST https://numbrs.lol/api/ingest \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"metric": "system.cpu_pct",
"value": 42.3
}'Multiple datapoints in one request:
curl -X POST https://numbrs.lol/api/ingest \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '[
{ "metric": "system.cpu_pct", "value": 42.3 },
{ "metric": "system.ram_pct", "value": 71.1 },
{ "metric": "system.disk_boot_pct", "value": 58.0 }
]'Metrics are created automatically on first push. Use dotted namespacing (plex.library.movies.count, bitcoin.price_usd, etc.) to keep things organized.
An example collector script that pushes system, Jellyfin, Plex, Bitcoin, and Nostr metrics is in scripts/numbrs-collector.sh.
numbrs can track your Claude Code and OpenClaw AI assistant usage — token consumption, API equivalent costs, and session patterns over time.
What it tracks:
- Claude Code — tokens in/out, estimated cost, per-project breakdown from
~/.claude/projects/JSONL files - OpenClaw — AI assistant session data from
~/.openclaw/agents/main/sessions/JSONL files
How it works:
A local collector script reads your session files and pushes aggregated stats to your numbrs database. Nothing leaves your machine except to your own Supabase instance.
Setup:
The collector script runs every 5 minutes via cron:
*/5 * * * * NUMBRS_SUPABASE_URL=... NUMBRS_SUPABASE_SERVICE_KEY=... NUMBRS_OWNER_ID=... /path/to/numbrs-claude-collector.shFull setup instructions (including the collector script) are on the Integrations page under Claude Code + OpenClaw.
| Template | Description |
|---|---|
| Relay Overview | Connect latency, event latency, uptime gauge for a single relay |
| Network Health | Network-wide throughput, active relay count, latency trends |
| Zap Economy | Lightning zap volumes, counts, and averages |
| Protocol Analytics | Event kind breakdowns, propagation time, NIP support score |
| Vercel Site | Deploy counts, build durations, error rates |
| GitHub Project | Stars, forks, open issues, PR velocity |
| Uptime Overview | Uptime %, latency, incident counts |
| My Relays | DB size and pubkey counts for self-hosted Haven relays |
| Projects | GitHub stars across multiple repos |
| Mac Mini Health | CPU, RAM, disk, Jellyfin streams and library stats |
| Plex Media Server | Active streams, library counts (movies/TV/music/audiobooks) |
| Satsdisco Dashboard | BTC price, Nostr followers, GitHub project stats |
| Personal Stats | Track anything — commits, workouts, habits |
git clone https://github.com/satsdisco/numbrs
cd numbrs
npm i
npm run devYou'll need a Supabase project. Copy .env.example to .env.local and fill in:
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key
Run migrations:
supabase db pushDeploy edge functions:
supabase functions deployMIT