Open source · MIT licensed · self-hosted

Track every event.
Own all your data.

A self-hostable event tracking and metrics dashboard. SQLite-backed, ingest with a single HTTP call, host it anywhere.

ingest an event
curl -X POST https://your-app/api/event \
  -H "X-API-Key: $BEAVER_KEY" \
  -d '{"name":"user.signed_up","title":"Alice registered","channel":"signups"}'
beaver.app/dashboard/feed

Feed

106 events
Search by title, or use object: action:
Filters
Newest first
Export
Views

🚀

deployment·success

parisosuch/colosseum:main-qsw0o8k0cckcc4kc

# coolify

today @ 2:43:16 PM

👤

user·signed_up

New signup — alice@acme.com

# signups

today @ 2:38:09 PM

💰

payment·completed

Customer paid $99.99

# payments

today @ 1:55:02 PM

🚨

alert·triggered

beszel — disk usage above 90%

# beszel

today @ 1:12:47 PM

Self-hosted

Your data lives in your own SQLite file. No third party, no data leaving your server, no per-event pricing.

Deploys in minutes

One-click to Render, Railway, or Fly.io — or docker run anywhere. Coolify supported too.

Simple API

One POST /api/event. Send single events or batches of up to 100 in a single call.

// features

Everything you need to watch your product

A focused toolkit for capturing, grouping, and measuring what happens in your app.

🚀deployment · success
👤user · signed_up
💰payment · completed

Live event feed

A real-time SSE stream of everything happening, grouped into channels and updating as it arrives.

Response time128ms

Metrics

Gauges, counters, and timeseries with filterable dashboards. Push a value with one call.

Devops

# kuma
# beszel
# coolify

Channels

Group events into channels with per-channel unread counts and notification settings.

method: googleamount > 50critical: true

Tags & filtering

Typed key/value metadata — string, number, or boolean — inferred automatically and filterable.

🚨

alert · triggered

Disk usage above 90%

Email notifications

Opt-in alerts on important events, delivered through Resend or your own SMTP server.

acme-prodbvr_live_••••a91f
acme-stagingbvr_live_••••7c20

Per-project API keys

Run many projects from one instance, each with its own scoped ingestion key.

// how it works

From zero to streaming in three steps

  1. 01

    Deploy Beaver

    Click a one-click deploy button or run docker run. A SQLite volume and JWT secret are set up for you.

  2. 02

    Create a project & channel

    Spin up a project, add a channel, and copy its scoped API key from the settings page.

  3. 03

    Send events

    POST to /api/event with one HTTP call. Events stream straight into your dashboard in real time.

curl -X POST https://your-app/api/event \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BEAVER_KEY" \
  -d '{
    "name": "user.signed_up",
    "title": "Alice registered",
    "channel": "signups",
    "icon": "👤",
    "tags": { "method": "google" }
  }'

Single events or batches up to 100. Types are inferred from the JSON.

// get it

Run your own Beaver in minutes

One click to a managed host, or self-host with Docker. No external services required.

or run locally

bash
bun install && bun run dev

SQLite volume and JWT secret are handled for you — no Postgres, no Redis, no third-party analytics.