First alert at once, then summaries
The first occurrence arrives immediately, with all its details. Repeats of the same error are counted and come as one summary: “×157 more since the last message”.
Error alerts for .NET
Add one NuGet package, and every new error of your application lands in the chat you already read: the first occurrence at once, in full, and repeats as short summaries.
dotnet add package BugsRadar
Free plan · no event quotas · your events are never stored
🔴 Shop API · Error
System.TimeoutException: The operation has timed out.
Shop.Payments.PaymentService.ChargeAsync
Production · web-1 · v1.4.2 · 2026-09-22 12:00:05 UTC
OrderId = 1042
at Shop.Payments.PaymentService.ChargeAsync(Order order) at Shop.Orders.OrderService.CreateOrder(Int32 orderId)12:00
🔴 Shop API · ×157 more
System.TimeoutException: The operation has timed out.
Shop.Payments.PaymentService.ChargeAsync
×157 more since the last message · 158 total since 2026-09-22 12:00:05 UTC · last 2026-09-22 12:09:58 UTC
12:10One package
The BugsRadar package is an ILogger provider, a Serilog sink and a direct call in one. Use any of them, or all three — an error reported twice still arrives once.
ILogger provider
using BugsRadar.Extensions.DependencyInjection;
using BugsRadar.Extensions.Logging;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddBugsRadar(configuration =>
{
configuration.ApiKey = "<your project API key>";
configuration.Environment = builder.Environment.EnvironmentName;
});
builder.Logging.AddBugsRadar();
// Anywhere in your code: Error and above goes to BugsRadar
logger.LogError(exception, "Order {OrderId} failed", orderId);
Serilog sink
using BugsRadar.Extensions.Serilog;
using Serilog;
Log.Logger = new LoggerConfiguration()
.WriteTo.BugsRadar("<your project API key>")
.CreateLogger();
// Error and above goes to BugsRadar
Log.Error(exception, "Payment {PaymentId} declined", paymentId);
Direct call
using BugsRadar;
public class OrderService
{
private readonly IBugsRadar _bugsRadar;
public OrderService(IBugsRadar bugsRadar)
{
_bugsRadar = bugsRadar;
}
public void CreateOrder(int orderId)
{
try
{
// ...
}
catch (Exception error)
{
_bugsRadar.SendException(error, "Order creation failed", module: "Orders");
}
}
}
Console app
using BugsRadar;
using var bugsRadar = new BugsRadarClient(new BugsRadarConfiguration
{
ApiKey = "<your project API key>"
});
try
{
RunImport();
}
catch (Exception error)
{
bugsRadar.SendException(error);
}
await bugsRadar.FlushAsync(); // before exit; Dispose also drains the queue
Built for the bad day
When something breaks at scale, you learn about it at once, and your chat stays readable.
The first occurrence arrives immediately, with all its details. Repeats of the same error are counted and come as one summary: “×157 more since the last message”.
When errors come faster than your channel accepts, they arrive bundled: one message, one line per error, grouped by project.
An exception logged through ILogger and reported by hand arrives once. There is nothing to configure.
Reports leave through a background queue in your process, so a slow network or a slow channel never holds up your requests.
An event stays in memory only until it is delivered. Nothing is written to a database, so there is no archive of your errors on our side.
Bot tokens and webhook URLs are encrypted with AES-256-GCM. After saving you only see a mask, and they never appear in logs.
FAQ
No. An event stays in memory only until it is delivered to your channels; nothing is written to a database. BugsRadar keeps only what it needs to run: your email, your projects and the encrypted settings of your channels.
The package folds repeats into one request with a count, and BugsRadar groups them on its side: you get the first occurrence at once and summaries after that. If errors come faster than your channel accepts, they are bundled into one message with a line per error.
Messages go from your bot to your chat, so you stay in control: you choose who is in the chat and can revoke the token at any time. BugsRadar stores the token encrypted and shows only a mask after saving.
The package targets .NET Standard 2.0, so it runs on modern .NET and on .NET Framework: ASP.NET Core, worker services, desktop and console apps.
API v2 is shut down, and versions below 3.0.0.1 no longer deliver error reports. Update the package to 3.0.0.1 or later: its major version matches the API version it talks to. See Upgrading from 1.x.
Sign in with your email, create a project and add the package.