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.
npx skills add Mindrally/skills --skill blazor -a claude-codeWhat 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
OnInitializedAsyncwithout blocking the render - wire up two-way binding with
@bind - speed up a long list with
Virtualizeand@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-code2Manually: put the files in place
~/.claude/skills/blazor/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/blazor/
1Skills CLI (Vercel)
npx skills add Mindrally/skills --skill blazor -a codex2Manually: put the files in place
.agents/skills/blazor/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add Mindrally/skills --skill blazor -a cursor2Manually: put the files in place
.cursor/skills/blazor/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install Mindrally/skills blazor2Manually: put the files in place
.github/skills/blazor/SKILL.md1Skills CLI (Vercel)
npx skills add Mindrally/skills --skill blazor -a gemini-cli2Platform CLI
gemini skills install https://github.com/Mindrally/skills --path blazorManually: put the files in place
.devin/skills/blazor/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add Mindrally/skills --skill blazor -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
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