<?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: withNext.NET</title>
    <description>The latest articles on DEV Community by withNext.NET (@withnextdotnet).</description>
    <link>https://dev.to/withnextdotnet</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4061672%2F093379ed-5f24-4a0d-804d-4ef2174c11c7.png</url>
      <title>DEV Community: withNext.NET</title>
      <link>https://dev.to/withnextdotnet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/withnextdotnet"/>
    <language>en</language>
    <item>
      <title>JsxCore hits 1.0, and its author is bringing C# to Astro (AstroSharp)</title>
      <dc:creator>withNext.NET</dc:creator>
      <pubDate>Thu, 06 Aug 2026 10:29:29 +0000</pubDate>
      <link>https://dev.to/withnextdotnet/jsxcore-hits-10-and-its-author-is-bringing-c-to-astro-astrosharp-dc0</link>
      <guid>https://dev.to/withnextdotnet/jsxcore-hits-10-and-its-author-is-bringing-c-to-astro-astrosharp-dc0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on our engineering blog, &lt;strong&gt;&lt;a href="https://withnext.net/articles/jsxcore-1-0-astro-csharp" rel="noopener noreferrer"&gt;WithNext.NET&lt;/a&gt;&lt;/strong&gt;. It's reposted here with the canonical link pointing back to the original.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A while back I wrote about &lt;strong&gt;&lt;a href="https://dev.to/withnextdotnet/jsxcore-write-reacttsx-views-in-aspnet-core-with-no-nodejs-218m"&gt;JsxCore&lt;/a&gt;&lt;/strong&gt; — a view engine that lets you &lt;strong&gt;write ASP.NET Core views in JSX/TSX and render them with React or Preact, with no Node.js required&lt;/strong&gt;. At the time it was "about to ship." Well, it just did: &lt;strong&gt;JsxCore is now 1.0.0&lt;/strong&gt;. And its author, David Whitney, is already pushing the same idea further — into &lt;strong&gt;Astro&lt;/strong&gt;, with a proof of concept called &lt;strong&gt;AstroSharp&lt;/strong&gt;. This is the follow-up.&lt;/p&gt;

&lt;h2&gt;
  
  
  JsxCore 1.0.0 is out
&lt;/h2&gt;

&lt;p&gt;On August 4, 2026, David Whitney announced &lt;strong&gt;"JsxCore 1.0.0 is out."&lt;/strong&gt; In short, everything from the earlier write-up is now a stable release. You write a &lt;code&gt;.tsx&lt;/code&gt; view, return it from a controller, and pick &lt;strong&gt;server rendering, hydration, or both — per response&lt;/strong&gt;. View-model types are &lt;strong&gt;generated from your C#&lt;/strong&gt;, and installing is still just &lt;code&gt;dotnet add package JsxCore&lt;/code&gt;. The project had a few dozen stars when I first covered it; it's now around &lt;strong&gt;200&lt;/strong&gt;, so interest is clearly building.&lt;/p&gt;

&lt;p&gt;It targets ASP.NET Core &lt;strong&gt;MVC, Web API, and Minimal API&lt;/strong&gt;, runs on the &lt;strong&gt;.NET SDK alone&lt;/strong&gt;, and keeps the "vite-like DX" goal: automatic TypeScript transpilation, bundler-free module resolution in the browser, and hot reload that surfaces TS errors as an overlay.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next move — AstroSharp
&lt;/h2&gt;

&lt;p&gt;Here's the part I find genuinely interesting. JsxCore brings C# to the React/TSX world. &lt;strong&gt;AstroSharp&lt;/strong&gt; aims to do the same thing for &lt;strong&gt;Astro&lt;/strong&gt;: write your Astro content in &lt;strong&gt;&lt;code&gt;.razor&lt;/code&gt; (C#)&lt;/strong&gt;, while the tooling underneath is powered by .NET.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyowbul55bve1zn24m4oy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyowbul55bve1zn24m4oy.png" alt="How AstroSharp works: an Astro project written in .razor, a sidecar .NET (Roslyn) process during development, and SSR output — all while the entry point stays npm." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The key design choice is that &lt;strong&gt;the entry point stays npm, but the inside is .NET&lt;/strong&gt;. From a front-end developer's perspective, you install a normal npm package. During development, the Astro plugin &lt;strong&gt;spawns a .NET sidecar process&lt;/strong&gt; and uses &lt;strong&gt;Roslyn&lt;/strong&gt; for a static, hot-reloading dev experience. A .NET runtime is needed at build time, but the front-end workflow — the one that starts with &lt;code&gt;npm install&lt;/code&gt; — is left intact.&lt;/p&gt;

&lt;p&gt;A minimal Astro component in AstroSharp reads like Razor: C# in the frontmatter, markup below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@{
    var name = "World";
}
&amp;lt;h1&amp;gt;Hello @name&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rendering goes through the sidecar for &lt;strong&gt;SSR&lt;/strong&gt; (HTML produced by C#), and there's an &lt;strong&gt;experimental, opt-in WASM path&lt;/strong&gt; for server-less rendering as well. Both are early — this is a work-in-progress PoC at the time of writing — but the direction is clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  What developers are saying
&lt;/h2&gt;

&lt;p&gt;The reaction has been warm, especially from people who were shopping around for exactly this kind of tool. One developer put it this way after seeing AstroSharp:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Nice, I needed something like that. I was evaluating Blazor SSR and HTMX, but I think this is actually what I wanted."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That captures the niche well. It's not "C# for everything" — it's &lt;strong&gt;C# where you already wanted server-side power, without giving up the front-end ecosystem you like.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually happening here
&lt;/h2&gt;

&lt;p&gt;Step back and there's a consistent theme across David Whitney's work. Rather than asking front-end developers to abandon their stack for a C#-only model, he's meeting each front-end culture where it is and &lt;strong&gt;delivering the feel of C# into it&lt;/strong&gt; — JSX/TSX with JsxCore, and now Astro with AstroSharp. Whether AstroSharp graduates from PoC to production is an open question, but the pattern — &lt;strong&gt;npm on the outside, .NET on the inside&lt;/strong&gt; — is a pragmatic way to bring .NET's strengths to teams that live in the JavaScript world.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is JsxCore production-ready now that it's 1.0?&lt;/strong&gt;&lt;br&gt;
It's a stable 1.0.0 release and supports MVC, Web API, and Minimal API with just &lt;code&gt;dotnet add package JsxCore&lt;/code&gt;. That said, it's still young, so a sensible path is to adopt it on a small surface first and grow as you gain confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need Node.js for either JsxCore or AstroSharp?&lt;/strong&gt;&lt;br&gt;
JsxCore needs only the .NET SDK — no Node.js. AstroSharp is different: its entry point is a normal npm package, and it uses a .NET sidecar during development plus a .NET runtime at build time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is AstroSharp ready to use?&lt;/strong&gt;&lt;br&gt;
Not yet. It's an early proof of concept at the time of writing, and the SSR WASM path in particular is experimental.&lt;/p&gt;




&lt;p&gt;Sources: &lt;a href="https://github.com/davidwhitney/JsxCore" rel="noopener noreferrer"&gt;JsxCore on GitHub&lt;/a&gt; · original announcement threads by &lt;a href="https://x.com/david_whitney" rel="noopener noreferrer"&gt;@david_whitney&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;strong&gt;&lt;a href="https://withnext.net/articles/jsxcore-1-0-astro-csharp" rel="noopener noreferrer"&gt;WithNext.NET&lt;/a&gt;&lt;/strong&gt;, where we write about .NET / C# modernization, performance, and AI.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>react</category>
      <category>astro</category>
    </item>
    <item>
      <title>G#: a modern .NET language with Go, Kotlin, and Swift ergonomics</title>
      <dc:creator>withNext.NET</dc:creator>
      <pubDate>Wed, 05 Aug 2026 04:49:47 +0000</pubDate>
      <link>https://dev.to/withnextdotnet/g-a-modern-net-language-with-go-kotlin-and-swift-ergonomics-4k3g</link>
      <guid>https://dev.to/withnextdotnet/g-a-modern-net-language-with-go-kotlin-and-swift-ergonomics-4k3g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on our engineering blog, &lt;strong&gt;&lt;a href="https://withnext.net/articles/gsharp-modern-dotnet-language" rel="noopener noreferrer"&gt;WithNext.NET&lt;/a&gt;&lt;/strong&gt;. It's reposted here with the canonical link pointing back to the original.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"I want modern, concise syntax — but I don't want to give up the .NET runtime or ecosystem." A new language called &lt;strong&gt;G#&lt;/strong&gt; goes after both. Built by David Obando and announced at its &lt;strong&gt;0.3 release&lt;/strong&gt; in July 2026, G# brings the feel of &lt;strong&gt;Go, Kotlin, and Swift&lt;/strong&gt; while compiling directly to managed .NET assemblies with full interop. Microsoft's David Fowler shared it as "a new .NET programming language," and it drew a lot of attention. This post tours what G# is, how it reads, and how it connects to .NET.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is G#?
&lt;/h2&gt;

&lt;p&gt;G# is a language that &lt;strong&gt;compiles directly to managed .NET assemblies&lt;/strong&gt;. It borrows modern design — Go's package layout, Kotlin/Swift null-safety — while letting you use the &lt;strong&gt;CLR runtime, BCL, NuGet, MSBuild, Portable PDB, and C# interop&lt;/strong&gt; as-is. The author frames the goal like this: "C# is excellent, but it's also large and carries decades of history. G# starts from a different constraint: keep the language surface small and predictable."&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flmxmpgn7f64xoihui1pv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flmxmpgn7f64xoihui1pv.png" alt="G# positioning: modern syntax (Go packages, Kotlin/Swift null safety, data class, explicit numeric types) times .NET power (CLR/BCL/NuGet, MSBuild, Portable PDB, C# interop), compiling straight to managed assemblies"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Modern, concise syntax
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;package&lt;/code&gt; / &lt;code&gt;import&lt;/code&gt; / &lt;code&gt;func&lt;/code&gt;, plus &lt;code&gt;${...}&lt;/code&gt; string interpolation. If you've used Go or Kotlin, it reads almost without explanation.&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;package&lt;/span&gt; &lt;span class="n"&gt;Hello&lt;/span&gt;
&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="kt"&gt;string&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="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Hello, ${name}!"&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="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"world"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;data class&lt;/code&gt; &lt;strong&gt;auto-synthesizes structural equality, &lt;code&gt;with&lt;/code&gt;-copy, and deconstruction&lt;/strong&gt; — the spirit of C# records, in fewer keystrokes.&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;data&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Name&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;Age&lt;/span&gt; &lt;span class="n"&gt;int32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alice"&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="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;older&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;alice&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;Age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;31&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;older&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="n"&gt;alice&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alice"&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="c1"&gt;// True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nullability is &lt;strong&gt;part of the type system&lt;/strong&gt;. G# uses &lt;code&gt;nil&lt;/code&gt; rather than &lt;code&gt;null&lt;/code&gt;; a plain &lt;code&gt;T&lt;/code&gt; can't hold nil, only &lt;code&gt;T?&lt;/code&gt; can. You unwrap safely with &lt;code&gt;if let&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;func&lt;/span&gt; &lt;span class="nf"&gt;Greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&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="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;n&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;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;"hi ${n}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;"hi stranger"&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;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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fip8s9bwim9nri0w6i0o5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fip8s9bwim9nri0w6i0o5.png" alt="G# language features: data class (auto equality/with/deconstruction), null safety (T can't hold nil, only T?), structured concurrency (scope joins child tasks, async/await), explicit numeric types (int8..float64)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured concurrency and explicit numerics
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt; run over &lt;code&gt;Task&lt;/code&gt; and &lt;code&gt;Task[T]&lt;/code&gt; — note that &lt;strong&gt;generics use brackets &lt;code&gt;[]&lt;/code&gt;&lt;/strong&gt;. The standout is the &lt;code&gt;scope { ... }&lt;/code&gt; block, which enforces &lt;strong&gt;structured concurrency&lt;/strong&gt; by automatically joining any child tasks started inside it. Numeric types carry their width in the name (&lt;code&gt;int32&lt;/code&gt;, &lt;code&gt;uint64&lt;/code&gt;, &lt;code&gt;float64&lt;/code&gt;), so the size of a value is &lt;strong&gt;explicit in the source&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="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;compute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;int32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;int32&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="m"&gt;5&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;n&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="n"&gt;scope&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;runAll&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Wait&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;
  
  
  .NET interoperability
&lt;/h2&gt;

&lt;p&gt;What makes G# practical is interop: you can &lt;strong&gt;call any .NET type&lt;/strong&gt; — BCL, NuGet packages, your own code — and LINQ, properties, &lt;code&gt;for&lt;/code&gt;-&lt;code&gt;in&lt;/code&gt; over &lt;code&gt;IEnumerable[T]&lt;/code&gt;, and P/Invoke all work. Existing test assets work too; the screenshot below is a G# test using xUnit's &lt;code&gt;@Fact&lt;/code&gt; / &lt;code&gt;@Theory&lt;/code&gt; / &lt;code&gt;@InlineData&lt;/code&gt;. It's a new language, but it lives &lt;strong&gt;inside&lt;/strong&gt; the .NET ecosystem.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fteiktnk2c17sumx2eoqn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fteiktnk2c17sumx2eoqn.png" alt="A G# xUnit-style test: a @Fact Greet_Returns_Hello_With_Name and a @Theory with @InlineData(Alice/Bob), using func declarations and Assert.Equal(greeter.Greet(...))"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling and getting started
&lt;/h2&gt;

&lt;p&gt;The toolchain is complete: the &lt;code&gt;gsc&lt;/code&gt; CLI compiler (emitting managed PE + Portable PDB), the &lt;code&gt;gsi&lt;/code&gt; REPL/script runner, a &lt;strong&gt;C#-to-G# migrator &lt;code&gt;cs2gs&lt;/code&gt;&lt;/strong&gt;, a VS Code extension, and an LSP language server. Getting started takes three commands — all you need is the .NET SDK.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzi0q9htvkfz63bnw266.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftzi0q9htvkfz63bnw266.png" alt="Start G# in 3 steps: install template (dotnet new install Gsharp.Templates), create project (dotnet new gsharp-console -n HelloG), build and run (cd HelloG &amp;amp;&amp;amp; dotnet build &amp;amp;&amp;amp; dotnet run)"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new &lt;span class="nb"&gt;install &lt;/span&gt;Gsharp.Templates
dotnet new gsharp-console &lt;span class="nt"&gt;-n&lt;/span&gt; HelloG
&lt;span class="nb"&gt;cd &lt;/span&gt;HelloG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rewrite the generated &lt;code&gt;Program.gs&lt;/code&gt; to exercise data classes and structural equality:&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;package&lt;/span&gt; &lt;span class="n"&gt;HelloG&lt;/span&gt;
&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Name&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;Age&lt;/span&gt; &lt;span class="n"&gt;int32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;Person&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="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"${p.Name} (${p.Age})"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alice"&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="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;older&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;alice&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;Age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;31&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="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alice&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="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;older&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="n"&gt;alice&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alice"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alice (30)
Alice (31)
True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;with&lt;/code&gt;-copy and structural equality just work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it means for .NET developers
&lt;/h2&gt;

&lt;p&gt;G# fits teams that &lt;strong&gt;want React/Go/Kotlin-style modern syntax but real CLR interop&lt;/strong&gt;, folks learning or teaching .NET without starting from C#, and anyone who likes Go's packages or Kotlin/Swift null-safety on the CLR. It isn't a C# replacement — think of it as &lt;strong&gt;another language option on .NET&lt;/strong&gt;, one you can mix with existing C# code.&lt;/p&gt;

&lt;p&gt;That said, G# is &lt;strong&gt;pre-1.0&lt;/strong&gt; (v0.3). The 0.3 base is an implementation milestone, not a long-term compatibility guarantee; some interop is emit-only, and &lt;code&gt;cs2gs&lt;/code&gt; coverage is still expanding. Start with small experiments and learning, and keep up with updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the community is saying
&lt;/h2&gt;

&lt;p&gt;The signal boost came from Microsoft Distinguished Engineer David Fowler (ASP.NET Core, and much of the .NET stack). A short post — but coming from a central figure in the .NET community, it put G# on a lot of radars.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2075421408688222607-328" src="https://platform.twitter.com/embed/Tweet.html?id=2075421408688222607"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2075421408688222607-328');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2075421408688222607&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is G# a replacement for C#?&lt;/strong&gt;&lt;br&gt;
No — it's &lt;strong&gt;another language option on .NET&lt;/strong&gt;. It compiles to managed assemblies and interops with C#, so you can mix it with existing code. It suits teams who prefer a smaller, more predictable syntax or Go/Kotlin/Swift-style design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use existing .NET libraries (NuGet, BCL)?&lt;/strong&gt;&lt;br&gt;
Yes — BCL, NuGet packages, and your own code are all callable, with LINQ, bracket generics &lt;code&gt;[]&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;-&lt;code&gt;in&lt;/code&gt;, and P/Invoke. It sits on MSBuild and Portable PDB, so &lt;code&gt;dotnet build&lt;/code&gt;/&lt;code&gt;run&lt;/code&gt; and debugging work as usual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it production-ready?&lt;/strong&gt;&lt;br&gt;
It's pre-1.0 (v0.3), so there's no long-term compatibility guarantee yet. Some interop is emit-only and the migrator is still growing. Start with validation, learning, and small experiments.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://davidobando.github.io/gsharp/" rel="noopener noreferrer"&gt;G# documentation &amp;amp; tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/DavidObando/gsharp" rel="noopener noreferrer"&gt;DavidObando/gsharp (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/pulse/meet-g-modern-net-language-go-kotlin-swift-ergonomics-david-obando-lwofc/" rel="noopener noreferrer"&gt;Meet G#: a modern .NET language (David Obando, LinkedIn)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/davidfowl/status/2075421408688222607" rel="noopener noreferrer"&gt;@davidfowl on X&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://withnext.net/articles/gsharp-modern-dotnet-language" rel="noopener noreferrer"&gt;WithNext.NET&lt;/a&gt;, where we write about .NET modernization, performance, and applied AI.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>programming</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>JsxCore: write React/TSX views in ASP.NET Core, with no Node.js</title>
      <dc:creator>withNext.NET</dc:creator>
      <pubDate>Tue, 04 Aug 2026 17:52:48 +0000</pubDate>
      <link>https://dev.to/withnextdotnet/jsxcore-write-reacttsx-views-in-aspnet-core-with-no-nodejs-218m</link>
      <guid>https://dev.to/withnextdotnet/jsxcore-write-reacttsx-views-in-aspnet-core-with-no-nodejs-218m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on our engineering blog, &lt;strong&gt;&lt;a href="https://withnext.net/articles/jsxcore-jsx-view-engine" rel="noopener noreferrer"&gt;WithNext.NET&lt;/a&gt;&lt;/strong&gt;. It's reposted here with the canonical link pointing back to the original.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You want React and TypeScript on the front end, but pulling a whole &lt;strong&gt;Node.js + npm + bundler&lt;/strong&gt; toolchain into a .NET project feels heavy. That trade-off has been a quiet pain for a lot of ASP.NET Core developers. &lt;strong&gt;JsxCore&lt;/strong&gt;, an about-to-ship library by UK developer David Whitney, rethinks it: it's a view engine that lets you &lt;strong&gt;write ASP.NET Core views in JSX/TSX and render them with React or Preact&lt;/strong&gt; — and its headline feature is that it runs on the &lt;strong&gt;.NET SDK alone, with no Node.js required&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post walks through what JsxCore solves, how you write it, and what it means for .NET teams, based on the project's GitHub repository.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🆕 &lt;strong&gt;Follow-up:&lt;/strong&gt; JsxCore has since shipped &lt;strong&gt;1.0.0&lt;/strong&gt;, and its author is now bringing C# to Astro with a PoC called &lt;strong&gt;AstroSharp&lt;/strong&gt; — &lt;a href="https://dev.to/withnextdotnet/jsxcore-hits-10-and-its-author-is-bringing-c-to-astro-astrosharp-dc0"&gt;read the follow-up&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is JsxCore?
&lt;/h2&gt;

&lt;p&gt;JsxCore aims to bring a &lt;strong&gt;"vite-like developer experience to the .NET ecosystem."&lt;/strong&gt; You write your views as &lt;code&gt;.tsx&lt;/code&gt; files and return them from a controller or a Minimal API. Each view can render on the &lt;strong&gt;server&lt;/strong&gt; (for the first paint and SEO), in the &lt;strong&gt;browser&lt;/strong&gt; (for interactivity), or &lt;strong&gt;both&lt;/strong&gt;. TypeScript is transpiled automatically, and the browser resolves the module graph &lt;strong&gt;without a bundler&lt;/strong&gt;. It's MIT-licensed and targets &lt;strong&gt;.NET 8, 9, and 10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Both React and Preact are supported (Preact ships built-in; React via restoration). Because JsxCore registers as an ASP.NET Core &lt;code&gt;IViewEngine&lt;/code&gt;, it also plays nicely with classic MVC and &lt;code&gt;return View()&lt;/code&gt;. In other words, you get &lt;strong&gt;"the feel of React" and "the conventions of ASP.NET Core" in a single project.&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyhat953kxjo83ok4e2g6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyhat953kxjo83ok4e2g6.png" alt="How JsxCore works: a .tsx view renders on the server inside the .NET process (calling C# services directly, generating the first HTML and TS types) and then hydrates in the browser without a bundler. No Node.js required." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;You add one NuGet package. &lt;strong&gt;No Node.js install&lt;/strong&gt; — the .NET SDK is all you need.&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 JsxCore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a Minimal API, you register JsxCore and return a view. Build the model in C# and hand it to a &lt;code&gt;.tsx&lt;/code&gt; view:&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;JsxCore.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;JsxCore.Mvc&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;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="nf"&gt;AddJsxCore&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;UseJsxCore&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;MapGet&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Extensions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Jsx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Home/Index"&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;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"World"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Views/Home/Index.tsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&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="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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a real editor, the C# &lt;code&gt;Program.cs&lt;/code&gt; and the &lt;code&gt;.tsx&lt;/code&gt; view sit side by side. Notice the &lt;code&gt;.tsx&lt;/code&gt; line &lt;code&gt;import type { IndexModel } from "dotnet:SampleApp.React"&lt;/code&gt; — your &lt;strong&gt;C# model type is pulled straight into TypeScript through the &lt;code&gt;dotnet:&lt;/code&gt; scheme&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmki6symgjl3ke23w0qdu.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmki6symgjl3ke23w0qdu.png" alt="Rider showing Program.cs (registering JsxCore and returning a Jsx view from a Minimal API, with a [JsxModel] record) next to Index.tsx (importing types from dotnet: and using React's useState)" width="800" height="832"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;C# &lt;code&gt;Program.cs&lt;/code&gt; and &lt;code&gt;Index.tsx&lt;/code&gt;. The &lt;code&gt;dotnet:&lt;/code&gt; import brings C# types into the TSX side (source: JsxCore repository).&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works — calling C# straight from a view
&lt;/h2&gt;

&lt;p&gt;The key idea is that &lt;strong&gt;server rendering runs inside the .NET process&lt;/strong&gt;. Because there's no separate Node.js process in the middle, a view can &lt;strong&gt;call your C# services synchronously, with no bridge overhead&lt;/strong&gt;. You don't have to round-trip through an API to fetch data; the view can reach straight into your application logic.&lt;/p&gt;

&lt;p&gt;The screenshot below is the sample app's ".NET globals" tab. The total stock value, the server time, and a low-stock list are all &lt;strong&gt;read from a C# service while the page renders&lt;/strong&gt;. The front-end component has a direct line into the .NET world.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8dnu8414gr2ob5hmi9mr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8dnu8414gr2ob5hmi9mr.png" alt="JsxCore sample app '.NET globals' screen: 'Reading .NET from a view', total stock value 10830.57 read from a C# service during rendering, server time, and a low-stock list, footer 'Rendered by JsxCore'" width="800" height="479"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;C# services are called during rendering to draw the stock value and server time (source: JsxCore repository).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On top of that, JsxCore &lt;strong&gt;generates TypeScript type definitions from your C# view models&lt;/strong&gt;. That prevents the server/client "drift" where types silently diverge, and your &lt;code&gt;.tsx&lt;/code&gt; gets written against generated, type-safe models. TypeScript and esbuild are handled with &lt;strong&gt;zero configuration&lt;/strong&gt;, so you don't lose time wiring up the toolchain.&lt;/p&gt;
&lt;h2&gt;
  
  
  Developer experience — comfortable without Node.js
&lt;/h2&gt;

&lt;p&gt;The DX details are where JsxCore shines. You can &lt;strong&gt;install and use npm packages without Node.js installed&lt;/strong&gt;. TypeScript type errors show up instantly on hot reload, surfaced as a &lt;strong&gt;browser overlay right on the page&lt;/strong&gt;. In the example below, &lt;code&gt;Index.tsx(15,7)&lt;/code&gt; reports &lt;code&gt;TS2322&lt;/code&gt; (&lt;code&gt;string&lt;/code&gt; is not assignable to &lt;code&gt;number&lt;/code&gt;) — the feedback loop is fast.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4zjtve9g1hus8hohqdtl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4zjtve9g1hus8hohqdtl.png" alt="JsxCore hot-reload error overlay: red 'TypeScript compilation failed' with '../../Views/Home/Index.tsx(15,7): error TS2322: Type string is not assignable to type number.'" width="800" height="129"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Hot reload surfaces TypeScript compilation errors as a browser overlay (source: JsxCore repository).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The render mode is configurable — &lt;code&gt;AddJsxCore(options =&amp;gt; options.DefaultRenderMode = RenderMode.ServerAndClient)&lt;/code&gt; gives you a &lt;strong&gt;"server + client"&lt;/strong&gt; mode that paints fast on the server and then hydrates for interactivity. React's &lt;code&gt;useState&lt;/code&gt;, hooks, and ESM &lt;code&gt;import&lt;/code&gt; all work as usual, so the learning curve for React developers is small.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it means for .NET teams
&lt;/h2&gt;

&lt;p&gt;JsxCore is a strong fit when &lt;strong&gt;your backend is .NET and you want the feel of React/TypeScript on the front end&lt;/strong&gt;. You get first-paint server rendering for SEO &lt;em&gt;and&lt;/em&gt; post-click interactivity from a single component model, and you can &lt;strong&gt;reach C# assets without an API hop or serialization&lt;/strong&gt;. Keeping your React skills while dropping the Node.js runtime and a separate build pipeline is a real maintenance win.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6beuq2el9gdz04pe4dl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6beuq2el9gdz04pe4dl.png" alt="What you need to add React to your front end: the traditional Node.js stack (Node runtime, npm + bundler, a build separate from .NET, manual type syncing) versus JsxCore (.NET SDK only, npm without Node, same build as .NET, TS types generated from C#)" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That said, JsxCore is a &lt;strong&gt;young project&lt;/strong&gt; (a few dozen GitHub stars at the time of writing), and its API and rendering behavior may still move. Before adopting it in production, try your own use cases (auth, streaming, large pages) against the sample app and make sure you can keep up with updates. Unlike &lt;strong&gt;Blazor&lt;/strong&gt;, which is "all C#," JsxCore is about &lt;strong&gt;bringing React/TSX skills and assets into .NET&lt;/strong&gt; — so pick it based on your team's skill set.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the community is saying
&lt;/h2&gt;

&lt;p&gt;The heads-up came from the author himself: server and client rendering, hooks, ESM imports, direct binding to C#, and transparent TypeScript type generation for server-side code — "it's really cool, coming soon," with follow-ups about native React support for ASP.NET Core MVC aimed at people used to Next.js.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2082220178062950894-590" src="https://platform.twitter.com/embed/Tweet.html?id=2082220178062950894"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2082220178062950894-590');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2082220178062950894&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;The reaction reflects real enthusiasm for full-stack C#. Developer Luke Parker riffed on it — half-joking that he'd "decided to rewrite opencode in C#" — a sign that "C# all the way to the front end" is genuinely moving people.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2084462147384557583-778" src="https://platform.twitter.com/embed/Tweet.html?id=2084462147384557583"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2084462147384557583-778');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2084462147384557583&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need Node.js to use JsxCore?&lt;/strong&gt;&lt;br&gt;
No. You only need the .NET SDK; JsxCore handles TypeScript compilation, esbuild, and even fetching npm packages. There's no Node.js runtime to provision in dev or prod.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use React and Preact?&lt;/strong&gt;&lt;br&gt;
Both. Preact ships built-in and React is available via restoration. Standard React idioms — &lt;code&gt;useState&lt;/code&gt;, hooks, ESM imports — work as-is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is this different from Blazor?&lt;/strong&gt;&lt;br&gt;
Blazor writes UI in C# and Razor — an "all-C#" approach. JsxCore instead &lt;strong&gt;brings JSX/TSX and React/Preact into ASP.NET Core&lt;/strong&gt;, so you can reuse existing React/TypeScript knowledge and code. Choose based on your team's skills and what you want from the front end.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/davidwhitney/JsxCore" rel="noopener noreferrer"&gt;davidwhitney/JsxCore (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://x.com/david_whitney/status/2082220178062950894" rel="noopener noreferrer"&gt;@david_whitney on X&lt;/a&gt; / &lt;a href="https://x.com/LukeParkerDev/status/2084462147384557583" rel="noopener noreferrer"&gt;@LukeParkerDev on X&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://withnext.net/articles/jsxcore-jsx-view-engine" rel="noopener noreferrer"&gt;WithNext.NET&lt;/a&gt;, where we write about .NET modernization, performance, and applied AI.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>TensorSharp: a pure C# / .NET GGUF inference engine that takes on llama.cpp</title>
      <dc:creator>withNext.NET</dc:creator>
      <pubDate>Tue, 04 Aug 2026 05:20:54 +0000</pubDate>
      <link>https://dev.to/withnextdotnet/tensorsharp-a-pure-c-net-gguf-inference-engine-that-takes-on-llamacpp-1l18</link>
      <guid>https://dev.to/withnextdotnet/tensorsharp-a-pure-c-net-gguf-inference-engine-that-takes-on-llamacpp-1l18</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article was originally published on our engineering blog, &lt;strong&gt;&lt;a href="https://withnext.net/articles/tensorsharp-dotnet-llm-inference" rel="noopener noreferrer"&gt;WithNext.NET&lt;/a&gt;&lt;/strong&gt;. It's reposted here with the canonical link pointing back to the original.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On the local-LLM community &lt;strong&gt;r/LocalLLaMA&lt;/strong&gt;, a .NET inference engine called &lt;strong&gt;TensorSharp&lt;/strong&gt; drew attention by publishing benchmarks against llama.cpp. Most inference engines are built on C/C++ or Python, so a project that implements the core of LLM inference in &lt;strong&gt;pure C# / .NET&lt;/strong&gt; is worth a close look — especially if .NET is your home turf and you'd like to pull AI inference into that stack.&lt;/p&gt;

&lt;p&gt;This post summarizes what TensorSharp actually does and how it compares to llama.cpp, based on the author's Reddit post and GitHub repository. The numbers below are the author's own measurements, and I add a .NET-developer perspective on top.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is TensorSharp?
&lt;/h2&gt;

&lt;p&gt;TensorSharp is a &lt;strong&gt;native .NET inference engine&lt;/strong&gt; for models in the GGUF format. It's developed by zhongkaifu and released under the BSD-3-Clause license. It ships with a console app, a web-based chatbot UI, and Ollama- / OpenAI-compatible HTTP APIs so you can call it from your own programs. It runs on Windows, macOS, and Linux, and can use the GPU.&lt;/p&gt;

&lt;p&gt;The important part: this is &lt;strong&gt;not just a C# wrapper around llama.cpp&lt;/strong&gt;. The author states the engine was implemented bottom-up, and when running on the CPU backend it is 100% pure C#. On top of that it implements CUDA, MLX, and GGML backends — the GGML backend is referenced as an external project, with several fused operations layered on top. Supported backends span Metal (macOS), CUDA (NVIDIA), Vulkan (general GPU), and CPU, all with CPU fallback.&lt;/p&gt;

&lt;p&gt;Model coverage is broad, too: Gemma 3 / 4, Qwen 3 / 3.5 / 3.6, GPT-OSS, Nemotron-H, Mistral 3, and even multimodal models such as DiffusionGemma and Qwen-Image-Edit. It handles image, video, and audio input, PDF documents, tool calling, thinking mode, and structured output. Notably, quantizations like Q4_K_M, Q8_0, MXFP4, and IQ2_XXS are &lt;strong&gt;computed directly, without a dequantization step&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks against llama.cpp
&lt;/h2&gt;

&lt;p&gt;The author's benchmarks compare TensorSharp and llama.cpp on the &lt;strong&gt;same backend&lt;/strong&gt;, reporting the geometric mean of the speed ratio per scenario. Above 1.00× means TensorSharp is faster; &lt;em&gt;decode&lt;/em&gt; and &lt;em&gt;prefill&lt;/em&gt; are throughput, while &lt;em&gt;TTFT&lt;/em&gt; is the latency to the first token. Measurements cover both CUDA and Vulkan across several models.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmu1ujac77m106vviav01.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmu1ujac77m106vviav01.png" alt="TensorSharp vs. llama.cpp benchmark table comparing decode, prefill, and TTFT speed ratios across Gemma 4 and Qwen 3.6 models on CUDA and Vulkan" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;TensorSharp vs. llama.cpp benchmarks (source: Reddit r/LocalLLaMA / the project author)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The results vary by model and backend. Prefill and TTFT favor TensorSharp in many cases — for example, Gemma 4 E4B on CUDA shows prefill at &lt;strong&gt;1.28×&lt;/strong&gt; and TTFT at 1.27×. Decode, on the other hand, hovers around 1.0, and on Qwen 3.6 35B-A3B (Vulkan) it drops to 0.87×, below llama.cpp. On Qwen 3.6 27B dense, prefill / TTFT fall under 1.0 instead. In other words, it is &lt;strong&gt;not uniformly faster&lt;/strong&gt;. The author describes the overall result as "on par with llama.cpp," and that cautious framing matches what the numbers show.&lt;/p&gt;

&lt;p&gt;What's genuinely notable is that a &lt;strong&gt;pure .NET implementation reaches this level at all&lt;/strong&gt;. Inference engines are a dense mix of matrix math and memory management — historically the exclusive domain of C/C++. Seeing C# land in the same range says something about the maturity of .NET's runtime performance and ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimizations it brings in
&lt;/h2&gt;

&lt;p&gt;TensorSharp actively borrows recent inference optimizations. The author says they adapted &lt;strong&gt;paged KV cache&lt;/strong&gt; and continuous batching from vLLM, an SSD-based cache for MoE models from oMLX, and GGUF quantization from llama.cpp. The KV cache supports prefix sharing via block hashing and an iteration-level scheduler, and continuous batching is on by default.&lt;/p&gt;

&lt;p&gt;For Qwen 3.6 and Gemma 4 it supports &lt;strong&gt;speculative decoding via MTP / NextN&lt;/strong&gt;, and tensor parallelism follows Megatron-LM's column/row parallel patterns, extending toward multiple GPUs and multi-node TCP clustering. Multi-GPU support came up in the Reddit comments; the author replied that PRs for both single-node multi-GPU and multi-node are in progress and under active development. It's fair to read this area as still evolving.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it means for .NET teams
&lt;/h2&gt;

&lt;p&gt;When teams bring local LLMs into production, the common shape is a Python-side model server that the application calls over HTTP. That works, but it doubles the runtime and adds deployment and operational surface. A credible option where the &lt;strong&gt;inference engine itself runs on .NET&lt;/strong&gt; invites you to revisit that architecture. Because TensorSharp exposes Ollama- / OpenAI-compatible APIs, you can often swap it in without rewriting much of your existing client code.&lt;/p&gt;

&lt;p&gt;That said, production adoption calls for a level head. The benchmarks scatter across models and backends, and multi-GPU support is still in development. The sound approach is to measure with your own target models and hardware, compare against llama.cpp or your current setup, and decide from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;TensorSharp implements GGUF inference in pure .NET and, in the author's benchmarks, reaches the same range as llama.cpp. Prefill and TTFT lead in many cases, while decode ties or trails — it isn't a blanket win. Even so, the fact that &lt;strong&gt;completing LLM inference in C# alone is now within practical reach&lt;/strong&gt; is significant, and it's worth watching for any team that wants to fold AI into a .NET stack.&lt;/p&gt;

&lt;p&gt;If you'd like the fuller Japanese write-up with additional context, it lives on the original post: &lt;strong&gt;&lt;a href="https://withnext.net/articles/tensorsharp-dotnet-llm-inference" rel="noopener noreferrer"&gt;TensorSharp — a pure C# GGUF inference engine that takes on llama.cpp | WithNext.NET&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/LocalLLaMA/comments/1v6ect8/benchmarks_tensorsharp_vs_llamacpp/" rel="noopener noreferrer"&gt;Benchmarks: TensorSharp vs. llama.cpp (Reddit r/LocalLLaMA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zhongkaifu/TensorSharp" rel="noopener noreferrer"&gt;zhongkaifu/TensorSharp (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;We write about .NET / C# modernization, performance, and applied AI at &lt;a href="https://withnext.net/articles" rel="noopener noreferrer"&gt;WithNext.NET&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>llm</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
