Why it exists
Every crash reporting service wanted one of three things: my data, a JVM with a gigabyte of heap, or a Kubernetes cluster. For a side project — or an internal tool at a company that would rather not ship stack traces to a third party — none of those is a good trade.
What you get
- One native binary, 30–50 MB resident, starting in milliseconds.
scpit to a box and run it. - Automatic grouping by fingerprint (message + stack trace), with a dashboard rendered server-side through HTMX — no bundler, no Node in production.
- Embedded SQLite through sqlx4k. No database to operate.
- No login screen on purpose. It trusts
X-Auth-Request-UserandX-Auth-Request-Emailfrom oauth2-proxy, Traefik ForwardAuth or NGINXauth_request, and answers 401 without them. That buys Keycloak, Google or GitHub SSO without a line of OAuth code.
Install
docker run -p 8080:8080 -v ./data:/data ghcr.io/youndie/katcher:latest
Client, in the app you want to hear about:
Katcher.start {
remoteHost = "https://katcher.example.com"
appKey = "<YOUR_APP_KEY>"
release = "1.0.0"
environment = "Production"
}
One detail worth stealing whatever you use: an atomic guard around the handler, so a crash inside the reporter cannot re-enter it. Without one, a bad day becomes an infinite one.