The database that ships inside your .NET application.

NetlyDB stores your documents and files, answers LINQ queries, searches by keyword or meaning, and can give AI agents governed access to your data. It runs in your process: no database server to install, secure or keep running.

The NetlyDB Management UI running a query on 8,000 orders: 25 results, and the index that answered
Program.cs
// 1. Add the package
$ dotnet add package NetlyDB.SDK

// 2. Register the database and a collection
builder.Services
    .AddNetlyDB()
    .AddNetlyDBCollection<Order>();

// 3. Query the collection with LINQ
var page = await orders.Query()
    .Where(x => x.Country == "BE")
    .OrderByDescending(x => x.Total)
    .Take(25)
    .ToListAsync();
Data in memory, every change logged to local disk No connection string, no network hop
  • No database server to run
  • One package: NetlyDB.SDK
  • Three query front ends: LINQ, filter strings, JSON
  • Two kinds of search: keyword (BM25) and vector
  • 12 read-only MCP tools for AI agents
  • 5 health probes for your orchestrator

A library, not a server.

A client-server database is a separate process you install, patch, secure and keep running, and your application talks to it over the network. NetlyDB is a library: the engine runs in your application's process and your code calls it directly.

A separate database server

Something extra to install, secure, monitor and keep running. Every read and write crosses the network.

  1. Your application
  2. Network
  3. Database server
  4. Storage

Inside your .NET application

Data in memory, every change logged to local disk. Optional modules open the engine to a browser, other applications, AI agents or other nodes. Try the switches.

Your .NET application
Your code
NetlyDB engine
  • Documents
  • Files & media
  • LINQ queries
  • Indexes
  • Keyword & vector search

Optional modules

  • → your browserEnterprise
  • → other applicationsEnterprise
  • → AI agentsEnterprise
  • → other NetlyDB nodesEnterprise
Local disk: snapshots + write-ahead log

Embedded database only.

Reads never wait on disk
Each collection is held in memory, so the data you can hold is bounded by the memory you give the process.
Changes are logged first
Every change is committed to a checksummed write-ahead log before it is confirmed, and snapshots are written periodically.
Startup rebuilds the data
Each collection is rebuilt from its last snapshot and the log that follows it, the same way every time.
Modules are registrations
Adding the REST API, Management UI or MCP server does not change how your code uses its collections.
See the full deployment picture
NetlyDB running inside a single .NET application Your code calls the NetlyDB engine through in-process calls; the engine persists snapshots and a write-ahead log to local disk. Both run inside your .NET application. Optional modules you can switch on - a REST API, the management UI, an MCP server, an event stream and gRPC clustering - connect the engine to your services and clients, your team in a browser, AI agents, dashboards and further NetlyDB nodes. Your .NET application Your code NetlyDB Local disk snapshots + write-ahead log in-process calls persistence Modular design (choose from built-in modules) REST API HTTP + JSON Management UI browse, query, administer MCP server read-only AI tools Event stream live engine events gRPC Clustering replication Your services and clients Your team, in a browser AI agents Dashboards and monitors More NetlyDB nodes
Your code, the engine and the local store in one process. The optional modules connect the engine to your services, your team, AI agents, dashboards and further NetlyDB nodes.

.NET teams that want a real database without running one.

NetlyDB is for applications that own their data and run wherever you deploy them: on a server, on a customer's site, or on a machine that is sometimes offline. Records, files and search stay together, inside the app.

  • Business applications

    Internal and line-of-business apps that own their records, without a database team behind them.

  • Local and site applications

    Software that keeps working when the link to central systems does not.

  • Offline web apps

    Blazor WebAssembly apps that keep their data in the browser and keep working without a connection (in development).

  • Files and media

    Documents, photos and video managed alongside the records they belong to.

  • AI-enabled applications

    Search by meaning over your own data, and give AI assistants governed, read-only access.

  • Replicated (micro)services

    Several application instances, each holding a full copy of the data.

A natural fit when

  • Your application is .NET
  • You'd rather not run a database server
  • Your data fits in memory
  • Records and files belong together
  • You deploy on your own machines
  • Search or AI access would help
  • Each instance should keep working when another goes down

Look elsewhere when

  • You want a managed cloud database
  • Your data exceeds one machine's memory
  • You need cross-collection transactions, or replication with strong consistency and automatic failover
  • Most readers of the data aren't .NET

Records, files and searchable knowledge. One engine.

Your business objects

Orders, customers, products and settings, stored as your code shapes them and returned typed.

  • Typed C# collections
  • Dynamic JSON collections
  • LINQ and filter-string queries
  • Single, nested and compound indexes
  • Schema validation
  • Time-to-live
Documents & collections

Documents, images and video

Files next to the records they belong to, in virtual folders and with tags, without a separate file store.

  • Compressed file collections
  • Queryable metadata
  • Virtual folders
  • Tags and tag queries
  • Streaming reads
File collections

Search beyond exact matches

Find content by the words it contains, or by what it means, using embeddings from the model you choose.

  • BM25 full-text search
  • Phrases and +/- operators
  • Vector search: cosine, dot product, Euclidean
  • Exact (flat) or approximate (HNSW)
  • Bring your own embeddings
Search

The database your .NET application already speaks.

One package gives you storage, files, search and AI access. Your own C# types, dependency injection and LINQ. No infrastructure to stand up before the first line of business logic.

  1. Start simple

    One package, one line of setup, no infrastructure. Your first collection is a C# class.

  2. Familiar .NET

    Your own types, dependency injection and LINQ. Queries are checked by the compiler.

  3. Data and files in one place

    Records, documents and media live together. No separate file store to wire up and back up.

  4. Grow, don't migrate

    Files, search, a REST API, AI access and replication are part of the same product. Switch them on when you need them.

  5. Built to protect your data

    A write is confirmed only once it is safely logged. Recovery is deterministic, and it never guesses.

  6. Not a black box

    Health checks, stable error codes and recovery reports show what is happening, without putting your data in logs.

  7. You own the deployment

    Runs wherever your application runs. Licenses are verified offline, with no license server and no call home.

  8. Works without a network

    The database lives inside the application, so the application keeps working with all its data when the connection does not.

  9. Ready for AI

    Your data, searchable by meaning and reachable by AI agents through read-only tools, under your control.

Start embedded. Add what you need, one line at a time.

Every step is a registration on the same service collection. Your code keeps using the same collections while the database gains a console, APIs, AI access and replication.

  1. Embed

    A fully working database for documents, files, queries and search inside your app.

    AddNetlyDB()
    Community
  2. Operate

    A browser console for health, diagnostics, snapshots, queries and indexes, hosted by your app.

    AddNetlyDBManagementUI()
    Enterprise
  3. Integrate

    Let other applications and AI agents reach your data through a REST API and an MCP server.

    AddNetlyDBAPI()
    AddNetlyDBMCP()
    Enterprise
  4. Distribute

    Run several nodes that each hold a full copy of the data and replicate peer-to-peer.

    JoinCluster(seedNodes)
    Enterprise

Loads online. Keeps working offline.

The same engine, compiled to WebAssembly, will run inside a Blazor WebAssembly application. Your server delivers the app once; from then on the data lives on the visitor's device, and every read and write happens there, connection or not.

First visit: online

Your web server serves the application like any other site. NetlyDB is part of what the browser downloads.

  1. Your web server
  2. Network, once
  3. Blazor app + NetlyDB engine (WebAssembly)

From then on: fully local

The engine runs in a worker, off the UI thread, and stores its log and snapshots in the browser's private file system.

  1. Your Blazor UI
  2. NetlyDB engine in a worker
  3. OPFS, on the device
In development Where it stands. The real engine now runs end to end in a browser worker on OPFS, and recovers every confirmed write after the worker, or the whole browser, is killed mid-stream. It is tested on Chromium on Linux so far, and is planned for release 1.3.

See and manage what's inside.

EnterpriseAvailable

A browser console hosted by your own application, reading the engine in-process. Query with plans, browse documents and files, manage indexes and snapshots, and watch health and metrics. Sign-in required, local access by default.

Data explorer

Browse documents and files, right where they live.

Data explorer listing customer documents returned by a query
Documents matching a query, field by field.

Built for applications that work with AI.

NetlyDB doesn't run models. It keeps the data AI features depend on next to your application data, makes it searchable by meaning, and gives agents a governed, read-only way to reach it.

Search by meaning

A query like "something warm for winter hikes" finds the insulated trekking jacket, even though the product text never says "warm" or "winter". Store the embeddings from the model you use, and NetlyDB does the nearest-neighbour search.

  • Vector search: flat (exact) or HNSW (approximate), with every result labelled which it was
  • Cosine, dot product or Euclidean similarity
  • BM25 keyword search alongside, with phrases and operators
  • You bring the embeddings; automatic embedding generation is not yet published
Search by meaning in an embedding space Documents are points. The query "something warm for winter hikes" lands nearest the insulated trekking jacket, so that document is returned first even though its text shares no words with the query. "something warm for winter hikes" Insulated trekking jacket each dot is a document, placed by meaning
The example from the text, drawn out: the query lands nearest the jacket although they share no words. Which documents match depends on the embedding model you use.

Governed access for AI agents Enterprise

An MCP server gives assistants read-only tools over the collections you choose. An operator can ask for "customers above the age of 60, located in Belgium" and the agent builds a structured query that the server validates against your fields before it runs. The server never interprets free text as a query.

  • 12 read-only tools: browse, query, count, aggregate, full-text and semantic search
  • Collection allow-list and a cap on how many records any tool returns
  • API-key or JWT authentication, bound to the local machine by default
  • No insert, update or delete tools exist

Designed to fail predictably.

A database earns trust by what it does when things go wrong. NetlyDB states its guarantees narrowly, and its limits just as plainly.

The path of a write through NetlyDB A write is appended to a checksummed write-ahead log and only then confirmed to your code. Snapshots are published later as new generations. After a crash, recovery replays the log over the last snapshot. Your write Add, update, delete Write-ahead log checksummed, flushed to disk Confirmed returned to your code Snapshot a new generation, later 1 · logged before anything else 2 · confirmed means saved 3 · never overwritten in place After a crash: recovery replays the log over the last snapshot, the same way every time Ambiguity recovery cannot resolve stops writable startup and leaves a report.
What happens to a write, and what happens after a crash.
  • Confirmed means saved

    A write is confirmed only once it is committed to a checksummed write-ahead log. A crash does not lose it.

    Write-ahead log, group commit
  • No guessing

    An uncertain write is reported as uncertain, never as failed, and can be looked up later by its id.

    Resolvable mutation outcomes
  • Deterministic recovery

    Startup recovers the same way every time, or stops and explains why in a report.

    Snapshot generations, recovery reports
  • One owner

    Only one process writes to a store, and only in engine states that allow it.

    Store ownership, admission control
  • Correct answers first

    An index that is not ready is never used. The query scans instead: slower, never wrong.

    Versioned indexes, scan fallback
  • Nothing sensitive in diagnostics

    Diagnostic output never contains document values, credentials or key material, and never blocks a write.

    Diagnostic codes, audit trail
How this is tested. The engine's test suites run on Linux x64, Windows x64 and macOS arm64, and a release is certified only after crash, chaos and stress test campaigns in addition to unit and integration tests. NetlyDB does not yet publish performance or scale figures; they will be published once measured and certified.

From one line to a data layer.

Real code against the published NetlyDB.SDK API. Every sample can be pasted into an application.

Register NetlyDB and a typed collection in any .NET 10 host. Read more

var builder = Host.CreateApplicationBuilder(args);   // or WebApplication.CreateBuilder(args)

builder.Services
    .AddNetlyDB(options => options.StorageRoot = "netlydb-data")
    .AddNetlyDBCollection<Order>();

using var host = builder.Build();
await host.StartAsync();

var orders = host.Services.GetRequiredService<INetlyDBCollection<Order>>();

Explore the engine

Documents & collections

Typed and dynamic document collections, opened through dependency injection or the document store.

Available
Typed collections
Store your own C# classes and records, and get them back typed.
Dynamic JSON collections
Schema-free documents, for data without a .NET type.
Named collections
Several separate collections of the same type, each with its own name.
Document metadata
Ids and timestamps you can filter on with the Meta. prefix.
Time-to-live
Documents can expire and are removed automatically.
Schema validation
Optional per-collection rules reject writes with invalid fields.
Optimistic concurrency
Update or delete only if the document has not changed since you read it.
Read the documentation for documents & collections

Query playground

Query 50,000 generated demo orders with a real, embedded NetlyDB instance running inside this website. Queries are read-only.

Live instance
Matches 4,976
Query time 34.45ms

Reported by NetlyDB for this query’s execution, excluding parsing. Measured on a shared web server; not a benchmark.

Equivalent C# usage

// orders: IDocumentCollection<Order>, registered by AddNetlyDBCollection<Order>()
var result = await orders.WhereAsync("Country == \"BE\"");

IReadOnlyList<Order> matches = result.UnwrappedDocuments;
TimeSpan queryTime = result.Duration; // execution time reported by NetlyDB

JSON results (showing top 25 of 4,976)

[
  {
    "Reference": "ORD-010237",
    "CustomerName": "Summit Pulse Systems",
    "Country": "BE",
    "Status": "Pending",
    "Total": 19086.48,
    "CreatedAt": "2026-12-31T16:17:08Z",
    "Priority": "High",
    "LineCount": 17
  },
  {
    "Reference": "ORD-015800",
    "CustomerName": "Nova Stone Supplies",
    "Country": "BE",
    "Status": "Open",
    "Total": 13352.66,
    "CreatedAt": "2026-12-30T23:11:56Z",
    "Priority": "Low",
    "LineCount": 22
  },
  {
    "Reference": "ORD-017089",
    "CustomerName": "Global Stone Industries",
    "Country": "BE",
    "Status": "Pending",
    "Total": 7604.92,
    "CreatedAt": "2026-12-30T03:32:10Z",
    "Priority": "Medium",
    "LineCount": 19
  },
  {
    "Reference": "ORD-002001",
    "CustomerName": "North Forest Retail",
    "Country": "BE",
    "Status": "Pending",
    "Total": 17312.28,
    "CreatedAt": "2026-12-30T01:07:17Z",
    "Priority": "Low",
    "LineCount": 5
  },
  {
    "Reference": "ORD-014100",
    "CustomerName": "Grand Grid Industries",
    "Country": "BE",
    "Status": "Closed",
    "Total": 34650.87,
    "CreatedAt": "2026-12-29T23:12:37Z",
    "Priority": "Low",
    "LineCount": 36
  },
  {
    "Reference": "ORD-018867",
    "CustomerName": "Rapid Stone Works",
    "Country": "BE",
    "Status": "Closed",
    "Total": 47458.87,
    "CreatedAt": "2026-12-29T00:33:53Z",
    "Priority": "High",
    "LineCount": 27
  },
  {
    "Reference": "ORD-026162",
    "CustomerName": "Ever Pulse Partners",
    "Country": "BE",
    "Status": "Closed",
    "Total": 26016.07,
    "CreatedAt": "2026-12-28T05:15:43Z",
    "Priority": "Medium",
    "LineCount": 28
  },
  {
    "Reference": "ORD-046157",
    "CustomerName": "Nova Pulse Retail",
    "Country": "BE",
    "Status": "Open",
    "Total": 23058.82,
    "CreatedAt": "2026-12-28T04:01:12Z",
    "Priority": "Medium",
    "LineCount": 26
  },
  {
    "Reference": "ORD-002975",
    "CustomerName": "Grand Bridge Works",
    "Country": "BE",
    "Status": "Open",
    "Total": 19906.62,
    "CreatedAt": "2026-12-28T00:22:41Z",
    "Priority": "Critical",
    "LineCount": 27
  },
  {
    "Reference": "ORD-040818",
    "CustomerName": "Urban Pulse Logistics",
    "Country": "BE",
    "Status": "Closed",
    "Total": 37161.98,
    "CreatedAt": "2026-12-27T23:30:24Z",
    "Priority": "Low",
    "LineCount": 34
  },
  {
    "Reference": "ORD-049049",
    "CustomerName": "Global Point Labs",
    "Country": "BE",
    "Status": "Cancelled",
    "Total": 42261.63,
    "CreatedAt": "2026-12-27T12:42:30Z",
    "Priority": "High",
    "LineCount": 14
  },
  {
    "Reference": "ORD-031509",
    "CustomerName": "Prime Bridge Retail",
    "Country": "BE",
    "Status": "Cancelled",
    "Total": 7585.08,
    "CreatedAt": "2026-12-27T07:48:10Z",
    "Priority": "High",
    "LineCount": 7
  },
  {
    "Reference": "ORD-026778",
    "CustomerName": "Prime Stone Partners",
    "Country": "BE",
    "Status": "Closed",
    "Total": 38421.08,
    "CreatedAt": "2026-12-27T07:22:19Z",
    "Priority": "High",
    "LineCount": 14
  },
  {
    "Reference": "ORD-041316",
    "CustomerName": "Blue Market Partners",
    "Country": "BE",
    "Status": "Pending",
    "Total": 7069.56,
    "CreatedAt": "2026-12-27T03:12:04Z",
    "Priority": "High",
    "LineCount": 30
  },
  {
    "Reference": "ORD-049587",
    "CustomerName": "Silver Market Systems",
    "Country": "BE",
    "Status": "Pending",
    "Total": 10363.81,
    "CreatedAt": "2026-12-26T22:52:41Z",
    "Priority": "Critical",
    "LineCount": 5
  },
  {
    "Reference": "ORD-013334",
    "CustomerName": "North Line Supplies",
    "Country": "BE",
    "Status": "Pending",
    "Total": 30591.05,
    "CreatedAt": "2026-12-26T22:42:30Z",
    "Priority": "Critical",
    "LineCount": 21
  },
  {
    "Reference": "ORD-025056",
    "CustomerName": "Prime Forest Systems",
    "Country": "BE",
    "Status": "Pending",
    "Total": 32004.85,
    "CreatedAt": "2026-12-26T11:59:59Z",
    "Priority": "Critical",
    "LineCount": 3
  },
  {
    "Reference": "ORD-017383",
    "CustomerName": "Urban Market Works",
    "Country": "BE",
    "Status": "Pending",
    "Total": 21425.98,
    "CreatedAt": "2026-12-26T01:00:25Z",
    "Priority": "Low",
    "LineCount": 40
  },
  {
    "Reference": "ORD-001160",
    "CustomerName": "Urban Bridge Works",
    "Country": "BE",
    "Status": "Pending",
    "Total": 19439.16,
    "CreatedAt": "2026-12-26T00:18:51Z",
    "Priority": "Critical",
    "LineCount": 3
  },
  {
    "Reference": "ORD-000928",
    "CustomerName": "Silver Stone Labs",
    "Country": "BE",
    "Status": "Open",
    "Total": 7475.70,
    "CreatedAt": "2026-12-25T15:23:17Z",
    "Priority": "High",
    "LineCount": 24
  },
  {
    "Reference": "ORD-038343",
    "CustomerName": "Summit Line Logistics",
    "Country": "BE",
    "Status": "Pending",
    "Total": 37194.17,
    "CreatedAt": "2026-12-25T11:44:30Z",
    "Priority": "Medium",
    "LineCount": 38
  },
  {
    "Reference": "ORD-035173",
    "CustomerName": "Rapid Peak Trading",
    "Country": "BE",
    "Status": "Cancelled",
    "Total": 37415.40,
    "CreatedAt": "2026-12-25T01:50:26Z",
    "Priority": "Medium",
    "LineCount": 17
  },
  {
    "Reference": "ORD-003945",
    "CustomerName": "Urban Harbor Logistics",
    "Country": "BE",
    "Status": "Cancelled",
    "Total": 37723.34,
    "CreatedAt": "2026-12-24T23:03:04Z",
    "Priority": "Low",
    "LineCount": 35
  },
  {
    "Reference": "ORD-046432",
    "CustomerName": "Global Grid Holdings",
    "Country": "BE",
    "Status": "Open",
    "Total": 22829.66,
    "CreatedAt": "2026-12-24T19:49:43Z",
    "Priority": "Critical",
    "LineCount": 26
  },
  {
    "Reference": "ORD-021510",
    "CustomerName": "Rapid Point Labs",
    "Country": "BE",
    "Status": "Closed",
    "Total": 35590.45,
    "CreatedAt": "2026-12-24T14:22:59Z",
    "Priority": "Medium",
    "LineCount": 32
  }
]

Free to embed. Licensed to operate at scale.

Without a license NetlyDB runs as the Community edition: the complete embedded, single-node engine. Enterprise adds the modules to operate, integrate and distribute.

Community

Free

The complete embedded database, for any .NET 10 application.

  • Documents and files
  • LINQ, text and JSON queries, indexes
  • Full-text and vector search
  • Durable writes and recovery
  • Health checks, metrics meter and diagnostics
  • Backup and import
  • API-key authentication, compression, schema validation

Use governed by your license agreement with NetlySoft. Currently distributed through an early-access package feed.

Get started

Enterprise

Licensed

Everything in Community, plus the modules to operate, integrate and distribute.

  • Management UI
  • REST API
  • MCP server
  • Replication / clustering
  • Encryption at rest
  • JWT / OIDC sign-in

Licenses are signed tokens verified offline. No license server, no call home. Enabling an Enterprise feature without a valid license fails at startup with a clear error; an expired license keeps working during a grace period.

How licensing works

Where NetlyDB is today.

NetlyDB is released to early-access users through a restricted package feed (latest 1.2.0). It is not yet on NuGet.org. What is available, what is being built and what is not planned, stated plainly.

Early access

NetlyDB 1.2.0 is out for early-access users

1.2.0 brings a faster engine and stricter recovery, after 1.1.0 added clustering across machines. The release notes list every change; the documentation says, per capability, which release delivers it.

Available now

In development

Planned

  • A supported scale envelope
  • Online index rebuilds
  • Point-in-time recovery
  • Measured search quality

Not planned

  • Data larger than memory
  • Queries across cluster nodes
Development history, quarter by quarter
2025

2025 Q1 Delivered

Core Foundation

Storage abstractions, sharding, persistence and indexing foundations.

2025 Q2 Delivered

File Collections

Binary document storage for blobs, to support all types of files.

Management UI

Operational views, reusable UI components and system metrics.

Clustering Foundation

First peer-to-peer node setup and replication groundwork.

2025 Q3 Delivered

Typed Collections

Strongly typed collection registration.

Indexing Maturity

Nested, compound and stale-index handling improved.

File Collections Tooling

Thumbnails, previews and video streaming.

2025 Q4 Delivered

gRPC Replication

Queue-driven replication over gRPC, with a WebSocket control channel.

Runtime Telemetry

Queue depth, active replication and cluster heartbeat diagnostics.

2026

2026 Q1 Delivered

Recovery Groundwork

Snapshot repair, stale checkpoint recovery and stronger replication negotiation.

Document Lifetime

Per-document time-to-live and background cleanup.

Mutation Queries

Update and delete queries through the shared query pipeline.

2026 Q2 Delivered

Chaos Testing

Fault injection, partitions, corrupted snapshots and convergence validation.

AI Integration

MCP tooling with structured, read-only query tools for AI agents.

2026 Q3 Delivered

Correctness Programme

A dedicated engineering phase on correctness rather than features:

Lifecycle & Ownership

An explicit engine state machine, exclusive store ownership and a write-admission gate.

Durable Mutations

One mutation pipeline over a versioned, checksummed write-ahead log, with resolvable outcomes.

Snapshots & Recovery

Atomically published snapshot generations and deterministic recovery that stops on ambiguity.

Index & Query Safety

Versioned index generations the planner respects, and one semantic model behind every query front end.

Providers & Replication

Stated storage-provider guarantees, and replication with provenance, de-duplication and negotiated protocol versions.

Observability & Operations

Published diagnostic code and metric catalogues, health projections, an audit trail and offline store inspection.

NetlyDB 1.0

Certified and released to early-access users in September 2026, followed by servicing releases 1.0.1 and 1.0.2.

2026 Q4 In progress

NetlyDB 1.1

Cross-machine clustering, optional modules that are truly optional, and safer listener defaults.

NetlyDB 1.2

Benchmark-driven optimisation - faster scans, queries, recovery and index rebuilds, and snapshots that no longer block writes - and stricter recovery that refuses a store it cannot fully verify.

WASM Support

The real engine running in a browser worker on OPFS storage, recovering after the worker or the whole browser is killed: the basis for web apps that load once and then work fully offline. Planned for release 1.3.

Build data-driven .NET applications without starting with operational complexity.

Add one package, register one line, and you have a working database with documents, files and search. Everything else is a switch you turn on later.

An unhandled error has occurred. Reload X

Reconnecting

Restoring the connection to the server...

Still trying

Next attempt in seconds

Connection lost

We could not reach the server.