Rask.Query
0.23.1-alpha.0.43
See the version list below for details.
dotnet add package Rask.Query --version 0.23.1-alpha.0.43
NuGet\Install-Package Rask.Query -Version 0.23.1-alpha.0.43
<PackageReference Include="Rask.Query" Version="0.23.1-alpha.0.43" />
<PackageVersion Include="Rask.Query" Version="0.23.1-alpha.0.43" />
<PackageReference Include="Rask.Query" />
paket add Rask.Query --version 0.23.1-alpha.0.43
#r "nuget: Rask.Query, 0.23.1-alpha.0.43"
#:package Rask.Query@0.23.1-alpha.0.43
#addin nuget:?package=Rask.Query&version=0.23.1-alpha.0.43&prerelease
#tool nuget:?package=Rask.Query&version=0.23.1-alpha.0.43&prerelease
<div align="center">
<img alt="Rask" src="https://raw.githubusercontent.com/pal-tamas/rask/main/assets/rask-logo.svg" width="280">
The .NET One Person Framework — build, run, and ship a whole product solo, in C#, on one server.
</div>
Write components as plain C# classes. Return a tree of HTML from Render(): state is a field, and an
event handler is a delegate. The same component code runs server-rendered with live WebSocket
updates or fully client-side on WebAssembly.
Rask is a superset, not a rival: React, Vue, Svelte, Angular and Lit components, real Blazor components
(Rask.Blazor), TypeScript SPAs and Nuxt or Next.js apps all run on it — and it builds on ASP.NET Core
and EF Core rather than replacing them.
[Route("/counter")]
public sealed partial class Counter : Component
{
private int _count;
protected override Component? Render() =>
Button.OnClick(() => _count++)[$"Current count: {_count}"];
}
Install
Prerequisites: none. The installer below adds whatever is missing — the .NET SDK, the
wasm-toolsworkload the WASM templates need, Node for the SPA templates — all under$HOME, nosudo. Already have the .NET 10 or 11 SDK?dotnet tool install -g Rask.Cliis the whole story.
curl -sSL https://rask.sh/rask.sh | sh # the rask CLI — scaffold, migrate, run, deploy
rask new MyApp # batteries included; or: -t wasm, or -t wasm-hosted
rask dev # run with hot reload — the first migration is already applied
rask deploy --host you@box --domain app.example.com # build + run on one box, over SSH
Or add to an existing project. Pick a host:
dotnet add package Rask # batteries included — the host plus every battery, all on
dotnet add package Rask.Server # the lean host on its own: server-rendered over WebSockets
dotnet add package Rask.Wasm # client-side WebAssembly
dotnet add package Rask.Spa.Hosting # host a built SPA on ASP.NET: a Rask WASM app or a TypeScript bundle
dotnet add package Rask.Meta.Hosting # host Nuxt/Next/SvelteKit/Start/SolidStart/Analog beside your C# (needs Node)
dotnet add package Rask.External # a .tsx/.vue/.svelte/Lit component as a Rask component (needs Node)
dotnet add package Rask.Blazor # a real Blazor component (MudBlazor, an RCL) as a Rask component
Tailwind is not on that list because it is not a package: the compiler ships inside Rask /
Rask.Server / Rask.Wasm, so any of them puts it in your build. Add a Styles/app.css holding
@import "tailwindcss";, link /css/app.css from your shell, and dotnet build compiles it — no
npm, no config file, nothing to switch on.
With Rask, that is the whole of Program.cs — every battery is on, and the file says only what this
app does without:
var app = RaskApp.Create(args);
app.Configure(c => c.Jobs.Off()); // this app has no background work
app.Run<App>();
Reference Rask.Server instead when you want the host with no database: it carries no EF Core and no
SQLite native bundles.
Then the batteries you want — each is opt-in, and every one is a AddRaskX<AppDbContext>() call plus
a modelBuilder.AddRaskX() schema line:
dotnet add package Rask.Data # declare a model and that is the data layer (no DbContext to write)
dotnet add package Rask.Api # host API controllers and minimal APIs, with a real 404 under /api
dotnet add package Rask.Api.Client # typed clients generated from those endpoints — no URL at the call site
dotnet add package Rask.Wire # reflection-free JSON primitives the generated codecs call
dotnet add package Rask.Cqrs # source-generated CQRS/mediator (queries, commands, notifications)
dotnet add package Rask.Cqrs.Client # dispatch a message to the server from a WASM client
dotnet add package Rask.Query # cache, dedup and invalidate dispatched queries per session
dotnet add package Rask.Cqrs.Server # host the endpoint those clients dispatch to
dotnet add package Rask.Auth # accounts: register, sign in, sign out, confirm, reset
dotnet add package Rask.Auth.Client # the same flows from a WebAssembly client
dotnet add package Rask.Auth.Api # the same accounts as JSON only, for a host that renders nothing
dotnet add package Rask.Jobs # durable background jobs
dotnet add package Rask.Mail # transactional email queue
dotnet add package Rask.Cache # read-through cache
dotnet add package Rask.Outbox # transactional outbox for domain events
dotnet add package Rask.Storage # keep uploaded files, with a row per file on your database
dotnet add package Rask.Logging # durable log store (its own SQLite file)
dotnet add package Rask.Dashboard # the /_rask operator dashboard over every pillar
dotnet add package Rask.Ui # the component kit those surfaces are drawn with
dotnet add package Rask.DevTools # the in-page devtools (wire, component tree), Debug-only, absent from every Release publish
dotnet add package Rask.WebPush # send Web Push notifications from the backend
dotnet add package Rask.Signaling # host the WebRTC signaling relay ISignaling connects to
Database — SQLite, treated as a real production database:
dotnet add package Rask.SQLite # production pragmas (WAL, busy_timeout) via UseRaskSqlite
dotnet add package Rask.SQLite.EntityFrameworkCore # the EF Core provider glue
dotnet add package Rask.SQLite.Litestream # managed continuous replication
dotnet add package Rask.SQLite.Snapshots # scheduled Online-Backup-API copies
dotnet add package Rask.SQLite.Browser # a persistent SQLite database inside a WASM app
SQLite stays the default. When one box is no longer enough:
dotnet add package Rask.Postgres # PostgreSQL via UseRaskPostgres: session timeouts + retry
dotnet add package Rask.SqlServer # SQL Server via UseRaskSqlServer: XACT_ABORT, lock timeout + retry
UI and testing:
dotnet add package Rask.Validation.FluentValidation # AbstractValidator<T>; DataAnnotations is built in
dotnet add package Rask.Testing # render + drive components in unit tests
Why Rask
After 15+ years building full-stack .NET apps — WebForms, MVC, Angular and React over a C# API — I wanted the front end
back in C# without .razor mixing markup and code. So Rask makes a component a plain C# class that returns a tree, runs
the same code on Server or WASM, and treats the network as the bottleneck (a state change ships a minimal diff, not
the page). It's a craft project built in the open, deep on Roslyn source generators and tree diffing.
- One component model, two hosts — the same C# component runs Server (live diff over WS) or WASM.
- Markup is a chain — a Roslyn generator emits
Div.Class("panel"),Counter.Start(3)and type-safe routes, so the IDE lists every step and a missing one is a compile error. - Scoped CSS & TypeScript — sibling
Component.css/Component.ts, compiled with no npm, content-addressed and cached. - Routing, lifecycle, forms, validation, auth — batteries included, no JavaScript required.
- Toast messages — inject
IToasterfor transient messages that survive a client-side navigation. - Tiny live updates — a minimal edit-op diff ships instead of the whole page.
- Slow-link aware — WASM boot shows download progress; a slow Server round-trip surfaces a pending bar.
Links
- 📖 Documentation · Getting started · Configuration · Observability · Accessibility
- 🚀 Live demo
- 💻 Source & README
- 🤖 AI assistant guide
Licensed under MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. net11.0 is compatible. |
NuGet packages (3)
Showing the top 3 NuGet packages that depend on Rask.Query:
| Package | Downloads |
|---|---|
|
Rask.Wasm
The Rask browser host: runs a Rask app's C# components client-side on .NET WebAssembly, with the client halves of the batteries — the mediator and query cache, remote dispatch, accounts, validation and the component kit — on by default. Ships the JS boot scripts, the page shell, and the MSBuild integration that stages them into the published bundle — and, opted in, prerenders every route to static HTML with a sitemap.xml at publish, so a static host serves real pages to visitors and crawlers. Depends on Rask, the shared core. |
|
|
Rask.Server
The ASP.NET host for Rask, a full-stack .NET web framework, with every battery: database (SQLite, PostgreSQL or SQL Server, picked by Rask:Database:Provider), mediator and query cache, accounts, background jobs, transactional email, cache, file storage, outbox, operator dashboard, durable logs, Web Push, SQLite snapshots and continuous backup. Renders Rask components with live updates over a WebSocket. RaskApp.Create(args).Run<App>() is the whole Program.cs; app.Configure(c => c.Jobs.Off()) is how an app does without one. Depends on Rask, the shared core. |
|
|
Rask.Data
A .NET data layer for Entity Framework Core apps where you declare DDD aggregates and nothing else: no DbContext class, no DbSet property, no IEntityTypeConfiguration, no registration, and no IDbContextFactory injected to read a row. `Entity<TId>` carries Id and audit timestamps, and `Aggregate<TId>` adds a Version concurrency token, domain events and opt-in soft delete (`Deletes = Deletion.Soft`); a source generator builds the EF model from every one it finds, so nothing is reflected and a trimmed publish cannot drop a table. Value objects need no marker and map as EF complex types. Reads go through a generated read face (`Product.Read.Where(...)`, `Product.Read.Search(text)`, `Product.Read.AsQueryable()`) via C# 14 static extension members, always untracked, each on its own short-lived context. The generator also writes a nullable form model, `ProductModel`, for every aggregate, with its defaults, `ToModel()` and validation attributes; the generated writes (Product.CreateAsync(model), Product.UpdateAsync(id, model), Product.DeleteAsync(id)) take it, with an optional lambda for values the form does not carry and an optional DbContext to join; anything richer is plain EF Core through an injected context. Strongly-typed ids get a generated value converter, mapping rules live in a static Configure on the type, and interceptors drive audit stamps, opt-in soft delete, multi-tenancy (`Tenancy.PerTenant`, the tenant read from the signed-in user), optimistic concurrency and after-commit domain-event publication through Rask.Cqrs. `Current.UserId` answers who is signed in from code with nothing injected. Ranked full-text search is declared with `HasFullTextSearch` and read with `Product.Read.Search(text)`, on SQLite, PostgreSQL and in the browser. A class that does not derive from Entity stays ordinary EF Core. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.23.1-alpha.0.84 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.82 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.81 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.80 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.79 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.78 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.76 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.74 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.72 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.70 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.69 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.68 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.67 | 0 | 9/25/2026 |
| 0.23.1-alpha.0.66 | 24 | 9/24/2026 |
| 0.23.1-alpha.0.65 | 24 | 9/24/2026 |
| 0.23.1-alpha.0.64 | 24 | 9/24/2026 |
| 0.23.1-alpha.0.62 | 26 | 9/24/2026 |
| 0.23.1-alpha.0.61 | 30 | 9/24/2026 |
| 0.23.1-alpha.0.43 | 41 | 9/23/2026 |
| 0.23.0 | 146 | 9/18/2026 |