How Rawbbit works:
From a player action to an answer

Rawbbit is an open-source game analytics pipeline. It collects every event your game emits, keeps the raw history in infrastructure you own, loads it into ClickHouse, and serves it through dashboards, SQL, and AI agents. This page follows one event through the whole path.

Side-view pixel adventure level and the events it emits A pixel hero with a sword crosses a level: a ship on the water, a coin, an enemy, spikes, a potion, a chest, a cyclops boss, and a castle at the end. Labels point to each object showing the event it emits. voyage_started combat_started purchase level_completed session_start level_failed boss_defeated item_collected player_healed
Nine event types from one level. Rawbbit collects whatever your game emits in full detail, using a consistent event envelope with flexible parameters.

Collect every event your game sends

Your game reports what players do: levels started and failed, purchases, sessions, ad views. Rawbbit takes all of it.

There is no schema to agree on first. Whatever your game sends is what gets stored, in full detail rather than as a summary.

Check events before they are stored

Every batch is checked at the door: is this request from your game, and can it be read? If something is wrong, the answer says why.

This is a check on the request, not a filter on your data. Nothing is thrown away for being uninteresting.

Handle traffic spikes without losing events

When your game suddenly gets busy, events line up in a queue instead of being turned away.

Nothing is lost while the rest of the pipeline catches up. Once the queue drains, everything that arrived during the spike is stored exactly as it came in.

Store raw player data you own

Everything lands as files in storage that belongs to you, in an open format, kept in full rather than summarised.

This is what makes leaving possible. Point another tool at the same files and your whole history comes with you.

Query player behavior fast

The raw files are loaded into a fast database on a schedule, ready for dashboards and questions.

Data that arrives late still lands. The loader goes back over recent windows, so a delayed file is picked up without duplicating anything.

Ask questions in plain language

Producers read dashboards. Analysts write SQL. Everyone else asks the AI agent your team already uses, and it writes the query.

The agent connects to your own database with read-only access, so it is your agent under your account, not a new vendor between your team and your data.

Your game

Game clients and backends send batches of events over HTTP. A JavaScript SDK is available today; native Unity and Unreal SDKs are still in progress, so studios on those engines send from their backend or over plain HTTP.

JavaScript SDKHTTPbatched

Collector API

Accepts event batches over HTTP, validates the payload, maps the API key to an app, attaches ingest metadata, and publishes one message per event.

A batch is either accepted or rejected with a reason. Limits, API keys, CORS and optional GeoIP attribution are configuration.

POST /v1/events:batchAPI key to app_idCORSGeoIP

NATS JetStream

Separates request handling from storage writes. If the raw writer restarts, the backlog waits in the stream instead of the collector rejecting traffic.

Delivery is at-least-once, and a message is acknowledged only after the write lands.

at-least-oncedurable consumerdedupe windowack after write

Parquet on object storage

The raw writer batches messages, assigns partitions, and writes compressed Parquet to S3-compatible object storage you own. A message is acknowledged only after the write lands.

This layer is the system of record. Everything downstream is derived from it and can be rebuilt without re-tracking a single event.

S3-compatibleSeaweedFSSnappypartitioned by date and hour

ClickHouse

A scheduled job loads bounded windows of raw Parquet into the events table, with a short hourly lookback and a longer daily reconciliation for late files.

Replays are safe at the event-key level, so overlapping windows cannot duplicate a row. Data tests run alongside the load.

analytics.eventsdelete_insert(app_id, event_id)data tests

MCP, dashboards, SQL

Three ways in, all reading the same table. The MCP server exposes a read-only analytical surface over your events table, so Codex, OpenCode, OpenClaw, Claude or any other MCP client can explore it.

Metabase covers dashboards and analysts connect directly with SQL, with no sampling and no export limits.

run_readonly_sqlcalculate_funnelcalculate_dausample_eventsread-only

What you actually need

Two virtual machines are enough to run this in production.

VM one handles ingestion and raw storage: NATS JetStream, the collector API, the raw writer, and SeaweedFS. VM two handles analytics and access: ClickHouse, the dbt runner, the Rawbbit MCP server, Metabase, and the Postgres instance Metabase uses for its own state. Both VMs expose optional Dozzle log access, in the browser and over MCP.

The boundary between them is the raw Parquet layer. That is a security property as much as an architectural one: an agent working on the analytics side has no path into the ingestion runtime.

Everything runs as Docker containers from public published images, so you can stand the whole stack up locally with Docker Compose before deciding anything.

Want us to run it for you?

Rawbbit architecture: mobile, backend, and browser game producers send events over HTTP to a collector-api, NATS JetStream message broker, and raw-writer running as Docker containers on a VM. Events land as partitioned Parquet in object storage (S3-compatible SeaweedFS). A dbt job loads Parquet into ClickHouse (analytics.events OBT); Metabase provides BI dashboards. An MCP server exposes the analytics layer to AI agents (Opencode, OpenClaw, Codex, Claude).
End-to-end Rawbbit pipeline: HTTP ingestion to raw Parquet, ClickHouse serving layers, modeled analytics tables, dashboards, and an MCP-powered AI agents layer.

Open source, managed for you

Rawbbit is released under the Apache 2.0 License. The source code, deployment scaffolding and modeling project are public on GitHub. Self-host it yourself, or we deploy and maintain it for you so your team works with answers instead of infrastructure.

The JavaScript SDK is available today. Native Unity and Unreal SDKs are still in progress, so studios on those engines send events from their backend or over plain HTTP.

Rawbbit components

Open source

Apache 2.0

2 VMs

in production

No per-eventor per-user fees

Collector API

Authenticates and ingests event batches.

NATS JetStream

Durable event buffer with at-least-once delivery.

AI agents layer

read-only

Codex · OpenCode · OpenClaw · Claude

Ask questions in plain language and let agents write and run the SQL.

ClickHouse

Fast analytical query layer.

Raw Writer

Writes partitioned Parquet files.

dbt runner

Builds and tests the analytics model.

Metabase

Open-source dashboards on the data.

MCP Server

Read-only analytical interface.

Object Storage

Portable S3-compatible raw event storage that belongs to you, so everything downstream can be rebuilt from it.

Deployment

Docker images on production VMs.

Raw Parquet layer

Portable raw event data you own.

Direct SQL access

Query ClickHouse directly.