Skip to main content
skill CX Codex

blazor — Claude Code skill: Blazor development guidelines

A skill that gives your coding agent Blazor rules: component lifecycle, data binding, state management and render optimization.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add Mindrally/skills --skill blazor -a claude-code
Open on GitHub

What blazor does

The skill turns the assistant into a Blazor developer who knows both Blazor Server and Blazor WebAssembly. It carries instructions on component architecture: parameters for input, EventCallback for events, IDisposable for cleanup. Your agent follows those rules whenever you ask it to write or refactor a component.

Separate sections cover the lifecycle (OnInitializedAsync, OnParametersSet, OnAfterRenderAsync), @bind two-way binding, render optimization with @key and Virtualize, and state management through cascading parameters and injectable services. There are examples for HttpClient calls, error handling with ErrorBoundary, bUnit tests and authentication via AuthorizeView.

It helps if you write C# and .razor files and want the agent to stop mixing up Blazor Server with WebAssembly or reaching for JavaScript interop too early. Installation runs through npx skills add, so you need Node.js with npx available.

What it helps with

  • build a component with parameters and events
  • load data in OnInitializedAsync without blocking the render
  • wire up two-way binding with @bind
  • speed up a long list with Virtualize and @key
  • cover a component with bUnit tests

Example prompts for the agent

  • Write a Blazor component with an Id parameter that loads the user in OnInitializedAsync
  • Why does my component render twice? Check it against the skill rules
  • Set up AuthorizeView for this page and add the [Authorize] attribute

How to install blazor

1Skills CLI (Vercel)

npx skills add Mindrally/skills --skill blazor -a claude-code

2Manually: put the files in place

~/.claude/skills/blazor/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/blazor/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about blazor

How do I install blazor in Claude?

Run npx skills add Mindrally/skills --skill blazor -a claude-code. The skill lands in ~/.claude/skills/blazor/SKILL.md.

What does the blazor skill do?

It feeds the agent Blazor development guidelines: component architecture, lifecycle, data binding, state management, render optimization, error handling, testing and authentication.

Does it cover both Blazor Server and WebAssembly?

Yes. The skill walks through both hosting models and their trade-offs: where state lives, how the connection works, what happens offline.

Source text

SKILL.md · Apache-2.0
---
name: blazor
description: Guidelines for Blazor development including component lifecycle, state management, and performance optimization
metadata:
  maintainer: Mindrally
  source: https://github.com/Mindrally/skills
---

# Blazor Development Guidelines

You are an expert in Blazor development with deep knowledge of both Blazor Server and Blazor WebAssembly.

## Component Architecture

### Component Design
- Create small, focused components
- Use component parameters for input
- Use EventCallback for output/events
- Implement IDisposable for cleanup
- Use cascading parameters sparingly

### Component Structure
```razor
@page "/users/{Id:int}"
@inject IUserService UserService

<h1>@User?.Name</h1>

@code {
    [Parameter]
    public int Id { get; set; }

    private User? User { get; set; }

    protected override async Task OnInitializedAsync()
    {
        User = await UserService.GetUserAsync(Id);
    }
}
```

## Component Lifecycle

### Lifecycle Methods
- `OnInitialized`/`OnInitializedAsync`: Initial setup
- `OnParametersSet`/`OnParametersSetAsync`: When parameters change
- `OnAfterRender`/`OnAfterRenderAsync`: After DOM updates
- `Dispose`: Cleanup resources

### Best Practices
- Use `OnInitializedAsync` for data loading
- Check `firstRender` in `OnAfterRenderAsync`
- Dispose subscriptions and timers
- Avoid long-running synchronous code

## Data Binding

### One-Way Binding
```razor
<p>@message</p>
<input value="@inputValue" />
```

### Two-Way Binding
```razor
<input @bind="inputValue" />
<input @bind="inputValue" @bind:event="oninput" />
```

### Event Handling
```razor
<button @onclick="HandleClick">Click</button>
<button @onclick="() => HandleClickWithParam(id)">Click</button>
<button @onclick="HandleClickAsync">Async Click</button>
```

## Render Optimization

### Prevent Unnecessary Renders
- Use `@key` for list items
- Implement `ShouldRender()` when appropriate
- Use `StateHasChanged()` judiciously
- Avoid inline handlers in loops

### Virtualization
```razor
<Virtualize Items="@items" Context="item">
    <ItemContent>
        <div>@item.Name</div>
    </ItemContent>
</Virtualize>
```

## State Management

### Component State
- Use private fields for component state
- Call `StateHasChanged()` when state changes externally
- Use `InvokeAsync` for thread-safe updates

### Cascading Parameters
```razor
<CascadingValue Value="@currentTheme">
    <ChildComponent />
</CascadingValue>

<!-- In child component -->
[CascadingParameter]
public Theme CurrentTheme { get; set; }
```

### State Containers
- Create injectable state services
- Use events for state change notifications
- Consider Fluxor for complex state management

## Blazor Server vs WebAssembly

### Blazor Server
- State lives on server
- Real-time connection via SignalR
- Faster initial load
- Requires stable connection
- Better for internal apps

### Blazor WebAssembly
- Runs entirely in browser
- Larger initial download
- Works offline (PWA capable)
- No server resources per user
- Better for public apps

## API Integration

### HTTP Client
```csharp
@inject HttpClient Http

private async Task LoadData()
{
    users = await Http.GetFromJsonAsync<List<User>>("api/users");
}
```

### Error Handling
```csharp
try
{
    users = await Http.GetFromJsonAsync<List<User>>("api/users");
}
catch (HttpRequestException ex)
{
    errorMessage = "Failed to load users";
}
```

## Error Handling

### Error Boundaries
```razor
<ErrorBoundary>
    <ChildContent>
        <RiskyComponent />
    </ChildContent>
    <ErrorContent Context="ex">
        <p>An error occurred: @ex.Message</p>
    </ErrorContent>
</ErrorBoundary>
```

### Global Error Handling
- Implement `IErrorBoundary` for custom handling
- Log errors to server
- Show user-friendly messages

## Testing

### bUnit Testing
```csharp
[Fact]
public void ComponentRendersCorrectly()
{
    using var ctx = new TestContext();
    var cut = ctx.RenderComponent<Counter>();

    cut.Find("p").MarkupMatches("<p>Current count: 0</p>");
    cut.Find("button").Click();
    cut.Find("p").MarkupMatches("<p>Current count: 1</p>");
}
```

## Authentication

### Setup
- Use `AuthenticationStateProvider`
- Use `AuthorizeView` for conditional UI
- Use `[Authorize]` attribute on pages
- Implement custom auth state provider for JWT

### AuthorizeView
```razor
<AuthorizeView>
    <Authorized>
        <p>Welcome, @context.User.Identity?.Name!</p>
    </Authorized>
    <NotAuthorized>
        <p>Please log in.</p>
    </NotAuthorized>
</AuthorizeView>
```

## Performance Tips

- Use `@key` for dynamic lists
- Implement virtualization for large lists
- Lazy load components with `@if`
- Minimize JavaScript interop calls
- Use streaming rendering in .NET 8+

© Mindrally · Apache-2.0 · Mindrally/skills

Similar skills

Everything for Frontend and UI →

From the same set168

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor