Blazor Developer Tools

August 6, 2026 ยท View on GitHub

Docs & Live Demo

Blazor Developer Tools

The first visual DevTools for Blazor. See your component tree, profile renders, understand why components re-render. No more console.log debugging. BDT beta 1 screenshot - 1

Watch the video

NuGet License

What's New in v1.0.0-beta

This release is a complete architectural rewrite with powerful new features:

  • ๐Ÿงฉ Component Tree - Visualize your entire Blazor component hierarchy
  • โฑ๏ธ Timeline Profiler - Record and analyze component renders with a visual flamegraph
  • ๐Ÿ’ก "Why Did This Render?" - Click any render event to see exactly what triggered it
  • ๐Ÿ“Š Ranked View - See which components render most often and take the longest
  • ๐Ÿ”ง Works With Any Component - No code changes required for basic tracking
  • โšก Enhanced Metrics - Opt-in to BlazorDevToolsComponentBase for deep lifecycle timing

Features

  • ๐Ÿ” Component Tree Visualization - See your Blazor component hierarchy in Chrome/Edge/Firefox DevTools
  • ๐ŸŽฏ Element Picker - Click any element on the page to identify and inspect its Blazor component
  • โฑ๏ธ Timeline Profiler - Record, analyze, and visualize component render performance
  • ๐Ÿ”ฅ Flamegraph View - Visual swimlane timeline of all component events
  • ๐Ÿ“ˆ Performance Rankings - Identify your slowest components at a glance
  • ๐ŸŽจ CSS Isolation Support - Full support for Blazor CSS isolation

Supported Render Modes

โš ๏ธ Currently, Blazor Developer Tools supports InteractiveAuto (Server) render mode. This is the default render mode in .NET 8+ Blazor Web Apps. Support for WebAssembly-only mode is planned for future releases.

Installation

1. Install the NuGet Package

dotnet add package BlazorDeveloperTools

2. Register the Services

Add this line to your Program.cs:

builder.Services.AddBlazorDevTools();

3. Install the Browser Extension

4. That's it!

Open your Blazor app, press F12, and look for the "Blazor" tab in DevTools.

Extension โ†” NuGet compatibility

The browser extension auto-updates through the stores; the NuGet package is pinned per-project โ€” so version skew between them is normal and supported. Any extension โ‰ฅ 1.0.0-beta.4 works with any package โ‰ฅ 1.0.0-beta.6. The panel shows both versions in its top bar, and features that need a newer package say so instead of breaking. Keeping both on the latest version is always recommended.

Maintainer note: the package's [JSInvokable] API surface is additive-only within the 1.x line โ€” methods are never removed or renamed, DTO fields never repurposed. New package-side behaviors are advertised via GetPackageInfo().Capabilities and feature-detected by the extension.

Usage

Basic Tracking (Zero Config)

Once installed, BDT automatically tracks all components. No code changes needed!

  1. Run your Blazor app
  2. Open your browser's DevTools (F12)
  3. Navigate to the "Blazor" tab
  4. Explore the Components tree or record a Timeline profile

Enhanced Tracking (Opt-in)

For detailed lifecycle metrics, inherit from BlazorDevToolsComponentBase:

@inherits BlazorDevToolsComponentBase

<h1>My Component</h1>

@code {
    // Your component code - all lifecycle methods are automatically timed
}

This gives you:

  • โœ… Lifecycle method timing (OnInitialized, OnParametersSet, etc.)
  • โœ… ShouldRender tracking
  • โœ… StateHasChanged counts
  • โœ… Parameter change detection
  • โœ… Render efficiency metrics

Timeline Profiler

  1. Go to the Timeline tab
  2. Click Record
  3. Interact with your app
  4. Click Stop
  5. Explore the results:
    • Events - Chronological list of all lifecycle events
    • Ranked - Components sorted by total render time
    • Flamegraph - Visual timeline with zoom and pan

How It Works

BDT uses a Three Pillars architecture:

PillarMethodWhat It Tracks
1. Component ActivatorAutomaticAll component instantiation, type detection
2. Renderer SyncAutomatic (Reflection)Component IDs, parent-child hierarchy, parameters, internal state
3. Enhanced ComponentsOpt-in inheritanceDeep lifecycle metrics, timing, ShouldRender, parameter change detection

Configuration

Configure in Program.cs:

builder.Services.AddBlazorDevTools(options =>
{
    options.EnableTiming = true;         // Enable lifecycle timing (default: true)
    options.EnableEventPush = false;     // Push events to JS in real-time (default: false)
    options.MinDurationToReportMs = 0;   // Filter events below this duration (default: 0)
});

Disabling in Production

Timing is enabled by default to work out-of-the-box during development. To disable in production for zero overhead:

builder.Services.AddBlazorDevTools(options =>
{
#if !DEBUG
    options.EnableTiming = false;
#endif
});

Try It Now!

Visit blazordevelopertools.com and open DevTools to see BDT in action on a live Blazor app.

Contributing

This project is open source! We welcome contributions.

License

Licensed under the Apache License 2.0. See LICENSE for details.

Support


Built with โค๏ธ for the Blazor community by Joe Gregory