dotnet/extensions: the Microsoft libraries behind Teams, packaged for your app
This repository contains a suite of libraries that provide facilities commonly needed when creating production-ready applications.
At a glance
- What is it?
- dotnet/extensions is a suite of .NET libraries covering AI abstractions, compliance, diagnostics, resilience, telemetry, ASP.NET Core middleware, static analysis and testing. Here is what each area actually does, how to build it, and where the repo stops being the right answer.
- Who is it for?
- Adopt dotnet/extensions if you are building .NET services that need resilience pipelines, telemetry, or testable abstractions over ILogger and TimeProvider, and you are willing to track a fast release cadence. Do not adopt it as a single drop-in framework: it is a set of independent libraries, and the AI, compliance and contextual options areas are the least settled.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 4 days ago.
- What is it written in?
- Mainly C#, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 14, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What dotnet/extensions actually is, and who it is for
The README describes the repository as a suite of libraries providing facilities commonly needed when creating production-ready applications. That is a deliberate framing: this is not one framework you adopt wholesale, it is a collection of separately versioned packages that happen to share a build, a contribution process and a release train. The README states the libraries were initially developed to support high-scale and high-availability services within Microsoft, naming Microsoft Teams as an example.
The target reader is a .NET engineer who already has an application and is filling in the operational gaps: retry behaviour, telemetry, diagnostic endpoints, testability of framework abstractions. The README enumerates the functional areas as AI, Compliance, Diagnostics, Contextual Options, Resilience, Telemetry, AspNetCore extensions, Static Analysis and Testing. Those nine areas are the actual scope. If your problem is not in that list, this repository is not the place to look.
The repository is not archived, and the last push was on 2026-08-12, which is recent enough that the code is moving. The most recent release listed is v10.9.0 on the same date, with v10.8.4 and v10.8.3 in the weeks before. That cadence matters for anyone planning an upgrade policy.
How the libraries are organised, and the mechanism behind the resilience and options areas
The repository layout is the clearest documentation of the architecture. Top-level directories include src/, test/, bench/, eng/, docs/ and scripts/, with Directory.Build.props, Directory.Build.targets and Directory.Packages.props at the root. That combination means the whole repository builds as one unit with centrally managed package versions, while the individual libraries under src/ remain separately consumable. A contributor works against the repository; a consumer works against the published packages.
The Resilience area is the one where the mechanism is described most concretely. According to the README, it builds on top of the Polly library to provide resilience pipelines that make applications robust to transient errors. So the design is compositional rather than a replacement: you are still using Polly, and this layer adds pipeline construction on top. That is a meaningful distinction for anyone who has already invested in Polly configuration, because it suggests migration is additive.
Contextual Options is described as extending the .NET Options model to enable experimentations in production. That is a narrower claim than it first appears. The Options pattern in .NET binds configuration to typed objects; extending it contextually implies the bound value can vary by context rather than being fixed at startup. The README does not spell out what constitutes a context or how the resolution is cached, so that detail has to come from the source under src/.
The Testing area is described as simplifying testing around common .NET abstractions such as ILogger and the TimeProvider. That is a concrete, well-bounded problem: both types are hard to fake convincingly, and a test double provided by the framework authors removes a class of hand-rolled mocks.
Building dotnet/extensions from source
The README does not give per-package install commands, and the repository has no homepage. Package names and install steps therefore have to be confirmed on NuGet before you commit to one; the functional areas above are the guide to which package you want. What the repository does document is how to build and test it from source. The README points to docs/building.md for build instructions, and the root contains build.sh, build.cmd, restore.sh and restore.cmd for exactly that purpose. That is the contributor path, not the consumer path.
If you are building the repository itself rather than consuming packages, start with the restore script at the root. It runs from the repository root and pulls down the dependencies the tree needs before anything compiles.
./restore.shOnce restore completes, the build script compiles the tree. Expect a long first run: the repository includes test/ and bench/ alongside src/, and the Directory.Build.props and Directory.Build.targets files at the root apply to all of them.
./build.shOn Windows the equivalent entry points are restore.cmd and build.cmd. The presence of global.json at the root means the SDK version is pinned by the repository rather than by whatever is installed on your machine, so a mismatched SDK is the first thing to check if either script fails early.
For a consumer, the route is a NuGet reference added to the project file. The README does not supply the package identifiers or versions, so confirm both on NuGet for the functional area you need before adding the reference.
Where dotnet/extensions is the wrong tool
The repository is a suite, not a framework, and treating it as one produces dependency sprawl. If you need exactly one capability, pulling in a package that carries the repository's shared build conventions and transitive dependencies is a worse trade than writing the small piece yourself. The Testing area is the clearest example: if you need a fake for a single interface in a single test project, a hand-written stub may be less total surface area than a package reference.
The AI area is described in the README only as abstractions and middlewares for working with generative AI models and services. Abstractions are a commitment to an interface, and interfaces in a fast-moving area age quickly. The README does not name supported providers, describe the middleware pipeline, or state a stability guarantee for these types. Anyone building on that area should read the source before assuming the surface is settled.
Compliance deserves the same caution. The README describes it as mechanisms to help manage application data according to privacy regulations and policies, including a data annotation framework, audit report generation, and telemetry redaction. Those are tools for implementing a policy. They are not a statement that using them makes an application compliant, and the README makes no such claim. Teams looking for a compliance guarantee rather than compliance tooling will be disappointed.
Finally, the release cadence is a real cost. Three releases are listed within roughly two weeks in July and August 2026. A repository moving that fast is a liability for a team that cannot absorb regular package updates, particularly in the AI and compliance areas where the surface is least documented.
How this differs from Polly and from the base Microsoft.Extensions packages
The most direct comparison is with Polly itself. Polly is a resilience and transient-fault-handling library; dotnet/extensions builds on top of it, according to the README, to provide resilience pipelines. The difference in approach is layering. Choosing Polly alone means you assemble retry, timeout and circuit-breaker policies and decide how they compose. Choosing the extensions layer means you get pipeline construction on top of Polly, at the cost of an additional dependency and of tracking the extensions release train alongside Polly's. If your policy composition is already working, the extensions layer adds a moving part without removing one.
The second comparison is with the base Microsoft.Extensions.* packages that ship with .NET itself. Logging, options, dependency injection and configuration live there. dotnet/extensions extends that model rather than replacing it: Contextual Options is described as an extension of the Options model, and the Testing area targets ILogger and TimeProvider, both base abstractions. The practical consequence is that adopting this repository does not cut you off from the platform packages, but it does mean your dependency graph contains two version streams that have to stay compatible.
A third option, for teams that only want the diagnostics and telemetry surface, is to implement health checks and instrumentation directly against the platform APIs. That is more code, but it is code you control and can version on your own schedule. The trade is explicit: less code now, more upgrade coordination later.
Licence, contribution and the cost of staying current
The repository is licensed under MIT, and the README states that .NET, including the runtime repository, is licensed under the MIT license, pointing at the LICENSE file. MIT is permissive: it allows use, modification and redistribution with the licence and copyright notice retained. That is a statement about the licence text, not legal advice, and organisations with strict open source review processes should run the usual check against the LICENSE and THIRD-PARTY-NOTICES.TXT files at the root, since the latter exists precisely to record third-party components.
Contribution is governed by CONTRIBUTING.md and docs/building.md, and the repository is a .NET Foundation project that has adopted the Contributor Covenant code of conduct. Security issues have a separate path: the README asks that they be reported privately to the Microsoft Security Response Center at secure@microsoft.com rather than through public issues, and SECURITY.md repeats those instructions.
Upgrade cost is the practical concern. The repository publishes frequently, with v10.9.0, v10.8.4 and v10.8.3 all landing in the weeks before 2026-08-12. The README does not document a rollback procedure, a support window, or which areas are considered stable. A team adopting several areas at once should expect to evaluate each release against the packages it actually depends on, and should treat the AI and compliance areas as the ones most likely to move. Pinning versions in Directory.Packages.props, the same mechanism the repository uses for itself, is the concrete way to keep that under control.
Editorial conclusion
Adopt dotnet/extensions if you are building .NET services that need resilience pipelines, telemetry, or testable abstractions over ILogger and TimeProvider, and you are willing to track a fast release cadence. Do not adopt it as a single drop-in framework: it is a set of independent libraries, and the AI, compliance and contextual options areas are the least settled. Before committing, verify that the specific package you need is published on NuGet at a version matching your target framework, and read the source tree under src/ rather than relying on the README, which lists functional areas but does not document per-package install commands or rollback.
Frequently asked questions
What is dotnet/extensions?
It is a repository containing a suite of .NET libraries providing facilities commonly needed when creating production-ready applications, initially developed to support high-scale services within Microsoft such as Microsoft Teams. The README groups them into AI, Compliance, Diagnostics, Contextual Options, Resilience, Telemetry, AspNetCore extensions, Static Analysis and Testing.
How do I install dotnet/extensions?
The README does not give per-package install commands, so the consumer route is a NuGet reference in your project file, with the package name and version confirmed on NuGet for the functional area you need. To build the repository itself, the README points to docs/building.md, and the root contains restore.sh, restore.cmd, build.sh and build.cmd.
Is dotnet/extensions actively maintained?
The repository is not archived and the last push was on 2026-08-12, with v10.9.0 released the same day and v10.8.4 and v10.8.3 in the preceding weeks. The README does not state a support window or which functional areas are considered stable.
Community notes