Skip to content

See every error through your users' eyes.

Error tracking and product analytics in one self-hosted stack. Every crash lands on the timeline of the person who hit it.

Open source · AGPL-3.0 · Rust + Postgres + Redis

Sauron Overview for the ACME Shop app over 30 days: 39.9K events, 5.2K sessions, 1.6K users, and errors climbing after the shop@3.3.0 release.

add_to_cart → coupon_removed → StateError, same session

One session's timeline in Sauron, filtered to events and issues: product_viewed, add_to_cart, coupon_applied, coupon_removed, then a fatal StateError.

Errors ↔ user events

From a crash to the person who hit it.

Open an issue and see who hit it, on which release, and what each of them did first. Open a person and see their errors inline with everything else they did.

Sauron issue detail for "StateError: Bad state: No element" in CartRepository.first, with its events over time and a stack trace with in-app frames highlighted.

290 customers hit it · Maya tried twice, didn’t buy

Sauron person profile for Maya Chen: her sessions, product events and the errors she hit, interleaved on one timeline.

Product analytics

Did the crash cost you the customer?

Retention splits every cohort by whether people hit an error. Funnels show where checkout leaks. Same data, same people, no export to a second tool.

Sauron checkout funnel over 30 days: product_viewed, add_to_cart, checkout_started and checkout_completed, with conversion and drop-off at each step.

Week 1: 25% came back after an error, 61% without

Sauron weekly retention split by whether people hit an error: in the Oct 26 cohort, 25% of people who hit an error came back in week 1, against 61% of those who did not.

Alerts & uptime

Know before your users tell you.

Alert rules on issues and performance, delivered to Email, Slack, Discord, Matrix, Telegram or any webhook. Uptime monitors live on the same dashboard, so ruling out the backend takes one glance.

Sauron uptime monitors for six ACME endpoints, all up with 100% uptime over 24 hours and their response times.

Paged 40 s after the first crash

Sauron alert history: "New fatal issue" sent to #shop-alerts and the on-call pager, followed by "Checkout errors spike".

And the rest of the platform

Releases & crash-free rate
Scope every page to a release and see which version broke things.
Source maps & symbols
Upload source maps and Flutter symbols for readable stack traces.
Performance
Transactions and HTTP spans with latency percentiles per screen and route.
Query-language search
Filter issues and events with a compact, typed query language.
Environments
dev, staging, production per app, each with its own DSN.
Fine-grained RBAC
Roles at org, project or app scope, plus custom roles.
Parquet cold storage
Old partitions tier out to Parquet and stay readable.
MCP server
Let AI agents query issues and sessions with scoped keys.
Arabic & RTL
The dashboard ships in English and Arabic, right-to-left included.

One SDK sends both signals.

Call identify once and every event and every error after it belongs to that person. No second SDK, no second user id to keep in sync.

SDKs are LGPL-3.0, so they fit in closed-source apps. The server is AGPL-3.0.

Install
npm install @edraj/sauron-browser
Use
import { Sauron } from '@edraj/sauron-browser';

Sauron.init({
  dsn: 'https://pk_test@ingest.example.com/42',
  release: 'web@1.4.2',
});

Sauron.identify('u_123', { plan: 'pro' });
Sauron.track('checkout_completed', { cart_value: 42.5 });

try {
  doRiskyThing();
} catch (err) {
  Sauron.captureException(err);
}

Uncaught errors, unhandled rejections, clicks, fetch/XHR and SPA navigations are captured automatically. A <script> build is available for no-bundler pages and Google Tag Manager.

Self-host it.

Two things to run besides Sauron: Postgres and Redis. Pick how you deploy.

Edit .env and change JWT_SECRET and NOTIFY_SECRET_KEY first. Both ship as placeholders and neither is safe to leave.

  1. Get the code
    git clone https://github.com/edraj/sauron.git
    cd sauron
  2. Configure
    cp .env.example .env
  3. Run
    docker compose up --build

Dashboard on http://localhost:10002 · API on :10000 · Ingest on :10001. Migrations run on their own.

Configuration, upgrades and the variables that matter are in the full install guide.

Under the hood

A Rust ingest edge accepts events fast and hands them to workers through a Redis stream. Workers group errors into issues and write everything to Postgres, where the API and dashboard read it.

  1. SDKs

    browser · flutter · node · python · c#

  2. Ingest

    Rust / axum edge

  3. Redis stream

    buffer + rate limits

  4. Workers

    enrich · fingerprint · group

  5. Postgres

    events, issues, people

  6. API + dashboard

    Rust / axum · Svelte

Open source. Yours to run.

Your errors and your users' events stay on your servers. If Sauron is useful to you, a star helps other developers find it.

Star on GitHub