Self-hosted observability,
embedded in your own app.
Logs, metrics, traces, and alerts for ASP.NET Core — with real ingestion and zero external dependencies. No collector, no separate service, no Docker Compose file. Two calls in Program.cs and it's running.
One package. Every signal.
Logs
Every ILogger call, captured automatically the moment AddNafasServer() runs — no bespoke sink to wire up.
Metrics
Built on System.Diagnostics.Metrics — CPU, memory, and your own custom meters, charted out of the box.
Traces
Distributed traces via Activity/ActivitySource, the same primitives OpenTelemetry itself is built on.
Alerting
Threshold and absence rules, authored from the dashboard — fires only on state transitions, delivered to your own webhook.
That's the whole integration.
No collector to run, no exporter to configure, no separate storage to stand up. AddNafasServer() wires up SQLite storage and real ingestion; UseNafasDashboard() mounts the dashboard at whatever path your app chooses.
builder.Services.AddNafasServer();
var app = builder.Build();
app.UseNafasDashboard("/nafas");
app.Run();Automatic. No instrumentation code.
Ingestion is decoupled from your request pipeline via a bounded, non-blocking channel — a burst of traffic slows nothing down.
Is this for you?
Nafas is a good fit if
- you run one app (or a handful) and want real observability without standing up infrastructure
- you want the same "just works" posture as Hangfire's own dashboard — secured to local requests by default
- SQLite or SQL Server already covers your storage needs
Reach for OTel + Prometheus/Grafana instead if
- you need federation across dozens of services or long-term, high-cardinality storage
- you're already exporting to a central observability backend
- you need a query language beyond what a single embedded dashboard offers
Two NuGet packages. Zero infrastructure.
Nafas.Observability for any ASP.NET Core app, Nafas.Observability.Server for WinForms/WPF/console apps with no pipeline of their own.