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
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.
npm install @edraj/sauron-browserimport { 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.
- Get the code
git clone https://github.com/edraj/sauron.git cd sauron - Configure
cp .env.example .env - 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.
SDKs
browser · flutter · node · python · c#
Ingest
Rust / axum edge
Redis stream
buffer + rate limits
Workers
enrich · fingerprint · group
Postgres
events, issues, people
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






