Embedded .NET 8 reporting with a full Blazor admin portal
Live Demo · Documentation · Pricing · NuGet
ScreamCode.Reporting is an embedded reporting library for ASP.NET Core that drops a full-featured admin portal directly into your existing application — no separate server, no external services, no re-architecting.
Install via NuGet, add a few lines to Program.cs, and your users get a complete reporting portal at /reportadmin.
yourapp.com/reportadmin ← full reporting portal, embedded in your app
Most reporting tools require a separate server, a SaaS subscription, or months of integration work. ScreamCode.Reporting is different:
- One NuGet install — no external dependencies to manage
- Your data, your server — nothing leaves your infrastructure
- One-time payment — no recurring fees, no per-seat pricing
- Blazor Server — works with your existing .NET 8 stack
| Feature | Community | Professional | Enterprise |
|---|---|---|---|
| Reports | Up to 10 | Up to 30 | Unlimited |
| HTML Templates | 5 | 10 | 10 |
| PDF export | ✓ | ✓ | ✓ |
| Excel export | ✓ | ✓ | ✓ |
| CSV export | ✓ | ✓ | ✓ |
| Charts & visualizations | — | ✓ | ✓ |
| Images in reports | — | ✓ | ✓ |
| Scheduler + email delivery | — | ✓ (5) | ✓ Unlimited |
| Audit trail | — | 30 days | 365 days |
| Backup & restore | — | ✓ | ✓ |
| Digital signature on PDFs | — | — | ✓ |
| Price | Free | $149 | $299 |
Every install starts with a 30-day Professional trial — no credit card required.
dotnet add package ScreamCode.Reporting.Core
dotnet add package ScreamCode.Reporting.Admin
dotnet add package ScreamCode.Reporting.Pdf
dotnet add package ScreamCode.Reporting.Excel
dotnet add package ScreamCode.Reporting.Builder
dotnet add package ScreamCode.Reporting.Templatesbuilder.Services
.AddScreamReporting(builder.Configuration)
.AddPdf()
.AddExcel()
.AddBuilder()
.AddTemplates()
.AddAdmin()
.AddDataProvider<YourDataProvider>();
var app = builder.Build();
await app.Services.InitializeScreamReportingAsync();
await app.Services.EnsureAdminDatabaseAsync();
app.UseStaticFiles();
app.UseAntiforgery();
app.MapBlazorHub();
var adminPath = builder.Configuration["ScreamReporting:AdminPath"] ?? "reportadmin";
app.MapFallbackToPage($"/{adminPath}/{{**path}}", "/_Host");
app.MapFallbackToPage($"/{adminPath}", "/_Host");{
"ScreamReporting": {
"LicenseKey": "",
"ApplicationName": "YourApp",
"AdminAuth": {
"Enabled": true,
"Username": "admin",
"Password": "your-secure-password"
}
}
}public class OrdersDataProvider : IReportDataProvider
{
private readonly AppDbContext _db;
public OrdersDataProvider(AppDbContext db) => _db = db;
public string EntityName => "orders";
public string DisplayName => "Orders";
public IReadOnlyList<ReportColumnDefinition> AvailableColumns =>
[
new() { Name = "Id", DisplayName = "Order ID", Type = "string" },
new() { Name = "CustomerName", DisplayName = "Customer", Type = "string" },
new() { Name = "Total", DisplayName = "Total", Type = "currency" },
new() { Name = "CreatedAt", DisplayName = "Date", Type = "datetime" }
];
public IReadOnlyList<ReportFilterDefinition> AvailableFilters =>
[
new() { Name = "CreatedAt", DisplayName = "Date Range", Type = "daterange" },
new() { Name = "CustomerName", DisplayName = "Customer", Type = "string" }
];
public async Task<ReportTable> GetDataAsync(ReportBuilderRequest request, CancellationToken ct = default)
{
var data = await _db.Orders
.Select(o => new Dictionary<string, object?>
{
["Id"] = o.Id,
["CustomerName"] = o.CustomerName,
["Total"] = o.Total,
["CreatedAt"] = o.CreatedAt
})
.ToListAsync(ct);
return new ReportTable { Columns = AvailableColumns.ToList(), Rows = data };
}
public async Task<int> GetCountAsync(ReportBuilderRequest request, CancellationToken ct = default)
=> await _db.Orders.CountAsync(ct);
}Navigate to https://yourapp.com/reportadmin — done.
Your ASP.NET Core App
│
├── / ← your existing app
└── /reportadmin ← ScreamCode.Reporting embedded portal
├── Dashboard
├── Reports ← build, run, export
├── HTML Templates ← custom layouts
├── Schedules ← automated delivery
├── Audit Trail ← full history
├── Settings ← backup & restore
└── License ← activation
ScreamCode.Reporting stores everything in a local SQLite database alongside your app — no external database required.
PDF export uses Playwright with Chromium for pixel-perfect rendering.
Automatic setup — Chromium installs automatically on first run:
[ScreamCode.Reporting] Chromium not found. Installing...
[ScreamCode.Reporting] Chromium installed successfully.
Windows Server 2016 requires a manual step — see PDF & Chromium docs.
Built-in: English and Bosnian. Add any language by dropping a JSON file:
publish/
└── Localization/
└── Languages/
├── en.json ← built-in
├── bs.json ← built-in
└── de.json ← your language
RTL languages (Arabic, Hebrew) are supported automatically.
| Package | Description |
|---|---|
ScreamCode.Reporting.Core |
Core engine, licensing, interfaces |
ScreamCode.Reporting.Admin |
Blazor Server admin portal |
ScreamCode.Reporting.Pdf |
PDF generation via Playwright |
ScreamCode.Reporting.Excel |
Excel export via ClosedXML |
ScreamCode.Reporting.Builder |
Dynamic query engine |
ScreamCode.Reporting.Templates |
HTML template engine |
ScreamCode.Reporting.Audit |
Audit trail (Professional+) |
ScreamCode.Reporting.Scheduler |
Scheduled delivery (Professional+) |
Try the full portal without installing anything:
reporting.screamcode.com/reportadmin
Full documentation at screamcode.com/docs
| Community | Professional | Enterprise | |
|---|---|---|---|
| Price | Free forever | $149 one-time | $299 one-time |
| Buy | Get started | Buy via Polar.sh | Buy via Polar.sh |
Already on Professional? Upgrade to Enterprise for $199
- Email: support@screamcode.com
- Documentation: screamcode.com/docs
- Issues: Use GitHub Issues for bug reports and feature requests
Build faster. Report smarter.