[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-create-blazor-project":3,"mdc-s49ywu-key":37,"related-repo-dotnet-create-blazor-project":2159,"related-org-dotnet-create-blazor-project":2265},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":32,"sourceUrl":35,"mdContent":36},"create-blazor-project","create ASP.NET Core Blazor projects","Create a new ASP.NET Core web application or web site using Blazor. USE FOR: creating a new Blazor web app, scaffolding a new web project, starting a new web site, choosing render modes (Static SSR, Interactive Server, Interactive WebAssembly, Auto), running dotnet new blazor with the right options, setting up initial project structure. DO NOT USE FOR: adding features to existing projects, changing how an existing app renders, or component authoring (use author-component).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19,22],{"name":13,"slug":14,"type":15},".NET","net","tag",{"name":17,"slug":18,"type":15},"ASP.NET Core","asp-net-core",{"name":20,"slug":21,"type":15},"Blazor","blazor",{"name":23,"slug":24,"type":15},"Web Development","web-development",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-12T08:23:01.601121","MIT",332,[31],"agent-skills",{"repoUrl":26,"stars":25,"forks":29,"topics":33,"description":34},[31],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-blazor\u002Fskills\u002Fcreate-blazor-project","---\nlicense: MIT\nname: create-blazor-project\ndescription: >\n  Create a new ASP.NET Core web application or web site using Blazor.\n  USE FOR: creating a new Blazor web app, scaffolding a new web project,\n  starting a new web site, choosing render modes (Static SSR, Interactive Server,\n  Interactive WebAssembly, Auto), running dotnet new blazor with the right options,\n  setting up initial project structure.\n  DO NOT USE FOR: adding features to existing projects, changing how an existing\n  app renders, or component authoring (use author-component).\n---\n\n# Create a Blazor Web App\n\n## Before You Start — Gather Requirements\n\nIf the user's request doesn't make the following clear, ask before scaffolding:\n\n1. **What does the app do?** List the main screens\u002Ffeatures (e.g., \"product catalog with search and shopping cart\").\n2. **What kind of interactivity is needed?** Displaying data and forms? Real-time updates? Offline support? Rich drag-and-drop UI?\n3. **Deployment environment?** Internet-facing? Intranet? Mobile users on slow connections?\n4. **Authentication needed?** Anonymous? Individual accounts? Organizational (Azure AD)?\n\n## Pick the Right Interactivity Level\n\nBlazor render modes are a progression scale. Start at the simplest level that satisfies the requirements and only move up when there's a concrete reason.\n\n```\nStatic SSR ──→ SSR + Enhanced Nav ──→ Interactive Server ──→ Interactive WebAssembly\n simplest                                                           most complex\n```\n\n### Decision Rules\n\n| If the app needs... | Use | Why |\n|---|---|---|\n| Display data, simple forms, links between pages | **Static SSR** (`-int None`) | No JS runtime, no circuit, no WebAssembly download. Forms work via HTML POST. Enhanced navigation makes it feel snappy. |\n| Everything above + a few components with client-side behavior (live search, real-time updates, complex form wizards) | **Interactive Server, per-page** (`-int Server`) | Only the components that need interactivity opt in with `@rendermode`. The rest stays static. Server-side execution, full .NET access, no API layer needed. |\n| Most pages need rich interactivity (dashboards, drag-and-drop, chat) | **Interactive Server, global** (`-int Server -ai`) | Every component is interactive by default. Consistent UX, simpler mental model. Trade-off: every user holds a SignalR circuit on the server. |\n| Network latency is a problem, users are on mobile\u002Fpoor connections, or the app must work offline | **Interactive WebAssembly** (`-int WebAssembly`) | Code runs in the browser. Eliminates round-trip latency but requires a `.Client` project, API layer for data access, and downloads the .NET runtime to the browser on first visit. For offline support, enable PWA: add a service worker and manifest after scaffolding (not included in the template by default). |\n| Fast initial load (Server) + low latency after (WebAssembly) | **Interactive Auto** (`-int Auto`) | First visit uses Server; subsequent visits use cached WebAssembly runtime. Most complex setup — see Auto constraints below. Only choose when both Server and WebAssembly constraints apply. |\n\n**Default recommendation:** Start with `-int Server` (per-page). It covers the vast majority of apps. Upgrade to global or WebAssembly only when a specific requirement demands it.\n\n### Auto Mode Constraints\n\nAuto mode means your component code runs on the server first, then in the browser on subsequent visits. This creates real constraints:\n\n- **All interactive components must live in the `.Client` project** — same as WebAssembly.\n- **No direct server access** from interactive components — no EF `DbContext`, no file system, no server-only services. All data access must go through HTTP APIs.\n- **Both `Program.cs` files must register matching services** — the server and client DI containers must both provide implementations for any service an interactive component injects.\n- **Code must not assume its execution environment** — no `HttpContext` access, no browser-only APIs without `RendererInfo` guards.\n- **Test in both modes** — a component that works on Server during development may break on WebAssembly in production (second visit). Test both paths.\n\n### Don'ts\n\n- Don't pick WebAssembly \"because it's cool\" — it adds a `.Client` project, forces API-mediated data access, and downloads ~10MB to the browser on first visit.\n- Don't pick Auto unless you can articulate why Server alone and WebAssembly alone are both insufficient.\n- Don't pick global interactivity for apps where most pages are read-only content — per-page keeps the static pages fast and reduces server memory.\n\n## Scaffold the Project\n\n### Static SSR Only (display data + simple forms)\n\n```shell\ndotnet new blazor -o {AppName} -int None\n```\n\nNo interactive runtime. Enhanced navigation enabled by default via `blazor.web.js`.\n\n### Interactive Server, Per-Page (recommended default)\n\n```shell\ndotnet new blazor -o {AppName} -int Server\n```\n\nPages are static by default. Add `@rendermode InteractiveServer` to components that need interactivity.\n\n### Interactive Server, Global\n\n```shell\ndotnet new blazor -o {AppName} -int Server -ai\n```\n\nAll pages interactive via `\u003CRoutes @rendermode=\"InteractiveServer\" \u002F>` in `App.razor`.\n\n### Interactive WebAssembly, Per-Page\n\n```shell\ndotnet new blazor -o {AppName} -int WebAssembly\n```\n\nCreates `{AppName}` (server) and `{AppName}.Client` (WebAssembly) projects. Interactive components must live in `.Client`.\n\n### Interactive WebAssembly, Global\n\n```shell\ndotnet new blazor -o {AppName} -int WebAssembly -ai\n```\n\n### Interactive Auto, Per-Page\n\n```shell\ndotnet new blazor -o {AppName} -int Auto\n```\n\n### Interactive Auto, Global\n\n```shell\ndotnet new blazor -o {AppName} -int Auto -ai\n```\n\n### With Authentication\n\nAppend `-au Individual` to any command above:\n\n```shell\ndotnet new blazor -o {AppName} -int Server -au Individual\n```\n\n`-au Individual` scaffolds ASP.NET Core Identity with SQLite (CLI) or SQL Server (Visual Studio). Identity pages are always static SSR — they do not use interactive render modes.\n\nThe `blazor` template only supports `-au Individual`. For organizational auth (Microsoft Entra ID, Azure AD B2C), scaffold with `-au Individual` first, then replace the Identity provider with `Microsoft.Identity.Web` \u002F OIDC middleware and configure the tenant in `appsettings.json`.\n\n## What the Template Creates\n\n### Single project (Static SSR, Server)\n\n```\n{AppName}\u002F\n├── Components\u002F\n│   ├── App.razor              # Root component — sets \u003CHeadOutlet> and \u003CRoutes>\n│   ├── Routes.razor           # Wraps \u003CRouter> with route discovery\n│   ├── Layout\u002F\n│   │   ├── MainLayout.razor   # App shell with nav, header, footer\n│   │   └── MainLayout.razor.css\n│   └── Pages\u002F\n│       └── Home.razor         # @page \"\u002F\" — first page\n├── Program.cs                 # Service registration and middleware\n├── wwwroot\u002F                   # Static files (CSS, images)\n└── {AppName}.csproj\n```\n\n### Two projects (WebAssembly, Auto)\n\n```\n{AppName}\u002F                     # Server project — hosts the app\n├── Components\u002F                # Server-only components (static SSR pages, layouts)\n│   ├── App.razor\n│   ├── Routes.razor\n│   └── Layout\u002F\n├── Program.cs                 # Server Program.cs\n└── {AppName}.Client\u002F          # Client project — WebAssembly components\n    ├── Pages\u002F                 # Interactive components go HERE\n    ├── Program.cs             # Client Program.cs\n    └── _Imports.razor\n```\n\n**Rule:** Components using `InteractiveWebAssembly` or `InteractiveAuto` must live in the `.Client` project. They can reference shared code but cannot reference server-only types (EF `DbContext`, server-side services).\n\n## Program.cs Wiring\n\nThe template generates the correct `Program.cs` for the chosen mode. Verify these registrations match your intent:\n\n### Static SSR Only\n\n```csharp\n\u002F\u002F Program.cs\nbuilder.Services.AddRazorComponents();\n\n\u002F\u002F ...\n\napp.MapRazorComponents\u003CApp>();\n```\n\n### Server (per-page or global)\n\n```csharp\nbuilder.Services.AddRazorComponents()\n    .AddInteractiveServerComponents();\n\n\u002F\u002F ...\n\napp.MapRazorComponents\u003CApp>()\n    .AddInteractiveServerRenderMode();\n```\n\n### WebAssembly (per-page or global)\n\n```csharp\n\u002F\u002F Server Program.cs\nbuilder.Services.AddRazorComponents()\n    .AddInteractiveWebAssemblyComponents();\n\n\u002F\u002F ...\n\napp.MapRazorComponents\u003CApp>()\n    .AddInteractiveWebAssemblyRenderMode()\n    .AddAdditionalAssemblies(typeof({AppName}.Client._Imports).Assembly);\n```\n\n```csharp\n\u002F\u002F Client Program.cs\nbuilder.Services.AddAuthorizationCore();\n\u002F\u002F Register HttpClient, other client-side services\n```\n\n## Create Project AGENTS.md\n\nAfter scaffolding, create an `AGENTS.md` file in the project root (next to the `.csproj`). For two-project setups, put it in the server project root.\n\nPick the matching template from `assets\u002Fagents-md\u002F` based on the chosen mode:\n\n| Mode | Template file |\n|------|--------------|\n| Static SSR (`-int None`) | `assets\u002Fagents-md\u002Fssr-none.md` |\n| Server, per-page (`-int Server`) | `assets\u002Fagents-md\u002Fserver-per-page.md` |\n| Server, global (`-int Server -ai`) | `assets\u002Fagents-md\u002Fserver-global.md` |\n| WebAssembly, per-page (`-int WebAssembly`) | `assets\u002Fagents-md\u002Fwebassembly-per-page.md` |\n| WebAssembly, global (`-int WebAssembly -ai`) | `assets\u002Fagents-md\u002Fwebassembly-global.md` |\n| Auto, per-page (`-int Auto`) | `assets\u002Fagents-md\u002Fauto-per-page.md` |\n| Auto, global (`-int Auto -ai`) | `assets\u002Fagents-md\u002Fauto-global.md` |\n\nCopy the template contents into the project's `AGENTS.md` and replace every `{AppName}` with the actual project name. If auth was scaffolded (`-au Individual`), add an `## Authentication` section noting that ASP.NET Core Identity is configured and that Identity pages under `Components\u002FAccount\u002F` are always static SSR — do not add `@rendermode` to them.\n\n**After scaffolding the project and creating AGENTS.md, continue implementing the features the user requested.** Remove default template pages (Counter, Weather) and replace them with the actual application pages.\n\n### Auto (per-page or global)\n\n```csharp\n\u002F\u002F Server Program.cs\nbuilder.Services.AddRazorComponents()\n    .AddInteractiveServerComponents()\n    .AddInteractiveWebAssemblyComponents();\n\n\u002F\u002F ...\n\napp.MapRazorComponents\u003CApp>()\n    .AddInteractiveServerRenderMode()\n    .AddInteractiveWebAssemblyRenderMode()\n    .AddAdditionalAssemblies(typeof({AppName}.Client._Imports).Assembly);\n```\n\n## App.razor — Global vs Per-Page\n\nThe difference between global and per-page interactivity is entirely in `App.razor`:\n\n### Per-page (default)\n\n```razor\n\u003C!DOCTYPE html>\n\u003Chtml>\n\u003Chead>\n    \u003CHeadOutlet \u002F>\n\u003C\u002Fhead>\n\u003Cbody>\n    \u003CRoutes \u002F>\n    \u003Cscript src=\"_framework\u002Fblazor.web.js\">\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\nNo `@rendermode` on `\u003CRoutes>` or `\u003CHeadOutlet>`. Individual pages opt in.\n\n### Global\n\n```razor\n\u003C!DOCTYPE html>\n\u003Chtml>\n\u003Chead>\n    \u003CHeadOutlet @rendermode=\"InteractiveServer\" \u002F>\n\u003C\u002Fhead>\n\u003Cbody>\n    \u003CRoutes @rendermode=\"InteractiveServer\" \u002F>\n    \u003Cscript src=\"_framework\u002Fblazor.web.js\">\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\nReplace `InteractiveServer` with `InteractiveWebAssembly` or `InteractiveAuto` as appropriate.\n\n## After Scaffolding\n\n1. **Verify it builds:** `dotnet build`\n2. **Run it:** `dotnet run` (in the server project if two-project setup)\n3. **Add your first page:** Create a `.razor` file in `Components\u002FPages\u002F` (server project) or `Pages\u002F` (`.Client` project for WebAssembly components)\n\n## Don'ts\n\n- Don't use `dotnet new blazorwasm` — that creates a standalone WebAssembly SPA without server-side rendering. Use the `blazor` template with `-int WebAssembly` instead.\n- Don't manually add `AddInteractiveServerComponents()` to a project created with `-int None` and expect it to work — you also need the `@rendermode` directives and potentially `App.razor` changes. Re-scaffold if the mode needs to change fundamentally.\n- Don't put WebAssembly-targeted components in the server project — they'll work during prerender but fail after handoff.\n",{"data":38,"body":39},{"license":28,"name":4,"description":6},{"type":40,"children":41},"root",[42,51,58,64,110,116,121,134,141,337,354,360,365,458,464,489,495,501,552,565,571,610,623,629,673,693,699,738,765,771,814,820,859,865,908,914,927,975,985,1026,1032,1038,1047,1053,1062,1102,1108,1120,1126,1188,1194,1255,1261,1337,1368,1374,1395,1408,1593,1642,1652,1658,1746,1752,1764,1770,1859,1886,1892,1971,1997,2003,2079,2084,2153],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"create-a-blazor-web-app",[48],{"type":49,"value":50},"text","Create a Blazor Web App",{"type":43,"tag":52,"props":53,"children":55},"h2",{"id":54},"before-you-start-gather-requirements",[56],{"type":49,"value":57},"Before You Start — Gather Requirements",{"type":43,"tag":59,"props":60,"children":61},"p",{},[62],{"type":49,"value":63},"If the user's request doesn't make the following clear, ask before scaffolding:",{"type":43,"tag":65,"props":66,"children":67},"ol",{},[68,80,90,100],{"type":43,"tag":69,"props":70,"children":71},"li",{},[72,78],{"type":43,"tag":73,"props":74,"children":75},"strong",{},[76],{"type":49,"value":77},"What does the app do?",{"type":49,"value":79}," List the main screens\u002Ffeatures (e.g., \"product catalog with search and shopping cart\").",{"type":43,"tag":69,"props":81,"children":82},{},[83,88],{"type":43,"tag":73,"props":84,"children":85},{},[86],{"type":49,"value":87},"What kind of interactivity is needed?",{"type":49,"value":89}," Displaying data and forms? Real-time updates? Offline support? Rich drag-and-drop UI?",{"type":43,"tag":69,"props":91,"children":92},{},[93,98],{"type":43,"tag":73,"props":94,"children":95},{},[96],{"type":49,"value":97},"Deployment environment?",{"type":49,"value":99}," Internet-facing? Intranet? Mobile users on slow connections?",{"type":43,"tag":69,"props":101,"children":102},{},[103,108],{"type":43,"tag":73,"props":104,"children":105},{},[106],{"type":49,"value":107},"Authentication needed?",{"type":49,"value":109}," Anonymous? Individual accounts? Organizational (Azure AD)?",{"type":43,"tag":52,"props":111,"children":113},{"id":112},"pick-the-right-interactivity-level",[114],{"type":49,"value":115},"Pick the Right Interactivity Level",{"type":43,"tag":59,"props":117,"children":118},{},[119],{"type":49,"value":120},"Blazor render modes are a progression scale. Start at the simplest level that satisfies the requirements and only move up when there's a concrete reason.",{"type":43,"tag":122,"props":123,"children":127},"pre",{"className":124,"code":126,"language":49},[125],"language-text","Static SSR ──→ SSR + Enhanced Nav ──→ Interactive Server ──→ Interactive WebAssembly\n simplest                                                           most complex\n",[128],{"type":43,"tag":129,"props":130,"children":132},"code",{"__ignoreMap":131},"",[133],{"type":49,"value":126},{"type":43,"tag":135,"props":136,"children":138},"h3",{"id":137},"decision-rules",[139],{"type":49,"value":140},"Decision Rules",{"type":43,"tag":142,"props":143,"children":144},"table",{},[145,169],{"type":43,"tag":146,"props":147,"children":148},"thead",{},[149],{"type":43,"tag":150,"props":151,"children":152},"tr",{},[153,159,164],{"type":43,"tag":154,"props":155,"children":156},"th",{},[157],{"type":49,"value":158},"If the app needs...",{"type":43,"tag":154,"props":160,"children":161},{},[162],{"type":49,"value":163},"Use",{"type":43,"tag":154,"props":165,"children":166},{},[167],{"type":49,"value":168},"Why",{"type":43,"tag":170,"props":171,"children":172},"tbody",{},[173,205,242,271,308],{"type":43,"tag":150,"props":174,"children":175},{},[176,182,200],{"type":43,"tag":177,"props":178,"children":179},"td",{},[180],{"type":49,"value":181},"Display data, simple forms, links between pages",{"type":43,"tag":177,"props":183,"children":184},{},[185,190,192,198],{"type":43,"tag":73,"props":186,"children":187},{},[188],{"type":49,"value":189},"Static SSR",{"type":49,"value":191}," (",{"type":43,"tag":129,"props":193,"children":195},{"className":194},[],[196],{"type":49,"value":197},"-int None",{"type":49,"value":199},")",{"type":43,"tag":177,"props":201,"children":202},{},[203],{"type":49,"value":204},"No JS runtime, no circuit, no WebAssembly download. Forms work via HTML POST. Enhanced navigation makes it feel snappy.",{"type":43,"tag":150,"props":206,"children":207},{},[208,213,229],{"type":43,"tag":177,"props":209,"children":210},{},[211],{"type":49,"value":212},"Everything above + a few components with client-side behavior (live search, real-time updates, complex form wizards)",{"type":43,"tag":177,"props":214,"children":215},{},[216,221,222,228],{"type":43,"tag":73,"props":217,"children":218},{},[219],{"type":49,"value":220},"Interactive Server, per-page",{"type":49,"value":191},{"type":43,"tag":129,"props":223,"children":225},{"className":224},[],[226],{"type":49,"value":227},"-int Server",{"type":49,"value":199},{"type":43,"tag":177,"props":230,"children":231},{},[232,234,240],{"type":49,"value":233},"Only the components that need interactivity opt in with ",{"type":43,"tag":129,"props":235,"children":237},{"className":236},[],[238],{"type":49,"value":239},"@rendermode",{"type":49,"value":241},". The rest stays static. Server-side execution, full .NET access, no API layer needed.",{"type":43,"tag":150,"props":243,"children":244},{},[245,250,266],{"type":43,"tag":177,"props":246,"children":247},{},[248],{"type":49,"value":249},"Most pages need rich interactivity (dashboards, drag-and-drop, chat)",{"type":43,"tag":177,"props":251,"children":252},{},[253,258,259,265],{"type":43,"tag":73,"props":254,"children":255},{},[256],{"type":49,"value":257},"Interactive Server, global",{"type":49,"value":191},{"type":43,"tag":129,"props":260,"children":262},{"className":261},[],[263],{"type":49,"value":264},"-int Server -ai",{"type":49,"value":199},{"type":43,"tag":177,"props":267,"children":268},{},[269],{"type":49,"value":270},"Every component is interactive by default. Consistent UX, simpler mental model. Trade-off: every user holds a SignalR circuit on the server.",{"type":43,"tag":150,"props":272,"children":273},{},[274,279,295],{"type":43,"tag":177,"props":275,"children":276},{},[277],{"type":49,"value":278},"Network latency is a problem, users are on mobile\u002Fpoor connections, or the app must work offline",{"type":43,"tag":177,"props":280,"children":281},{},[282,287,288,294],{"type":43,"tag":73,"props":283,"children":284},{},[285],{"type":49,"value":286},"Interactive WebAssembly",{"type":49,"value":191},{"type":43,"tag":129,"props":289,"children":291},{"className":290},[],[292],{"type":49,"value":293},"-int WebAssembly",{"type":49,"value":199},{"type":43,"tag":177,"props":296,"children":297},{},[298,300,306],{"type":49,"value":299},"Code runs in the browser. Eliminates round-trip latency but requires a ",{"type":43,"tag":129,"props":301,"children":303},{"className":302},[],[304],{"type":49,"value":305},".Client",{"type":49,"value":307}," project, API layer for data access, and downloads the .NET runtime to the browser on first visit. For offline support, enable PWA: add a service worker and manifest after scaffolding (not included in the template by default).",{"type":43,"tag":150,"props":309,"children":310},{},[311,316,332],{"type":43,"tag":177,"props":312,"children":313},{},[314],{"type":49,"value":315},"Fast initial load (Server) + low latency after (WebAssembly)",{"type":43,"tag":177,"props":317,"children":318},{},[319,324,325,331],{"type":43,"tag":73,"props":320,"children":321},{},[322],{"type":49,"value":323},"Interactive Auto",{"type":49,"value":191},{"type":43,"tag":129,"props":326,"children":328},{"className":327},[],[329],{"type":49,"value":330},"-int Auto",{"type":49,"value":199},{"type":43,"tag":177,"props":333,"children":334},{},[335],{"type":49,"value":336},"First visit uses Server; subsequent visits use cached WebAssembly runtime. Most complex setup — see Auto constraints below. Only choose when both Server and WebAssembly constraints apply.",{"type":43,"tag":59,"props":338,"children":339},{},[340,345,347,352],{"type":43,"tag":73,"props":341,"children":342},{},[343],{"type":49,"value":344},"Default recommendation:",{"type":49,"value":346}," Start with ",{"type":43,"tag":129,"props":348,"children":350},{"className":349},[],[351],{"type":49,"value":227},{"type":49,"value":353}," (per-page). It covers the vast majority of apps. Upgrade to global or WebAssembly only when a specific requirement demands it.",{"type":43,"tag":135,"props":355,"children":357},{"id":356},"auto-mode-constraints",[358],{"type":49,"value":359},"Auto Mode Constraints",{"type":43,"tag":59,"props":361,"children":362},{},[363],{"type":49,"value":364},"Auto mode means your component code runs on the server first, then in the browser on subsequent visits. This creates real constraints:",{"type":43,"tag":366,"props":367,"children":368},"ul",{},[369,386,404,422,448],{"type":43,"tag":69,"props":370,"children":371},{},[372,384],{"type":43,"tag":73,"props":373,"children":374},{},[375,377,382],{"type":49,"value":376},"All interactive components must live in the ",{"type":43,"tag":129,"props":378,"children":380},{"className":379},[],[381],{"type":49,"value":305},{"type":49,"value":383}," project",{"type":49,"value":385}," — same as WebAssembly.",{"type":43,"tag":69,"props":387,"children":388},{},[389,394,396,402],{"type":43,"tag":73,"props":390,"children":391},{},[392],{"type":49,"value":393},"No direct server access",{"type":49,"value":395}," from interactive components — no EF ",{"type":43,"tag":129,"props":397,"children":399},{"className":398},[],[400],{"type":49,"value":401},"DbContext",{"type":49,"value":403},", no file system, no server-only services. All data access must go through HTTP APIs.",{"type":43,"tag":69,"props":405,"children":406},{},[407,420],{"type":43,"tag":73,"props":408,"children":409},{},[410,412,418],{"type":49,"value":411},"Both ",{"type":43,"tag":129,"props":413,"children":415},{"className":414},[],[416],{"type":49,"value":417},"Program.cs",{"type":49,"value":419}," files must register matching services",{"type":49,"value":421}," — the server and client DI containers must both provide implementations for any service an interactive component injects.",{"type":43,"tag":69,"props":423,"children":424},{},[425,430,432,438,440,446],{"type":43,"tag":73,"props":426,"children":427},{},[428],{"type":49,"value":429},"Code must not assume its execution environment",{"type":49,"value":431}," — no ",{"type":43,"tag":129,"props":433,"children":435},{"className":434},[],[436],{"type":49,"value":437},"HttpContext",{"type":49,"value":439}," access, no browser-only APIs without ",{"type":43,"tag":129,"props":441,"children":443},{"className":442},[],[444],{"type":49,"value":445},"RendererInfo",{"type":49,"value":447}," guards.",{"type":43,"tag":69,"props":449,"children":450},{},[451,456],{"type":43,"tag":73,"props":452,"children":453},{},[454],{"type":49,"value":455},"Test in both modes",{"type":49,"value":457}," — a component that works on Server during development may break on WebAssembly in production (second visit). Test both paths.",{"type":43,"tag":135,"props":459,"children":461},{"id":460},"donts",[462],{"type":49,"value":463},"Don'ts",{"type":43,"tag":366,"props":465,"children":466},{},[467,479,484],{"type":43,"tag":69,"props":468,"children":469},{},[470,472,477],{"type":49,"value":471},"Don't pick WebAssembly \"because it's cool\" — it adds a ",{"type":43,"tag":129,"props":473,"children":475},{"className":474},[],[476],{"type":49,"value":305},{"type":49,"value":478}," project, forces API-mediated data access, and downloads ~10MB to the browser on first visit.",{"type":43,"tag":69,"props":480,"children":481},{},[482],{"type":49,"value":483},"Don't pick Auto unless you can articulate why Server alone and WebAssembly alone are both insufficient.",{"type":43,"tag":69,"props":485,"children":486},{},[487],{"type":49,"value":488},"Don't pick global interactivity for apps where most pages are read-only content — per-page keeps the static pages fast and reduces server memory.",{"type":43,"tag":52,"props":490,"children":492},{"id":491},"scaffold-the-project",[493],{"type":49,"value":494},"Scaffold the Project",{"type":43,"tag":135,"props":496,"children":498},{"id":497},"static-ssr-only-display-data-simple-forms",[499],{"type":49,"value":500},"Static SSR Only (display data + simple forms)",{"type":43,"tag":122,"props":502,"children":506},{"className":503,"code":504,"language":505,"meta":131,"style":131},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dotnet new blazor -o {AppName} -int None\n","shell",[507],{"type":43,"tag":129,"props":508,"children":509},{"__ignoreMap":131},[510],{"type":43,"tag":511,"props":512,"children":515},"span",{"class":513,"line":514},"line",1,[516,521,527,532,537,542,547],{"type":43,"tag":511,"props":517,"children":519},{"style":518},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[520],{"type":49,"value":8},{"type":43,"tag":511,"props":522,"children":524},{"style":523},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[525],{"type":49,"value":526}," new",{"type":43,"tag":511,"props":528,"children":529},{"style":523},[530],{"type":49,"value":531}," blazor",{"type":43,"tag":511,"props":533,"children":534},{"style":523},[535],{"type":49,"value":536}," -o",{"type":43,"tag":511,"props":538,"children":539},{"style":523},[540],{"type":49,"value":541}," {AppName}",{"type":43,"tag":511,"props":543,"children":544},{"style":523},[545],{"type":49,"value":546}," -int",{"type":43,"tag":511,"props":548,"children":549},{"style":523},[550],{"type":49,"value":551}," None\n",{"type":43,"tag":59,"props":553,"children":554},{},[555,557,563],{"type":49,"value":556},"No interactive runtime. Enhanced navigation enabled by default via ",{"type":43,"tag":129,"props":558,"children":560},{"className":559},[],[561],{"type":49,"value":562},"blazor.web.js",{"type":49,"value":564},".",{"type":43,"tag":135,"props":566,"children":568},{"id":567},"interactive-server-per-page-recommended-default",[569],{"type":49,"value":570},"Interactive Server, Per-Page (recommended default)",{"type":43,"tag":122,"props":572,"children":574},{"className":503,"code":573,"language":505,"meta":131,"style":131},"dotnet new blazor -o {AppName} -int Server\n",[575],{"type":43,"tag":129,"props":576,"children":577},{"__ignoreMap":131},[578],{"type":43,"tag":511,"props":579,"children":580},{"class":513,"line":514},[581,585,589,593,597,601,605],{"type":43,"tag":511,"props":582,"children":583},{"style":518},[584],{"type":49,"value":8},{"type":43,"tag":511,"props":586,"children":587},{"style":523},[588],{"type":49,"value":526},{"type":43,"tag":511,"props":590,"children":591},{"style":523},[592],{"type":49,"value":531},{"type":43,"tag":511,"props":594,"children":595},{"style":523},[596],{"type":49,"value":536},{"type":43,"tag":511,"props":598,"children":599},{"style":523},[600],{"type":49,"value":541},{"type":43,"tag":511,"props":602,"children":603},{"style":523},[604],{"type":49,"value":546},{"type":43,"tag":511,"props":606,"children":607},{"style":523},[608],{"type":49,"value":609}," Server\n",{"type":43,"tag":59,"props":611,"children":612},{},[613,615,621],{"type":49,"value":614},"Pages are static by default. Add ",{"type":43,"tag":129,"props":616,"children":618},{"className":617},[],[619],{"type":49,"value":620},"@rendermode InteractiveServer",{"type":49,"value":622}," to components that need interactivity.",{"type":43,"tag":135,"props":624,"children":626},{"id":625},"interactive-server-global",[627],{"type":49,"value":628},"Interactive Server, Global",{"type":43,"tag":122,"props":630,"children":632},{"className":503,"code":631,"language":505,"meta":131,"style":131},"dotnet new blazor -o {AppName} -int Server -ai\n",[633],{"type":43,"tag":129,"props":634,"children":635},{"__ignoreMap":131},[636],{"type":43,"tag":511,"props":637,"children":638},{"class":513,"line":514},[639,643,647,651,655,659,663,668],{"type":43,"tag":511,"props":640,"children":641},{"style":518},[642],{"type":49,"value":8},{"type":43,"tag":511,"props":644,"children":645},{"style":523},[646],{"type":49,"value":526},{"type":43,"tag":511,"props":648,"children":649},{"style":523},[650],{"type":49,"value":531},{"type":43,"tag":511,"props":652,"children":653},{"style":523},[654],{"type":49,"value":536},{"type":43,"tag":511,"props":656,"children":657},{"style":523},[658],{"type":49,"value":541},{"type":43,"tag":511,"props":660,"children":661},{"style":523},[662],{"type":49,"value":546},{"type":43,"tag":511,"props":664,"children":665},{"style":523},[666],{"type":49,"value":667}," Server",{"type":43,"tag":511,"props":669,"children":670},{"style":523},[671],{"type":49,"value":672}," -ai\n",{"type":43,"tag":59,"props":674,"children":675},{},[676,678,684,686,692],{"type":49,"value":677},"All pages interactive via ",{"type":43,"tag":129,"props":679,"children":681},{"className":680},[],[682],{"type":49,"value":683},"\u003CRoutes @rendermode=\"InteractiveServer\" \u002F>",{"type":49,"value":685}," in ",{"type":43,"tag":129,"props":687,"children":689},{"className":688},[],[690],{"type":49,"value":691},"App.razor",{"type":49,"value":564},{"type":43,"tag":135,"props":694,"children":696},{"id":695},"interactive-webassembly-per-page",[697],{"type":49,"value":698},"Interactive WebAssembly, Per-Page",{"type":43,"tag":122,"props":700,"children":702},{"className":503,"code":701,"language":505,"meta":131,"style":131},"dotnet new blazor -o {AppName} -int WebAssembly\n",[703],{"type":43,"tag":129,"props":704,"children":705},{"__ignoreMap":131},[706],{"type":43,"tag":511,"props":707,"children":708},{"class":513,"line":514},[709,713,717,721,725,729,733],{"type":43,"tag":511,"props":710,"children":711},{"style":518},[712],{"type":49,"value":8},{"type":43,"tag":511,"props":714,"children":715},{"style":523},[716],{"type":49,"value":526},{"type":43,"tag":511,"props":718,"children":719},{"style":523},[720],{"type":49,"value":531},{"type":43,"tag":511,"props":722,"children":723},{"style":523},[724],{"type":49,"value":536},{"type":43,"tag":511,"props":726,"children":727},{"style":523},[728],{"type":49,"value":541},{"type":43,"tag":511,"props":730,"children":731},{"style":523},[732],{"type":49,"value":546},{"type":43,"tag":511,"props":734,"children":735},{"style":523},[736],{"type":49,"value":737}," WebAssembly\n",{"type":43,"tag":59,"props":739,"children":740},{},[741,743,749,751,757,759,764],{"type":49,"value":742},"Creates ",{"type":43,"tag":129,"props":744,"children":746},{"className":745},[],[747],{"type":49,"value":748},"{AppName}",{"type":49,"value":750}," (server) and ",{"type":43,"tag":129,"props":752,"children":754},{"className":753},[],[755],{"type":49,"value":756},"{AppName}.Client",{"type":49,"value":758}," (WebAssembly) projects. Interactive components must live in ",{"type":43,"tag":129,"props":760,"children":762},{"className":761},[],[763],{"type":49,"value":305},{"type":49,"value":564},{"type":43,"tag":135,"props":766,"children":768},{"id":767},"interactive-webassembly-global",[769],{"type":49,"value":770},"Interactive WebAssembly, Global",{"type":43,"tag":122,"props":772,"children":774},{"className":503,"code":773,"language":505,"meta":131,"style":131},"dotnet new blazor -o {AppName} -int WebAssembly -ai\n",[775],{"type":43,"tag":129,"props":776,"children":777},{"__ignoreMap":131},[778],{"type":43,"tag":511,"props":779,"children":780},{"class":513,"line":514},[781,785,789,793,797,801,805,810],{"type":43,"tag":511,"props":782,"children":783},{"style":518},[784],{"type":49,"value":8},{"type":43,"tag":511,"props":786,"children":787},{"style":523},[788],{"type":49,"value":526},{"type":43,"tag":511,"props":790,"children":791},{"style":523},[792],{"type":49,"value":531},{"type":43,"tag":511,"props":794,"children":795},{"style":523},[796],{"type":49,"value":536},{"type":43,"tag":511,"props":798,"children":799},{"style":523},[800],{"type":49,"value":541},{"type":43,"tag":511,"props":802,"children":803},{"style":523},[804],{"type":49,"value":546},{"type":43,"tag":511,"props":806,"children":807},{"style":523},[808],{"type":49,"value":809}," WebAssembly",{"type":43,"tag":511,"props":811,"children":812},{"style":523},[813],{"type":49,"value":672},{"type":43,"tag":135,"props":815,"children":817},{"id":816},"interactive-auto-per-page",[818],{"type":49,"value":819},"Interactive Auto, Per-Page",{"type":43,"tag":122,"props":821,"children":823},{"className":503,"code":822,"language":505,"meta":131,"style":131},"dotnet new blazor -o {AppName} -int Auto\n",[824],{"type":43,"tag":129,"props":825,"children":826},{"__ignoreMap":131},[827],{"type":43,"tag":511,"props":828,"children":829},{"class":513,"line":514},[830,834,838,842,846,850,854],{"type":43,"tag":511,"props":831,"children":832},{"style":518},[833],{"type":49,"value":8},{"type":43,"tag":511,"props":835,"children":836},{"style":523},[837],{"type":49,"value":526},{"type":43,"tag":511,"props":839,"children":840},{"style":523},[841],{"type":49,"value":531},{"type":43,"tag":511,"props":843,"children":844},{"style":523},[845],{"type":49,"value":536},{"type":43,"tag":511,"props":847,"children":848},{"style":523},[849],{"type":49,"value":541},{"type":43,"tag":511,"props":851,"children":852},{"style":523},[853],{"type":49,"value":546},{"type":43,"tag":511,"props":855,"children":856},{"style":523},[857],{"type":49,"value":858}," Auto\n",{"type":43,"tag":135,"props":860,"children":862},{"id":861},"interactive-auto-global",[863],{"type":49,"value":864},"Interactive Auto, Global",{"type":43,"tag":122,"props":866,"children":868},{"className":503,"code":867,"language":505,"meta":131,"style":131},"dotnet new blazor -o {AppName} -int Auto -ai\n",[869],{"type":43,"tag":129,"props":870,"children":871},{"__ignoreMap":131},[872],{"type":43,"tag":511,"props":873,"children":874},{"class":513,"line":514},[875,879,883,887,891,895,899,904],{"type":43,"tag":511,"props":876,"children":877},{"style":518},[878],{"type":49,"value":8},{"type":43,"tag":511,"props":880,"children":881},{"style":523},[882],{"type":49,"value":526},{"type":43,"tag":511,"props":884,"children":885},{"style":523},[886],{"type":49,"value":531},{"type":43,"tag":511,"props":888,"children":889},{"style":523},[890],{"type":49,"value":536},{"type":43,"tag":511,"props":892,"children":893},{"style":523},[894],{"type":49,"value":541},{"type":43,"tag":511,"props":896,"children":897},{"style":523},[898],{"type":49,"value":546},{"type":43,"tag":511,"props":900,"children":901},{"style":523},[902],{"type":49,"value":903}," Auto",{"type":43,"tag":511,"props":905,"children":906},{"style":523},[907],{"type":49,"value":672},{"type":43,"tag":135,"props":909,"children":911},{"id":910},"with-authentication",[912],{"type":49,"value":913},"With Authentication",{"type":43,"tag":59,"props":915,"children":916},{},[917,919,925],{"type":49,"value":918},"Append ",{"type":43,"tag":129,"props":920,"children":922},{"className":921},[],[923],{"type":49,"value":924},"-au Individual",{"type":49,"value":926}," to any command above:",{"type":43,"tag":122,"props":928,"children":930},{"className":503,"code":929,"language":505,"meta":131,"style":131},"dotnet new blazor -o {AppName} -int Server -au Individual\n",[931],{"type":43,"tag":129,"props":932,"children":933},{"__ignoreMap":131},[934],{"type":43,"tag":511,"props":935,"children":936},{"class":513,"line":514},[937,941,945,949,953,957,961,965,970],{"type":43,"tag":511,"props":938,"children":939},{"style":518},[940],{"type":49,"value":8},{"type":43,"tag":511,"props":942,"children":943},{"style":523},[944],{"type":49,"value":526},{"type":43,"tag":511,"props":946,"children":947},{"style":523},[948],{"type":49,"value":531},{"type":43,"tag":511,"props":950,"children":951},{"style":523},[952],{"type":49,"value":536},{"type":43,"tag":511,"props":954,"children":955},{"style":523},[956],{"type":49,"value":541},{"type":43,"tag":511,"props":958,"children":959},{"style":523},[960],{"type":49,"value":546},{"type":43,"tag":511,"props":962,"children":963},{"style":523},[964],{"type":49,"value":667},{"type":43,"tag":511,"props":966,"children":967},{"style":523},[968],{"type":49,"value":969}," -au",{"type":43,"tag":511,"props":971,"children":972},{"style":523},[973],{"type":49,"value":974}," Individual\n",{"type":43,"tag":59,"props":976,"children":977},{},[978,983],{"type":43,"tag":129,"props":979,"children":981},{"className":980},[],[982],{"type":49,"value":924},{"type":49,"value":984}," scaffolds ASP.NET Core Identity with SQLite (CLI) or SQL Server (Visual Studio). Identity pages are always static SSR — they do not use interactive render modes.",{"type":43,"tag":59,"props":986,"children":987},{},[988,990,995,997,1002,1004,1009,1011,1017,1019,1025],{"type":49,"value":989},"The ",{"type":43,"tag":129,"props":991,"children":993},{"className":992},[],[994],{"type":49,"value":21},{"type":49,"value":996}," template only supports ",{"type":43,"tag":129,"props":998,"children":1000},{"className":999},[],[1001],{"type":49,"value":924},{"type":49,"value":1003},". For organizational auth (Microsoft Entra ID, Azure AD B2C), scaffold with ",{"type":43,"tag":129,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":49,"value":924},{"type":49,"value":1010}," first, then replace the Identity provider with ",{"type":43,"tag":129,"props":1012,"children":1014},{"className":1013},[],[1015],{"type":49,"value":1016},"Microsoft.Identity.Web",{"type":49,"value":1018}," \u002F OIDC middleware and configure the tenant in ",{"type":43,"tag":129,"props":1020,"children":1022},{"className":1021},[],[1023],{"type":49,"value":1024},"appsettings.json",{"type":49,"value":564},{"type":43,"tag":52,"props":1027,"children":1029},{"id":1028},"what-the-template-creates",[1030],{"type":49,"value":1031},"What the Template Creates",{"type":43,"tag":135,"props":1033,"children":1035},{"id":1034},"single-project-static-ssr-server",[1036],{"type":49,"value":1037},"Single project (Static SSR, Server)",{"type":43,"tag":122,"props":1039,"children":1042},{"className":1040,"code":1041,"language":49},[125],"{AppName}\u002F\n├── Components\u002F\n│   ├── App.razor              # Root component — sets \u003CHeadOutlet> and \u003CRoutes>\n│   ├── Routes.razor           # Wraps \u003CRouter> with route discovery\n│   ├── Layout\u002F\n│   │   ├── MainLayout.razor   # App shell with nav, header, footer\n│   │   └── MainLayout.razor.css\n│   └── Pages\u002F\n│       └── Home.razor         # @page \"\u002F\" — first page\n├── Program.cs                 # Service registration and middleware\n├── wwwroot\u002F                   # Static files (CSS, images)\n└── {AppName}.csproj\n",[1043],{"type":43,"tag":129,"props":1044,"children":1045},{"__ignoreMap":131},[1046],{"type":49,"value":1041},{"type":43,"tag":135,"props":1048,"children":1050},{"id":1049},"two-projects-webassembly-auto",[1051],{"type":49,"value":1052},"Two projects (WebAssembly, Auto)",{"type":43,"tag":122,"props":1054,"children":1057},{"className":1055,"code":1056,"language":49},[125],"{AppName}\u002F                     # Server project — hosts the app\n├── Components\u002F                # Server-only components (static SSR pages, layouts)\n│   ├── App.razor\n│   ├── Routes.razor\n│   └── Layout\u002F\n├── Program.cs                 # Server Program.cs\n└── {AppName}.Client\u002F          # Client project — WebAssembly components\n    ├── Pages\u002F                 # Interactive components go HERE\n    ├── Program.cs             # Client Program.cs\n    └── _Imports.razor\n",[1058],{"type":43,"tag":129,"props":1059,"children":1060},{"__ignoreMap":131},[1061],{"type":49,"value":1056},{"type":43,"tag":59,"props":1063,"children":1064},{},[1065,1070,1072,1078,1080,1086,1088,1093,1095,1100],{"type":43,"tag":73,"props":1066,"children":1067},{},[1068],{"type":49,"value":1069},"Rule:",{"type":49,"value":1071}," Components using ",{"type":43,"tag":129,"props":1073,"children":1075},{"className":1074},[],[1076],{"type":49,"value":1077},"InteractiveWebAssembly",{"type":49,"value":1079}," or ",{"type":43,"tag":129,"props":1081,"children":1083},{"className":1082},[],[1084],{"type":49,"value":1085},"InteractiveAuto",{"type":49,"value":1087}," must live in the ",{"type":43,"tag":129,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":49,"value":305},{"type":49,"value":1094}," project. They can reference shared code but cannot reference server-only types (EF ",{"type":43,"tag":129,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":49,"value":401},{"type":49,"value":1101},", server-side services).",{"type":43,"tag":52,"props":1103,"children":1105},{"id":1104},"programcs-wiring",[1106],{"type":49,"value":1107},"Program.cs Wiring",{"type":43,"tag":59,"props":1109,"children":1110},{},[1111,1113,1118],{"type":49,"value":1112},"The template generates the correct ",{"type":43,"tag":129,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":49,"value":417},{"type":49,"value":1119}," for the chosen mode. Verify these registrations match your intent:",{"type":43,"tag":135,"props":1121,"children":1123},{"id":1122},"static-ssr-only",[1124],{"type":49,"value":1125},"Static SSR Only",{"type":43,"tag":122,"props":1127,"children":1131},{"className":1128,"code":1129,"language":1130,"meta":131,"style":131},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Program.cs\nbuilder.Services.AddRazorComponents();\n\n\u002F\u002F ...\n\napp.MapRazorComponents\u003CApp>();\n","csharp",[1132],{"type":43,"tag":129,"props":1133,"children":1134},{"__ignoreMap":131},[1135,1143,1152,1162,1171,1179],{"type":43,"tag":511,"props":1136,"children":1137},{"class":513,"line":514},[1138],{"type":43,"tag":511,"props":1139,"children":1140},{},[1141],{"type":49,"value":1142},"\u002F\u002F Program.cs\n",{"type":43,"tag":511,"props":1144,"children":1146},{"class":513,"line":1145},2,[1147],{"type":43,"tag":511,"props":1148,"children":1149},{},[1150],{"type":49,"value":1151},"builder.Services.AddRazorComponents();\n",{"type":43,"tag":511,"props":1153,"children":1155},{"class":513,"line":1154},3,[1156],{"type":43,"tag":511,"props":1157,"children":1159},{"emptyLinePlaceholder":1158},true,[1160],{"type":49,"value":1161},"\n",{"type":43,"tag":511,"props":1163,"children":1165},{"class":513,"line":1164},4,[1166],{"type":43,"tag":511,"props":1167,"children":1168},{},[1169],{"type":49,"value":1170},"\u002F\u002F ...\n",{"type":43,"tag":511,"props":1172,"children":1174},{"class":513,"line":1173},5,[1175],{"type":43,"tag":511,"props":1176,"children":1177},{"emptyLinePlaceholder":1158},[1178],{"type":49,"value":1161},{"type":43,"tag":511,"props":1180,"children":1182},{"class":513,"line":1181},6,[1183],{"type":43,"tag":511,"props":1184,"children":1185},{},[1186],{"type":49,"value":1187},"app.MapRazorComponents\u003CApp>();\n",{"type":43,"tag":135,"props":1189,"children":1191},{"id":1190},"server-per-page-or-global",[1192],{"type":49,"value":1193},"Server (per-page or global)",{"type":43,"tag":122,"props":1195,"children":1197},{"className":1128,"code":1196,"language":1130,"meta":131,"style":131},"builder.Services.AddRazorComponents()\n    .AddInteractiveServerComponents();\n\n\u002F\u002F ...\n\napp.MapRazorComponents\u003CApp>()\n    .AddInteractiveServerRenderMode();\n",[1198],{"type":43,"tag":129,"props":1199,"children":1200},{"__ignoreMap":131},[1201,1209,1217,1224,1231,1238,1246],{"type":43,"tag":511,"props":1202,"children":1203},{"class":513,"line":514},[1204],{"type":43,"tag":511,"props":1205,"children":1206},{},[1207],{"type":49,"value":1208},"builder.Services.AddRazorComponents()\n",{"type":43,"tag":511,"props":1210,"children":1211},{"class":513,"line":1145},[1212],{"type":43,"tag":511,"props":1213,"children":1214},{},[1215],{"type":49,"value":1216},"    .AddInteractiveServerComponents();\n",{"type":43,"tag":511,"props":1218,"children":1219},{"class":513,"line":1154},[1220],{"type":43,"tag":511,"props":1221,"children":1222},{"emptyLinePlaceholder":1158},[1223],{"type":49,"value":1161},{"type":43,"tag":511,"props":1225,"children":1226},{"class":513,"line":1164},[1227],{"type":43,"tag":511,"props":1228,"children":1229},{},[1230],{"type":49,"value":1170},{"type":43,"tag":511,"props":1232,"children":1233},{"class":513,"line":1173},[1234],{"type":43,"tag":511,"props":1235,"children":1236},{"emptyLinePlaceholder":1158},[1237],{"type":49,"value":1161},{"type":43,"tag":511,"props":1239,"children":1240},{"class":513,"line":1181},[1241],{"type":43,"tag":511,"props":1242,"children":1243},{},[1244],{"type":49,"value":1245},"app.MapRazorComponents\u003CApp>()\n",{"type":43,"tag":511,"props":1247,"children":1249},{"class":513,"line":1248},7,[1250],{"type":43,"tag":511,"props":1251,"children":1252},{},[1253],{"type":49,"value":1254},"    .AddInteractiveServerRenderMode();\n",{"type":43,"tag":135,"props":1256,"children":1258},{"id":1257},"webassembly-per-page-or-global",[1259],{"type":49,"value":1260},"WebAssembly (per-page or global)",{"type":43,"tag":122,"props":1262,"children":1264},{"className":1128,"code":1263,"language":1130,"meta":131,"style":131},"\u002F\u002F Server Program.cs\nbuilder.Services.AddRazorComponents()\n    .AddInteractiveWebAssemblyComponents();\n\n\u002F\u002F ...\n\napp.MapRazorComponents\u003CApp>()\n    .AddInteractiveWebAssemblyRenderMode()\n    .AddAdditionalAssemblies(typeof({AppName}.Client._Imports).Assembly);\n",[1265],{"type":43,"tag":129,"props":1266,"children":1267},{"__ignoreMap":131},[1268,1276,1283,1291,1298,1305,1312,1319,1328],{"type":43,"tag":511,"props":1269,"children":1270},{"class":513,"line":514},[1271],{"type":43,"tag":511,"props":1272,"children":1273},{},[1274],{"type":49,"value":1275},"\u002F\u002F Server Program.cs\n",{"type":43,"tag":511,"props":1277,"children":1278},{"class":513,"line":1145},[1279],{"type":43,"tag":511,"props":1280,"children":1281},{},[1282],{"type":49,"value":1208},{"type":43,"tag":511,"props":1284,"children":1285},{"class":513,"line":1154},[1286],{"type":43,"tag":511,"props":1287,"children":1288},{},[1289],{"type":49,"value":1290},"    .AddInteractiveWebAssemblyComponents();\n",{"type":43,"tag":511,"props":1292,"children":1293},{"class":513,"line":1164},[1294],{"type":43,"tag":511,"props":1295,"children":1296},{"emptyLinePlaceholder":1158},[1297],{"type":49,"value":1161},{"type":43,"tag":511,"props":1299,"children":1300},{"class":513,"line":1173},[1301],{"type":43,"tag":511,"props":1302,"children":1303},{},[1304],{"type":49,"value":1170},{"type":43,"tag":511,"props":1306,"children":1307},{"class":513,"line":1181},[1308],{"type":43,"tag":511,"props":1309,"children":1310},{"emptyLinePlaceholder":1158},[1311],{"type":49,"value":1161},{"type":43,"tag":511,"props":1313,"children":1314},{"class":513,"line":1248},[1315],{"type":43,"tag":511,"props":1316,"children":1317},{},[1318],{"type":49,"value":1245},{"type":43,"tag":511,"props":1320,"children":1322},{"class":513,"line":1321},8,[1323],{"type":43,"tag":511,"props":1324,"children":1325},{},[1326],{"type":49,"value":1327},"    .AddInteractiveWebAssemblyRenderMode()\n",{"type":43,"tag":511,"props":1329,"children":1331},{"class":513,"line":1330},9,[1332],{"type":43,"tag":511,"props":1333,"children":1334},{},[1335],{"type":49,"value":1336},"    .AddAdditionalAssemblies(typeof({AppName}.Client._Imports).Assembly);\n",{"type":43,"tag":122,"props":1338,"children":1340},{"className":1128,"code":1339,"language":1130,"meta":131,"style":131},"\u002F\u002F Client Program.cs\nbuilder.Services.AddAuthorizationCore();\n\u002F\u002F Register HttpClient, other client-side services\n",[1341],{"type":43,"tag":129,"props":1342,"children":1343},{"__ignoreMap":131},[1344,1352,1360],{"type":43,"tag":511,"props":1345,"children":1346},{"class":513,"line":514},[1347],{"type":43,"tag":511,"props":1348,"children":1349},{},[1350],{"type":49,"value":1351},"\u002F\u002F Client Program.cs\n",{"type":43,"tag":511,"props":1353,"children":1354},{"class":513,"line":1145},[1355],{"type":43,"tag":511,"props":1356,"children":1357},{},[1358],{"type":49,"value":1359},"builder.Services.AddAuthorizationCore();\n",{"type":43,"tag":511,"props":1361,"children":1362},{"class":513,"line":1154},[1363],{"type":43,"tag":511,"props":1364,"children":1365},{},[1366],{"type":49,"value":1367},"\u002F\u002F Register HttpClient, other client-side services\n",{"type":43,"tag":52,"props":1369,"children":1371},{"id":1370},"create-project-agentsmd",[1372],{"type":49,"value":1373},"Create Project AGENTS.md",{"type":43,"tag":59,"props":1375,"children":1376},{},[1377,1379,1385,1387,1393],{"type":49,"value":1378},"After scaffolding, create an ",{"type":43,"tag":129,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":49,"value":1384},"AGENTS.md",{"type":49,"value":1386}," file in the project root (next to the ",{"type":43,"tag":129,"props":1388,"children":1390},{"className":1389},[],[1391],{"type":49,"value":1392},".csproj",{"type":49,"value":1394},"). For two-project setups, put it in the server project root.",{"type":43,"tag":59,"props":1396,"children":1397},{},[1398,1400,1406],{"type":49,"value":1399},"Pick the matching template from ",{"type":43,"tag":129,"props":1401,"children":1403},{"className":1402},[],[1404],{"type":49,"value":1405},"assets\u002Fagents-md\u002F",{"type":49,"value":1407}," based on the chosen mode:",{"type":43,"tag":142,"props":1409,"children":1410},{},[1411,1427],{"type":43,"tag":146,"props":1412,"children":1413},{},[1414],{"type":43,"tag":150,"props":1415,"children":1416},{},[1417,1422],{"type":43,"tag":154,"props":1418,"children":1419},{},[1420],{"type":49,"value":1421},"Mode",{"type":43,"tag":154,"props":1423,"children":1424},{},[1425],{"type":49,"value":1426},"Template file",{"type":43,"tag":170,"props":1428,"children":1429},{},[1430,1453,1476,1499,1522,1546,1569],{"type":43,"tag":150,"props":1431,"children":1432},{},[1433,1444],{"type":43,"tag":177,"props":1434,"children":1435},{},[1436,1438,1443],{"type":49,"value":1437},"Static SSR (",{"type":43,"tag":129,"props":1439,"children":1441},{"className":1440},[],[1442],{"type":49,"value":197},{"type":49,"value":199},{"type":43,"tag":177,"props":1445,"children":1446},{},[1447],{"type":43,"tag":129,"props":1448,"children":1450},{"className":1449},[],[1451],{"type":49,"value":1452},"assets\u002Fagents-md\u002Fssr-none.md",{"type":43,"tag":150,"props":1454,"children":1455},{},[1456,1467],{"type":43,"tag":177,"props":1457,"children":1458},{},[1459,1461,1466],{"type":49,"value":1460},"Server, per-page (",{"type":43,"tag":129,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":49,"value":227},{"type":49,"value":199},{"type":43,"tag":177,"props":1468,"children":1469},{},[1470],{"type":43,"tag":129,"props":1471,"children":1473},{"className":1472},[],[1474],{"type":49,"value":1475},"assets\u002Fagents-md\u002Fserver-per-page.md",{"type":43,"tag":150,"props":1477,"children":1478},{},[1479,1490],{"type":43,"tag":177,"props":1480,"children":1481},{},[1482,1484,1489],{"type":49,"value":1483},"Server, global (",{"type":43,"tag":129,"props":1485,"children":1487},{"className":1486},[],[1488],{"type":49,"value":264},{"type":49,"value":199},{"type":43,"tag":177,"props":1491,"children":1492},{},[1493],{"type":43,"tag":129,"props":1494,"children":1496},{"className":1495},[],[1497],{"type":49,"value":1498},"assets\u002Fagents-md\u002Fserver-global.md",{"type":43,"tag":150,"props":1500,"children":1501},{},[1502,1513],{"type":43,"tag":177,"props":1503,"children":1504},{},[1505,1507,1512],{"type":49,"value":1506},"WebAssembly, per-page (",{"type":43,"tag":129,"props":1508,"children":1510},{"className":1509},[],[1511],{"type":49,"value":293},{"type":49,"value":199},{"type":43,"tag":177,"props":1514,"children":1515},{},[1516],{"type":43,"tag":129,"props":1517,"children":1519},{"className":1518},[],[1520],{"type":49,"value":1521},"assets\u002Fagents-md\u002Fwebassembly-per-page.md",{"type":43,"tag":150,"props":1523,"children":1524},{},[1525,1537],{"type":43,"tag":177,"props":1526,"children":1527},{},[1528,1530,1536],{"type":49,"value":1529},"WebAssembly, global (",{"type":43,"tag":129,"props":1531,"children":1533},{"className":1532},[],[1534],{"type":49,"value":1535},"-int WebAssembly -ai",{"type":49,"value":199},{"type":43,"tag":177,"props":1538,"children":1539},{},[1540],{"type":43,"tag":129,"props":1541,"children":1543},{"className":1542},[],[1544],{"type":49,"value":1545},"assets\u002Fagents-md\u002Fwebassembly-global.md",{"type":43,"tag":150,"props":1547,"children":1548},{},[1549,1560],{"type":43,"tag":177,"props":1550,"children":1551},{},[1552,1554,1559],{"type":49,"value":1553},"Auto, per-page (",{"type":43,"tag":129,"props":1555,"children":1557},{"className":1556},[],[1558],{"type":49,"value":330},{"type":49,"value":199},{"type":43,"tag":177,"props":1561,"children":1562},{},[1563],{"type":43,"tag":129,"props":1564,"children":1566},{"className":1565},[],[1567],{"type":49,"value":1568},"assets\u002Fagents-md\u002Fauto-per-page.md",{"type":43,"tag":150,"props":1570,"children":1571},{},[1572,1584],{"type":43,"tag":177,"props":1573,"children":1574},{},[1575,1577,1583],{"type":49,"value":1576},"Auto, global (",{"type":43,"tag":129,"props":1578,"children":1580},{"className":1579},[],[1581],{"type":49,"value":1582},"-int Auto -ai",{"type":49,"value":199},{"type":43,"tag":177,"props":1585,"children":1586},{},[1587],{"type":43,"tag":129,"props":1588,"children":1590},{"className":1589},[],[1591],{"type":49,"value":1592},"assets\u002Fagents-md\u002Fauto-global.md",{"type":43,"tag":59,"props":1594,"children":1595},{},[1596,1598,1603,1605,1610,1612,1617,1619,1625,1627,1633,1635,1640],{"type":49,"value":1597},"Copy the template contents into the project's ",{"type":43,"tag":129,"props":1599,"children":1601},{"className":1600},[],[1602],{"type":49,"value":1384},{"type":49,"value":1604}," and replace every ",{"type":43,"tag":129,"props":1606,"children":1608},{"className":1607},[],[1609],{"type":49,"value":748},{"type":49,"value":1611}," with the actual project name. If auth was scaffolded (",{"type":43,"tag":129,"props":1613,"children":1615},{"className":1614},[],[1616],{"type":49,"value":924},{"type":49,"value":1618},"), add an ",{"type":43,"tag":129,"props":1620,"children":1622},{"className":1621},[],[1623],{"type":49,"value":1624},"## Authentication",{"type":49,"value":1626}," section noting that ASP.NET Core Identity is configured and that Identity pages under ",{"type":43,"tag":129,"props":1628,"children":1630},{"className":1629},[],[1631],{"type":49,"value":1632},"Components\u002FAccount\u002F",{"type":49,"value":1634}," are always static SSR — do not add ",{"type":43,"tag":129,"props":1636,"children":1638},{"className":1637},[],[1639],{"type":49,"value":239},{"type":49,"value":1641}," to them.",{"type":43,"tag":59,"props":1643,"children":1644},{},[1645,1650],{"type":43,"tag":73,"props":1646,"children":1647},{},[1648],{"type":49,"value":1649},"After scaffolding the project and creating AGENTS.md, continue implementing the features the user requested.",{"type":49,"value":1651}," Remove default template pages (Counter, Weather) and replace them with the actual application pages.",{"type":43,"tag":135,"props":1653,"children":1655},{"id":1654},"auto-per-page-or-global",[1656],{"type":49,"value":1657},"Auto (per-page or global)",{"type":43,"tag":122,"props":1659,"children":1661},{"className":1128,"code":1660,"language":1130,"meta":131,"style":131},"\u002F\u002F Server Program.cs\nbuilder.Services.AddRazorComponents()\n    .AddInteractiveServerComponents()\n    .AddInteractiveWebAssemblyComponents();\n\n\u002F\u002F ...\n\napp.MapRazorComponents\u003CApp>()\n    .AddInteractiveServerRenderMode()\n    .AddInteractiveWebAssemblyRenderMode()\n    .AddAdditionalAssemblies(typeof({AppName}.Client._Imports).Assembly);\n",[1662],{"type":43,"tag":129,"props":1663,"children":1664},{"__ignoreMap":131},[1665,1672,1679,1687,1694,1701,1708,1715,1722,1730,1738],{"type":43,"tag":511,"props":1666,"children":1667},{"class":513,"line":514},[1668],{"type":43,"tag":511,"props":1669,"children":1670},{},[1671],{"type":49,"value":1275},{"type":43,"tag":511,"props":1673,"children":1674},{"class":513,"line":1145},[1675],{"type":43,"tag":511,"props":1676,"children":1677},{},[1678],{"type":49,"value":1208},{"type":43,"tag":511,"props":1680,"children":1681},{"class":513,"line":1154},[1682],{"type":43,"tag":511,"props":1683,"children":1684},{},[1685],{"type":49,"value":1686},"    .AddInteractiveServerComponents()\n",{"type":43,"tag":511,"props":1688,"children":1689},{"class":513,"line":1164},[1690],{"type":43,"tag":511,"props":1691,"children":1692},{},[1693],{"type":49,"value":1290},{"type":43,"tag":511,"props":1695,"children":1696},{"class":513,"line":1173},[1697],{"type":43,"tag":511,"props":1698,"children":1699},{"emptyLinePlaceholder":1158},[1700],{"type":49,"value":1161},{"type":43,"tag":511,"props":1702,"children":1703},{"class":513,"line":1181},[1704],{"type":43,"tag":511,"props":1705,"children":1706},{},[1707],{"type":49,"value":1170},{"type":43,"tag":511,"props":1709,"children":1710},{"class":513,"line":1248},[1711],{"type":43,"tag":511,"props":1712,"children":1713},{"emptyLinePlaceholder":1158},[1714],{"type":49,"value":1161},{"type":43,"tag":511,"props":1716,"children":1717},{"class":513,"line":1321},[1718],{"type":43,"tag":511,"props":1719,"children":1720},{},[1721],{"type":49,"value":1245},{"type":43,"tag":511,"props":1723,"children":1724},{"class":513,"line":1330},[1725],{"type":43,"tag":511,"props":1726,"children":1727},{},[1728],{"type":49,"value":1729},"    .AddInteractiveServerRenderMode()\n",{"type":43,"tag":511,"props":1731,"children":1733},{"class":513,"line":1732},10,[1734],{"type":43,"tag":511,"props":1735,"children":1736},{},[1737],{"type":49,"value":1327},{"type":43,"tag":511,"props":1739,"children":1741},{"class":513,"line":1740},11,[1742],{"type":43,"tag":511,"props":1743,"children":1744},{},[1745],{"type":49,"value":1336},{"type":43,"tag":52,"props":1747,"children":1749},{"id":1748},"apprazor-global-vs-per-page",[1750],{"type":49,"value":1751},"App.razor — Global vs Per-Page",{"type":43,"tag":59,"props":1753,"children":1754},{},[1755,1757,1762],{"type":49,"value":1756},"The difference between global and per-page interactivity is entirely in ",{"type":43,"tag":129,"props":1758,"children":1760},{"className":1759},[],[1761],{"type":49,"value":691},{"type":49,"value":1763},":",{"type":43,"tag":135,"props":1765,"children":1767},{"id":1766},"per-page-default",[1768],{"type":49,"value":1769},"Per-page (default)",{"type":43,"tag":122,"props":1771,"children":1775},{"className":1772,"code":1773,"language":1774,"meta":131,"style":131},"language-razor shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!DOCTYPE html>\n\u003Chtml>\n\u003Chead>\n    \u003CHeadOutlet \u002F>\n\u003C\u002Fhead>\n\u003Cbody>\n    \u003CRoutes \u002F>\n    \u003Cscript src=\"_framework\u002Fblazor.web.js\">\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","razor",[1776],{"type":43,"tag":129,"props":1777,"children":1778},{"__ignoreMap":131},[1779,1787,1795,1803,1811,1819,1827,1835,1843,1851],{"type":43,"tag":511,"props":1780,"children":1781},{"class":513,"line":514},[1782],{"type":43,"tag":511,"props":1783,"children":1784},{},[1785],{"type":49,"value":1786},"\u003C!DOCTYPE html>\n",{"type":43,"tag":511,"props":1788,"children":1789},{"class":513,"line":1145},[1790],{"type":43,"tag":511,"props":1791,"children":1792},{},[1793],{"type":49,"value":1794},"\u003Chtml>\n",{"type":43,"tag":511,"props":1796,"children":1797},{"class":513,"line":1154},[1798],{"type":43,"tag":511,"props":1799,"children":1800},{},[1801],{"type":49,"value":1802},"\u003Chead>\n",{"type":43,"tag":511,"props":1804,"children":1805},{"class":513,"line":1164},[1806],{"type":43,"tag":511,"props":1807,"children":1808},{},[1809],{"type":49,"value":1810},"    \u003CHeadOutlet \u002F>\n",{"type":43,"tag":511,"props":1812,"children":1813},{"class":513,"line":1173},[1814],{"type":43,"tag":511,"props":1815,"children":1816},{},[1817],{"type":49,"value":1818},"\u003C\u002Fhead>\n",{"type":43,"tag":511,"props":1820,"children":1821},{"class":513,"line":1181},[1822],{"type":43,"tag":511,"props":1823,"children":1824},{},[1825],{"type":49,"value":1826},"\u003Cbody>\n",{"type":43,"tag":511,"props":1828,"children":1829},{"class":513,"line":1248},[1830],{"type":43,"tag":511,"props":1831,"children":1832},{},[1833],{"type":49,"value":1834},"    \u003CRoutes \u002F>\n",{"type":43,"tag":511,"props":1836,"children":1837},{"class":513,"line":1321},[1838],{"type":43,"tag":511,"props":1839,"children":1840},{},[1841],{"type":49,"value":1842},"    \u003Cscript src=\"_framework\u002Fblazor.web.js\">\u003C\u002Fscript>\n",{"type":43,"tag":511,"props":1844,"children":1845},{"class":513,"line":1330},[1846],{"type":43,"tag":511,"props":1847,"children":1848},{},[1849],{"type":49,"value":1850},"\u003C\u002Fbody>\n",{"type":43,"tag":511,"props":1852,"children":1853},{"class":513,"line":1732},[1854],{"type":43,"tag":511,"props":1855,"children":1856},{},[1857],{"type":49,"value":1858},"\u003C\u002Fhtml>\n",{"type":43,"tag":59,"props":1860,"children":1861},{},[1862,1864,1869,1871,1877,1878,1884],{"type":49,"value":1863},"No ",{"type":43,"tag":129,"props":1865,"children":1867},{"className":1866},[],[1868],{"type":49,"value":239},{"type":49,"value":1870}," on ",{"type":43,"tag":129,"props":1872,"children":1874},{"className":1873},[],[1875],{"type":49,"value":1876},"\u003CRoutes>",{"type":49,"value":1079},{"type":43,"tag":129,"props":1879,"children":1881},{"className":1880},[],[1882],{"type":49,"value":1883},"\u003CHeadOutlet>",{"type":49,"value":1885},". Individual pages opt in.",{"type":43,"tag":135,"props":1887,"children":1889},{"id":1888},"global",[1890],{"type":49,"value":1891},"Global",{"type":43,"tag":122,"props":1893,"children":1895},{"className":1772,"code":1894,"language":1774,"meta":131,"style":131},"\u003C!DOCTYPE html>\n\u003Chtml>\n\u003Chead>\n    \u003CHeadOutlet @rendermode=\"InteractiveServer\" \u002F>\n\u003C\u002Fhead>\n\u003Cbody>\n    \u003CRoutes @rendermode=\"InteractiveServer\" \u002F>\n    \u003Cscript src=\"_framework\u002Fblazor.web.js\">\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[1896],{"type":43,"tag":129,"props":1897,"children":1898},{"__ignoreMap":131},[1899,1906,1913,1920,1928,1935,1942,1950,1957,1964],{"type":43,"tag":511,"props":1900,"children":1901},{"class":513,"line":514},[1902],{"type":43,"tag":511,"props":1903,"children":1904},{},[1905],{"type":49,"value":1786},{"type":43,"tag":511,"props":1907,"children":1908},{"class":513,"line":1145},[1909],{"type":43,"tag":511,"props":1910,"children":1911},{},[1912],{"type":49,"value":1794},{"type":43,"tag":511,"props":1914,"children":1915},{"class":513,"line":1154},[1916],{"type":43,"tag":511,"props":1917,"children":1918},{},[1919],{"type":49,"value":1802},{"type":43,"tag":511,"props":1921,"children":1922},{"class":513,"line":1164},[1923],{"type":43,"tag":511,"props":1924,"children":1925},{},[1926],{"type":49,"value":1927},"    \u003CHeadOutlet @rendermode=\"InteractiveServer\" \u002F>\n",{"type":43,"tag":511,"props":1929,"children":1930},{"class":513,"line":1173},[1931],{"type":43,"tag":511,"props":1932,"children":1933},{},[1934],{"type":49,"value":1818},{"type":43,"tag":511,"props":1936,"children":1937},{"class":513,"line":1181},[1938],{"type":43,"tag":511,"props":1939,"children":1940},{},[1941],{"type":49,"value":1826},{"type":43,"tag":511,"props":1943,"children":1944},{"class":513,"line":1248},[1945],{"type":43,"tag":511,"props":1946,"children":1947},{},[1948],{"type":49,"value":1949},"    \u003CRoutes @rendermode=\"InteractiveServer\" \u002F>\n",{"type":43,"tag":511,"props":1951,"children":1952},{"class":513,"line":1321},[1953],{"type":43,"tag":511,"props":1954,"children":1955},{},[1956],{"type":49,"value":1842},{"type":43,"tag":511,"props":1958,"children":1959},{"class":513,"line":1330},[1960],{"type":43,"tag":511,"props":1961,"children":1962},{},[1963],{"type":49,"value":1850},{"type":43,"tag":511,"props":1965,"children":1966},{"class":513,"line":1732},[1967],{"type":43,"tag":511,"props":1968,"children":1969},{},[1970],{"type":49,"value":1858},{"type":43,"tag":59,"props":1972,"children":1973},{},[1974,1976,1982,1984,1989,1990,1995],{"type":49,"value":1975},"Replace ",{"type":43,"tag":129,"props":1977,"children":1979},{"className":1978},[],[1980],{"type":49,"value":1981},"InteractiveServer",{"type":49,"value":1983}," with ",{"type":43,"tag":129,"props":1985,"children":1987},{"className":1986},[],[1988],{"type":49,"value":1077},{"type":49,"value":1079},{"type":43,"tag":129,"props":1991,"children":1993},{"className":1992},[],[1994],{"type":49,"value":1085},{"type":49,"value":1996}," as appropriate.",{"type":43,"tag":52,"props":1998,"children":2000},{"id":1999},"after-scaffolding",[2001],{"type":49,"value":2002},"After Scaffolding",{"type":43,"tag":65,"props":2004,"children":2005},{},[2006,2022,2039],{"type":43,"tag":69,"props":2007,"children":2008},{},[2009,2014,2016],{"type":43,"tag":73,"props":2010,"children":2011},{},[2012],{"type":49,"value":2013},"Verify it builds:",{"type":49,"value":2015}," ",{"type":43,"tag":129,"props":2017,"children":2019},{"className":2018},[],[2020],{"type":49,"value":2021},"dotnet build",{"type":43,"tag":69,"props":2023,"children":2024},{},[2025,2030,2031,2037],{"type":43,"tag":73,"props":2026,"children":2027},{},[2028],{"type":49,"value":2029},"Run it:",{"type":49,"value":2015},{"type":43,"tag":129,"props":2032,"children":2034},{"className":2033},[],[2035],{"type":49,"value":2036},"dotnet run",{"type":49,"value":2038}," (in the server project if two-project setup)",{"type":43,"tag":69,"props":2040,"children":2041},{},[2042,2047,2049,2055,2057,2063,2065,2071,2072,2077],{"type":43,"tag":73,"props":2043,"children":2044},{},[2045],{"type":49,"value":2046},"Add your first page:",{"type":49,"value":2048}," Create a ",{"type":43,"tag":129,"props":2050,"children":2052},{"className":2051},[],[2053],{"type":49,"value":2054},".razor",{"type":49,"value":2056}," file in ",{"type":43,"tag":129,"props":2058,"children":2060},{"className":2059},[],[2061],{"type":49,"value":2062},"Components\u002FPages\u002F",{"type":49,"value":2064}," (server project) or ",{"type":43,"tag":129,"props":2066,"children":2068},{"className":2067},[],[2069],{"type":49,"value":2070},"Pages\u002F",{"type":49,"value":191},{"type":43,"tag":129,"props":2073,"children":2075},{"className":2074},[],[2076],{"type":49,"value":305},{"type":49,"value":2078}," project for WebAssembly components)",{"type":43,"tag":52,"props":2080,"children":2082},{"id":2081},"donts-1",[2083],{"type":49,"value":463},{"type":43,"tag":366,"props":2085,"children":2086},{},[2087,2114,2148],{"type":43,"tag":69,"props":2088,"children":2089},{},[2090,2092,2098,2100,2105,2107,2112],{"type":49,"value":2091},"Don't use ",{"type":43,"tag":129,"props":2093,"children":2095},{"className":2094},[],[2096],{"type":49,"value":2097},"dotnet new blazorwasm",{"type":49,"value":2099}," — that creates a standalone WebAssembly SPA without server-side rendering. Use the ",{"type":43,"tag":129,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":49,"value":21},{"type":49,"value":2106}," template with ",{"type":43,"tag":129,"props":2108,"children":2110},{"className":2109},[],[2111],{"type":49,"value":293},{"type":49,"value":2113}," instead.",{"type":43,"tag":69,"props":2115,"children":2116},{},[2117,2119,2125,2127,2132,2134,2139,2141,2146],{"type":49,"value":2118},"Don't manually add ",{"type":43,"tag":129,"props":2120,"children":2122},{"className":2121},[],[2123],{"type":49,"value":2124},"AddInteractiveServerComponents()",{"type":49,"value":2126}," to a project created with ",{"type":43,"tag":129,"props":2128,"children":2130},{"className":2129},[],[2131],{"type":49,"value":197},{"type":49,"value":2133}," and expect it to work — you also need the ",{"type":43,"tag":129,"props":2135,"children":2137},{"className":2136},[],[2138],{"type":49,"value":239},{"type":49,"value":2140}," directives and potentially ",{"type":43,"tag":129,"props":2142,"children":2144},{"className":2143},[],[2145],{"type":49,"value":691},{"type":49,"value":2147}," changes. Re-scaffold if the mode needs to change fundamentally.",{"type":43,"tag":69,"props":2149,"children":2150},{},[2151],{"type":49,"value":2152},"Don't put WebAssembly-targeted components in the server project — they'll work during prerender but fail after handoff.",{"type":43,"tag":2154,"props":2155,"children":2156},"style",{},[2157],{"type":49,"value":2158},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2160,"total":2264},[2161,2178,2193,2211,2225,2240,2250],{"slug":2162,"name":2162,"fn":2163,"description":2164,"org":2165,"tags":2166,"stars":25,"repoUrl":26,"updatedAt":2177},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2167,2168,2171,2174],{"name":13,"slug":14,"type":15},{"name":2169,"slug":2170,"type":15},"Code Analysis","code-analysis",{"name":2172,"slug":2173,"type":15},"Debugging","debugging",{"name":2175,"slug":2176,"type":15},"Performance","performance","2026-07-12T08:23:25.400375",{"slug":2179,"name":2179,"fn":2180,"description":2181,"org":2182,"tags":2183,"stars":25,"repoUrl":26,"updatedAt":2192},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2184,2185,2188,2189],{"name":13,"slug":14,"type":15},{"name":2186,"slug":2187,"type":15},"Android","android",{"name":2172,"slug":2173,"type":15},{"name":2190,"slug":2191,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":2194,"name":2194,"fn":2195,"description":2196,"org":2197,"tags":2198,"stars":25,"repoUrl":26,"updatedAt":2210},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2199,2200,2201,2204,2207],{"name":13,"slug":14,"type":15},{"name":2172,"slug":2173,"type":15},{"name":2202,"slug":2203,"type":15},"iOS","ios",{"name":2205,"slug":2206,"type":15},"macOS","macos",{"name":2208,"slug":2209,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":2212,"name":2212,"fn":2213,"description":2214,"org":2215,"tags":2216,"stars":25,"repoUrl":26,"updatedAt":2224},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2217,2218,2221],{"name":2169,"slug":2170,"type":15},{"name":2219,"slug":2220,"type":15},"QA","qa",{"name":2222,"slug":2223,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":2226,"name":2226,"fn":2227,"description":2228,"org":2229,"tags":2230,"stars":25,"repoUrl":26,"updatedAt":2239},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2231,2232,2233,2235,2238],{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":2234,"slug":1130,"type":15},"C#",{"name":2236,"slug":2237,"type":15},"UI Components","ui-components",{"name":23,"slug":24,"type":15},"2026-07-15T06:03:29.216359",{"slug":2241,"name":2241,"fn":2242,"description":2243,"org":2244,"tags":2245,"stars":25,"repoUrl":26,"updatedAt":2249},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2246,2247,2248],{"name":2169,"slug":2170,"type":15},{"name":2172,"slug":2173,"type":15},{"name":2190,"slug":2191,"type":15},"2026-07-12T08:21:34.637923",{"slug":2251,"name":2251,"fn":2252,"description":2253,"org":2254,"tags":2255,"stars":25,"repoUrl":26,"updatedAt":2263},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2256,2259,2260],{"name":2257,"slug":2258,"type":15},"Build","build",{"name":2172,"slug":2173,"type":15},{"name":2261,"slug":2262,"type":15},"Engineering","engineering","2026-07-19T05:38:19.340791",96,{"items":2266,"total":2371},[2267,2279,2286,2293,2301,2307,2315,2321,2327,2337,2350,2361],{"slug":2268,"name":2268,"fn":2269,"description":2270,"org":2271,"tags":2272,"stars":2276,"repoUrl":2277,"updatedAt":2278},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2273,2274,2275],{"name":13,"slug":14,"type":15},{"name":2261,"slug":2262,"type":15},{"name":2175,"slug":2176,"type":15},5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":2162,"name":2162,"fn":2163,"description":2164,"org":2280,"tags":2281,"stars":25,"repoUrl":26,"updatedAt":2177},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2282,2283,2284,2285],{"name":13,"slug":14,"type":15},{"name":2169,"slug":2170,"type":15},{"name":2172,"slug":2173,"type":15},{"name":2175,"slug":2176,"type":15},{"slug":2179,"name":2179,"fn":2180,"description":2181,"org":2287,"tags":2288,"stars":25,"repoUrl":26,"updatedAt":2192},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2289,2290,2291,2292],{"name":13,"slug":14,"type":15},{"name":2186,"slug":2187,"type":15},{"name":2172,"slug":2173,"type":15},{"name":2190,"slug":2191,"type":15},{"slug":2194,"name":2194,"fn":2195,"description":2196,"org":2294,"tags":2295,"stars":25,"repoUrl":26,"updatedAt":2210},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2296,2297,2298,2299,2300],{"name":13,"slug":14,"type":15},{"name":2172,"slug":2173,"type":15},{"name":2202,"slug":2203,"type":15},{"name":2205,"slug":2206,"type":15},{"name":2208,"slug":2209,"type":15},{"slug":2212,"name":2212,"fn":2213,"description":2214,"org":2302,"tags":2303,"stars":25,"repoUrl":26,"updatedAt":2224},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2304,2305,2306],{"name":2169,"slug":2170,"type":15},{"name":2219,"slug":2220,"type":15},{"name":2222,"slug":2223,"type":15},{"slug":2226,"name":2226,"fn":2227,"description":2228,"org":2308,"tags":2309,"stars":25,"repoUrl":26,"updatedAt":2239},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2310,2311,2312,2313,2314],{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":2234,"slug":1130,"type":15},{"name":2236,"slug":2237,"type":15},{"name":23,"slug":24,"type":15},{"slug":2241,"name":2241,"fn":2242,"description":2243,"org":2316,"tags":2317,"stars":25,"repoUrl":26,"updatedAt":2249},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2318,2319,2320],{"name":2169,"slug":2170,"type":15},{"name":2172,"slug":2173,"type":15},{"name":2190,"slug":2191,"type":15},{"slug":2251,"name":2251,"fn":2252,"description":2253,"org":2322,"tags":2323,"stars":25,"repoUrl":26,"updatedAt":2263},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2324,2325,2326],{"name":2257,"slug":2258,"type":15},{"name":2172,"slug":2173,"type":15},{"name":2261,"slug":2262,"type":15},{"slug":2328,"name":2328,"fn":2329,"description":2330,"org":2331,"tags":2332,"stars":25,"repoUrl":26,"updatedAt":2336},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2333,2334,2335],{"name":13,"slug":14,"type":15},{"name":2261,"slug":2262,"type":15},{"name":2175,"slug":2176,"type":15},"2026-07-19T05:38:18.364937",{"slug":2338,"name":2338,"fn":2339,"description":2340,"org":2341,"tags":2342,"stars":25,"repoUrl":26,"updatedAt":2349},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2343,2344,2347,2348],{"name":2261,"slug":2262,"type":15},{"name":2345,"slug":2346,"type":15},"Monitoring","monitoring",{"name":2175,"slug":2176,"type":15},{"name":2222,"slug":2223,"type":15},"2026-07-12T08:21:35.865649",{"slug":2351,"name":2351,"fn":2352,"description":2353,"org":2354,"tags":2355,"stars":25,"repoUrl":26,"updatedAt":2360},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2356,2357,2358,2359],{"name":13,"slug":14,"type":15},{"name":2172,"slug":2173,"type":15},{"name":2261,"slug":2262,"type":15},{"name":2175,"slug":2176,"type":15},"2026-07-12T08:21:40.961722",{"slug":2362,"name":2362,"fn":2363,"description":2364,"org":2365,"tags":2366,"stars":25,"repoUrl":26,"updatedAt":2370},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2367,2368,2369],{"name":2172,"slug":2173,"type":15},{"name":2261,"slug":2262,"type":15},{"name":2219,"slug":2220,"type":15},"2026-07-19T05:38:14.336279",144]