Developers
Tools that finish the job .NET left open.
A data library, a notebook with an embeddable engine, and browser automation with an MCP server. Native to .NET, documented alongside the code, and plain about what's free.
# The in-memory DataBlock $ dotnet add package Datafication.Core # A connector for each format you read, CSV here $ dotnet add package Datafication.CsvConnector # VelocityDataBlock, when the data outgrows memory $ dotnet add package Datafication.Storage.Velocity
# The command line: browser editor, CI runs, conversions $ dotnet tool install -g Verso.Cli $ verso serve my-notebook.verso $ verso run pipeline.verso --param region=us-east # The engine, inside your own app $ dotnet add package Verso
# The library and a test adapter $ dotnet add package Motus $ dotnet add package Motus.Testing.MSTest # The CLI: browsers, recorder and the MCP server $ dotnet tool install --global Motus.Cli $ motus install $ motus mcp
Datafication SDK
Commercial, free for small teamsAnalytical data processing for .NET. A column-oriented, in-memory DataBlock with a pandas-style API, a disk-backed VelocityDataBlock for data that outgrows memory, and connectors for the formats your data already lives in.
LINQ is wonderful until you need a moving average, a pivot or a join across two files. Analysis kept leaving .NET for another language or a spreadsheet, and the app that made the data never got to use it.
.NET teams who load, shape and analyze data inside their own applications, services and tools.
Load and shape
Every operation returns a new DataBlock, so a pipeline reads top to bottom and never changes its input.
using Datafication.Core.Data; using Datafication.Extensions.Connectors.CsvConnector; var sales = await DataBlock.Connector.LoadCsvAsync("sales.csv"); var result = sales .Where("region", "North America", ComparisonOperator.Equals) .Compute("profit_margin", "profit / revenue") .Where("profit_margin", 0.25, ComparisonOperator.GreaterThan) .GroupByAggregate("product_category", "revenue", AggregationType.Sum, "total_revenue") .Sort(SortDirection.Descending, "total_revenue");
using Datafication.Core.Data; using Datafication.Connectors.CsvConnector; using Datafication.Storage.Velocity; // Stream a large CSV to disk in batches, in the DFC columnar format var connector = new CsvDataConnector(new CsvConnectorConfiguration { Source = new Uri(Path.GetFullPath("data/orders.csv")) }); using var orders = new VelocityDataBlock("data/orders.dfc"); await connector.GetStorageDataAsync(orders, batchSize: 10000); await orders.FlushAsync(); // The same query API: Where, GroupByAggregate and Sort build a plan; Execute runs it var totals = orders .Where("region", "North America", ComparisonOperator.Equals) .GroupByAggregate("product_category", "revenue", AggregationType.Sum, "total_revenue") .Sort(SortDirection.Descending, "total_revenue") .Execute();
Where the data comes from
Install
dotnet add package Datafication.Coredotnet add package Datafication.CsvConnectordotnet add package Datafication.Storage.Velocity| License | Commercial. Free while fewer than five developers in your organization build with it and revenue is under $500,000 a year. Open-source projects with under $500,000 a year in funding are exempt from the developer limit. |
|---|---|
| Connectors | CSV, Parquet, JSON, Excel, ADO.NET, Web, S3, text |
| Runtime | .NET 8.0 or later; Windows, macOS, Linux |
| Released | Datafication.Core 1.0 on 2026-01-09 |

Verso
MIT1.0 since 2026-02-20An interactive notebook platform and an embeddable .NET execution engine. Eight language kernels share one variable store, and every feature, including the built-in ones, is an extension.
Understanding data means load, look, reshape, look again. .NET developers needed a maintained notebook for that loop, and apps needed a notebook engine they could build on.
Developers exploring data in VS Code, the browser or a terminal, and teams putting a programmable notebook runtime inside their own product.
One variable store, eight kernels
A value set in C# is visible to Python, bound as a SQL parameter and substituted into Markdown. Nothing to import, nothing to declare.
ILanguageKernel, on the same interfaces the built-in kernels use.// [1] C# record Sale(string Region, decimal Revenue); var revenue = new[] { new Sale("East", 52_000m), new Sale("West", 38_500m) }; var threshold = 40_000m; # [2] Python: revenue and threshold came from the C# cell over = [r.Region for r in revenue if r.Revenue > threshold] -- [3] SQL: bound from the shared store SELECT * FROM orders WHERE total > @threshold <!-- [4] Markdown --> Regions above @threshold are on track this quarter.
using Verso; using Verso.Abstractions; using Verso.Extensions; var extensionHost = new ExtensionHost(); await extensionHost.LoadBuiltInExtensionsAsync(); var scaffold = new Scaffold(new NotebookModel(), extensionHost, filePath: null); scaffold.InitializeSubsystems(); scaffold.AddCell("code", language: "csharp", source: "var greeting = \"hello\";"); scaffold.AddCell("code", language: "csharp", source: "greeting.ToUpper()"); await scaffold.ExecuteAllAsync(); scaffold.Variables.Set("threshold", 0.95); var threshold = scaffold.Variables.Get<double>("threshold");
$ verso serve my-notebook.verso # open in the browser $ verso run pipeline.verso --param region=us-east --fail-fast $ verso convert notebook.ipynb --to verso $ verso repl --kernel fsharp
Install
Verso in the MarketplaceOpendotnet tool install -g Verso.Clidotnet add package Verso| Surfaces | VS Code, browser, terminal, CI. All run the same headless engine. |
|---|---|
| Formats | .verso, .ipynb, .md; imports .dib |
| Layouts | Dashboards, slides, spreadsheets, reactive graphs and an image compositor ship as extensions. |
| Runtime | .NET 8, .NET 10 |

Motus
MIT1.0 since 2026-03-29Browser automation and testing for .NET that talks straight to the browser over CDP and WebDriver BiDi. No Node.js sidecar, no driver binaries, and every built-in feature is a plugin you could have written yourself.
Browser testing from .NET meant borrowing another runtime: a proxy process or a driver binary per browser, a second toolchain in CI, and a boundary between your test and the page.
.NET teams who ship to the web and want tests that run in their own process, and anyone whose AI assistant needs a real browser to work in.
Nothing in between
using Motus; using Motus.Testing.MSTest; using static Motus.Assertions.Expect; [MotusTestClass] public class SearchTests : MotusTestBase { [TestMethod] public async Task SearchReturnsResults() { var page = await Context.NewPageAsync(); await page.GotoAsync("https://example.com"); await page.Locator("input[name='q']").FillAsync("motus automation"); await page.Locator("button[type='submit']").ClickAsync(); await That(page).ToHaveUrlAsync("**/search**"); await That(page.Locator(".results")).ToBeVisibleAsync(); } }
{
"mcpServers": {
"motus": {
"command": "motus",
"args": ["mcp"]
}
}
}
// Add capabilities by name when an assistant needs them:
// motus mcp --caps coordinates,recording,contexts,routingInstall
dotnet add package Motusdotnet add package Motus.Testing.MSTestdotnet tool install --global Motus.Cli| Protocols | CDP for Chromium, Chrome and Edge; WebDriver BiDi for Firefox |
|---|---|
| Test frameworks | MSTest, xUnit, NUnit |
| Built in | Auto-waiting locators and assertions, network interception, accessibility and performance audits, coverage, tracing, a recorder and code generation |
| Runtime | .NET 8, .NET 10; NativeAOT friendly |
Licenses, stated up front
We'd rather be clear about what's open and what pays for the open parts than blur the two.
| Product | License | What it means for you |
|---|---|---|
| Datafication SDK | Commercial | Free under five developers and $500,000 in yearly revenue. Open-source projects with under $500,000 a year in funding are exempt from the developer limit. Above that, a commercial license adds priority email support. |
| Verso | MIT | Use it, embed it, ship it. The license will not change under you. |
| Motus | MIT | Use it, extend it, ship it. The license will not change under you. |
Stuck, or missing something?
Email reaches the person who writes the code. Verso and Motus also take issues and pull requests on GitHub.
