Skip to main content
Open Source .NET Library

Ship SPA-Like Apps with Server-Rendered HTML

Bring Hotwire Turbo and Stimulus to ASP.NET Core. Partial page updates, real-time streams over SignalR, and Razor Pages you already know — no JavaScript framework required.

Program.cs
// Three lines. That's it. builder.Services.AddTurbo(); app.UseTurbo(); app.MapTurboHub();
NuGetnpmBuild

Already know Razor Pages? You're 90% there.

Tombatron.Turbo isn't a new framework to learn. It's a thin layer that makes your existing server-rendered pages feel like a SPA.

ASP.NET CoreRazor PagesSignalRTag HelpersDependency InjectionSource Generators

Why Tombatron.Turbo?

Everything you need to build rich, interactive web applications without leaving the server-rendered world.

01

Turbo Frames

Wrap any section in a <turbo-frame> and only that region updates on navigation. SPA-like speed with zero client-side routing.

02

Real-Time Streams

Push live DOM updates over SignalR. Append, prepend, replace, or remove elements from any connected client with a single method call.

03

Source-Generated Partials

The bundled source generator creates strongly-typed partial references at compile time. Typos become build errors, not runtime 500s.

04

Three-Line Setup

AddTurbo(), UseTurbo(), MapTurboHub() — Turbo.js, the SignalR bridge, and signed stream tokens are wired up automatically.

05

Razor All the Way Down

Tag helpers, partials, view models, DI — everything you already use. No component model, no virtual DOM, no new abstractions to learn.

06

Stimulus Controllers

Convention-based controller discovery via import maps. Drop a JS file in wwwroot/controllers/ and it auto-registers, with hot reload in dev.

See It in Action

From setup to real-time broadcasts in under a minute.

01

Register Services

// Program.cs
builder.Services.AddTurbo();
builder.Services.AddRazorPages();

app.UseTurbo();
app.MapTurboHub();
app.MapRazorPages();
02

Add a Turbo Frame

<turbo-frame id="cart" src="/cart"
loading="lazy">
<p>Loading cart...</p>
</turbo-frame>
03

Broadcast in Real-Time

await _turbo.Stream("orders", async b =>
{
await b.AppendAsync(
"list",
Partials.OrderRow,
newOrder);
});

How Does It Compare?

Blazor and Tombatron.Turbo both bring rich interactivity to .NET developers, but with different trade-offs. Pick the approach that fits your project.

Blazor Server

  • Persistent SignalR circuit per user
  • Stateful components with C# logic
  • Small download, higher server memory
  • Every interaction round-trips to server

Blazor WASM

  • .NET runtime in WebAssembly
  • Offline-capable after first load
  • Large initial download (~5-10 MB)
  • Full C# execution in the browser

Tombatron.Turbo

  • Stateless HTTP + targeted DOM updates
  • ~30 KB JS layer, no .NET in browser
  • Progressive enhancement built in
  • Standard Razor — no new component model

Ready to try a different approach?

Add one NuGet package to your existing ASP.NET Core app and start shipping faster, lighter web experiences today.

Read the Quickstart →
dotnet add package Tombatron.Turbo