.NET and C#
Backend services in C# and .NET — built by developers who have worked in a microservice platform with hundreds of projects behind a national loyalty and online grocery service.

Tools and frameworks we use
- C#
- .NET 8 and .NET 10
- ASP.NET Core
- Azure Functions (isolated worker and Durable Functions)
- .NET Aspire
- YARP
- Entity Framework Core
- Dapper
- DbUp
- Polly
- MediatR
- FusionCache
- Serilog
- OpenTelemetry
- Duende IdentityServer
- Kafka (Confluent)
- Elasticsearch
- Redis
- Azure SQL
- Cosmos DB
- NUnit and xUnit
- NSubstitute
- Testcontainers
- WireMock.Net
- k6
- OpenAPI, Kiota, and NSwag
.NET development for services that must work every day
A good backend is noticed most when it goes unnoticed. Users should be able to sign in, add items to the cart, pick a delivery slot, and use their coupons without thinking about which services talk to each other behind the scenes. We have worked in a large C# and .NET microservice platform with hundreds of projects behind a national loyalty and online grocery service — members, cart, orders, delivery slots, coupons, and search.
We have also built smaller, focused tools. One example is a .NET 10 service that syncs store opening hours to Google Business Profile and Apple Maps, so customers see the right hours where they actually look.
Architecture choices in C# and ASP.NET Core projects
Some decisions we make early, because they are expensive to change later:
- Isolated worker for Azure Functions. It is the model Microsoft recommends for new functions, and it gives the same .NET version, middleware, and dependency injection as the rest of the codebase.
- Generated clients from OpenAPI. Kiota or NSwag produce typed clients, so a broken contract is caught at build time rather than in production.
- Resilience at the boundaries. Polly policies and caching wrap calls to other systems instead of being scattered through the domain logic.
- Real databases in tests. Testcontainers rather than in-memory databases, because SQL, transactions, and migrations should be tested the way they actually run.
- Explicit migrations. DbUp when the team wants to own the SQL, Entity Framework Core migrations when the model is driven from code.
We are also wary of layers that do not pay for themselves. MediatR and custom abstractions can bring order to large codebases, but in a small service a straightforward ASP.NET Core endpoint is often easier to read and debug.
ASP.NET Core, Azure Functions, and .NET Aspire
Many .NET solutions combine APIs, background jobs, and event flows. We use ASP.NET Core and YARP for APIs and gateways, Azure Functions and Durable Functions for event-driven processes and long-running workflows, and .NET Aspire to make local development with several services simpler. Data lives in Azure SQL, Cosmos DB, or Elasticsearch depending on how it is used, and messages flow through Kafka where systems need to stay loosely coupled.
We also contribute to open source in C#, including a BTCPay Server plugin that lets merchants receive Lightning payments directly to a Bare Bitcoin account.
Typical engagements
New APIs and microservices
We design and build services in ASP.NET Core and Azure Functions with clear contracts, OpenAPI documentation, and tests from day one.
Modernisation to .NET 10
We upgrade codebases from older versions such as .NET Core 3.1 to .NET 10, step by step and without halting ongoing development.
Integrations and event flows
We connect systems with Kafka, queues, and external APIs, with retries, caching, and monitoring that cope with failures elsewhere.
Senior .NET capacity in your team
Experienced developers who contribute to existing teams with architecture, code review, testing, and operations.
Relevant experience
Projects and open-source work where the technology has been used in practice.
Open source
- btcpayserver-plugin-barebitcoin
A BTCPay Server plugin in C#/.NET for receiving Lightning payments to a Bare Bitcoin account.
Frequently asked questions
Can you help us upgrade to a newer .NET version?
Yes. We have modernised services from .NET Core 3.1 to .NET 10. We map dependencies and risks first, then upgrade in small steps that can go to production continuously.
Do you work with Azure Functions or ASP.NET Core?
Both. Azure Functions suits event-driven jobs and integrations well, while ASP.NET Core is often the right choice for APIs with steady traffic. We choose based on load, cost, and how the team operates the solution.
How do you test .NET services?
With unit tests in NUnit or xUnit, integration tests against real databases using Testcontainers, simulated external APIs with WireMock.Net, and load tests with k6.
Can you join a large existing codebase?
Yes. We have worked in a platform with hundreds of .NET projects and are used to learning established conventions before proposing changes.
How quickly can you start?
Get in touch with a short description of what you need, and we will respond with an assessment of scope and when we can contribute.
Related technologies
Part of the service: Backend development and integrations
TypeScript and Node.js
Backend services, integrations, and internal tools in TypeScript and Node.js, from REST APIs to build and release automation.
Read moreRust development
Rust backends with Axum and Tokio for long-running, security-sensitive services, with tests, Docker, and packaging for self-hosting.
Read moreGo development
APIs, background jobs, and libraries in Go, with a focus on simple operations and predictable performance.
Read moreNeed help with .NET and C#?
Tell us briefly about the product, the team, or the system. We will respond with a practical suggestion for the next step — a complete delivery, senior capacity in your team, or technical advice.
- Phone
- +47 920 50 946
- Location
- Oslo, Norway
