MIT License · Single Binary · No Instrumentation

Error tracking that works with your existing logs

Sentinel reads your stdout and stderr — no SDK, no code changes, no cloud. Pipe it in and it groups, fingerprints, and triages every error across all your services.

bash
$ docker logs -f api | sentinel stdin
connected · sentinel.db · project: api
error TypeError: Cannot read properties of undefined (reading 'id')
fingerprint a4f1b2c · 3rd occurrence · last seen 2m ago
triage: null check missing on req.body.user in auth handler
warn Database pool exhausted (14/15 connections)
fingerprint 9c3d7e2 · new issue · first seen now
triage: connection leak likely — check for unclosed queries
$ sentinel ui
dashboard → http://localhost:4040
How it works

Pipe in. Get signal.

Three steps. No account, no config file, no YAML.

01

Point it at your logs

Pipe stdin, tail files with watch ./logs/*.log, or wrap a process with run -- your_command. Sentinel reads whatever your app already emits.

02

Fingerprints, not raw lines

Multiline stack traces are grouped. UUIDs, IDs, and timestamps are stripped before hashing so the same error from different requests lands in the same bucket, every time.

03

Triage and track

Each new fingerprint is triaged — heuristically offline, or via a local LLM if you have Ollama running. Mark issues as investigating, resolved, or suppressed. Regressions are auto-flagged.

Ingestion modes

Works wherever your logs live

Three ingestion modes, one binary.

stdin

Pipe from anything

Pipe from Docker, journald, your build system, CI output — any process that writes to stdout.

$ docker logs -f api | sentinel stdin
watch

Tail log files

Glob patterns, seek-based offset tracking, and automatic rotation detection for file-based logs.

$ sentinel watch ./logs/*.log
run

Wrap your dev server

Captures stdout and stderr from a child process. Tags the session with your git branch and commit.

$ sentinel run -- npm run dev
ui

Local web dashboard

Filter by project, severity, status. View occurrence timelines, breadcrumbs, and stack frames. Real-time via SSE.

$ sentinel ui → localhost:4040
Features

Built for engineers, not ops teams

Everything you need. Nothing you don't.

fingerprinting

Stable fingerprints

SHA-256 over a normalized message and top-3 stack frames. UUIDs, IDs, timestamps, and paths are stripped first — so the same bug gets the same fingerprint across every run.

multi-language

Parses 7 languages

Structured stack trace parsing for Python, Go, Node.js, Java, Kotlin, .NET, and Rust. Multiline exceptions are grouped automatically — no config required.

multi-project

Multi-project scoping

Same error in your billing service and auth service stays separate. Use --project to scope ingestion; the dashboard has a project filter built in.

llm triage

Optional LLM triage

Works with Ollama, LM Studio, or any OpenAI-compatible endpoint. Falls back to heuristic automatically. Pass --offline to skip LLM entirely — zero latency, zero calls.

regression

Regression detection

When a resolved issue reappears after a 10-minute quiet period, it's automatically flagged as a regression. Status history tracks every transition.

breadcrumbs

Breadcrumb context

The 50 log lines preceding each error are captured and stored with the occurrence. You see what led up to it, not just the exception itself.

otlp

OTLP trace correlation

Built-in OpenTelemetry HTTP receiver. Traces are correlated with error events and shown as a span waterfall in the UI — no external collector needed.

local-first

Everything stays local

SQLite with WAL mode. API keys encrypted with AES-256-GCM. Data never leaves your machine. Self-update pulls from GitHub with SHA-256 checksum verification.

Under the hood

Deliberately minimal stack

Single binary. No runtime, no daemon, no background services. Drop it in your PATH and it works.

Go 1.23 language
SQLite + WAL storage
Pure Go SQLite no CGO
Cobra CLI
oat.ink UI library
go:embed web UI
OpenTelemetry traces
AES-256-GCM secrets
macOS · Linux · Windows platforms

Start in under a minute

Download the binary, add it to your PATH, and pipe your first logs in.

$sentinel run --offline -- npm run dev
Download Sentinel ↗ View on GitHub