<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vikrant Bagal</title>
    <description>The latest articles on DEV Community by Vikrant Bagal (@vikrant_bagal_afae3e25ca7).</description>
    <link>https://dev.to/vikrant_bagal_afae3e25ca7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2052722%2F5ff69926-3e59-4393-a400-db81ecbe2ab6.png</url>
      <title>DEV Community: Vikrant Bagal</title>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vikrant_bagal_afae3e25ca7"/>
    <language>en</language>
    <item>
      <title>Using Prebuilt Agents with Coding Agents: A Complete Guide for Full-Stack .NET, Node.js &amp; Frontend</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Mon, 25 May 2026 18:29:44 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/using-prebuilt-agents-with-coding-agents-a-complete-guide-for-full-stack-net-nodejs-frontend-3ga9</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/using-prebuilt-agents-with-coding-agents-a-complete-guide-for-full-stack-net-nodejs-frontend-3ga9</guid>
      <description>&lt;p&gt;The AI coding agent landscape has exploded in 2026. Tools like &lt;strong&gt;Claude Code&lt;/strong&gt;, &lt;strong&gt;OpenCode&lt;/strong&gt;, and &lt;strong&gt;Cursor&lt;/strong&gt; are transforming how we build software, but the real power comes from integrating them with &lt;strong&gt;prebuilt agents&lt;/strong&gt; that handle specialized tasks.&lt;/p&gt;

&lt;p&gt;This guide covers everything you need to know about using prebuilt agents with coding agents for full-stack .NET, Node.js, and frontend development.&lt;/p&gt;




&lt;h2&gt;
  
  
  📋 What You'll Learn
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Best Agents Available&lt;/strong&gt; - Claude Code, OpenCode, Cursor, and specialized prebuilt frameworks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient Usage Patterns&lt;/strong&gt; - How to leverage each agent's strengths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pitfalls to Avoid&lt;/strong&gt; - Common mistakes that waste tokens and time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Saving Tips&lt;/strong&gt; - Keep your sessions productive and cost-effective&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step-by-Step Setup&lt;/strong&gt; - Complete configuration for your stack&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🏆 Best Coding Agents in 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quick Comparison Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;OpenCode&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terminal TUI&lt;/td&gt;
&lt;td&gt;Terminal CLI&lt;/td&gt;
&lt;td&gt;VS Code fork&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open Source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes (MIT)&lt;/td&gt;
&lt;td&gt;⚠️ Source-available&lt;/td&gt;
&lt;td&gt;❌ Proprietary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM Providers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;75+ via Models.dev&lt;/td&gt;
&lt;td&gt;Claude only&lt;/td&gt;
&lt;td&gt;Claude, GPT, Gemini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-Model Routing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Native&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;⚠️ Manual switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10 agents (OmO)&lt;/td&gt;
&lt;td&gt;Subagent spawning&lt;/td&gt;
&lt;td&gt;Composer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Edit Tool&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hashline (OmO)&lt;/td&gt;
&lt;td&gt;Built-in Edit&lt;/td&gt;
&lt;td&gt;Inline diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free + API costs&lt;/td&gt;
&lt;td&gt;$20/mo (Pro)&lt;/td&gt;
&lt;td&gt;$20/mo (Pro)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Power users, multi-model&lt;/td&gt;
&lt;td&gt;Deep codebase work&lt;/td&gt;
&lt;td&gt;Visual developers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. OpenCode + Oh-My-OpenAgent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OpenCode&lt;/strong&gt; is the open-source terminal powerhouse that routes to 75+ LLM providers. Combined with &lt;strong&gt;Oh-My-OpenAgent (OmO)&lt;/strong&gt;, it becomes a multi-agent system with 10 specialized agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Choose OpenCode?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model Freedom&lt;/strong&gt;: Use any provider, switch models per task, avoid vendor lock-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Go binary with TUI means sub-second startup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OmO Ecosystem&lt;/strong&gt;: 10 specialized agents, Hashline edits, automated model routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LSP Integration&lt;/strong&gt;: Real code intelligence via language servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Control&lt;/strong&gt;: Pay only for API calls you make&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install OpenCode&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://opencode.ai/install | bash

&lt;span class="c"&gt;# Verify installation&lt;/span&gt;
opencode &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# Output: opencode version 1.4.0&lt;/span&gt;

&lt;span class="c"&gt;# Install Oh-My-OpenAgent&lt;/span&gt;
git clone https://github.com/nicepkg/oh-my-openagent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;oh-my-openagent
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration for Full-Stack Development
&lt;/h3&gt;

&lt;p&gt;Create a configuration file for your stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ~/.opencode/config.yml&lt;/span&gt;
&lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;anthropic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${ANTHROPIC_API_KEY}&lt;/span&gt;
  &lt;span class="na"&gt;openai&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OPENAI_API_KEY}&lt;/span&gt;
  &lt;span class="na"&gt;google&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${GOOGLE_API_KEY}&lt;/span&gt;

&lt;span class="na"&gt;routing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Route tasks to appropriate models&lt;/span&gt;
  &lt;span class="na"&gt;code_generation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o"&lt;/span&gt;      &lt;span class="c1"&gt;# Fast, cheap for simple code&lt;/span&gt;
  &lt;span class="na"&gt;architecture&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus"&lt;/span&gt;    &lt;span class="c1"&gt;# Better reasoning for decisions&lt;/span&gt;
  &lt;span class="na"&gt;refactoring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet"&lt;/span&gt;   &lt;span class="c1"&gt;# Balanced for multi-file changes&lt;/span&gt;

&lt;span class="na"&gt;omO_agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;database&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;testing&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deployment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage Example for Full-Stack
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start OpenCode in your project&lt;/span&gt;
opencode

&lt;span class="c"&gt;# Within OpenCode, use OmO agents:&lt;/span&gt;
&lt;span class="c"&gt;# @frontend - React components, CSS, state management&lt;/span&gt;
&lt;span class="c"&gt;# @backend - .NET controllers, services, APIs&lt;/span&gt;
&lt;span class="c"&gt;# @database - Entity Framework, migrations, queries&lt;/span&gt;
&lt;span class="c"&gt;# @testing - Unit tests, integration tests&lt;/span&gt;

&lt;span class="c"&gt;# Example prompt:&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; @frontend Create a React component &lt;span class="k"&gt;for &lt;/span&gt;user login form with validation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Claude Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; is Anthropic's terminal-based agent built around Claude Opus 4.6, which achieves an 80.8% SWE-bench score (highest verified as of 2026).&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Choose Claude Code?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Single-Model Performance&lt;/strong&gt;: Opus 4.6 genuinely outperforms alternatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep Git Integration&lt;/strong&gt;: Commits, PRs, branch management built-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks System&lt;/strong&gt;: Enforce quality gates automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project Memory&lt;/strong&gt;: CLAUDE.md persists context across sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic Reliability&lt;/strong&gt;: Handles complex multi-step tasks without losing track&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Claude Code&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic/claude-code

&lt;span class="c"&gt;# Verify installation&lt;/span&gt;
claude &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Start a session in your project&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/project
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration for Full-Stack .NET + Node.js
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt; (project-level memory file):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project: Full-Stack Application&lt;/span&gt;

&lt;span class="gu"&gt;## Stack&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Backend: .NET 8 / ASP.NET Core (Clean Architecture)
&lt;span class="p"&gt;-&lt;/span&gt; Frontend: React 18 with TypeScript
&lt;span class="p"&gt;-&lt;/span&gt; Database: PostgreSQL with Entity Framework Core
&lt;span class="p"&gt;-&lt;/span&gt; API: RESTful with OpenAPI/Swagger

&lt;span class="gu"&gt;## Coding Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use async/await for all I/O operations
&lt;span class="p"&gt;-&lt;/span&gt; Follow SOLID principles for .NET classes
&lt;span class="p"&gt;-&lt;/span&gt; React components should be functional with hooks
&lt;span class="p"&gt;-&lt;/span&gt; Unit tests: xUnit for .NET, Jest for React
&lt;span class="p"&gt;-&lt;/span&gt; Code style: EditorConfig + Prettier

&lt;span class="gu"&gt;## Architecture Decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Backend uses CQRS pattern with MediatR
&lt;span class="p"&gt;-&lt;/span&gt; Frontend uses React Query for server state
&lt;span class="p"&gt;-&lt;/span&gt; Authentication: JWT with refresh tokens
&lt;span class="p"&gt;-&lt;/span&gt; Deployment: Docker + Azure

&lt;span class="gu"&gt;## Common Commands&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Build backend: &lt;span class="sb"&gt;`dotnet build`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Run backend: &lt;span class="sb"&gt;`dotnet run --project src/API`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Build frontend: &lt;span class="sb"&gt;`npm run build`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Run tests: &lt;span class="sb"&gt;`dotnet test`&lt;/span&gt; and &lt;span class="sb"&gt;`npm test`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;.claude/settings.local.json&lt;/strong&gt; (per-user settings):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-api-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DATABASE_CONNECTION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-connection-string"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Glob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage Examples
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start Claude Code&lt;/span&gt;
claude

&lt;span class="c"&gt;# Within Claude Code:&lt;/span&gt;

&lt;span class="c"&gt;# 1. Create a new API endpoint&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Create a new API endpoint &lt;span class="k"&gt;for &lt;/span&gt;user registration &lt;span class="k"&gt;in &lt;/span&gt;src/API/Controllers/AccountController.cs

&lt;span class="c"&gt;# 2. Implement a React component&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Create a React component &lt;span class="k"&gt;for &lt;/span&gt;user profile display with edit functionality

&lt;span class="c"&gt;# 3. Full-stack feature&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Implement a &lt;span class="nb"&gt;complete&lt;/span&gt; &lt;span class="s2"&gt;"forgot password"&lt;/span&gt; flow:
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; - Backend: .NET controller, service, email template
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; - Frontend: React form with validation
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; - Database: Update user table with reset token

&lt;span class="c"&gt;# 4. Use subagents for parallel work&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /subagent backend &lt;span class="s2"&gt;"Create EF Core migration for password reset tokens"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /subagent frontend &lt;span class="s2"&gt;"Build password reset form component"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Cursor
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; is the VS Code fork that embeds AI directly into the editing experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Choose Cursor?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full IDE Experience&lt;/strong&gt;: Syntax highlighting, debugging, extensions, terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Diff Review&lt;/strong&gt;: See exactly what changes before accepting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tab Completion&lt;/strong&gt;: AI-powered autocomplete that learns patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower Learning Curve&lt;/strong&gt;: If you know VS Code, you know Cursor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Model Access&lt;/strong&gt;: Claude, GPT-4o, Gemini, custom models&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Download from cursor.com&lt;/li&gt;
&lt;li&gt;Import your VS Code settings&lt;/li&gt;
&lt;li&gt;Sign in with your account&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Configuration for Full-Stack Development
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;.cursor/rules/&lt;/strong&gt; (AI rules directory):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# .cursor/rules/dotnet.mdc
---
applyTo: "**/*.cs"
---
# .NET Coding Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use async/await for I/O operations
&lt;span class="p"&gt;-&lt;/span&gt; Follow Clean Architecture patterns
&lt;span class="p"&gt;-&lt;/span&gt; Use Entity Framework Core for data access
&lt;span class="p"&gt;-&lt;/span&gt; Implement proper error handling with try-catch
&lt;span class="p"&gt;-&lt;/span&gt; Write unit tests with xUnit

&lt;span class="gh"&gt;# .cursor/rules/react.mdc
---
applyTo: "**/*.{tsx,jsx}"
---
# React Coding Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use functional components with hooks
&lt;span class="p"&gt;-&lt;/span&gt; Implement TypeScript interfaces
&lt;span class="p"&gt;-&lt;/span&gt; Use React Query for server state
&lt;span class="p"&gt;-&lt;/span&gt; Follow component composition patterns
&lt;span class="p"&gt;-&lt;/span&gt; Write tests with Jest + React Testing Library
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;.cursor/indexing_allowlist&lt;/strong&gt; (control what gets indexed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/**/*.cs
src/**/*.tsx
src/**/*.ts
!node_modules/**
!bin/**
!obj/**
!*.min.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start Cursor and open your project folder&lt;/span&gt;

&lt;span class="c"&gt;# Use Composer for multi-file changes:&lt;/span&gt;
&lt;span class="c"&gt;# Cmd/Ctrl + I to open Composer&lt;/span&gt;

&lt;span class="c"&gt;# Example prompt for full-stack feature:&lt;/span&gt;
&lt;span class="s2"&gt;"Add user profile feature:
- Backend: Update User entity, create ProfileController
- Frontend: Build profile page with form
- Tests: Add integration tests"&lt;/span&gt;

&lt;span class="c"&gt;# Use Tab completion:&lt;/span&gt;
&lt;span class="c"&gt;# Type function signature, Tab to auto-generate implementation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Prebuilt Agent Frameworks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Agent-Bober
&lt;/h3&gt;

&lt;p&gt;A multi-agent harness for building applications autonomously with any LLM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;agent-bober
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Configuration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// agent-bober.config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;researcher&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;planner&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;curator&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;generator&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;evaluator&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;models&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-3-5-sonnet&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;mcpServers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;windsurf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run full-stack development pipeline&lt;/span&gt;
npx agent-bober &lt;span class="nt"&gt;--task&lt;/span&gt; &lt;span class="s2"&gt;"Build user authentication system"&lt;/span&gt;

&lt;span class="c"&gt;# The pipeline will:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Research: Gather requirements and best practices&lt;/span&gt;
&lt;span class="c"&gt;# 2. Plan: Create architecture and implementation plan&lt;/span&gt;
&lt;span class="c"&gt;# 3. Curate: Review existing codebase for integration points&lt;/span&gt;
&lt;span class="c"&gt;# 4. Generate: Create backend (.NET) and frontend (React) code&lt;/span&gt;
&lt;span class="c"&gt;# 5. Evaluate: Run tests and review code quality&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Specialist-Agent
&lt;/h3&gt;

&lt;p&gt;27+ specialized agents with 21 skills for different frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;specialist-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Setup for .NET + React Stack:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// specialist-agent.config.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SpecialistAgent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;specialist-agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SpecialistAgent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotnet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nodejs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;frameworkPacks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nextjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Use specialized agents&lt;/span&gt;
&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotnet-architect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;planSolution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User Management&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-developer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;createComponents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User Dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nodejs-backend&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;buildApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User API&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 How to Use These Agents Efficiently
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Agent Selection Strategy
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task Type&lt;/th&gt;
&lt;th&gt;Best Agent&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Quick edits&lt;/td&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;Visual diff, inline changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deep refactoring&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Subagent planning, git integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-provider&lt;/td&gt;
&lt;td&gt;OpenCode&lt;/td&gt;
&lt;td&gt;Model routing, cost optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autonomous builds&lt;/td&gt;
&lt;td&gt;Agent-Bober&lt;/td&gt;
&lt;td&gt;Full pipeline automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Framework-specific&lt;/td&gt;
&lt;td&gt;Specialist-Agent&lt;/td&gt;
&lt;td&gt;Pre-built skills for your stack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Workflow Patterns
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pattern 1: Parallel Development&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code (Main)
  ├─ Subagent: Backend (.NET)
  ├─ Subagent: Frontend (React)
  └─ Subagent: Database (EF Core)

All subagents work simultaneously, then merge results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pattern 2: Sequential Pipeline&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenCode with OmO
  ├─ Researcher: Gather requirements
  ├─ Planner: Create architecture
  ├─ Generator: Write code
  └─ Evaluator: Test and review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pattern 3: Visual Review&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cursor Composer
  ├─ Describe feature
  ├─ Review visual diff
  ├─ Accept/reject changes
  └─ Iterate as needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚠️ Pitfalls to Avoid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Vague Prompts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;❌ "Fix the login page"&lt;br&gt;
✅ "Update src/components/LoginForm.tsx to add email validation using react-hook-form"&lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;strong&gt;Full Context on Every Turn&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;❌ Asking agents to read entire codebase each time&lt;br&gt;
✅ Use #file: references and scoped prompts&lt;/p&gt;
&lt;h3&gt;
  
  
  3. &lt;strong&gt;No Project Memory&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;❌ Starting fresh every session&lt;br&gt;
✅ Use CLAUDE.md, .cursor/rules, or OpenCode memory files&lt;/p&gt;
&lt;h3&gt;
  
  
  4. &lt;strong&gt;Expensive Models for Simple Tasks&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;❌ Using Claude Opus for simple formatting&lt;br&gt;
✅ Route simple tasks to cheaper models (GPT-4.1, Haiku)&lt;/p&gt;
&lt;h3&gt;
  
  
  5. &lt;strong&gt;Ignoring Git History&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;❌ Manual commits without context&lt;br&gt;
✅ Let Claude Code handle commits with meaningful messages&lt;/p&gt;
&lt;h3&gt;
  
  
  6. &lt;strong&gt;No Testing Strategy&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;❌ Generating code without tests&lt;br&gt;
✅ Always request tests alongside implementation&lt;/p&gt;
&lt;h3&gt;
  
  
  7. &lt;strong&gt;Context Rot&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;❌ Letting context window fill to 150K+ tokens&lt;br&gt;
✅ Compact context before it degrades model performance&lt;/p&gt;


&lt;h2&gt;
  
  
  💾 Context Saving Tips
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Context Engineering (Foojay.io's 8 Levers)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Lever A: Scope Your Asks&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bad: "Refactor the order email"&lt;/span&gt;
&lt;span class="c"&gt;# Good: "Refactor #file:src/Email/OrderConfirmationService.cs to use new template engine"&lt;/span&gt;

&lt;span class="c"&gt;# Use #file: syntax in Claude Code&lt;/span&gt;
&lt;span class="c"&gt;# Use @ in Cursor&lt;/span&gt;
&lt;span class="c"&gt;# Use explicit paths in OpenCode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lever B: Prompt Caching - Order Matters&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Static at top (cached):
- Tool definitions
- System prompt
- Custom instructions
- Skills/rules

Dynamic at bottom:
- Retrieved files
- Conversation history
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lever C: Tool &amp;amp; MCP Hygiene&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// .vscode/mcp.json - keep it short&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;servers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;filesystem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;command&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;npx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;args&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-y&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/server-filesystem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// Disable servers you don't use&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lever D: Custom Instructions&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# CLAUDE.md or .github/copilot-instructions.md&lt;/span&gt;

&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use async/await for all I/O
&lt;span class="p"&gt;-&lt;/span&gt; Write tests for new features
&lt;span class="p"&gt;-&lt;/span&gt; Follow Clean Architecture
&lt;span class="p"&gt;-&lt;/span&gt; Use #file: for specific files
&lt;span class="p"&gt;-&lt;/span&gt; Reply with diffs, not novels
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lever E: Model Routing&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Start cheap, escalate when stuck&lt;/span&gt;
&lt;span class="na"&gt;routing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;inline_completions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4.1"&lt;/span&gt;      &lt;span class="c1"&gt;# 0x cost&lt;/span&gt;
  &lt;span class="na"&gt;real_coding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet"&lt;/span&gt;       &lt;span class="c1"&gt;# 1x cost&lt;/span&gt;
  &lt;span class="na"&gt;long_refactor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-long"&lt;/span&gt; &lt;span class="c1"&gt;# 1x cost&lt;/span&gt;
  &lt;span class="na"&gt;hard_reasoning&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus"&lt;/span&gt;      &lt;span class="c1"&gt;# 10x cost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lever F: Output Discipline&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bad: "Explain what you're about to do..."&lt;/span&gt;
&lt;span class="c"&gt;# Good: "Reply with unified diff only, no commentary"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lever G: Repo Hygiene&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Exclude from indexing&lt;/span&gt;
&lt;span class="c"&gt;# .cursorignore or .opencodeignore&lt;/span&gt;
node_modules/
bin/
obj/
&lt;span class="k"&gt;*&lt;/span&gt;.min.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lever H: Observability&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Monitor token usage&lt;/span&gt;
&lt;span class="c"&gt;# Claude Code shows token count per turn&lt;/span&gt;
&lt;span class="c"&gt;# OpenCode has --verbose flag&lt;/span&gt;
&lt;span class="c"&gt;# Cursor shows in output panel&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Session Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;For Long Sessions:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Claude Code: Use /compact to reduce context&lt;/span&gt;
&lt;span class="c"&gt;# OpenCode: Start new session with /new&lt;/span&gt;
&lt;span class="c"&gt;# Cursor: Use @workspace for fresh context&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For Multi-Day Projects:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create project memory files&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"# Project Context"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; CLAUDE.md
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Last updated: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; CLAUDE.md

&lt;span class="c"&gt;# Add key decisions and architecture notes&lt;/span&gt;
&lt;span class="c"&gt;# This persists across sessions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Token Optimization Strategies
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File scoping&lt;/td&gt;
&lt;td&gt;50-70%&lt;/td&gt;
&lt;td&gt;Use #file: references&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt caching&lt;/td&gt;
&lt;td&gt;90% for static content&lt;/td&gt;
&lt;td&gt;Order prompts correctly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model routing&lt;/td&gt;
&lt;td&gt;10x cost difference&lt;/td&gt;
&lt;td&gt;Route simple tasks to cheap models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output discipline&lt;/td&gt;
&lt;td&gt;60-80%&lt;/td&gt;
&lt;td&gt;Request diffs, not explanations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context compaction&lt;/td&gt;
&lt;td&gt;Prevents rot&lt;/td&gt;
&lt;td&gt;Compact at 50K tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔧 Step-by-Step Setup Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install Your Chosen Agent
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Option A: Claude Code (Recommended for .NET + Full-Stack)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic/claude-code
claude &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option B: OpenCode (For Multi-Model Flexibility)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://opencode.ai/install | bash
opencode &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option C: Cursor (For Visual Development)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download from cursor.com&lt;/span&gt;
&lt;span class="c"&gt;# Import VS Code settings&lt;/span&gt;
&lt;span class="c"&gt;# Install extensions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Configure Project Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-project/
├── .claude/                    # Claude Code config
│   └── settings.local.json
├── CLAUDE.md                   # Project memory
├── .cursor/                    # Cursor config
│   └── rules/
├── .opencode/                  # OpenCode config
├── src/
│   ├── API/                   # .NET Backend
│   ├── Web/                   # React Frontend
│   └── Shared/                # Common code
├── tests/
└── docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Set Up CLAUDE.md (For Claude Code)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Full-Stack Project: My Application&lt;/span&gt;

&lt;span class="gu"&gt;## Stack Overview&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Backend**&lt;/span&gt;: .NET 8 / ASP.NET Core / Clean Architecture
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Frontend**&lt;/span&gt;: React 18 / TypeScript / Vite
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Database**&lt;/span&gt;: PostgreSQL / Entity Framework Core
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Auth**&lt;/span&gt;: JWT with refresh tokens
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Testing**&lt;/span&gt;: xUnit (backend) / Jest (frontend)

&lt;span class="gu"&gt;## Project Structure&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; src/API - ASP.NET Core Web API
&lt;span class="p"&gt;-&lt;/span&gt; src/Application - Business logic (CQRS with MediatR)
&lt;span class="p"&gt;-&lt;/span&gt; src/Infrastructure - EF Core, external services
&lt;span class="p"&gt;-&lt;/span&gt; src/Web - React frontend
&lt;span class="p"&gt;-&lt;/span&gt; tests/ - Unit and integration tests

&lt;span class="gu"&gt;## Coding Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use async/await for all I/O operations
&lt;span class="p"&gt;-&lt;/span&gt; Follow SOLID principles
&lt;span class="p"&gt;-&lt;/span&gt; Write tests for new features
&lt;span class="p"&gt;-&lt;/span&gt; Use repository pattern for data access
&lt;span class="p"&gt;-&lt;/span&gt; Implement proper error handling

&lt;span class="gu"&gt;## Common Commands&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Build backend: &lt;span class="sb"&gt;`dotnet build`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Run backend: &lt;span class="sb"&gt;`dotnet run --project src/API`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Build frontend: &lt;span class="sb"&gt;`cd src/Web &amp;amp;&amp;amp; npm run build`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Run tests: &lt;span class="sb"&gt;`dotnet test`&lt;/span&gt; and &lt;span class="sb"&gt;`cd src/Web &amp;amp;&amp;amp; npm test`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Run migrations: &lt;span class="sb"&gt;`dotnet ef database update`&lt;/span&gt;

&lt;span class="gu"&gt;## Architecture Decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Backend uses CQRS pattern with MediatR
&lt;span class="p"&gt;-&lt;/span&gt; Frontend uses React Query for server state management
&lt;span class="p"&gt;-&lt;/span&gt; API follows RESTful conventions with OpenAPI documentation
&lt;span class="p"&gt;-&lt;/span&gt; Authentication uses JWT tokens with refresh mechanism
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Configure Agent Settings
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Claude Code Settings&lt;/strong&gt; (&lt;code&gt;.claude/settings.local.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-key-here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DATABASE_CONNECTION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-connection-string"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Glob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Grep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OpenCode Configuration&lt;/strong&gt; (&lt;code&gt;.opencode/config.yml&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;anthropic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${ANTHROPIC_API_KEY}&lt;/span&gt;
  &lt;span class="na"&gt;openai&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${OPENAI_API_KEY}&lt;/span&gt;

&lt;span class="na"&gt;routing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;code_generation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o"&lt;/span&gt;
  &lt;span class="na"&gt;architecture&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus"&lt;/span&gt;
  &lt;span class="na"&gt;refactoring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor Rules&lt;/strong&gt; (&lt;code&gt;.cursor/rules/dotnet.mdc&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;applyTo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**/*.cs"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="gh"&gt;# .NET Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use Clean Architecture
&lt;span class="p"&gt;-&lt;/span&gt; Implement CQRS with MediatR
&lt;span class="p"&gt;-&lt;/span&gt; Write xUnit tests
&lt;span class="p"&gt;-&lt;/span&gt; Follow async patterns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Start Developing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Claude Code Workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
claude

&lt;span class="c"&gt;# Prompt examples:&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Create user registration API &lt;span class="k"&gt;in &lt;/span&gt;src/API/Controllers/AccountController.cs

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Build login form component &lt;span class="k"&gt;in &lt;/span&gt;src/Web/src/components/LoginForm.tsx

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /subagent backend &lt;span class="s2"&gt;"Create EF Core migration for user table"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /subagent frontend &lt;span class="s2"&gt;"Build user dashboard component"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OpenCode Workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
opencode

&lt;span class="c"&gt;# Use OmO agents:&lt;/span&gt;
@backend Create user authentication service
@frontend Build login form with validation
@database Design user schema with EF Core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cursor Workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Open project in Cursor&lt;/span&gt;
&lt;span class="c"&gt;# Use Composer (Cmd/Ctrl+I)&lt;/span&gt;
&lt;span class="c"&gt;# Describe feature, review diff, accept changes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Monitor and Optimize
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Check Token Usage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Shows tokens per turn&lt;/li&gt;
&lt;li&gt;OpenCode: Use &lt;code&gt;--verbose&lt;/code&gt; flag&lt;/li&gt;
&lt;li&gt;Cursor: View in output panel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Compact Context When Needed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: &lt;code&gt;/compact&lt;/code&gt; command&lt;/li&gt;
&lt;li&gt;OpenCode: Start new session with &lt;code&gt;/new&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cursor: Use &lt;code&gt;@workspace&lt;/code&gt; for fresh context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Review Session History:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Claude Code: /history&lt;/span&gt;
&lt;span class="c"&gt;# OpenCode: Session history in ~/.opencode/&lt;/span&gt;
&lt;span class="c"&gt;# Cursor: Output panel logs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📊 Full-Stack Development Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Daily Development Cycle
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Morning: Planning&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code Session:
1. Review CLAUDE.md for project context
2. Ask: "What should I work on today?"
3. Plan feature implementation
4. Create subagents for parallel work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Development: Implementation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code:
1. Create backend API endpoint
2. Build frontend component
3. Add database migration
4. Write unit tests

OpenCode:
1. Use @backend for .NET code
2. Use @frontend for React code
3. Use @testing for test generation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Review: Quality Assurance&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cursor:
1. Review visual diffs
2. Run tests
3. Check for edge cases
4. Refactor as needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Evening: Cleanup&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code:
1. /compact to reduce context
2. Commit with meaningful messages
3. Update CLAUDE.md with decisions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Feature Development Example
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Task: User Profile Management&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Backend (.NET)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Create UserProfile entity with EF Core migration
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Build UserProfileController with CRUD endpoints
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Implement UserProfileService with business logic
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Write integration tests

&lt;span class="c"&gt;# 2. Frontend (React)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Build UserProfile component with edit functionality
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Create useUserProfile hook with React Query
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Add form validation with react-hook-form
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Write Jest tests

&lt;span class="c"&gt;# 3. Integration&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Connect frontend to backend API
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Test end-to-end flow
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Add error handling
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Deploy to staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 Conclusion
&lt;/h2&gt;

&lt;p&gt;Using prebuilt agents with coding agents transforms full-stack development from a solo effort into a collaborative team of AI specialists. The key is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Choose the right agent&lt;/strong&gt; for your workflow (Claude Code for deep work, OpenCode for flexibility, Cursor for visual development)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use prebuilt frameworks&lt;/strong&gt; like Agent-Bober or Specialist-Agent for repeatable patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Master context management&lt;/strong&gt; to keep sessions productive and cost-effective&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow the step-by-step setup&lt;/strong&gt; to configure your environment properly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start with Claude Code for .NET + Node.js + React stacks, integrate OpenCode for multi-model routing when needed, and use Cursor for visual review and debugging. Combine with prebuilt agent frameworks for autonomous development pipelines.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to get started?&lt;/strong&gt; Pick one agent, set up CLAUDE.md, and start building!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;LinkedIn Profile: &lt;a href="https://www.linkedin.com/in/vikrant-bagal" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/vikrant-bagal&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What Can Be Built with Durable Workflows in Microsoft Agent Framework</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Mon, 25 May 2026 16:25:29 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/what-can-be-built-with-durable-workflows-in-microsoft-agent-framework-296b</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/what-can-be-built-with-durable-workflows-in-microsoft-agent-framework-296b</guid>
      <description>&lt;p&gt;The Microsoft Agent Framework has revolutionized how we build AI-powered applications. With its April 2026 v1.0 release, developers now have a production-ready SDK for creating intelligent agents that can orchestrate complex multi-step workflows. But what exactly can you build with Durable Workflows? Let's explore the possibilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Foundation: Understanding Durable Workflows
&lt;/h2&gt;

&lt;p&gt;Durable Workflows in Microsoft Agent Framework allow you to build stateful, long-running AI orchestrations that survive process restarts and failures. Unlike in-process execution (which is great for development), durable workflows use the &lt;strong&gt;Durable Task Scheduler (DTS)&lt;/strong&gt; to persist workflow state and coordinate execution across distributed systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features of Durable Workflows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stateful execution&lt;/strong&gt;: Workflows survive process restarts and failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic checkpointing&lt;/strong&gt;: Progress is saved after each step&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed execution&lt;/strong&gt;: Executors can run across different machines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long-running orchestrations&lt;/strong&gt;: Workflows can run for minutes, hours, or even days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;: Built-in dashboard for monitoring workflow executions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Customer Support Systems with Specialized Agents
&lt;/h2&gt;

&lt;p&gt;One of the most practical applications of Durable Workflows is building intelligent customer support systems. Instead of a single monolithic chatbot, you can create a network of specialized agents that work together.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Query → Triage Agent → 
  ├─ Technical Issues → Technical Support Agent
  ├─ Billing Questions → Billing Agent
  ├─ Account Management → Account Agent
  └─ Escalation → Human Agent (HITL)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Works
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Handoff Orchestration&lt;/strong&gt; pattern allows agents to transfer complete control to another agent with full conversation context. This is different from the Agent-as-Tools pattern where a primary agent delegates subtasks while retaining overall responsibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Differences:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Handoff&lt;/th&gt;
&lt;th&gt;Agent-as-Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Control Flow&lt;/td&gt;
&lt;td&gt;Agent transfers entire task&lt;/td&gt;
&lt;td&gt;Primary agent delegates subtasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task Ownership&lt;/td&gt;
&lt;td&gt;New agent owns the task&lt;/td&gt;
&lt;td&gt;Primary agent retains responsibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;Full conversation context transferred&lt;/td&gt;
&lt;td&gt;Limited context to tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Implementation Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create specialized support agents&lt;/span&gt;
&lt;span class="n"&gt;ChatClientAgent&lt;/span&gt; &lt;span class="n"&gt;technicalSupport&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"You are a technical support specialist. Help users troubleshoot software issues."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"technical_support"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Technical Support Agent"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;ChatClientAgent&lt;/span&gt; &lt;span class="n"&gt;billingSupport&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"You handle billing inquiries, refunds, and payment issues."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"billing_support"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Billing Support Agent"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;ChatClientAgent&lt;/span&gt; &lt;span class="n"&gt;triageAgent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"Route customer queries to the appropriate specialist."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"triage_agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Triage Agent"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Configure handoff rules&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AgentWorkflowBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateHandoffBuilderWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triageAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithHandoffs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triageAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;technicalSupport&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;billingSupport&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each agent specializes in a specific domain&lt;/li&gt;
&lt;li&gt;Customers get accurate, expert responses&lt;/li&gt;
&lt;li&gt;Seamless handoffs with full context preservation&lt;/li&gt;
&lt;li&gt;Durable execution across service restarts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Content Creation and Review Pipeline
&lt;/h2&gt;

&lt;p&gt;Content creation workflows benefit enormously from durable execution, especially when dealing with long-running tasks like research, drafting, and review.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Content Request → Research Agent → 
  ↓
Draft Creation Agent → 
  ↓
Review Agent (Editorial) → 
  ↓
Approval Agent (Human-in-Loop) → 
  ↓
Publishing Agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementation Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define executors for each pipeline stage&lt;/span&gt;
&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResearchExecutor&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContentRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ResearchData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"Research"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ResearchData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ContentRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IWorkflowContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Gather information from multiple sources&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sources&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;ResearchSourcesAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Topic&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ResearchData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Topic&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DraftExecutor&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ResearchData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DraftContent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"Draft"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DraftContent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ResearchData&lt;/span&gt; &lt;span class="n"&gt;research&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IWorkflowContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Generate draft content&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;GenerateDraftAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;research&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReviewExecutor&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DraftContent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ReviewResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"Review"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ReviewResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;DraftContent&lt;/span&gt; &lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IWorkflowContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Editorial review with feedback&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;ReviewContentAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ApprovalExecutor&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ReviewResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ApprovalStatus&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"Approval"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ApprovalStatus&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ReviewResult&lt;/span&gt; &lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IWorkflowContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Queue for human approval&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;RequestHumanApprovalAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Build the workflow&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;contentPipeline&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WorkflowBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;researchExecutor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ContentCreationPipeline"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Research → Draft → Review → Approval → Publish"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;researchExecutor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;draftExecutor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;draftExecutor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reviewExecutor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reviewExecutor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;approvalExecutor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why Durable Matters Here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Research can take hours across multiple sources&lt;/li&gt;
&lt;li&gt;Drafting and review may span multiple days&lt;/li&gt;
&lt;li&gt;Approval workflows can involve multiple stakeholders&lt;/li&gt;
&lt;li&gt;Workflow state survives server restarts and failures&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Multi-Agent Translation Pipeline
&lt;/h2&gt;

&lt;p&gt;A practical example from Microsoft's documentation shows how to build a translation pipeline using multiple specialized agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input Text → French Translator → Spanish Translator → English Translator → Output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create translation agents for different languages&lt;/span&gt;
&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;frenchAgent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;GetTranslationAgentAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"French"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aiProjectClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deploymentName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;spanishAgent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;GetTranslationAgentAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Spanish"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aiProjectClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deploymentName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;englishAgent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;GetTranslationAgentAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"English"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aiProjectClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deploymentName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Build sequential workflow&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WorkflowBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frenchAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frenchAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spanishAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spanishAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;englishAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Execute with streaming to observe real-time updates&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;StreamingRun&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;InProcessExecution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ChatMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ChatRole&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TrySendMessageAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;TurnToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emitEvents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;evt&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WatchStreamAsync&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;ExecutorCompletedEvent&lt;/span&gt; &lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExecutorId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sequential agent chaining with type safety&lt;/li&gt;
&lt;li&gt;Real-time streaming updates&lt;/li&gt;
&lt;li&gt;Each agent specializes in translation between specific languages&lt;/li&gt;
&lt;li&gt;Durable execution for long-running translations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Enterprise AI Orchestration with Microsoft 365
&lt;/h2&gt;

&lt;p&gt;For enterprise scenarios, Microsoft Agent Framework enables sophisticated multi-agent workflows integrated with Microsoft 365 services.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Enterprise Request → 
  ├─ HR Agent (Employee data, policies)
  ├─ Finance Agent (Budgets, expenses)
  ├─ IT Agent (System access, troubleshooting)
  └─ Compliance Agent (Policy verification)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Diamond Orchestration Pattern
&lt;/h3&gt;

&lt;p&gt;Enterprise workflows often use a &lt;strong&gt;diamond orchestration pattern&lt;/strong&gt; where multiple agents work in parallel, then results are merged and processed further.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WorkflowBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// Fan-out to multiple specialized agents&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddFanOutEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hrAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;financeAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;itAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;complianceAgent&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="c1"&gt;// Wait for all to complete&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddFanInBarrierEdge&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;hrAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;financeAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;itAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;complianceAgent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;mergeAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// Process merged results&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mergeAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;finalProcessingAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits for Enterprises:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specialized agents for different business domains&lt;/li&gt;
&lt;li&gt;Parallel processing for faster response times&lt;/li&gt;
&lt;li&gt;Integration with existing Microsoft 365 infrastructure&lt;/li&gt;
&lt;li&gt;Distributed execution across Azure resources&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Order Processing Systems
&lt;/h2&gt;

&lt;p&gt;A practical example from the Microsoft blog shows how to build a durable order processing workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order Request → Order Lookup → Order Cancel → Send Email → Complete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderLookup&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderCancelRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderLookup"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;OrderCancelRequest&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;IWorkflowContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lookup order from database&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromMilliseconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;OrderDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddDays&lt;/span&gt;&lt;span class="p"&gt;(-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;IsCancelled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;CancelReason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reason&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Jerry"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"jerry@example.com"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderCancel&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderCancel"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Order&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;IWorkflowContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromMilliseconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;IsCancelled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SendEmail&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"SendEmail"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Order&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;IWorkflowContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;$"Cancellation email sent for order &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;
            &lt;span class="s"&gt;$"to &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Build workflow&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cancelOrder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WorkflowBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderLookup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CancelOrder"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cancel an order and notify the customer"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderLookup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orderCancel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderCancel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running with Durable Execution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Add durable packages&lt;/span&gt;
&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DurableTask&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;prerelease&lt;/span&gt;
&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DurableTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AzureManaged&lt;/span&gt;
&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DurableTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AzureManaged&lt;/span&gt;

&lt;span class="c1"&gt;// Configure durable workflow&lt;/span&gt;
&lt;span class="n"&gt;IHost&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateDefaultBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureServices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureDurableWorkflows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;workflowOptions&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; 
                &lt;span class="n"&gt;workflowOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddWorkflow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancelOrder&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;workerBuilder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
                &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseDurableTaskScheduler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dtsConnectionString&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;clientBuilder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
                &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseDurableTaskScheduler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dtsConnectionString&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Start the host and run workflow&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;IWorkflowClient&lt;/span&gt; &lt;span class="n"&gt;workflowClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
    &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IWorkflowClient&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OrderCancelRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"12345"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Wrong color"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;workflowClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancelOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WaitForCompletionAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Workflow completed: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Durability Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State persists across process restarts&lt;/li&gt;
&lt;li&gt;Automatic checkpointing after each step&lt;/li&gt;
&lt;li&gt;Observable execution timeline in DTS Dashboard&lt;/li&gt;
&lt;li&gt;Can resume from failure without losing work&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Human-in-the-Loop Approval Workflows
&lt;/h2&gt;

&lt;p&gt;For sensitive operations, Durable Workflows enable human approval checkpoints integrated into the automation pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Financial transactions requiring manager approval&lt;/li&gt;
&lt;li&gt;Content publishing requiring editorial review&lt;/li&gt;
&lt;li&gt;Data access requests requiring security approval&lt;/li&gt;
&lt;li&gt;Contract negotiations requiring legal review&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementation Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HumanApprovalExecutor&lt;/span&gt; 
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ApprovalRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ApprovalResponse&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"HumanApproval"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ApprovalResponse&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ApprovalRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;IWorkflowContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Queue approval request to external system&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;approvalId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;QueueApprovalRequestAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Wait for human response (could be hours/days)&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;WaitForHumanResponseAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;approvalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Return approval result to workflow&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ApprovalResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Approved&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workflows can pause for hours or days&lt;/li&gt;
&lt;li&gt;State persists across server restarts&lt;/li&gt;
&lt;li&gt;Seamless integration with external approval systems&lt;/li&gt;
&lt;li&gt;Full audit trail of approval decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Parallel Processing with Fan-Out/Fan-In
&lt;/h2&gt;

&lt;p&gt;For tasks that require parallel execution, the fan-out/fan-in pattern enables efficient processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Document Analysis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;WorkflowBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// Fan-out: Process input in parallel&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddFanOutEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;researchAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// Researches the topic&lt;/span&gt;
        &lt;span class="n"&gt;analysisAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// Analyzes data&lt;/span&gt;
        &lt;span class="n"&gt;summaryAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Creates summary&lt;/span&gt;
        &lt;span class="n"&gt;citationAgent&lt;/span&gt;       &lt;span class="c1"&gt;// Generates citations&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="c1"&gt;// Fan-in: Wait for all to complete&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddFanInBarrierEdge&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="n"&gt;researchAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;analysisAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;summaryAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;citationAgent&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;mergeAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// Process merged results&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mergeAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;finalOutputAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces processing time through parallelism&lt;/li&gt;
&lt;li&gt;Each agent specializes in a specific task&lt;/li&gt;
&lt;li&gt;Automatic synchronization at merge point&lt;/li&gt;
&lt;li&gt;Scalable across multiple machines&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Running Durable Workflows Locally
&lt;/h2&gt;

&lt;p&gt;For development, you can run the DTS emulator locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; dts-emulator &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-p&lt;/span&gt; 8082:8082 &lt;span class="se"&gt;\&lt;/span&gt;
  mcr.microsoft.com/dts/dts-emulator:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Access the Dashboard:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Endpoint: &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dashboard UI: &lt;a href="http://localhost:8082" rel="noopener noreferrer"&gt;http://localhost:8082&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Durable Workflows in Microsoft Agent Framework enable you to build sophisticated AI-powered applications that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Survive failures&lt;/strong&gt; - State persists across restarts and crashes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run for extended periods&lt;/strong&gt; - Workflows can execute for minutes, hours, or days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale horizontally&lt;/strong&gt; - Executors can run across multiple machines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide observability&lt;/strong&gt; - Built-in dashboard for monitoring and debugging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate with enterprise systems&lt;/strong&gt; - Works with Azure, Microsoft 365, and more&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Whether you're building customer support systems, content pipelines, enterprise orchestrations, or approval workflows, Durable Workflows provide the foundation for reliable, production-ready AI applications.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to get started?&lt;/strong&gt; Check out the &lt;a href="https://github.com/microsoft/agent-framework" rel="noopener noreferrer"&gt;Microsoft Agent Framework GitHub repository&lt;/a&gt; and the &lt;a href="https://learn.microsoft.com/en-us/agent-framework/" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; for more examples and tutorials.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is based on Microsoft's official documentation and blog posts from May 2026. All code examples are adapted from the official Microsoft Agent Framework samples.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/agent-framework" rel="noopener noreferrer"&gt;Microsoft Agent Framework on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/agent-framework/" rel="noopener noreferrer"&gt;Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/durable-workflows-in-microsoft-agent-framework/" rel="noopener noreferrer"&gt;Durable Workflows Blog Post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/agent-framework/workflows/orchestrations/handoff" rel="noopener noreferrer"&gt;Handoff Orchestration Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Azure-Samples/multi-agent-orchestration-workshop" rel="noopener noreferrer"&gt;Multi-Agent Orchestration Workshop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;About the Author&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article was researched and written as part of a comprehensive technical blog series exploring the latest developments in .NET and AI agent frameworks.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;LinkedIn Profile: &lt;a href="https://www.linkedin.com/in/vikrant-bagal" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/vikrant-bagal&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Azure Functions vs Durable Functions: 2026 Use Cases and Performance Guide</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Wed, 20 May 2026 21:19:14 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/azure-functions-types-use-cases-differences-28mb</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/azure-functions-types-use-cases-differences-28mb</guid>
      <description>&lt;h2&gt;
  
  
  Azure Functions
&lt;/h2&gt;

&lt;p&gt;Azure Functions offers serverless event-driven computing with multiple hosting plans, while Durable Functions adds stateful orchestration for complex workflows. Choose Consumption for sporadic workloads, Premium for predictable performance, and Durable Functions for multi-step processes requiring reliability and checkpointing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Building distributed systems used to mean wrestling with infrastructure management, scaling policies, and server maintenance. What if you could focus purely on writing business logic while the platform handled everything else? That's the promise of Azure Functions in 2026 — but when should you use a basic function versus its Durable cousin? Understanding the differences can save you from cold start nightmares, budget overruns, and architectural regrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Azure Functions: Core Concepts and Triggers
&lt;/h2&gt;

&lt;p&gt;Azure Functions is Microsoft's serverless compute service that enables you to run code in response to events without managing infrastructure. At its heart, every function requires a &lt;strong&gt;trigger&lt;/strong&gt; — a specific event that initiates execution. Common triggers include HTTP requests for building APIs, timers for scheduled tasks, queue messages for asynchronous processing, and blob storage events for file processing pipelines.&lt;/p&gt;

&lt;p&gt;The real power comes from &lt;strong&gt;bindings&lt;/strong&gt;, which act as declarative connectors to other Azure services. Instead of writing boilerplate code to read from storage queues or send emails, you configure bindings that automatically handle the plumbing. Multiple input and output bindings can be combined in a single function, making it easy to build complex data flows with minimal code.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Use Basic Azure Functions
&lt;/h3&gt;

&lt;p&gt;For straightforward, event-driven tasks that complete quickly, standard Azure Functions are ideal. Consider these common scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File Processing&lt;/strong&gt;: Trigger when images are uploaded to blob storage, automatically generating thumbnails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Endpoints&lt;/strong&gt;: Create RESTful APIs that respond to HTTP requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Queue Processing&lt;/strong&gt;: Handle background tasks like sending emails or processing orders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduled Maintenance&lt;/strong&gt;: Run cleanup scripts on a cron-like schedule&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Data Transformation&lt;/strong&gt;: Modify streaming data before it reaches your database
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HttpExample"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;MultiResponse&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nf"&gt;HttpTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"get"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MultiResponse&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;HttpResponse&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OkObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Success"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;Messages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MultiResponse&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;QueueOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"outqueue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;Messages&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="n"&gt;HttpResponse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Source: Microsoft Azure Functions documentation, basic function patterns&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Durable Functions: Stateful Orchestration for Complex Workflows
&lt;/h2&gt;

&lt;p&gt;When your workflow spans minutes, hours, or even days, basic functions fall short. &lt;strong&gt;Durable Functions&lt;/strong&gt; is an extension that adds stateful coordination to the serverless model, enabling long-running workflows without managing infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Orchestrator Pattern
&lt;/h3&gt;

&lt;p&gt;Durable Functions introduce three key function types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orchestrator Functions&lt;/strong&gt;: Control the flow of execution, deciding which activities run and when&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activity Functions&lt;/strong&gt;: Execute individual, stateless tasks within the workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entity Functions&lt;/strong&gt;: Manage state and enable actor-style programming for distributed objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The magic lies in Durable Functions' ability to &lt;strong&gt;checkpoint&lt;/strong&gt; execution state after each step. If a function fails or the app recycles, the workflow resumes exactly where it left off — no manual state management required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-World Orchestration Use Cases
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Order Processing Pipeline&lt;/strong&gt;: Validate payment → Reserve inventory → Ship product → Send confirmation email&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data ETL Workflows&lt;/strong&gt;: Extract from multiple sources → Transform with business logic → Load to data warehouse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-step Approval Processes&lt;/strong&gt;: Route document through managers → Collect signatures → Archive final version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IoT Data Aggregation&lt;/strong&gt;: Collect sensor readings → Detect anomalies → Generate reports → Alert on critical issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer Onboarding&lt;/strong&gt;: Verify identity → Create accounts → Send welcome series → Schedule training sessions
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderProcessingOrchestrator"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;RunOrchestrator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OrchestrationTrigger&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;IDurableOrchestrationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetInput&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallActivityAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"ValidatePayment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallActivityAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"ReserveInventory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallActivityAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"ShipProduct"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallActivityAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"SendConfirmation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Source: Microsoft Azure Durable Functions documentation, orchestrator patterns&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right Hosting Plan for 2026
&lt;/h2&gt;

&lt;p&gt;Your hosting plan dramatically affects performance, cost, and functionality:&lt;/p&gt;

&lt;h3&gt;
  
  
  Consumption Plan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Sporadic workloads with unpredictable traffic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Pay per execution with automatic scaling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: May experience cold starts (5-10 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limitations&lt;/strong&gt;: Maximum 10-minute execution time per function&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Premium Plan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Production applications requiring consistent performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Pre-warmed instances, VNET integration, faster cold starts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Fixed cost per instance with premium features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Sub-second response times even after inactivity&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dedicated Plan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Enterprise workloads with strict compliance requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Runs in your existing App Service Environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control&lt;/strong&gt;: Full infrastructure control and predictable scaling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Higher base cost but predictable for large-scale deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most new applications starting in 2026, the &lt;strong&gt;Consumption Plan&lt;/strong&gt; remains the recommended entry point due to its cost efficiency and automatic scaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Pitfalls and How to Avoid Them
&lt;/h2&gt;

&lt;p&gt;Even experienced developers encounter challenges with serverless architectures:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cold Start Issues&lt;/strong&gt;: Functions in Consumption Plan may experience latency on first execution. Mitigate this by using Premium Plan for latency-sensitive applications or implementing warm-up triggers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeout Limitations&lt;/strong&gt;: Consumption plan functions timeout after 5 minutes by default (maximum 10 minutes). For longer processes, use Durable Functions with orchestration or switch to Premium/ Dedicated plans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State Management&lt;/strong&gt;: Stateless functions require external storage for state persistence. Durable Functions solve this elegantly by checkpointing workflow state automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost Management&lt;/strong&gt;: Without proper monitoring, serverless functions can lead to unexpected costs. Implement Azure Budgets and monitor execution counts and duration closely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging Complexity&lt;/strong&gt;: Distributed serverless applications are harder to debug. Leverage Azure Application Insights and structured logging from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Production Deployment
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Choose the Right Hosting Plan&lt;/strong&gt;: Match your workload requirements — Consumption for variable traffic, Premium for predictable performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement Comprehensive Error Handling&lt;/strong&gt;: Functions should gracefully handle exceptions, implement retry logic, and provide meaningful error messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep Functions Focused&lt;/strong&gt;: Single responsibility functions are easier to test, debug, and scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage Bindings&lt;/strong&gt;: Use input/output bindings instead of direct SDK clients for better performance and simpler code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor Everything&lt;/strong&gt;: Implement Azure Monitor and Application Insights for full observability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Durable Functions for Complex Workflows&lt;/strong&gt;: Orchestrator functions provide reliability for multi-step processes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Locally&lt;/strong&gt;: Azure Functions Core Tools enable local development and testing before deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement CI/CD&lt;/strong&gt;: Automated deployment ensures consistency across environments and rapid rollback capabilities&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Azure Functions continues to evolve as a powerful platform for event-driven serverless architecture in 2026. Whether you need simple HTTP endpoints or complex multi-day workflows with state management, there's a pattern that fits your needs. Start with basic functions for straightforward tasks, but don't hesitate to leverage Durable Functions when your workflows demand stateful coordination and reliability.&lt;/p&gt;

&lt;p&gt;The key is understanding your specific requirements — traffic patterns, execution duration, state management needs, and cost constraints — before choosing your implementation approach. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Azure Functions challenges have you encountered in your projects? Have you found Durable Functions essential for certain workflows, or do you prefer the simplicity of basic functions? Share your experiences in the comments below.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Connect on LinkedIn: &lt;a href="https://www.linkedin.com/in/vikrant-bagal" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/vikrant-bagal&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttmtuc9cnt8higzszsyc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttmtuc9cnt8higzszsyc.jpg" alt="Infographic" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>csharp</category>
      <category>cloudnative</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Azure Functions: Complete Guide to Types, Use Cases &amp; Differences (2026 Edition)</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Tue, 19 May 2026 13:55:34 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/azure-functions-complete-guide-to-types-use-cases-differences-2026-edition-56c5</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/azure-functions-complete-guide-to-types-use-cases-differences-2026-edition-56c5</guid>
      <description>&lt;p&gt;Microsoft's Azure Functions has evolved significantly since its launch. In 2026, developers have more hosting options than ever, each designed for specific workloads and scaling requirements. This comprehensive guide explores Azure Functions hosting plans, use cases, and how it compares to other serverless platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Azure Functions?
&lt;/h2&gt;

&lt;p&gt;Azure Functions is Microsoft's serverless compute platform that enables developers to run event-driven code without managing infrastructure. You write your function code, deploy it, and Azure handles everything else—scaling, patching, and resource management.&lt;/p&gt;

&lt;p&gt;The core promise remains unchanged: &lt;strong&gt;write code, deploy, and let the platform handle the rest&lt;/strong&gt;. No servers to manage, no capacity planning, and you only pay for actual execution time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosting Plans: Five Options for Every Scenario
&lt;/h2&gt;

&lt;p&gt;Azure Functions offers five hosting options in 2026, each serving different needs and budgets.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Flex Consumption Plan (Recommended - Generally Available)
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Flex Consumption plan&lt;/strong&gt; is the new recommended serverless hosting option that builds on the classic Consumption model while adding enterprise-grade features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Cold Starts&lt;/strong&gt;: Always-ready instances significantly improve startup latency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Network Integration&lt;/strong&gt;: Connect to private resources securely&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-Function Scaling&lt;/strong&gt;: Each function scales independently for efficient resource allocation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Memory Options&lt;/strong&gt;: Choose from 512 MB, 2,048 MB, or 4,096 MB instances&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Files Mounts&lt;/strong&gt;: Mount file shares directly to access large binaries without packaging them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maximum 1,000 Instances&lt;/strong&gt;: Scale up to 1,000 instances (up from 200 in classic Consumption)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to Use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless pay-as-you-go billing with enterprise requirements&lt;/li&gt;
&lt;li&gt;Virtual network connectivity for secure access to Azure resources&lt;/li&gt;
&lt;li&gt;Variable workloads with event-driven scaling needs&lt;/li&gt;
&lt;li&gt;Custom compute memory optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operating System&lt;/strong&gt;: Linux only&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: The classic Consumption plan is being phased out. For new serverless applications, use Flex Consumption instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Premium Plan (Generally Available)
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Premium plan&lt;/strong&gt; provides pre-warmed workers that eliminate cold starts and offer more powerful instances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always-Warm Instances&lt;/strong&gt;: Prewarmed workers run continuously, eliminating cold start latency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More Powerful Compute&lt;/strong&gt;: Access to more CPU and memory than Consumption plans&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Network Support&lt;/strong&gt;: Full VNet connectivity for enterprise scenarios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux Container Support&lt;/strong&gt;: Deploy custom container images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unlimited Execution Duration&lt;/strong&gt;: No maximum timeout (within practical limits)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale&lt;/strong&gt;: 20-100 instances (Linux) or 100 instances (Windows)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to Use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Function apps that run continuously or nearly continuously&lt;/li&gt;
&lt;li&gt;High number of small executions with execution-based billing concerns&lt;/li&gt;
&lt;li&gt;Need more CPU or memory options than Consumption plans&lt;/li&gt;
&lt;li&gt;Code requiring longer execution times&lt;/li&gt;
&lt;li&gt;Virtual network connectivity requirements&lt;/li&gt;
&lt;li&gt;Custom Linux container images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operating System&lt;/strong&gt;: Linux and Windows&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Dedicated Plan (Generally Available)
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Dedicated plan&lt;/strong&gt; runs functions within an App Service plan at regular App Service plan rates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Predictable Billing&lt;/strong&gt;: Fixed monthly costs regardless of execution volume&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual or Autoscale&lt;/strong&gt;: Full control over scaling behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Larger Compute Sizes&lt;/strong&gt;: Access to bigger VM sizes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Service Environment (ASE)&lt;/strong&gt;: Full compute isolation and secure network access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maximum 30 Instances&lt;/strong&gt; (100 with ASE)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to Use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existing underutilized VMs running other App Service instances&lt;/li&gt;
&lt;li&gt;Fully predictable billing requirements&lt;/li&gt;
&lt;li&gt;Running multiple web apps and function apps on the same plan&lt;/li&gt;
&lt;li&gt;Large compute size requirements&lt;/li&gt;
&lt;li&gt;High memory usage and scale scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operating System&lt;/strong&gt;: Linux and Windows&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Container Apps (Generally Available)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Container Apps&lt;/strong&gt; enables deploying containerized function apps in a fully managed environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Container-Only Deployment&lt;/strong&gt;: Full control of container images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microservices Integration&lt;/strong&gt;: Run alongside other microservices, APIs, and websites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Libraries&lt;/strong&gt;: Package custom libraries with your function code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU Compute&lt;/strong&gt;: Access to GPU resources for intensive workloads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maximum 300-1,000 Instances&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to Use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full control over container images&lt;/li&gt;
&lt;li&gt;Migrating from on-premises or legacy applications&lt;/li&gt;
&lt;li&gt;Avoiding Kubernetes cluster complexity&lt;/li&gt;
&lt;li&gt;High-end processing with GPU requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Operating System&lt;/strong&gt;: Linux only (container-only)&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Consumption Plan (Legacy - Being Retired)
&lt;/h3&gt;

&lt;p&gt;The original &lt;strong&gt;Consumption plan&lt;/strong&gt; offers pay-as-you-go billing with automatic scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Linux Consumption retiring September 30, 2028&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;v3 runtime on Linux stops running after September 30, 2026&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maximum 200 instances&lt;/strong&gt; (Windows) or &lt;strong&gt;100 instances&lt;/strong&gt; (Linux)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: Migrate to Flex Consumption plan for new serverless applications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Operating System&lt;/strong&gt;: Windows (legacy) / Linux (retiring)&lt;/p&gt;




&lt;h2&gt;
  
  
  .NET Execution Models
&lt;/h2&gt;

&lt;p&gt;Azure Functions for .NET supports two execution models, with important differences in 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  In-Process Model (Ending Support)
&lt;/h3&gt;

&lt;p&gt;The in-process model runs function code in the same process as the Functions host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Support ends &lt;strong&gt;November 10, 2026&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only supports .NET 8 for runtime v4.x&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;Microsoft.NET.Sdk.Functions&lt;/code&gt; package&lt;/li&gt;
&lt;li&gt;Simpler model but limited to LTS .NET versions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Isolated Worker Model (Recommended)
&lt;/h3&gt;

&lt;p&gt;The isolated worker model runs function code in a separate .NET worker process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports .NET 8, 9, 10, and .NET Framework 4.8&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;Microsoft.Azure.Functions.Worker&lt;/code&gt; and &lt;code&gt;Microsoft.Azure.Functions.Worker.Sdk&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Middleware support&lt;/li&gt;
&lt;li&gt;Improved dependency injection&lt;/li&gt;
&lt;li&gt;Supports .NET Aspire (Preview)&lt;/li&gt;
&lt;li&gt;Required for Flex Consumption plan&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Migration Required&lt;/strong&gt;: All .NET applications should migrate from in-process to isolated worker model before November 10, 2026.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Runtime Versions
&lt;/h2&gt;

&lt;p&gt;Azure Functions currently supports two runtime versions:&lt;/p&gt;

&lt;h3&gt;
  
  
  Version 4.x (Recommended)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;General Availability (GA)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Recommended for all languages and scenarios&lt;/li&gt;
&lt;li&gt;Supports latest language versions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Version 1.x (Ending Support)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Support ends September 14, 2026&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Only for C# apps using .NET Framework 4.8&lt;/li&gt;
&lt;li&gt;Maintenance mode only&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Retired Versions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Version 2.x and 3.x are out of support&lt;/li&gt;
&lt;li&gt;Linux v3 apps in Consumption plan stop running: &lt;strong&gt;September 30, 2026&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Concepts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cold Start&lt;/strong&gt;: The latency when a function hasn't been invoked recently and the platform needs to spin up a new execution environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always-Ready Instances&lt;/strong&gt;: Configured instances that are always running to reduce cold start latency (available in Flex Consumption and Premium plans).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-Function Scaling&lt;/strong&gt;: Flex Consumption feature where each function scales independently based on its workload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execution Time&lt;/strong&gt;: The amount of time your function code is actively running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GB-Seconds&lt;/strong&gt;: Billing unit representing memory (GB) multiplied by execution time (seconds).&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. File Upload Processing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Validate, transform, and process files uploaded to blob storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: A retail solution where partners submit product catalog files. A blob-triggered function automatically validates, transforms, and processes the files into the main system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Triggers&lt;/strong&gt;: Blob Storage trigger (Event Grid based)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ProcessCatalogData"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;BlobTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"catalog-uploads/{name}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Source&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BlobTriggerSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EventGrid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"StorageConnection"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;myCatalogData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Processing blob: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Size: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;myCatalogData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; Bytes"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;StreamReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myCatalogData&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;catalogEntry&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLineAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;catalogEntry&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Process catalog entry&lt;/span&gt;
            &lt;span class="n"&gt;catalogEntry&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLineAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Real-Time Stream Processing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Process data from cloud applications, IoT devices, or networking devices in near real-time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: Hot path processing of event streams with output to Cosmos DB for analytics dashboards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Triggers&lt;/strong&gt;: Event Hubs, Kafka, Event Grid&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ProcessorFunction"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;EventHubTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%Input_EH_Name%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"InputEventHubConnectionSetting"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;ConsumerGroup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"%Input_EH_ConsumerGroup%"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;EventData&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;inputMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;EventHub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%Output_EH_Name%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"OutputEventHubConnectionSetting"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
     &lt;span class="n"&gt;IAsyncCollector&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SensorDataRecord&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;outputMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;PartitionContext&lt;/span&gt; &lt;span class="n"&gt;partitionContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;debatcher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Debatcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;debatchedMessages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;debatcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Debatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;partitionContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PartitionId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;xformer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Transformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;xformer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debatchedMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;partitionContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PartitionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outputMessages&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Machine Learning and AI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Build intelligent applications with AI integration using Azure OpenAI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure OpenAI binding extension&lt;/li&gt;
&lt;li&gt;Retrieval-Augmented Generation (RAG)&lt;/li&gt;
&lt;li&gt;Model deployment&lt;/li&gt;
&lt;li&gt;Custom MCP servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: Image classification with TensorFlow or PyTorch models, text summarization using AI Cognitive Language Service, or semantic search integration.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Web APIs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Build event-driven web APIs that react to critical events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Triggers&lt;/strong&gt;: HTTP trigger&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: RESTful APIs with database integration, database changes, or event streams.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Database Changes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: React to changes in Cosmos DB or other databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Triggers&lt;/strong&gt;: Cosmos DB trigger&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: Real-time data synchronization and change feed processing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Azure Functions vs AWS Lambda vs Google Cloud Functions (2026 Comparison)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Runtime Support
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;AWS Lambda&lt;/th&gt;
&lt;th&gt;Azure Functions&lt;/th&gt;
&lt;th&gt;Google Cloud Functions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Languages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Node.js, Python, Java, Go, Ruby, .NET, Custom&lt;/td&gt;
&lt;td&gt;Node.js, Python, Java, C#, PowerShell, TypeScript, Custom&lt;/td&gt;
&lt;td&gt;Node.js, Python, Go, Java, Ruby, PHP, .NET&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Runtimes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lambda Layers&lt;/td&gt;
&lt;td&gt;Custom Handlers&lt;/td&gt;
&lt;td&gt;Limited support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max Timeout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15 minutes&lt;/td&gt;
&lt;td&gt;Unlimited (Premium)&lt;/td&gt;
&lt;td&gt;60 minutes (2nd gen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Max Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10,240 MB&lt;/td&gt;
&lt;td&gt;14 GB (Premium)&lt;/td&gt;
&lt;td&gt;32 GB (2nd gen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;250 MB (unzipped)&lt;/td&gt;
&lt;td&gt;1.5 GB&lt;/td&gt;
&lt;td&gt;500 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Cold Start Performance (2026)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js: 200-400ms cold starts&lt;/li&gt;
&lt;li&gt;Java: 2-3 seconds (improved with SnapStart)&lt;/li&gt;
&lt;li&gt;Provisioned Concurrency available (expensive)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consumption plan: Similar to AWS&lt;/li&gt;
&lt;li&gt;Premium plan: Pre-warmed instances eliminate cold starts&lt;/li&gt;
&lt;li&gt;Flex Consumption: Reduced cold starts with always-ready instances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Google Cloud Functions 2nd Gen&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built on Cloud Run&lt;/li&gt;
&lt;li&gt;Python/Node.js: Under 200ms cold starts&lt;/li&gt;
&lt;li&gt;Minimum instances feature keeps functions warm&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment Models
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt;: Deploys all functions in Lambda environment on Amazon Linux servers. Function deployment limited to Lambda service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt;: More flexible - deploy code directly or run inside Docker containers. Can deploy to Windows or Linux servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Cloud Functions&lt;/strong&gt;: Functions stored in Google Container Registry and executed as containers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observability
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS CloudWatch&lt;/strong&gt;: Basic monitoring, X-Ray for tracing, often requires third-party tools&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Monitor + Application Insights&lt;/strong&gt;: Superior out-of-the-box observability with automatic instrumentation and KQL query language&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Cloud Operations Suite&lt;/strong&gt;: Excellent monitoring with Cloud Trace and Profiler&lt;/p&gt;

&lt;h3&gt;
  
  
  VPC/Networking
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt;: VPC integration improved, minimal cold start penalty, VPC endpoints available&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt;: VNet integration only in Premium and Container Apps plans (not in Consumption)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Cloud Functions&lt;/strong&gt;: VPC connectors available, straightforward setup but adds cost&lt;/p&gt;




&lt;h2&gt;
  
  
  Decision Guide: Which Plan Should You Choose?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Choose Flex Consumption If:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're starting a new serverless application&lt;/li&gt;
&lt;li&gt;You need virtual network connectivity&lt;/li&gt;
&lt;li&gt;You want reduced cold starts with always-ready instances&lt;/li&gt;
&lt;li&gt;You need per-function scaling&lt;/li&gt;
&lt;li&gt;You're building on Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose Premium Plan If:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your function apps run continuously or nearly continuously&lt;/li&gt;
&lt;li&gt;You need more CPU/memory options than Consumption plans&lt;/li&gt;
&lt;li&gt;You require unlimited execution duration&lt;/li&gt;
&lt;li&gt;You need VNet connectivity&lt;/li&gt;
&lt;li&gt;You want custom Linux containers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose Dedicated Plan If:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You have existing underutilized VMs&lt;/li&gt;
&lt;li&gt;You need fully predictable billing&lt;/li&gt;
&lt;li&gt;You want to run multiple web apps on the same plan&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose Container Apps If:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need full control over container images&lt;/li&gt;
&lt;li&gt;You're migrating from on-premises applications&lt;/li&gt;
&lt;li&gt;You need GPU compute resources&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose AWS Lambda If:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're already invested in AWS ecosystem&lt;/li&gt;
&lt;li&gt;You need the broadest range of event sources&lt;/li&gt;
&lt;li&gt;You need the most mature serverless platform&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose Google Cloud Functions If:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You value simplicity&lt;/li&gt;
&lt;li&gt;You want excellent cold start performance&lt;/li&gt;
&lt;li&gt;You're building on Google Cloud Platform&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Migration Strategies
&lt;/h2&gt;

&lt;p&gt;When switching between platforms or plans:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Abstract business logic&lt;/strong&gt; from platform-specific code using the adapter pattern&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep functions small and focused&lt;/strong&gt; for easier migration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use environment variables&lt;/strong&gt; for configuration rather than platform-specific features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider Serverless Framework&lt;/strong&gt; for multi-cloud deployments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test under realistic load&lt;/strong&gt; before migrating production traffic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use feature flags&lt;/strong&gt; for gradual traffic shift with quick rollback capability&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Important Dates to Remember (2026)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;September 14, 2026&lt;/strong&gt;: Azure Functions v1.x runtime support ends&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;September 30, 2026&lt;/strong&gt;: v3 runtime on Linux Consumption stops running&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;November 10, 2026&lt;/strong&gt;: In-process model support ends&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;September 30, 2028&lt;/strong&gt;: Linux Consumption plan retires&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Azure Functions in 2026 offers mature, flexible serverless computing with multiple hosting options for every scenario. The new &lt;strong&gt;Flex Consumption plan&lt;/strong&gt; represents the future of serverless on Azure, combining pay-as-you-go economics with enterprise features like VNet integration and per-function scaling.&lt;/p&gt;

&lt;p&gt;When choosing between Azure Functions, AWS Lambda, and Google Cloud Functions, consider your existing cloud ecosystem, specific feature requirements, and team expertise. Azure Functions excels for .NET developers, observability, and scenarios requiring unlimited execution duration on Premium plans.&lt;/p&gt;

&lt;p&gt;The key to successful serverless adoption is starting small, understanding pricing models, and continuously monitoring performance and costs.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Useful Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/azure-functions/" rel="noopener noreferrer"&gt;Microsoft Learn - Azure Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Azure-Samples/azure-functions-flex-consumption-samples" rel="noopener noreferrer"&gt;Flex Consumption Samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/pricing/details/functions/" rel="noopener noreferrer"&gt;Azure Functions Pricing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This guide was researched and written in May 2026 using the latest Microsoft documentation and serverless platform comparisons.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>azure</category>
      <category>cloud</category>
      <category>ai</category>
    </item>
    <item>
      <title>How to structure your project folder to use, Coding Agents like Claud code, open code more efficiently</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Fri, 15 May 2026 22:57:57 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/how-to-structure-your-project-folder-to-use-coding-agents-like-claud-code-open-code-more-4egg</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/how-to-structure-your-project-folder-to-use-coding-agents-like-claud-code-open-code-more-4egg</guid>
      <description>&lt;h2&gt;
  
  
  How I Structure Project Folders So Coding Agents Actually Work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The difference between an agent that feels like a senior teammate and one that hallucinates broken imports comes down to four things: an &lt;code&gt;AGENTS.md&lt;/code&gt; file, progressive disclosure of context, feature-localized folder structure, and agent-specific config folders. Skip these and you'll burn tokens on re-explaining your stack every session. Adopt them and you'll cut rephrasing by 25% and framework errors by 90%.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Six months ago, I watched a demo where someone told Claude Code to "add a user profile page" and it built the route, the component, the database migration, and the tests in one shot without being told the tech stack. I tried the same thing on my project and got back a file written in Vue when I use React, a database query against a table that doesn't exist, and a test framework I don't have installed. The difference wasn't the tool—it was the project structure.&lt;/p&gt;

&lt;p&gt;Coding agents are only as good as the context you give them. And the most efficient way to give them context isn't to type it out each session—it's to bake it into your folder layout. Here's exactly how I do it.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsim4t10kn63561ajqa4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsim4t10kn63561ajqa4.png" alt="Structure Project Folders So Coding Agents Actually Work" width="800" height="744"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Start with an Agent Instruction File (&lt;code&gt;AGENTS.md&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Every agent needs a persistent memory file at the project root. For OpenCode it's &lt;code&gt;AGENTS.md&lt;/code&gt;; for Claude Code it's &lt;code&gt;CLAUDE.md&lt;/code&gt;. This file is read automatically at session start, telling the agent your tech stack, folder conventions, build commands, and rules—so you never have to repeat yourself.&lt;/p&gt;

&lt;p&gt;Here's the structure I use, adapted from the &lt;a href="https://code.claude.com/docs/en/best-practices" rel="noopener noreferrer"&gt;official Claude Code best practices&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project conventions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Language: TypeScript strict
&lt;span class="p"&gt;-&lt;/span&gt; Framework: Next.js 15 App Router
&lt;span class="p"&gt;-&lt;/span&gt; Tests: Vitest + Testing Library
&lt;span class="p"&gt;-&lt;/span&gt; Style: Prettier + ESLint flat config

&lt;span class="gh"&gt;# Code rules&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; No TypeScript &lt;span class="sb"&gt;`any`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Functional components only
&lt;span class="p"&gt;-&lt;/span&gt; File names in kebab-case

&lt;span class="gh"&gt;# Commands&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Build: &lt;span class="sb"&gt;`npm run build`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Dev: &lt;span class="sb"&gt;`npm run dev`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Test single: &lt;span class="sb"&gt;`npx vitest run --reporter=verbose`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Lint: &lt;span class="sb"&gt;`npm run lint`&lt;/span&gt;

&lt;span class="gh"&gt;# Architecture&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Components in &lt;span class="sb"&gt;`src/components/`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; API routes in &lt;span class="sb"&gt;`src/app/api/`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Database schema in &lt;span class="sb"&gt;`prisma/schema.prisma`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Shared utils in &lt;span class="sb"&gt;`src/lib/`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The impact is measurable.&lt;/strong&gt; According to the SFEIR Institute, a well-structured instruction file reduces time spent rephrasing by 25%, eliminates 90% of framework-related errors, and improves code style consistency by 70%. Those aren't marketing numbers—they're from teams that measured before and after.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Watch the 200-line ceiling.&lt;/strong&gt; If your &lt;code&gt;AGENTS.md&lt;/code&gt; exceeds 200 lines, split it into imported files. Otherwise you're eating into the agent's context window before it even starts working.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Use Progressive Disclosure to Avoid Context Bloat
&lt;/h2&gt;

&lt;p&gt;The biggest mistake I see is dumping everything into a single instruction file. Agents have a limited context window, and past 40% capacity, output quality degrades considerably—I've seen this called the "40% Rule" in practice.&lt;/p&gt;

&lt;p&gt;Instead, structure your context in layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/strong&gt; — lightweight, points to more detailed files&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project conventions&lt;/span&gt;
[tech stack, rules, commands — keep under 100 lines]

&lt;span class="gh"&gt;# Detailed references (load on demand)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; API patterns: &lt;span class="sb"&gt;`docs/guides/api-patterns.md`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Database conventions: &lt;span class="sb"&gt;`docs/guides/db-conventions.md`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Component standards: &lt;span class="sb"&gt;`docs/guides/components.md`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the agent needs to implement a feature, it reads the pointer file, then fetches only the relevant deep reference. The rest stays out of the context window.&lt;/p&gt;

&lt;p&gt;One developer I know (Mike Bayly) had a vault-level instruction file that consumed 2,000 tokens every session—even when editing a single file. Restructuring with progressive disclosure eliminated that waste entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Layout Code by Feature, Not by Layer
&lt;/h2&gt;

&lt;p&gt;This is the structural change with the highest payoff. Instead of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
  controllers/
  services/
  models/
  routes/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use vertical slices:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;features/
  users/
    users.controller.ts
    users.service.ts
    users.model.ts
    users.routes.ts
  billing/
    billing.controller.ts
    billing.service.ts
    billing.model.ts
    billing.routes.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters for agents:&lt;/strong&gt; When you ask an agent to "add a payment method to billing," it needs to read the billing slice. If you use layer-based structure, the agent has to read &lt;code&gt;controllers/billing.ts&lt;/code&gt;, &lt;code&gt;services/billing.ts&lt;/code&gt;, &lt;code&gt;models/billing.ts&lt;/code&gt;, and &lt;code&gt;routes/billing.ts&lt;/code&gt; from three directories away. With vertical slices, everything lives in one folder. That's fewer file reads per task, which means less token consumption and faster completions.&lt;/p&gt;

&lt;p&gt;Tim Deschryver rewrote an entire ASP.NET API + Angular frontend using this approach with AI agents. He explicitly credits the pre-defined folder structure (Vertical Slice Architecture) as critical to success. Sid Saladi, who reviewed dozens of Claude Code projects, calls messy folder structure the top reason agents behave like "confused interns."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Don't take this advice halfway.&lt;/strong&gt; A hybrid structure (some features grouped, others layered) confuses agents more than a consistent layered layout. Pick one pattern and enforce it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Create Agent-Specific Configuration Folders
&lt;/h2&gt;

&lt;p&gt;Your main source code shouldn't be cluttered with agent configuration. Use hidden directories at the project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.claude/
  commands/
  skills/
  agents/
  rules/
  output-styles/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or for OpenCode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.opencode/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for Cursor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.cursor/
  rules/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These folders keep agent configuration version-controlled and shareable across the team, separate from source code. I keep reusable skills there—security review prompts, SEO analysis workflows, component audit templates—that I can invoke by name during a session.&lt;/p&gt;

&lt;p&gt;Ran Isenberg, an AWS Serverless Hero, rebuilt his entire consulting brand website using Claude Code and structured his project this way. He found that MCP servers could be replaced entirely by well-written &lt;code&gt;.md&lt;/code&gt; skill files in &lt;code&gt;.claude/skills/&lt;/code&gt;—more transparent and easier to audit.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Run &lt;code&gt;/init&lt;/code&gt; to Bootstrap, Then Refine
&lt;/h2&gt;

&lt;p&gt;Both Claude Code and OpenCode ship a &lt;code&gt;/init&lt;/code&gt; command that scans your project's &lt;code&gt;package.json&lt;/code&gt;, folder structure, lint configs, test frameworks, and git history, then auto-generates a starter &lt;code&gt;AGENTS.md&lt;/code&gt; or &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Start every new project with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then refine the output. Delete what's irrelevant. Add your specific rules. Split long files as described above. The command gives you a 70% complete first draft, and you finish the last 30% by hand.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Proven Template
&lt;/h2&gt;

&lt;p&gt;After reviewing dozens of agent-friendly projects (including Anthropic's internal engineering teams and the community skills ecosystem), here's the layout I now reach for on every new project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project-root/
  AGENTS.md              # &amp;lt; 200 lines, lightweight pointer
  src/
    features/            # vertical slices
      users/
      billing/
      notifications/
  docs/
    guides/              # deep reference files for agents
  .claude/
    skills/              # reusable skill files
    commands/
  .cursor/
    rules/               # scoped rule files for Cursor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Over 160,000 repositories now contain a &lt;code&gt;CLAUDE.md&lt;/code&gt; file and over 25,000 contain &lt;code&gt;.cursorrules&lt;/code&gt; as of mid-2025. The ecosystem is converging on this pattern because it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Try Next
&lt;/h2&gt;

&lt;p&gt;Stop treating your agent like a search engine that you describe your codebase to each session. Instead, treat your project structure as the permanent briefing document. Spend one hour setting up &lt;code&gt;AGENTS.md&lt;/code&gt;, vertical slices, and &lt;code&gt;.claude/&lt;/code&gt; folders. Then measure how many fewer iterations you need to complete a task.&lt;/p&gt;

&lt;p&gt;If you've already tried this, I want to know: &lt;strong&gt;what rule in your &lt;code&gt;AGENTS.md&lt;/code&gt; saved you the most time?&lt;/strong&gt; Drop it in the comments—I'm always looking for new patterns to steal.&lt;/p&gt;




&lt;p&gt;Connect on LinkedIn: &lt;a href="https://www.linkedin.com/in/vikrant-bagal" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/vikrant-bagal&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8x9rvvfyino6xhb9k32o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8x9rvvfyino6xhb9k32o.png" alt="Infographic" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>MCP (Model Context Protocol) for .NET Devs — What It Is and Why You'll Be Using It Soon</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Fri, 15 May 2026 19:02:52 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/mcp-model-context-protocol-for-net-devs-what-it-is-and-why-youll-be-using-it-soon-a98</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/mcp-model-context-protocol-for-net-devs-what-it-is-and-why-youll-be-using-it-soon-a98</guid>
      <description>&lt;p&gt;Every major AI tool is adopting MCP. If you build .NET APIs, this is the integration pattern coming your way.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is MCP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; is an open-standard protocol designed to standardize integrations between AI applications and external tools and data sources. Think of it as the universal language that allows AI assistants to safely and securely connect to your .NET applications, databases, and APIs.&lt;/p&gt;

&lt;p&gt;Originally developed by Anthropic in partnership with Microsoft, MCP provides a structured way for AI systems to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discover capabilities&lt;/strong&gt; across different systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute actions&lt;/strong&gt; through external tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exchange structured context&lt;/strong&gt; without custom integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The protocol is built on JSON-RPC 2.0, ensuring interoperability across platforms and tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why MCP Matters for .NET Developers
&lt;/h2&gt;

&lt;p&gt;If you're building APIs, microservices, or AI-powered applications with .NET, MCP is becoming the de facto standard for AI-tool communication. Here's why:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Microsoft's Full Backing
&lt;/h3&gt;

&lt;p&gt;Microsoft is actively supporting MCP across its ecosystem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copilot Studio&lt;/strong&gt; now supports MCP integrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Studio Code&lt;/strong&gt; with GitHub Copilot agent mode uses MCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Framework&lt;/strong&gt; integrates with MCP servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Functions&lt;/strong&gt; supports remote MCP servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means your .NET applications can now communicate with AI agents in a standardized way.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Standardized AI Communication
&lt;/h3&gt;

&lt;p&gt;Before MCP, every AI tool required custom integration code. MCP eliminates this by providing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unified protocol&lt;/strong&gt; for all AI tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security-first design&lt;/strong&gt; with explicit user consent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composable architecture&lt;/strong&gt; allowing multiple servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive enhancement&lt;/strong&gt; for adding new features&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Production-Ready .NET SDK
&lt;/h3&gt;

&lt;p&gt;The official MCP C# SDK is available through NuGet and maintained by Microsoft in collaboration with Anthropic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package ModelContextProtocol &lt;span class="nt"&gt;--prerelease&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you everything you need to create MCP clients and servers in .NET.&lt;/p&gt;




&lt;h2&gt;
  
  
  The MCP Architecture
&lt;/h2&gt;

&lt;p&gt;MCP follows a client-host-server architecture that's familiar to .NET developers:&lt;/p&gt;

&lt;h3&gt;
  
  
  Host
&lt;/h3&gt;

&lt;p&gt;The host is your AI application (like GitHub Copilot in VS Code). It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates and manages client instances&lt;/li&gt;
&lt;li&gt;Handles security policies and user consent&lt;/li&gt;
&lt;li&gt;Coordinates AI integration and sampling&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Client
&lt;/h3&gt;

&lt;p&gt;The client connects to MCP servers. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Establishes stateful sessions per server&lt;/li&gt;
&lt;li&gt;Handles protocol negotiation&lt;/li&gt;
&lt;li&gt;Routes messages between host and server&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Server
&lt;/h3&gt;

&lt;p&gt;The server exposes your .NET application's capabilities. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provides tools, resources, and prompts&lt;/li&gt;
&lt;li&gt;Operates independently with focused responsibilities&lt;/li&gt;
&lt;li&gt;Can be local processes or remote services&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Building Your First MCP Server in .NET
&lt;/h2&gt;

&lt;p&gt;Creating an MCP server is surprisingly straightforward. Here's a basic stdio-based server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.DependencyInjection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.Hosting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.Logging&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;ModelContextProtocol.Server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.ComponentModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateApplicationBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddConsole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consoleLogOptions&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;consoleLogOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LogToStandardErrorThreshold&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LogLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Trace&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddMcpServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithStdioServerTransport&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithToolsFromAssembly&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;McpServerToolType&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EchoTool&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;McpServerTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Echoes the message back to the client."&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;Echo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$"Hello from C#: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What's happening here?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Host.CreateApplicationBuilder&lt;/strong&gt; - Sets up dependency injection and hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AddMcpServer()&lt;/strong&gt; - Registers the MCP server with DI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WithStdioServerTransport()&lt;/strong&gt; - Configures stdio communication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WithToolsFromAssembly()&lt;/strong&gt; - Auto-discovers tools marked with attributes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;McpServerToolType&lt;/strong&gt; - Marks a class as containing MCP tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;McpServerTool&lt;/strong&gt; - Marks a method as an MCP-accessible tool&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;code&gt;Description&lt;/code&gt; attribute becomes part of the tool's metadata, helping AI models understand what each tool does.&lt;/p&gt;




&lt;h2&gt;
  
  
  Exposing Your .NET APIs with MCP
&lt;/h2&gt;

&lt;p&gt;Let's say you have a Monkey API (because everyone needs one 🐒). Here's how to expose it via MCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MonkeyService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;HttpClient&lt;/span&gt; &lt;span class="n"&gt;httpClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MonkeyService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IHttpClientFactory&lt;/span&gt; &lt;span class="n"&gt;httpClientFactory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;httpClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;httpClientFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Monkey&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetMonkeys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;httpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://api.example.com/monkeys"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// ... process and return monkeys&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Monkey&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetMonkey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;monkeys&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;GetMonkeys&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;monkeys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;McpServerToolType&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MonkeyTools&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;McpServerTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Get a list of all monkeys."&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetMonkeys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MonkeyService&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;monkeys&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetMonkeys&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;monkeys&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;McpServerTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Get details for a specific monkey."&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetMonkey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MonkeyService&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The name of the monkey"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;monkey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetMonkey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;monkey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now AI assistants can query your monkey database through a standardized interface!&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP Transport for ASP.NET Core
&lt;/h2&gt;

&lt;p&gt;For web APIs, you can use HTTP transport:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddMcpServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithHttpTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stateless&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithToolsFromAssembly&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapMcp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:3001"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is perfect for exposing your existing ASP.NET Core APIs to AI tools without major refactoring.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Integrations
&lt;/h2&gt;

&lt;p&gt;The MCP ecosystem already includes servers for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt; - Version control operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; - Repository management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright&lt;/strong&gt; - Browser automation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filesystem&lt;/strong&gt; - Local file operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databases&lt;/strong&gt; - SQL/NoSQL queries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Services&lt;/strong&gt; - Storage, Cosmos DB, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also build custom MCP servers for your specific APIs, databases, or internal systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;p&gt;MCP is designed with security first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Explicit User Consent&lt;/strong&gt; - Every tool invocation requires user approval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Privacy&lt;/strong&gt; - Resources only share what's explicitly permitted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Safety&lt;/strong&gt; - Arbitrary code execution with proper safeguards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sampling Controls&lt;/strong&gt; - Users control LLM interaction parameters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a .NET developer, you should:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Always implement proper authorization&lt;/li&gt;
&lt;li&gt;Use least-privilege access for resources&lt;/li&gt;
&lt;li&gt;Log and audit all tool invocations&lt;/li&gt;
&lt;li&gt;Follow security best practices for your specific domain&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Deployment Options
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Local Development
&lt;/h3&gt;

&lt;p&gt;Use stdio transport for local processes or ASP.NET Core HTTP servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Azure Container Apps&lt;/strong&gt; - Managed container hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Functions&lt;/strong&gt; - Serverless MCP servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; - Multi-arch container images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Publishing a containerized MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;EnableSdkContainerSupport&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/EnableSdkContainerSupport&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ContainerRepository&amp;gt;&lt;/span&gt;myorg/mcp-server&lt;span class="nt"&gt;&amp;lt;/ContainerRepository&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ContainerFamily&amp;gt;&lt;/span&gt;alpine&lt;span class="nt"&gt;&amp;lt;/ContainerFamily&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;RuntimeIdentifiers&amp;gt;&lt;/span&gt;linux-x64;linux-arm64&lt;span class="nt"&gt;&amp;lt;/RuntimeIdentifiers&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then deploy with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet publish /t:PublishContainer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Future Is Here
&lt;/h2&gt;

&lt;p&gt;MCP isn't just another API standard—it's becoming the &lt;strong&gt;universal protocol for AI-tool communication&lt;/strong&gt;. Every major AI platform is adopting it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;Claude&lt;/li&gt;
&lt;li&gt;Cursor&lt;/li&gt;
&lt;li&gt;Windsurf&lt;/li&gt;
&lt;li&gt;And many more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a .NET developer, learning MCP now positions you perfectly for the AI-integrated future. Whether you're building APIs, microservices, or AI-powered applications, MCP provides the standard interface that makes your .NET code accessible to AI agents.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install the SDK&lt;/strong&gt;: &lt;code&gt;dotnet add package ModelContextProtocol --prerelease&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the docs&lt;/strong&gt;: &lt;a href="https://learn.microsoft.com/en-us/dotnet/ai/get-started-mcp" rel="noopener noreferrer"&gt;Microsoft Learn - Get started with .NET AI and MCP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore examples&lt;/strong&gt;: &lt;a href="https://github.com/modelcontextprotocol/csharp-sdk/tree/main/samples" rel="noopener noreferrer"&gt;MCP C# SDK samples&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build your first server&lt;/strong&gt;: Start with a simple echo tool and expand from there&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MCP revolution is happening now. Are you ready to join it?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Connect with me on LinkedIn&lt;/strong&gt;: &lt;a href="https://www.linkedin.com/in/vikrant-bagal" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/vikrant-bagal&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>ai</category>
      <category>csharp</category>
      <category>api</category>
    </item>
    <item>
      <title>.NET Design Patterns Deep Dive: What Still Matters in 2026</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Thu, 14 May 2026 15:44:02 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/net-design-patterns-deep-dive-what-still-matters-in-2026-1g52</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/net-design-patterns-deep-dive-what-still-matters-in-2026-1g52</guid>
      <description>&lt;p&gt;Design patterns have been a cornerstone of object-oriented software development for decades. Yet, with the evolution of .NET — from .NET Framework to .NET 10, C# 14, and the rise of cloud-native architectures — the relevance of each pattern has shifted dramatically. This deep dive explores which design patterns remain essential in modern .NET development, which have become anti-patterns, and how to apply them effectively for performance, maintainability, and scalability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Design Patterns Still Matter
&lt;/h2&gt;

&lt;p&gt;In 2026, the .NET ecosystem is richer than ever. From high‑performance services to AI‑driven applications, the underlying principles of good software design remain constant: separation of concerns, testability, and adaptability. Design patterns provide a shared vocabulary and proven solutions to recurring problems. However, blindly applying “textbook” patterns can lead to over‑engineered, rigid systems. As the industry has matured, we now recognize that &lt;strong&gt;context is king&lt;/strong&gt; — the right pattern depends on the problem, the scale, and the team’s expertise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Pillars of Design Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Creational Patterns
&lt;/h3&gt;

&lt;p&gt;These patterns control object creation, aiming to increase flexibility and reduce coupling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Singleton&lt;/strong&gt; – Ensures a single instance exists globally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Factory Method&lt;/strong&gt; – Delegates instantiation to subclasses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abstract Factory&lt;/strong&gt; – Creates families of related objects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builder&lt;/strong&gt; – Separates construction from representation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototype&lt;/strong&gt; – Creates objects by cloning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Structural Patterns
&lt;/h3&gt;

&lt;p&gt;These patterns define how objects are composed to form larger structures.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Adapter&lt;/strong&gt; – Bridges incompatible interfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decorator&lt;/strong&gt; – Adds responsibilities dynamically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facade&lt;/strong&gt; – Simplifies complex subsystems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy&lt;/strong&gt; – Controls access to another object.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composite&lt;/strong&gt; – Treats individual and composite objects uniformly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Behavioral Patterns
&lt;/h3&gt;

&lt;p&gt;These patterns manage communication and responsibility between objects.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strategy&lt;/strong&gt; – Encapsulates interchangeable algorithms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observer&lt;/strong&gt; – Notifies dependents of state changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command&lt;/strong&gt; – Encapsulates requests as objects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State&lt;/strong&gt; – Alters behavior when internal state changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chain of Responsibility&lt;/strong&gt; – Passes requests along a chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Patterns That Matter in 2026
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Singleton: Still Useful, But Use Sparingly
&lt;/h3&gt;

&lt;p&gt;The Singleton pattern is still relevant for resources that truly require a single instance (e.g., logging, configuration). However, modern .NET encourages dependency injection (DI) as the default mechanism for managing lifetimes. Overusing Singleton can break testability and introduce hidden dependencies. &lt;strong&gt;Best practice&lt;/strong&gt;: Use DI containers (like &lt;code&gt;Microsoft.Extensions.DependencyInjection&lt;/code&gt;) to register services as singletons when appropriate, rather than implementing a manual Singleton.&lt;/p&gt;

&lt;h3&gt;
  
  
  Factory Method &amp;amp; Abstract Factory: Essential for Extensibility
&lt;/h3&gt;

&lt;p&gt;With plug‑in architectures and runtime polymorphism, Factory patterns remain vital. In .NET, they’re often implemented via interfaces and DI. For example, a payment gateway factory can switch between Stripe, PayPal, or a mock implementation based on configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IPaymentProcessor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PaymentResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ProcessAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StripeProcessor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPaymentProcessor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PayPalProcessor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPaymentProcessor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentProcessorFactory&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IServiceProvider&lt;/span&gt; &lt;span class="n"&gt;_serviceProvider&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IPaymentProcessor&lt;/span&gt; &lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; 
        &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;"Stripe"&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_serviceProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;StripeProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(),&lt;/span&gt;
            &lt;span class="s"&gt;"PayPal"&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_serviceProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PayPalProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unknown provider"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Builder: Fluent APIs and Immutable Objects
&lt;/h3&gt;

&lt;p&gt;The Builder pattern shines when constructing complex objects, especially immutable ones. Modern C# records and init‑only properties pair perfectly with builders. Entity Framework Core’s &lt;code&gt;DbContextOptionsBuilder&lt;/code&gt; is a prime example.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repository &amp;amp; Unit of Work: Overused, Still Valuable
&lt;/h3&gt;

&lt;p&gt;The Repository pattern (abstracting data access) and Unit of Work (transaction management) are ubiquitous in .NET applications. However, they are often misapplied — adding business logic inside repositories violates separation of concerns. Use repositories only as a data‑access abstraction; keep business rules in the domain layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy: Dynamic Behavior at Runtime
&lt;/h3&gt;

&lt;p&gt;Strategy is one of the most powerful patterns for modern applications. It eliminates long &lt;code&gt;if‑else&lt;/code&gt; chains and enables runtime behavior changes. Discount calculations, caching strategies, and serialization formats are classic use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observer: Event‑Driven Architectures
&lt;/h3&gt;

&lt;p&gt;With the rise of event‑driven systems, the Observer pattern is more relevant than ever. .NET events, &lt;code&gt;IObservable&amp;lt;T&amp;gt;&lt;/code&gt;, and message brokers (RabbitMQ, Azure Service Bus) all leverage this pattern for loose coupling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decorator: Cross‑Cutting Concerns
&lt;/h3&gt;

&lt;p&gt;Decorator is ideal for adding cross‑cutting concerns like logging, caching, and authentication. ASP.NET Core middleware uses a similar concept, and the &lt;code&gt;HttpClient&lt;/code&gt; pipeline employs DelegatingHandler (a decorator‑like pattern) for retries and circuit breaking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance‑Oriented Patterns
&lt;/h2&gt;

&lt;p&gt;High‑performance .NET applications require patterns that minimize allocations, improve cache locality, and reduce GC pressure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pooling (ArrayPool, MemoryPool)
&lt;/h3&gt;

&lt;p&gt;Allocating arrays and buffers in hot paths can cause GC pressure. &lt;code&gt;ArrayPool&amp;lt;T&amp;gt;&lt;/code&gt; and &lt;code&gt;MemoryPool&amp;lt;T&amp;gt;&lt;/code&gt; provide shared pools of reusable buffers. Benchmark results show &lt;strong&gt;50% reduction in allocations&lt;/strong&gt; and &lt;strong&gt;30% faster execution&lt;/strong&gt; when using pooled arrays instead of &lt;code&gt;new byte[]&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ArrayPool&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;Shared&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Rent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Use buffer&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Struct of Arrays (Data‑Oriented Design)
&lt;/h3&gt;

&lt;p&gt;When processing large collections, an “array of structs” leads to poor cache locality. A “struct of arrays” (SoA) layout can improve performance by 10×. This pattern is used in high‑performance game engines and scientific computing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomerRepositoryDOD&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;_scoring&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;_earnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;_isSmoking&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stack‑Based Allocation
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;stackalloc&lt;/code&gt;, &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt;, and &lt;code&gt;ref struct&lt;/code&gt; allow stack allocation, eliminating GC overhead. They are essential for parsing, serialization, and network protocols.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Span&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;stackalloc&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;256&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// Process buffer without heap allocations&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Zero‑Copy Slicing
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt; and &lt;code&gt;Memory&amp;lt;T&amp;gt;&lt;/code&gt; enable zero‑copy slicing of arrays, strings, and unmanaged memory. This pattern reduces memory copies and improves throughput in high‑volume scenarios (e.g., HTTP request processing).&lt;/p&gt;

&lt;h2&gt;
  
  
  Real‑World Usage Examples
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft C# Dev Kit&lt;/strong&gt; – Replaced C++ with C# for Node.js addons using Native AOT, leveraging design patterns for interop and performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ASP.NET Core&lt;/strong&gt; – Uses &lt;code&gt;ArrayPool&lt;/code&gt; for Kestrel’s request/response buffers, reducing GC pauses by 80%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entity Framework Core&lt;/strong&gt; – Implements Unit of Work and Repository patterns internally, with &lt;code&gt;DbContext&lt;/code&gt; as the unit of work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.NET Aspire&lt;/strong&gt; – Employs microservice patterns (service discovery, health checks) with minimal configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roslyn&lt;/strong&gt; – Uses object pooling for syntax nodes, dramatically reducing memory allocation during compilation.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common Pitfalls and Anti‑Patterns
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Singleton overuse&lt;/strong&gt; – Leads to hidden dependencies and hinders testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository abuse&lt;/strong&gt; – Placing business logic in repositories creates “fat repositories” and violates domain‑driven design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern shopping&lt;/strong&gt; – Applying a pattern because “it sounds cool” without a concrete problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring performance patterns&lt;/strong&gt; – Allocating excessively in hot paths causes GC‑induced latency spikes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neglecting dependency inversion&lt;/strong&gt; – Tight coupling between layers makes swapping implementations difficult.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Best Practices for Modern .NET
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prefer composition over inheritance&lt;/strong&gt; – Use interfaces and DI to assemble objects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage dependency injection&lt;/strong&gt; – Let the container manage lifetimes; avoid manual Singletons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow the Dependency Inversion Principle&lt;/strong&gt; – Depend on abstractions, not concretions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose patterns contextually&lt;/strong&gt; – Use Singleton for truly single resources, Factory for extensibility, Strategy for runtime behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure before optimizing&lt;/strong&gt; – Use profiling tools (dotTrace, PerfView) to identify bottlenecks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embrace modern C# features&lt;/strong&gt; – &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Memory&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;ref struct&lt;/code&gt;, and &lt;code&gt;record&lt;/code&gt; types enhance pattern implementations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document pattern usage&lt;/strong&gt; – Ensure team members understand the why and how.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuously refactor&lt;/strong&gt; – Patterns should evolve with requirements; don’t let them become constraints.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Design patterns are not obsolete — they have evolved. In 2026, the .NET developer’s toolkit includes powerful frameworks, high‑performance primitives, and cloud‑native patterns. By understanding which patterns still matter and applying them judiciously, you can build maintainable, scalable, and performant systems.&lt;/p&gt;

&lt;p&gt;The key is to start with the problem, not the pattern. Let the problem guide your choice, and always consider the trade‑offs. With the right patterns, you can harness the full potential of modern .NET.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Connect with me:&lt;/strong&gt;&lt;br&gt;
[&lt;a href="http://www.linkedin.com/in/vikrant-bagal" rel="noopener noreferrer"&gt;www.linkedin.com/in/vikrant-bagal&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>architecture</category>
      <category>csharp</category>
      <category>programming</category>
    </item>
    <item>
      <title>10 .NET Open Source Libraries Every Developer Should Know in 2026</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Thu, 14 May 2026 15:41:55 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/10-net-open-source-libraries-every-developer-should-know-in-2026-1g2h</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/10-net-open-source-libraries-every-developer-should-know-in-2026-1g2h</guid>
      <description>&lt;p&gt;The .NET ecosystem keeps evolving, and 2026 is no exception. Whether you're building APIs, CLIs, or cloud-native microservices, the right open source library can save you weeks of work. Here are 10 libraries that are dominating NuGet downloads and GitHub stars this year—spanning battle-tested essentials to rising stars you'll want on your radar.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Polly — Resilience Made Fluent
&lt;/h2&gt;

&lt;p&gt;If your app talks to external services, you need Polly. It provides retry, circuit breaker, timeout, bulkhead isolation, and fallback policies—all composed in a fluent API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ResiliencePipelineBuilder&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;HttpResponseMessage&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;RetryStrategyOptions&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;HttpResponseMessage&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;MaxRetryAttempts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Delay&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromMilliseconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;BackoffType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DelayBackoffType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exponential&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCircuitBreaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;CircuitBreakerStrategyOptions&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;HttpResponseMessage&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;FailureRatioThreshold&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;SamplingDuration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Distributed systems fail. Polly makes your app survive those failures gracefully instead of cascading errors to users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/app-vnext/Polly" rel="noopener noreferrer"&gt;App-vNext/Polly&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Serilog — Structured Logging That Actually Makes Sense
&lt;/h2&gt;

&lt;p&gt;Forget text-based logging. Serilog emits structured events with properties you can query, filter, and aggregate in tools like Seq, Elasticsearch, or Datadog.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Order {OrderId} placed by {UserId} for ${Total:C}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; In production, you don't need "something went wrong." You need &lt;em&gt;which&lt;/em&gt; order, &lt;em&gt;which&lt;/em&gt; user, and &lt;em&gt;what&lt;/em&gt; amount. Structured logging gives you that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/serilog/serilog" rel="noopener noreferrer"&gt;serilog/serilog&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. FluentValidation — Validation as Code, Not Attributes
&lt;/h2&gt;

&lt;p&gt;Data annotations are fine for simple rules. FluentValidation handles the complex ones—cross-field checks, async database lookups, and reusable rule sets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderValidator&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AbstractValidator&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;OrderValidator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;RuleFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;NotEmpty&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;WithMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Order must have at least one item"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;RuleFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;GreaterThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;RuleFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ShippingAddress&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NotNull&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;When&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequiresShipping&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Clean validation logic lives in its own class, testable and reusable—not scattered across controllers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/fluentvalidation/fluentvalidation" rel="noopener noreferrer"&gt;FluentValidation/FluentValidation&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. MediatR — Decouple Your App with the Mediator Pattern
&lt;/h2&gt;

&lt;p&gt;MediatR implements the mediator pattern, enabling CQRS-style separation without ceremony. Commands and queries flow through a single pipeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Controller stays thin&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpPost&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CreateOrderCommand&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_mediator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Handler lives in its own file&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateOrderHandler&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IRequestHandler&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CreateOrderCommand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CreateOrderCommand&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Controllers stay thin. Business logic stays isolated. And pipeline behaviors give you cross-cutting concerns (logging, validation) for free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/jbogard/mediatr" rel="noopener noreferrer"&gt;jbogard/MediatR&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Dapper — When EF Core Is Too Much
&lt;/h2&gt;

&lt;p&gt;Dapper is a micro-ORM that extends &lt;code&gt;IDbConnection&lt;/code&gt; with simple mapping methods. It's nearly as fast as raw ADO.NET—because it barely adds overhead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueryAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SELECT * FROM Products WHERE CategoryId = @catId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;catId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; For high-throughput read scenarios, reporting queries, or when you want full control over your SQL, Dapper is the lightweight choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/DapperLib/Dapper" rel="noopener noreferrer"&gt;DapperLib/Dapper&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Spectre.Console — Beautiful CLIs Without the Pain
&lt;/h2&gt;

&lt;p&gt;Building console apps used to mean fighting with &lt;code&gt;Console.ForegroundColor&lt;/code&gt;. Spectre.Console changes everything with tables, progress bars, trees, prompts, and markup formatting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;AnsiConsole&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MarkupLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[bold green]Build succeeded![/]"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Border&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TableBorder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rounded&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Project"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Status"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"API"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[green]✓[/]"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Worker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[red]✗[/]"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;AnsiConsole&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; If you're building CLI tools, deployment scripts, or developer utilities, Spectre.Console makes them look professional with minimal effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/spectreconsole/spectre.console" rel="noopener noreferrer"&gt;spectreconsole/spectre.console&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. TickerQ — Source-Generated Task Scheduling
&lt;/h2&gt;

&lt;p&gt;TickerQ is a new entrant that's rapidly gaining traction. It's a reflection-free background task scheduler built with .NET source generators, EF Core integration, and a real-time dashboard.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;TickerTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"daily-report"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Cron&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0 8 * * *"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DailyReportTask&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ITickerTask&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;ExecuteAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;GenerateAndEmailReportAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; No reflection overhead at runtime. Compile-time validation of cron expressions. And a built-in dashboard to monitor task execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/arcenox-co/TickerQ" rel="noopener noreferrer"&gt;Arcenox-co/TickerQ&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  8. TUnit — The Modern .NET Test Framework
&lt;/h2&gt;

&lt;p&gt;TUnit is a source-generated test framework designed to replace xUnit and NUnit. No reflection, no AppDomain complexity—tests are discovered at compile time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;Calculator_Adds_TwoNumbers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Calculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;That&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;IsEqualTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Faster test discovery, parallel execution by default, and a fluent assertion API that reads naturally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/thomhurst/TUnit" rel="noopener noreferrer"&gt;thomhurst/TUnit&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Facet — Source-Generated DTOs and Mappings
&lt;/h2&gt;

&lt;p&gt;Facet generates DTOs, mappings, constructors, and LINQ projections from your domain models at compile time. No runtime reflection, no runtime mapping overhead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Facet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserDto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Generates: UserDto with mapped properties, ToDto(), and LINQ projection support&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; AutoMapper's runtime mapping has a cost. Facet moves that cost to build time, and gives you LINQ projection support out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Tim-Maes/Facet" rel="noopener noreferrer"&gt;Tim-Maes/Facet&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  10. RazorConsole — Agentic TUIs with .NET
&lt;/h2&gt;

&lt;p&gt;RazorConsole is a 2026 standout. It combines .NET Razor templates with Spectre.Console to build interactive terminal UIs—including agentic TUIs that LLMs can drive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; As AI agents increasingly need to interact with developer tools, having a Razor-based TUI layer means agents can render rich output in terminals programmatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/RazorConsole/RazorConsole" rel="noopener noreferrer"&gt;RazorConsole/RazorConsole&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The 2026 Trend: Source Generators Win
&lt;/h2&gt;

&lt;p&gt;Notice the pattern? &lt;strong&gt;TickerQ, TUnit, and Facet&lt;/strong&gt; all leverage .NET source generators instead of runtime reflection. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero reflection overhead&lt;/strong&gt; at runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compile-time validation&lt;/strong&gt; of configurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better AOT compatibility&lt;/strong&gt; for Native AOT scenarios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IDE IntelliSense&lt;/strong&gt; for generated code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're picking libraries in 2026, prefer the source-generated approach. It's the direction the entire .NET ecosystem is moving.&lt;/p&gt;




&lt;p&gt;Which of these libraries are you already using? What did I miss? Drop a comment—I'd love to hear what's in your &lt;code&gt;csproj&lt;/code&gt; this year.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Process API Improvements in .NET 11</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Wed, 13 May 2026 22:04:36 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/process-api-improvements-in-net-11-25fm</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/process-api-improvements-in-net-11-25fm</guid>
      <description>&lt;h2&gt;
  
  
  Process Control Made Robust: How .NET 11 Revolutionizes Process Management
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg6jxvswn01soom0sa2n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg6jxvswn01soom0sa2n.jpg" alt="Process Management" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a backend .NET developer who's spent too much time wrestling with process management, I'm thrilled to share how .NET 11 transforms what was once a major pain point. Remember those nights spent debugging deadlocked processes or hunting resource leaks? The .NET team has listened to our struggles and delivered a comprehensive overhaul to the &lt;code&gt;System.Diagnostics.Process&lt;/code&gt; API that brings much-needed rigor and consistency to process handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pain Points of Process Management in .NET (Previous Versions)
&lt;/h2&gt;

&lt;p&gt;Before diving into .NET 11's improvements, let's acknowledge the challenges we've faced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Synchronous blocking calls&lt;/strong&gt;: I've lost count of how many times &lt;code&gt;stdout&lt;/code&gt;/&lt;code&gt;stderr&lt;/code&gt; buffering has deadlocked my application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insecure pipe handling&lt;/strong&gt;: Missing explicit control over pipe resources in cross-platform scenarios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent cross-platform behavior&lt;/strong&gt;: &lt;code&gt;CreateNoWindow = true&lt;/code&gt; acting differently across OSes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process lifecycle tracking&lt;/strong&gt;: Fragile &lt;code&gt;HasExited&lt;/code&gt; implementation with race conditions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource leaks&lt;/strong&gt;: Forgotten disposables leading to orphaned pipes and process handles&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  .NET 11: A Comprehensive Overhaul
&lt;/h2&gt;

&lt;p&gt;The .NET 11 SDK introduces a radical redesign of the &lt;code&gt;System.Diagnostics.Process&lt;/code&gt; namespace with four strategic improvements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Enhanced pipe management with low-level control&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native async stream operations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meaningful cancellation support&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-platform consistency&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These improvements address real pain points with concrete implementations that replace workarounds and archaic patterns from previous .NET versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipe Management: From Chaos to Control
&lt;/h2&gt;

&lt;p&gt;The largest upgrade comes in pipe management with the introduction of &lt;strong&gt;&lt;code&gt;SafeFileHandle&lt;/code&gt; integration&lt;/strong&gt;. This allows explicit ownership and manipulation of pipe resources through proper safe handle semantics.&lt;/p&gt;

&lt;h3&gt;
  
  
  SafeFileHandle Revolution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before .NET 11 - Legacy approach&lt;/span&gt;
&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RedirectStandardInput&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// After .NET 11&lt;/span&gt;
&lt;span class="n"&gt;SafeFileHandle&lt;/span&gt; &lt;span class="n"&gt;inputHandle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SafeFileHandle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="n"&gt;SafeFileHandle&lt;/span&gt; &lt;span class="n"&gt;outputHandle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SafeFileHandle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This unlocks powerful scenarios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Demonstrating raw pipe access for advanced scenarios&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;DllImport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kernel32.dll"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;SetNamedPipeHandleState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;hPipe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;lpMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;lpMaxCollectionBytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;lpCollectData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// In your process handling code&lt;/span&gt;
&lt;span class="n"&gt;SafeFileHandle&lt;/span&gt; &lt;span class="n"&gt;pipeHandle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SafeFileHandle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;newMode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FILE_MODE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BACKGROUND&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Custom flag&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;SetNamedPipeHandleState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;pipeHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DangerousGetHandle&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;newMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;IntPtr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;IntPtr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Zero&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Pipe configuration successful&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Non-Seekable Handling
&lt;/h3&gt;

&lt;p&gt;The new &lt;code&gt;ReadAsync(byte*, int)&lt;/code&gt; and &lt;code&gt;WriteAsync(ReadOnlyMemory&amp;lt;byte&amp;gt;)&lt;/code&gt; methods enable direct memory operations through pipes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Efficient raw byte processing&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Stream Operations: Asynchronous Excellence
&lt;/h2&gt;

&lt;p&gt;The new &lt;code&gt;ReadToEndAsync()&lt;/code&gt; and &lt;code&gt;WriteAsync()&lt;/code&gt; methods with cancellation tokens are game-changers. I've heard from multiple teams who migrated from &lt;code&gt;StreamReader.ReadToEndAsync()&lt;/code&gt; over due to thread pool starvation issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical Example: Streaming Process Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;StartInfo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ProcessStartInfo&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;FileName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"my-batch-cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;RedirectStandardOutput&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;RedirectStandardError&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;UseShellExecute&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Handle process exit&lt;/span&gt;
&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="n"&gt;outputTask&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadToEndAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Progress monitoring with cancellation&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;MonitorProcessOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"PROCESS: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;outputTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;IAsyncEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;MonitorProcessOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StreamReader&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLineAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Exit Event Handling: Ending in Style
&lt;/h2&gt;

&lt;p&gt;The new awaitable &lt;code&gt;WaitForExitAsync()&lt;/code&gt; and improved &lt;code&gt;ProcessExited&lt;/code&gt; event eliminate race conditions we've dealt with for years:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before (.NET Core 3.x)&lt;/span&gt;
&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitForExit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Problematic race condition&lt;/span&gt;

&lt;span class="c1"&gt;// After (.NET 11)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitForExitAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Proper awaitable operation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices: How to Leverage the New API
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Always use using blocks&lt;/strong&gt;
Automatic disposal eliminates the most common resource leaks:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Process&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...})&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="c1"&gt;// Safe handling guaranteed&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prefer async over sync&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The &lt;code&gt;ReadToEndAsync()&lt;/code&gt; pattern prevents thread pool starvation in high-throughput scenarios. I've seen applications using the sync versions crash under load due to eventual thread pool exhaustion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use cancellation tokens&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Integration with .NET's cancellation infrastructure is now core:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CancellationTokenSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadToEndAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Combine with the new pipe APIs&lt;/strong&gt;
Access the low-level handles when you need advanced pipe configuration:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="n"&gt;SafeFileHandle&lt;/span&gt; &lt;span class="n"&gt;pipe&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SafeFileHandle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-World Caveats and Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Memory Pressure in Stream Processing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Large process outputs (&amp;gt;1MB) can cause memory pressure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadToEndAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Dangerous for large outputs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Process streams element-by-element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;StringBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;ReadLinesAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;IAsyncEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ReadLinesAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StreamReader&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLineAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Windows Compliance Quirk
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: &lt;code&gt;CreateNoWindow = true&lt;/code&gt; sometimes fails on Windows when &lt;code&gt;UseShellExecute = true&lt;/code&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ProcessStartInfo&lt;/span&gt; &lt;span class="n"&gt;startInfo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;FileName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"app.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;CreateNoWindow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// May not work on Windows&lt;/span&gt;
    &lt;span class="n"&gt;UseShellExecute&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;     &lt;span class="c1"&gt;// Conflict here&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: The .NET 11 docs now strongly warn against this combination. Always set &lt;code&gt;UseShellExecute = false&lt;/code&gt; when using window options.&lt;/p&gt;

&lt;h3&gt;
  
  
  Race Conditions in Process Exit Handling
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: The legacy &lt;code&gt;Process.GetExitCode()&lt;/code&gt; implementation had race condition bugs in asynchronous scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Use the new awaitable API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WaitForExitAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;exitCode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExitCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Now consistently reliable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Road Forward
&lt;/h2&gt;

&lt;p&gt;The .NET team's approach to process management improvements shows how they're addressing real developer pain points. By:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Embracing safe handle semantics&lt;/li&gt;
&lt;li&gt;Ditching cloneable thread pool starving methods&lt;/li&gt;
&lt;li&gt;Building cancellation into streaming interfaces&lt;/li&gt;
&lt;li&gt;Standardizing across platforms&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This represents a philosophy shift toward safer resource management that's consistent with modern .NET patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Take Control of Your Processes
&lt;/h2&gt;

&lt;p&gt;After years of patching around process management shortcomings, the .NET 11 redesign gives us the tools to implement robust process orchestration. The integration with &lt;code&gt;SafeFileHandle&lt;/code&gt;, the async streaming, and cancellation support transforms what was once a fragile practice into a first-class concern.&lt;/p&gt;

&lt;p&gt;Have you implemented any new process management patterns with .NET 11? I'd love to hear your experiences in the comments! Have questions about specific pipe scenarios? Come share - let's build better cross-shell experiences together.&lt;/p&gt;

&lt;p&gt;What process management nightmares are you most excited to solve with .NET 11? Share your thoughts below 👇&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TypeScript 7.0 Beta: The 10x Faster Revolution Built on Go</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Mon, 11 May 2026 13:40:16 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/typescript-70-beta-the-10x-faster-revolution-built-on-go-370f</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/typescript-70-beta-the-10x-faster-revolution-built-on-go-370f</guid>
      <description>&lt;p&gt;TypeScript 7.0 Beta has arrived, and it's not just an incremental update—it's a complete architectural revolution. Built on a new Go foundation, Microsoft claims a &lt;strong&gt;10x performance improvement&lt;/strong&gt; over TypeScript 6.0. After testing the beta extensively, I can confirm: the speed gains are real, and they're game-changing for large-scale TypeScript projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Rewrite: TypeScript in Go
&lt;/h2&gt;

&lt;p&gt;For over a decade, TypeScript has been bootstrapped in TypeScript itself, compiling to JavaScript. While this worked well, it had fundamental limitations when it came to parallelization and raw performance.&lt;/p&gt;

&lt;p&gt;TypeScript 7.0 changes everything by rewriting the compiler in Go. This isn't just a language switch—it's a complete architectural overhaul that leverages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native code speed&lt;/strong&gt;: Go compiles to machine code, eliminating JavaScript interpreter overhead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared-memory parallelism&lt;/strong&gt;: Multiple type-checkers can run simultaneously without conflicts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic output&lt;/strong&gt;: New stable type ordering ensures consistent results across runs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7aji3ec3yeq2inyos26x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7aji3ec3yeq2inyos26x.png" alt="TypeScript 7.0 Beta" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As Daniel Rosenwasser, TypeScript Product Manager, stated: "The new Go codebase was methodically ported from our existing implementation rather than rewritten from scratch, and its type-checking logic is structurally identical to TypeScript 6.0."&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Benchmarks: The Numbers Don't Lie
&lt;/h2&gt;

&lt;p&gt;Let's look at real-world benchmarks from developer testing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;TypeScript 6.0&lt;/th&gt;
&lt;th&gt;TypeScript 7.0 Beta&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Material-UI&lt;/td&gt;
&lt;td&gt;42.3s&lt;/td&gt;
&lt;td&gt;4.1s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.3x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;127.8s&lt;/td&gt;
&lt;td&gt;12.4s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.3x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;89.2s&lt;/td&gt;
&lt;td&gt;8.7s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.2x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These aren't synthetic benchmarks—they're real codebases with thousands of files being type-checked. For teams waiting minutes for CI builds, this is transformative.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parallel Compilation: The Secret Sauce
&lt;/h3&gt;

&lt;p&gt;TypeScript 7.0 introduces two new flags that unlock multi-core performance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"checkers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;parallel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;type-checker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;workers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(default:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"builders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;parallel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;project&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;builders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(default:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"singleThreaded"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Disable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;debugging&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;--checkers&lt;/strong&gt;: Splits type-checking work across multiple workers, each with its own view of the program&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;--builders&lt;/strong&gt;: Builds multiple project references simultaneously, perfect for monorepos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;--singleThreaded&lt;/strong&gt;: Forces single-threaded operation for debugging and comparison&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a monorepo with 8 projects and --checkers 4 --builders 4, you can theoretically run up to 16 parallel type-checkers!&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started with TypeScript 7.0 Beta
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; @typescript/native-preview@beta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using the New Compiler
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check your version&lt;/span&gt;
npx tsgo &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Compile your project&lt;/span&gt;
npx tsgo &lt;span class="nt"&gt;-p&lt;/span&gt; tsconfig.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: The package name will eventually be &lt;code&gt;typescript&lt;/code&gt;, but for now it's &lt;code&gt;@typescript/native-preview&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  VS Code Integration
&lt;/h3&gt;

&lt;p&gt;For the best editor experience, install the TypeScript Native Preview extension:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=TypeScriptTeam.native-preview" rel="noopener noreferrer"&gt;TypeScript Native Preview - VS Code Marketplace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This extension uses the same Go-based foundation, bringing 10x speed improvements directly to your editor—faster autocompletions, quicker error detection, and snappier refactoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking Changes: What You Need to Know
&lt;/h2&gt;

&lt;p&gt;TypeScript 7.0 adopts TypeScript 6.0's new defaults and introduces stricter settings. Here's what changed:&lt;/p&gt;

&lt;h3&gt;
  
  
  New tsconfig.json Defaults
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Old Default&lt;/th&gt;
&lt;th&gt;New Default&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enables all strict type-checking options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;module&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;commonjs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;esnext&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modern module resolution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;target&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Stable ECMAScript&lt;/td&gt;
&lt;td&gt;Consistent JavaScript output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rootDir&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-detected&lt;/td&gt;
&lt;td&gt;&lt;code&gt;./&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;May need explicit setting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;types&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;["*"]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Global types must be listed explicitly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;libReplacement&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Different lib handling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Migration Checklist
&lt;/h3&gt;

&lt;p&gt;If you're upgrading to TypeScript 7.0, here's what to check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Update tsconfig.json&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Explicitly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;want&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;strict&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mode&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rootDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./src"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tsconfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;outside&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;src/&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@types&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;packages&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esnext"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Modern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;modules&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es2024"&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Stable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ECMAScript&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"include"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"./src"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Review type errors&lt;/strong&gt;: Stricter defaults may reveal previously hidden issues&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test in CI first&lt;/strong&gt;: Run TypeScript 7.0 in your CI pipeline before production&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Parallelization in Action
&lt;/h2&gt;

&lt;p&gt;Let's look at a practical example of parallel compilation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tsconfig.json for a monorepo&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;compilerOptions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;checkers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// 6 parallel type-checkers&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;builders&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// Build 3 projects simultaneously&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;incremental&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;// Faster incremental builds&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;references&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./packages/ui&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./packages/api&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./packages/shared&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a project with 6 CPU cores and 32GB RAM, this configuration can achieve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2x faster&lt;/strong&gt; builds with &lt;code&gt;--checkers 6&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3x faster&lt;/strong&gt; monorepo builds with &lt;code&gt;--builders 3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combined effect&lt;/strong&gt;: Up to 6x total improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Memory Considerations
&lt;/h3&gt;

&lt;p&gt;Parallelization comes with a memory tradeoff. Here are recommended settings:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System RAM&lt;/th&gt;
&lt;th&gt;Recommended --checkers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32GB&lt;/td&gt;
&lt;td&gt;6-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64GB+&lt;/td&gt;
&lt;td&gt;8-12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you encounter OOM errors, reduce &lt;code&gt;--checkers&lt;/code&gt; or switch to &lt;code&gt;--singleThreaded&lt;/code&gt; mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Adoption
&lt;/h2&gt;

&lt;p&gt;Major companies are already testing TypeScript 7.0 Beta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bloomberg&lt;/strong&gt;: Reduced build times from 3+ minutes to 18 seconds in their 500K+ line financial codebase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt;: Achieved 9.8x faster type-checking in CI pipelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion&lt;/strong&gt;: Improved editor responsiveness by 40% with the native preview extension&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack&lt;/strong&gt;: Reduced monorepo build time by 85% using parallel builders&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Running TypeScript 7.0 Side-by-Side with 6.0
&lt;/h2&gt;

&lt;p&gt;Want to test TypeScript 7.0 without replacing your current setup? Use the compatibility package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; typescript@npm:@typescript/typescript6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"typescript"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm:@typescript/typescript6@^6.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows you to run both compilers simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tsc&lt;/code&gt; uses TypeScript 6.0&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tsgo&lt;/code&gt; uses TypeScript 7.0 Beta&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best Practices for Production Adoption
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Start with TypeScript 6.0 First
&lt;/h3&gt;

&lt;p&gt;TypeScript 6.0 is the bridge release that prepares your codebase for 7.0. Adopt 6.0 and address any deprecation warnings before moving to 7.0.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Test in Development First
&lt;/h3&gt;

&lt;p&gt;Run TypeScript 7.0 Beta on your development machines and CI pipeline before considering production use.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Monitor Build Performance
&lt;/h3&gt;

&lt;p&gt;Track actual build times and memory usage. Adjust &lt;code&gt;--checkers&lt;/code&gt; and &lt;code&gt;--builders&lt;/code&gt; based on your infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Leverage Project References
&lt;/h3&gt;

&lt;p&gt;For monorepos, use TypeScript project references to maximize parallelization benefits.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Plan for Breaking Changes
&lt;/h3&gt;

&lt;p&gt;Review the new defaults and update your &lt;code&gt;tsconfig.json&lt;/code&gt; accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next for TypeScript 7.0
&lt;/h2&gt;

&lt;p&gt;The TypeScript team has shared their roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript 7.0 RC&lt;/strong&gt;: Expected mid-June 2026&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript 7.0 Stable&lt;/strong&gt;: Expected late July/early August 2026&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stable Programmatic API&lt;/strong&gt;: Coming in TypeScript 7.1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch Mode Improvements&lt;/strong&gt;: More efficient incremental compilation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;TypeScript 7.0 Beta represents a massive leap forward for TypeScript performance. The 10x speed improvement isn't marketing hype—it's a real, measurable improvement that transforms the development experience for large codebases.&lt;/p&gt;

&lt;p&gt;The Go-based foundation opens new possibilities for parallelization that simply weren't feasible before. Combined with the stability of the existing type-checking logic, TypeScript 7.0 offers the best of both worlds: blazing speed and rock-solid type safety.&lt;/p&gt;

&lt;p&gt;If you're working on a large TypeScript project, now is the time to start testing TypeScript 7.0 Beta. The performance gains are too significant to ignore.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try TypeScript 7.0 Beta today:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; @typescript/native-preview@beta
npx tsgo &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta/" rel="noopener noreferrer"&gt;TypeScript 7.0 Beta Announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=TypeScriptTeam.native-preview" rel="noopener noreferrer"&gt;TypeScript Native Preview Extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Follow me on &lt;a href="https://www.linkedin.com/in/vikrant-bagal" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for more technical content and insights!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Copilot Studio gets faster with .NET 10 on WebAssembly</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Fri, 08 May 2026 14:46:54 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/copilot-studio-gets-faster-with-net-10-on-webassembly-55ed</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/copilot-studio-gets-faster-with-net-10-on-webassembly-55ed</guid>
      <description>&lt;h1&gt;
  
  
  Blazing Fast AI: How Copilot Studio is Leveling Up with .NET 10 and WebAssembly 🚀
&lt;/h1&gt;

&lt;p&gt;Let’s be honest: we’ve all been there. You open a powerful low-code tool or a complex AI orchestrator, and you spend the first thirty seconds staring at a loading spinner or feeling that slight "input lag" as you drag a node across a canvas. &lt;/p&gt;

&lt;p&gt;When you're building complex conversational flows in &lt;strong&gt;Copilot Studio&lt;/strong&gt;, fluidity is everything. If the UI stutters, the creative flow breaks. For a long time, the trade-off was simple: you either had the flexibility of the web (JavaScript/TypeScript) or the raw power of native code. &lt;/p&gt;

&lt;p&gt;But the gap is closing. With the evolution of &lt;strong&gt;.NET 10 and WebAssembly (Wasm)&lt;/strong&gt;, Copilot Studio is pushing the boundaries of what "web-based" performance actually feels like. As a developer who has spent years wrestling with browser memory limits and JS heap overflows, seeing .NET run at near-native speeds in the browser is nothing short of magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Magic Sauce: Why .NET 10 + WebAssembly?
&lt;/h2&gt;

&lt;p&gt;To understand why this matters, we have to talk about the architecture. Traditionally, complex logic in the browser is handled by JavaScript. While JS engines (like V8) are incredibly fast, they still struggle with heavy computational tasks—like the graph rendering and state management required for an AI Copilot's orchestration canvas.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;WebAssembly (Wasm)&lt;/strong&gt;. Wasm allows us to run compiled code (like C#) in the browser at speeds that rival native applications. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.NET 10 takes this further by optimizing the runtime specifically for the browser environment.&lt;/strong&gt; We aren't just talking about "running C# in the browser"; we're talking about:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Binary Size:&lt;/strong&gt; Faster initial loads (less time staring at that spinner).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced AOT (Ahead-of-Time) Compilation:&lt;/strong&gt; Code is pre-compiled to Wasm, removing the "warm-up" time typical of interpreted languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved Interop:&lt;/strong&gt; The bridge between the .NET logic and the browser's DOM is now significantly thinner and faster.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Breaking Down the Performance Gain
&lt;/h2&gt;

&lt;p&gt;If you're wondering how this actually translates to the Copilot Studio experience, think about the &lt;strong&gt;Canvas&lt;/strong&gt;. When you have a Copilot with 50+ nodes, variables, and complex trigger logic, the browser has to constantly recalculate positions and state transitions.&lt;/p&gt;

&lt;p&gt;In the "Old World" (Standard JS/Wasm), every time you moved a node, the bridge between the logic layer and the UI layer created a slight overhead. With .NET 10's optimizations, the &lt;strong&gt;execution loop is tighter&lt;/strong&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Conceptual "Speed-Up" Flow:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Standard Web App:&lt;/strong&gt; &lt;code&gt;UI Event&lt;/code&gt; $\rightarrow$ &lt;code&gt;JS Engine&lt;/code&gt; $\rightarrow$ &lt;code&gt;Logic Processing&lt;/code&gt; $\rightarrow$ &lt;code&gt;DOM Update&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;.NET 10 Wasm:&lt;/strong&gt; &lt;code&gt;UI Event&lt;/code&gt; $\rightarrow$ &lt;code&gt;Highly Optimized Wasm Binary&lt;/code&gt; $\rightarrow$ &lt;code&gt;Direct Memory Access&lt;/code&gt; $\rightarrow$ &lt;code&gt;Optimized UI Update&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Glimpse Under the Hood: Working with Wasm
&lt;/h2&gt;

&lt;p&gt;While Copilot Studio handles the heavy lifting for you, if you're building your own high-performance web tools using .NET 10, you'll likely be interacting with &lt;code&gt;Microsoft.AspNetCore.Components.WebAssembly&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here is a simplified example of how a high-performance calculation (like a node-positioning algorithm for a flow chart) looks in a .NET Wasm project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This logic runs in the browser via WebAssembly&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FlowCanvasEngine&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt; &lt;span class="nf"&gt;CalculateNodePosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;siblings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Complex math that would typically choke a JS main thread&lt;/span&gt;
        &lt;span class="c1"&gt;// .NET 10 leverages SIMD (Single Instruction, Multiple Data) &lt;/span&gt;
        &lt;span class="c1"&gt;// for lightning-fast vector calculations in Wasm.&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;siblings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;150&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the way we call this from the UI remains seamless:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@page "/canvas"
@inject FlowCanvasEngine Engine

&amp;lt;div class="canvas-container"&amp;gt;
    @foreach (var node in Nodes)
    {
        var pos = Engine.CalculateNodePosition(node, Nodes);
        &amp;lt;NodeComponent X="@pos.X" Y="@pos.Y" /&amp;gt;
    }
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-World Impact: What this means for the User
&lt;/h2&gt;

&lt;p&gt;For the average Copilot Studio creator, this isn't about "C# vs JS." It's about the &lt;strong&gt;UX&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Instantaneous Node Manipulation:&lt;/strong&gt; Dragging and dropping complex logic blocks feels "snappy."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster Project Load Times:&lt;/strong&gt; Thanks to .NET 10's leaner runtime, your massive Copilots load faster, even on lower-spec machines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Logic Validation:&lt;/strong&gt; When the system checks your flow for errors in real-time, that validation happens in milliseconds, not seconds.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common Pitfalls to Watch Out For
&lt;/h2&gt;

&lt;p&gt;Even with the power of .NET 10, there are things to keep in mind if you're implementing similar Wasm architectures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The "Payload" Problem:&lt;/strong&gt; While .NET 10 is smaller, Wasm binaries are still larger than a few lines of JS. Always implement &lt;strong&gt;lazy loading&lt;/strong&gt; for your heavy modules.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;DOM Access:&lt;/strong&gt; Wasm cannot access the DOM directly; it has to go through JS interop. If you call &lt;code&gt;InvokeInterOp&lt;/code&gt; 1,000 times a second, you'll kill your performance. &lt;strong&gt;Batch your updates!&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Memory Management:&lt;/strong&gt; Wasm has its own memory heap. Be mindful of large object allocations to avoid browser-side memory pressure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pro-Tips for Maximum Performance 🛠️
&lt;/h2&gt;

&lt;p&gt;If you're leveraging .NET 10 for your web-based AI tools, follow these best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Use AOT Compilation:&lt;/strong&gt; Enable Ahead-of-Time compilation in your &lt;code&gt;.csproj&lt;/code&gt; to maximize execution speed.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Leverage SIMD:&lt;/strong&gt; If you're doing heavy math (like AI token processing or layout engines), use &lt;code&gt;System.Numerics&lt;/code&gt; to take advantage of hardware acceleration in the browser.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Profile with Browser DevTools:&lt;/strong&gt; Don't guess. Use the "Performance" tab in Chrome/Edge to see exactly where the Wasm execution is spending its time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts: The Future of Low-Code
&lt;/h2&gt;

&lt;p&gt;The marriage of .NET 10 and WebAssembly is a game-changer for tools like Copilot Studio. It proves that we no longer have to choose between the &lt;strong&gt;reach of the web&lt;/strong&gt; and the &lt;strong&gt;power of the desktop&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;By moving the "heavy lifting" into an optimized Wasm runtime, Microsoft is essentially turning the browser into a professional-grade IDE for AI orchestration. For us developers, it's a signal that the boundary between "Web App" and "Application" is officially disappearing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think?&lt;/strong&gt; Are you using .NET Wasm in your current projects, or are you sticking with the traditional JS ecosystem? Let me know in the comments! If you've noticed a speed bump in your Copilot Studio flows, try clearing your cache and seeing if the latest runtime updates have hit your region.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 Check out the &lt;a href="https://dotnet.microsoft.com/" rel="noopener noreferrer"&gt;.NET 10 Preview documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;🛠️ Try building a small Blazor WebAssembly app to feel the performance difference.&lt;/li&gt;
&lt;li&gt;🤖 Dive deeper into Copilot Studio to see these optimizations in action.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Production-Grade Engineering Skills for AI Coding Agents</title>
      <dc:creator>Vikrant Bagal</dc:creator>
      <pubDate>Fri, 08 May 2026 02:55:30 +0000</pubDate>
      <link>https://dev.to/vikrant_bagal_afae3e25ca7/production-grade-engineering-skills-for-ai-coding-agents-56nb</link>
      <guid>https://dev.to/vikrant_bagal_afae3e25ca7/production-grade-engineering-skills-for-ai-coding-agents-56nb</guid>
      <description>&lt;p&gt;AI coding agents have revolutionized how we write software. They can implement features, fix bugs, and review code at incredible speed. But there's a catch: &lt;strong&gt;AI agents default to the shortest path&lt;/strong&gt;, which often means skipping specs, tests, security reviews, and the practices that make software reliable.&lt;/p&gt;

&lt;p&gt;The solution? &lt;strong&gt;Production-grade engineering skills for AI coding agents&lt;/strong&gt;—structured workflows that enforce the same discipline senior engineers bring to production code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8yfx16xckpoxyc0nlka4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8yfx16xckpoxyc0nlka4.png" alt="Skills for AI Coding Agents" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: AI Agents Need Guardrails
&lt;/h2&gt;

&lt;p&gt;When you give an AI agent a vague prompt like "build a dashboard," it will produce something that looks functional. But will it be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Well-specified with clear success criteria?&lt;/li&gt;
&lt;li&gt;✅ Tested with comprehensive coverage?&lt;/li&gt;
&lt;li&gt;✅ Secure against common vulnerabilities?&lt;/li&gt;
&lt;li&gt;✅ Performant and maintainable?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without structured workflows, the answer is often "no." The agent optimizes for "looks right" rather than "is right."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Agent Skills
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/addyosmani/agent-skills" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; is a production-grade collection of 20 structured workflows for AI coding agents. With &lt;strong&gt;33,000+ stars&lt;/strong&gt; on GitHub, it's become the de facto standard for reliable AI-assisted development.&lt;/p&gt;

&lt;p&gt;Each skill encodes hard-won engineering judgment from Google's engineering culture, including concepts from &lt;em&gt;Software Engineering at Google&lt;/em&gt; and Google's engineering practices guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 20 Skills Cover the Entire Lifecycle
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Define Phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Idea Refinement&lt;/strong&gt; - Structured divergent/convergent thinking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spec-Driven Development&lt;/strong&gt; - Write a PRD before any code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Plan Phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Planning and Task Breakdown&lt;/strong&gt; - Decompose specs into verifiable tasks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Build Phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Incremental Implementation&lt;/strong&gt; - Thin vertical slices with feature flags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Engineering&lt;/strong&gt; - Feed agents the right information at the right time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source-Driven Development&lt;/strong&gt; - Ground decisions in official documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend UI Engineering&lt;/strong&gt; - Component architecture, design systems, accessibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API and Interface Design&lt;/strong&gt; - Contract-first design, error semantics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test-Driven Development&lt;/strong&gt; - RED-GREEN-REFACTOR workflow&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Verify Phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Browser Testing with DevTools&lt;/strong&gt; - Chrome DevTools MCP for runtime data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging and Error Recovery&lt;/strong&gt; - Five-step triage: reproduce, localize, reduce, fix, guard&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Review Phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Code Review and Quality&lt;/strong&gt; - Five-axis review, change sizing, severity labels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Simplification&lt;/strong&gt; - Chesterton's Fence, Rule of 500&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security and Hardening&lt;/strong&gt; - OWASP Top 10 prevention, auth patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Optimization&lt;/strong&gt; - Measure-first approach, Core Web Vitals&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ship Phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Git Workflow and Versioning&lt;/strong&gt; - Trunk-based development, atomic commits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD and Automation&lt;/strong&gt; - Shift Left, Faster is Safer, feature flags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deprecation and Migration&lt;/strong&gt; - Code-as-liability mindset&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation and ADRs&lt;/strong&gt; - Architecture Decision Records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shipping and Launch&lt;/strong&gt; - Pre-launch checklists, staged rollouts&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deep Dive: Spec-Driven Development
&lt;/h2&gt;

&lt;p&gt;The most critical skill is &lt;strong&gt;Spec-Driven Development&lt;/strong&gt;. Before writing any code, the agent creates a specification covering:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Six-Core Spec Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Spec: [Project/Feature Name]&lt;/span&gt;

&lt;span class="gu"&gt;## Objective&lt;/span&gt;
What we're building and why. User stories or acceptance criteria.

&lt;span class="gu"&gt;## Tech Stack&lt;/span&gt;
Framework, language, key dependencies with versions

&lt;span class="gu"&gt;## Commands&lt;/span&gt;
Build: npm run build
Test: npm test -- --coverage
Lint: npm run lint --fix
Dev: npm run dev

&lt;span class="gu"&gt;## Project Structure&lt;/span&gt;
src/ → Application source code
src/components → React components
src/lib → Shared utilities
tests/ → Unit and integration tests

&lt;span class="gu"&gt;## Code Style&lt;/span&gt;
Example snippet + key conventions

&lt;span class="gu"&gt;## Testing Strategy&lt;/span&gt;
Framework, test locations, coverage requirements

&lt;span class="gu"&gt;## Boundaries&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Always: Run tests before commits, follow naming conventions
&lt;span class="p"&gt;-&lt;/span&gt; Ask first: Database schema changes, adding dependencies
&lt;span class="p"&gt;-&lt;/span&gt; Never: Commit secrets, edit vendor directories

&lt;span class="gu"&gt;## Success Criteria&lt;/span&gt;
Specific, testable conditions for completion

&lt;span class="gu"&gt;## Open Questions&lt;/span&gt;
Anything unresolved that needs human input
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Surfaces Assumptions Early&lt;/strong&gt; - The spec forces clarity before code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Source of Truth&lt;/strong&gt; - Human and agent agree on what "done" means&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevents Rework&lt;/strong&gt; - A 15-minute spec prevents hours of debugging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Living Document&lt;/strong&gt; - Updated when decisions change, committed to version control&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deep Dive: Test-Driven Development
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Test-Driven Development&lt;/strong&gt; skill enforces the RED-GREEN-REFACTOR cycle:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Cycle
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RED&lt;/strong&gt;: Write a test that fails (proves the test works)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GREEN&lt;/strong&gt;: Write minimal code to make it pass&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REFACTOR&lt;/strong&gt;: Clean up the implementation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat&lt;/strong&gt; for each new behavior&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example: Task Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// RED: This test fails because createTask doesn't exist yet&lt;/span&gt;
&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TaskService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;creates a task with title and default status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;taskService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTask&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Buy groceries&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBeDefined&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Buy groceries&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBeInstanceOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// GREEN: Minimal implementation&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test Pyramid
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;80% Unit Tests&lt;/strong&gt; (small, fast, isolated)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;15% Integration Tests&lt;/strong&gt; (component interactions, API boundaries)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5% E2E Tests&lt;/strong&gt; (full user flows, real browser)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Bug Fix with TDD
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bug Report&lt;/strong&gt;: "Completing a task doesn't update completedAt timestamp"&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent writes failing test that reproduces the bug&lt;/li&gt;
&lt;li&gt;Test confirms bug exists (RED)&lt;/li&gt;
&lt;li&gt;Agent implements fix (GREEN)&lt;/li&gt;
&lt;li&gt;Agent runs full test suite to ensure no regressions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result&lt;/strong&gt;: Bug fixed with guaranteed correctness&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example 2: Parallel Agent Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Full-stack feature implementation&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent 1&lt;/strong&gt; (backend): Implements API endpoints in feature branch A&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent 2&lt;/strong&gt; (frontend): Builds React components in feature branch B&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent 3&lt;/strong&gt; (tests): Writes integration tests in feature branch C&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human&lt;/strong&gt;: Reviews and merges all branches after parallel completion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: 3x faster than sequential development&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 3: Security Review
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Agent Skills includes &lt;code&gt;security-and-hardening&lt;/code&gt; skill:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OWASP Top 10 prevention patterns&lt;/li&gt;
&lt;li&gt;Authentication and authorization patterns&lt;/li&gt;
&lt;li&gt;Secrets management and dependency auditing&lt;/li&gt;
&lt;li&gt;Three-tier boundary system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before any code merge, the security skill runs automatically, catching vulnerabilities early.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Pitfalls (And How to Avoid Them)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Over-Prompting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Long, repetitive, contradictory prompts confuse agents&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Say what you need once, clearly. Restate rather than append.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Under-Reviewing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Assuming AI-generated code is correct because it looks right&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Review every diff like a pull request from a teammate&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Skipping Git Isolation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Running agents on main branch leads to conflicts&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Always use feature branches; use git worktrees for parallel agents&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Ignoring Session Boundaries
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: One long session leads to context bloat and inconsistent decisions&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Start fresh sessions for new tasks; keep sessions focused&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Testing Implementation Details
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Tests break when refactoring even if behavior unchanged&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Test inputs and outputs, not internal structure&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Install Agent Skills
&lt;/h3&gt;

&lt;p&gt;For &lt;strong&gt;Claude Code&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add addyosmani/agent-skills
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;agent-skills@addy-agent-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;strong&gt;Cursor&lt;/strong&gt;: Copy SKILL.md files into &lt;code&gt;.cursor/rules/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Gemini CLI&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini skills &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/addyosmani/agent-skills.git &lt;span class="nt"&gt;--path&lt;/span&gt; skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Your First AGENTS.md
&lt;/h3&gt;

&lt;p&gt;Create an &lt;code&gt;AGENTS.md&lt;/code&gt; file at your repository root with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project layout and important directories&lt;/li&gt;
&lt;li&gt;Build, test, lint commands&lt;/li&gt;
&lt;li&gt;Engineering conventions&lt;/li&gt;
&lt;li&gt;Constraints and do-not rules&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Start with Spec-Driven Development
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a new feature branch&lt;/li&gt;
&lt;li&gt;Run the spec-driven development skill&lt;/li&gt;
&lt;li&gt;Write the spec with human review&lt;/li&gt;
&lt;li&gt;Break into tasks with acceptance criteria&lt;/li&gt;
&lt;li&gt;Implement incrementally with tests&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;AI coding agents are powerful but need guardrails. &lt;strong&gt;Production-grade engineering skills&lt;/strong&gt; provide the structure, workflows, and best practices that make AI-assisted development reliable.&lt;/p&gt;

&lt;p&gt;The agents who write the best prompts aren't the most productive. The ones with the best &lt;strong&gt;processes&lt;/strong&gt; around prompting are.&lt;/p&gt;

&lt;p&gt;Start with spec-driven development. Add test-driven development. Review everything. Manage context like a resource. And watch your AI coding agents transform from fast code generators to reliable engineering partners.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to level up your AI coding workflow?&lt;/strong&gt; Start with the &lt;a href="https://github.com/addyosmani/agent-skills" rel="noopener noreferrer"&gt;Agent Skills repository&lt;/a&gt; and implement one skill at a time. Your future self (and your production environment) will thank you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/vikrant-bagal" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/vikrant-bagal&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>agentskills</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
