Bloop mascot

Self-hosted error tracking
that won't break the bank

A single Rust binary with SQLite storage. Multi-project support, trend charts, source maps, DuckDB-powered analytics, and SDKs for every platform.

Why Bloop?

📦

Single Binary, Zero Dependencies

One Rust binary. SQLite for storage. No Postgres, no Redis, no Kafka. Deploy a docker run and you're done.

Sub-millisecond Ingestion

Buffered MPSC channel with backpressure. Bloop ACKs instantly and never returns 429s to your clients, even under load.

🧠

Smart Fingerprinting

Normalizes UUIDs, IPs, and numbers before hashing with xxhash3. Groups "Error at 10.0.0.1:5000" and "Error at 192.168.1.2:3000" into one issue.

🔐

Passkey Auth

WebAuthn-based authentication. No passwords to leak, no tokens to rotate. Just your fingerprint or hardware key.

📊

Trend Charts & Sparklines

Hourly event timeseries with SVG area charts. Sparklines on every error row show 24-hour trends at a glance.

📂

Multi-Project

Isolate errors per project with scoped API keys. Each project gets its own key, alerts, and source maps.

🗺

Source Maps

Upload source maps and see deobfuscated stack traces. Toggle between original and minified views in the dashboard.

🔑

Scoped API Tokens

Create bearer tokens with granular scopes for CI pipelines, AI agents, and scripts. Project-scoped, SHA-256 hashed, revocable from the dashboard.

🔍

Analytics Engine

Optional DuckDB-powered Insights tab: spike detection via z-scores, top movers, error correlations, release impact scoring, and environment percentile breakdowns. Zero data migration — DuckDB reads SQLite directly.

📱

SDKs for Every Platform

First-party SDKs for TypeScript, Swift, Kotlin, React Native, Python, and Ruby. Automatic error capture with zero config.

How It Works

Your App
Client SDK
Auth
Project Key
Buffer
MPSC Channel
Process
Fingerprint
Enrich
Source Maps
Store
SQLite WAL
Analyze
DuckDB

How Bloop Compares

Bloop Sentry (self-hosted) GlitchTip Self-built
Deploy complexity docker run 23+ containers 3-5 containers You decide
Dependencies None (SQLite) Postgres, Redis, Kafka, Zookeeper, ClickHouse Postgres, Redis Varies
Idle memory ~20 MB 4+ GB ~500 MB Varies
Binary size ~15 MB N/A (multi-service) N/A (Python) Varies
Ingestion auth HMAC-SHA256 DSN tokens DSN tokens Custom
Dashboard auth WebAuthn passkeys Email/password Email/password Custom
Cost Free (MIT) Free (BSL) Free (MIT) Your time
Multi-project Built-in Built-in Built-in Custom
Source maps Built-in Built-in Limited Custom
Official SDKs 6 platforms 30+ platforms Sentry-compatible None
API tokens Scoped bearer tokens API keys DSN tokens Custom
Analytics Spikes, movers, correlations, releases, envs Built-in (advanced) Basic Custom
Alert channels Slack, Webhook, Email Slack, Email, PagerDuty, ... Slack, Email, Webhook Custom

Get Started

One command. That's it.

bash
docker run -d --name bloop \
  -p 5332:5332 \
  -v bloop_data:/data \
  -e BLOOP__AUTH__HMAC_SECRET=your-secret-here \
  ghcr.io/jaikoo/bloop:latest

Then open http://localhost:5332 and register your passkey. The Insights tab appears automatically when analytics is enabled.

Install an SDK to start capturing errors automatically:

bash
# TypeScript / Node.js
npm install @bloop/sdk

# React Native
npm install @bloop/react-native

# Python
pip install bloop-sdk

# Ruby
gem install bloop

# Swift (SPM) — add to Package.swift dependencies:
# .package(url: "https://github.com/jaikoo/bloop-swift.git", from: "0.3.0")

# Kotlin (Gradle) — add to build.gradle.kts:
# implementation("com.jaikoo.bloop:bloop-client:0.3.0")