Lookout.AspNetCore 1.0.0-preview.5

This is a prerelease version of Lookout.AspNetCore.
dotnet add package Lookout.AspNetCore --version 1.0.0-preview.5
                    
NuGet\Install-Package Lookout.AspNetCore -Version 1.0.0-preview.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Lookout.AspNetCore" Version="1.0.0-preview.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Lookout.AspNetCore" Version="1.0.0-preview.5" />
                    
Directory.Packages.props
<PackageReference Include="Lookout.AspNetCore" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Lookout.AspNetCore --version 1.0.0-preview.5
                    
#r "nuget: Lookout.AspNetCore, 1.0.0-preview.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Lookout.AspNetCore@1.0.0-preview.5
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Lookout.AspNetCore&version=1.0.0-preview.5&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Lookout.AspNetCore&version=1.0.0-preview.5&prerelease
                    
Install as a Cake Tool

<div align="center"> <img src="assets/lookout-icon.png" alt="Lookout" width="72" />

<h1>Lookout for ASP.NET Core</h1>

<p>Zero-config dev-time diagnostics dashboard for ASP.NET Core.</p>

NuGet NuGet CI License: Apache 2.0 .NET

<p> Captures HTTP requests, EF Core queries with N+1 detection, outbound HTTP, cache hits/misses,<br/> exceptions, logs, Hangfire jobs, and <code>Lookout.Dump()</code> — all correlated per-request in a browser dashboard. </p>

<img src="assets/lookout-demo.gif" alt="Lookout dashboard demo — N+1 detection in action" width="900" /> </div>


Install

dotnet add package Lookout.AspNetCore

For Hangfire job capture:

dotnet add package Lookout.Hangfire

Quickstart

Three lines in Program.cs:

builder.Services.AddLookout();

app.UseLookout();
app.MapLookout(); // mounts the dashboard as a route on your app at /lookout

The dashboard is a route inside your existing app — same host, same port, no separate process. Run your app, then open https://localhost:{port}/lookout (where {port} is your app's port). Your first request appears the moment you hit any endpoint — no database setup, no configuration file.

Dev-only by default. Lookout throws LookoutEnvironmentException at startup if IsDevelopment() is false, unless you explicitly set AllowInProduction = true or AllowInEnvironments = ["Staging"]. There is no silent production exposure.


What it captures

Capture point What you get
HTTP Requests Method, path, status, duration, headers, user identity, body (opt-in)
EF Core Queries SQL text, parameters, duration, rows affected, stack trace to your code
N+1 Detection Flags 3+ identical-normalised queries per request with a grouped banner
Raw ADO.NET / Dapper Via SqlClientDiagnosticListener (SQL Server); de-duped against EF
Outbound HTTP All HttpClient calls via auto-registered DelegatingHandler
Memory Cache IMemoryCache get (hit/miss), set, remove — hit ratio per key
Distributed Cache IDistributedCache get/set/refresh/remove, provider tagged
Exceptions Handled and unhandled — type, message, inner exceptions, stack
Logs All ILogger output, scoped to the active request; level-filterable
Hangfire Jobs Enqueue → execution cross-linked; child EF/HTTP/cache/log captures inside jobs
Lookout.Dump() Inline object inspection from anywhere — caller file + line attached

All entries are correlated by request ID and searchable full-text (SQLite FTS5).


Screenshots

<table> <tr> <td><img src="assets/screenshots/dashboard-requests.png" alt="Request list with N+1 and signal badges" /></td> <td><img src="assets/screenshots/dashboard-n1.png" alt="Request detail with N+1 banner and EF queries" /></td> </tr> <tr> <td align="center"><em>Request list — signal badges surface db, http, cache, log, job counts</em></td> <td align="center"><em>N+1 banner — 12 identical queries grouped, stack trace to your code</em></td> </tr> </table>


Dashboard features

  • Section-per-capture navigation — dedicated list page per capture type: Requests, Queries, Exceptions, Logs, Cache, Jobs, Dump, HTTP Clients
  • Full-text searchCmd+K / Ctrl+K across all entries and tags
  • Keyboard navigationj/k to move, Enter to open, Esc to go back
  • Mini-Gantt timeline — per-request coloured bars for each capture type
  • Dark mode — system / light / dark cycle, persisted across sessions
  • Source links — stack frames open directly in VS Code or Rider
  • Tag-based filtering — click any tag chip to filter across all sections
  • "Copy as cURL" — on every request detail

Security

Lookout is built to stay safe in shared dev environments:

  • Dev-only by default — throws at startup in Production unless explicitly opted in via AllowInProduction = true
  • Loopback-only by default — warns at startup if bound to a non-loopback address; set AllowNonLoopback = true to suppress
  • CSRF protection — all mutating endpoints require a double-submit cookie (__lookout-csrf) + X-Lookout-Csrf-Token header
  • Retention bounded — 24-hour time window (configurable) + 50,000 entry cap; background pruning keeps storage in check

See the Security model docs page for the full picture.


Configuration

All options are set via AddLookout(options => { ... }). Everything has a sane default — you only touch what you need.

builder.Services.AddLookout(options =>
{
    options.RetentionWindow        = TimeSpan.FromHours(24); // default
    options.MaxEntries             = 50_000;                 // default
    options.CaptureRequestBody     = true;                   // default
    options.CaptureResponseBody    = true;                   // default
    options.Ef.N1DetectionMinOccurrences = 3;               // default

    // Allow in non-Production environments
    options.AllowInEnvironments    = ["Staging"];
});

Full reference at a-ghanem1.github.io/Lookout/docs/configuration.


Documentation

Full docs at a-ghanem1.github.io/Lookout:


Comparison

Lookout MiniProfiler.NET Aspire Dashboard
Zero-config install ❌ requires AppHost
N+1 detection
Exception + log capture partial
Cache capture
Hangfire job capture
Standalone browser dashboard in-page widget
Production observability ❌ dev-only
Last major release 2026 2022 active

Lookout is complementary to both, not a replacement. MiniProfiler's in-page widget is great for timing SQL in production pages; Aspire Dashboard is a full production observability platform. Lookout is the tool you run during development when you want to understand exactly what a single request did.


Contributing

Issues and pull requests are welcome. The v2 wishlist issue tracks planned additions — a good place to find a first contribution.

Planned community PR targets post-v1: Quartz.NET, MassTransit, Wolverine, gRPC capture, IEmailSender / MailKit.


License

Apache 2.0 — see LICENSE.

Security

Found a vulnerability? Please report it privately — see SECURITY.md. Do not open a public issue.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Lookout.AspNetCore:

Package Downloads
Lookout.Hangfire

Hangfire background-job capture for Lookout's dev-time diagnostics dashboard. Records job enqueue and execution with child captures (EF queries, outbound HTTP, cache, logs, Dump) correlated per job.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0-preview.5 0 5/6/2026
1.0.0-preview.4 0 5/6/2026
1.0.0-preview.3 32 5/5/2026
1.0.0-preview.2 27 5/5/2026
1.0.0-preview.1 45 5/1/2026