![]() |
VOOZH | about |
dotnet add package MinimalLambda --version 2.6.0
NuGet\Install-Package MinimalLambda -Version 2.6.0
<PackageReference Include="MinimalLambda" Version="2.6.0" />
<PackageVersion Include="MinimalLambda" Version="2.6.0" />Directory.Packages.props
<PackageReference Include="MinimalLambda" />Project file
paket add MinimalLambda --version 2.6.0
#r "nuget: MinimalLambda, 2.6.0"
#:package MinimalLambda@2.6.0
#addin nuget:?package=MinimalLambda&version=2.6.0Install as a Cake Addin
#tool nuget:?package=MinimalLambda&version=2.6.0Install as a Cake Tool
Minimal API-style ergonomics, Lambda-first runtime β Build Lambda functions for any trigger using familiar .NET patterns without sacrificing Lambda-specific capabilities.
Write Lambda functions with the familiar minimal API pattern from ASP.NET Core, adapted for Lambda's execution model:
var builder = LambdaApplication.CreateBuilder();
builder.Services.AddScoped<IMyService, MyService>();
var lambda = builder.Build();
lambda.MapHandler(([FromEvent] string input, IMyService service) =>
service.Process(input));
await lambda.RunAsync();
The framework provides:
lambda.MapHandler(...) in the same declarative style as app.MapGet()Use() pattern for cross-cutting concernsInstall the NuGet package:
dotnet add package MinimalLambda
Ensure your project uses C# 11 or later:
<PropertyGroup>
<LangVersion>11</LangVersion>
</PropertyGroup>
Create a simple Lambda handler:
using MinimalLambda.Builder;
using Microsoft.Extensions.Hosting;
var builder = LambdaApplication.CreateBuilder();
var lambda = builder.Build();
// The [FromEvent] attribute marks the parameter that receives the deserialized Lambda event
lambda.MapHandler(([FromEvent] string input) => $"Hello {input}!");
await lambda.RunAsync();
The [FromEvent] attribute tells the framework which parameter receives the deserialized event. You
can
also inject dependencies:
lambda.MapHandler(([FromEvent] Order order, IOrderService service) =>
service.Process(order)
);
Add middleware for cross-cutting concerns:
lambda.UseMiddleware(async (context, next) =>
{
Console.WriteLine("Before handler");
await next(context);
Console.WriteLine("After handler");
});
Use OnInit() for setup and OnShutdown() for cleanup:
// Service can be injected into the Init handler
lambda.OnInit(ICache cache =>
{
// Runs once at startup - perfect for setting up resources
cache.Warm();
});
// Handlers can also control if the Init phase should be continued or not
lambda.OnInit(async (services, token) =>
{
// Returns false to abort startup
return true;
});
// Runs once at shutdown - cleanup resources
lambda.OnShutdown(async (services, token) =>
{
// ...
});
// Service can be injected into the shutdown handler too handler
lambda.OnShutdown(ITelemetryService telemetryService =>
{
// Runs once at shutdown - great for cleaning up resources
telemetryService.ForceFlush();
});
Register your Lambda handler with the builder. The framework uses source generation to analyze your handler signature:
[FromEvent] attribute marks the input parameter typeHandlers can inject dependencies alongside the event:
lambda.MapHandler(([FromEvent] Order order, IOrderService service) =>
service.Process(order) // Return type automatically serialized to JSON
);
Middleware wraps the handler for cross-cutting concerns. Add as many middlewares as neededβthey compose into a pipeline:
lambda.UseMiddleware(async (context, next) =>
{
// Pre-handler logic
await next(context);
// Post-handler logic
});
lambda.UseMiddleware(async (context, next) =>
{
// Another middleware layer
await next(context);
});
The framework manages initialization and shutdown phases automatically. Add as many callbacks as neededβthey execute in order and then all awaited:
Both run asynchronously and should be kept as short as possible to minimize startup/shutdown time.
lambda.OnInit(async (services, token) =>
{
// One-time setup (runs once, reused across invocations)
return true; // or false to abort startup
});
lambda.OnShutdown(async (services, token) =>
{
// Cleanup before shutdown
});
Register services in the builder; they're available in handlers, middleware, and lifecycle methods:
builder.Services.AddSingleton<ICache, MemoryCache>(); // Reused across invocations
builder.Services.AddScoped<IRepository, Repository>(); // New per invocation
Each invocation receives its own scopeβscoped services are isolated per request. OnInit() and
OnShutdown() handlers receive their own scopes as well. You can also request the
ILambdaInvocationContext or CancellationToken in any handler, and they're automatically
injected.
The framework uses C# source generators and compile-time interceptors to:
Result: Zero runtime reflection, zero performance cost.
To use .NET Native AOT, define a JSON serializer context and annotate with types to serialize:
using System.Text.Json.Serialization;
[JsonSerializable(typeof(string))]
public partial class SerializerContext : JsonSerializerContext;
Register the serializer context with the application:
using MinimalLambda;
var builder = LambdaApplication.CreateBuilder();
builder.Services.AddLambdaSerializerWithContext<SerializerContext>();
var lambda = builder.Build();
The AddLambdaSerializerWithContext<TContext>() method registers a source-generated JSON serializer
that uses your context for all Lambda event and response serialization, providing compile-time
serialization metadata and eliminating runtime reflection.
Enable AOT in your project file:
<PublishAot>true</PublishAot>
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>full</TrimMode>
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>
See AOT documentation for details.
The framework supports configuration through LambdaHostOptions:
builder.Services.ConfigureLambdaHostOptions(options =>
{
options.InitTimeout = TimeSpan.FromSeconds(10);
options.InvocationCancellationBuffer = TimeSpan.FromSeconds(5);
options.ShutdownDuration = ShutdownDuration.ExternalExtensions;
options.ShutdownDurationBuffer = TimeSpan.FromMilliseconds(100);
options.ClearLambdaOutputFormatting = true;
});
Available options include timeout control, shutdown duration, output formatting, and JSON
serialization customization. The framework automatically registers DefaultLambdaHostJsonSerializer
which uses JsonSerializerOptions and JsonWriterOptions for all Lambda serialization. See
the configuration guide for details.
Additional packages in the minimal-lambda framework for abstractions, observability, and event source handling.
This project is licensed under the MIT License. See for details.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. net11.0 net11.0 is compatible. |
Showing the top 3 NuGet packages that depend on MinimalLambda:
| Package | Downloads |
|---|---|
|
AlexaVoxCraft.MinimalLambda
Minimal API-style Lambda hosting for AlexaVoxCraft skills powered by MinimalLambda. |
|
|
MinimalLambda.OpenTelemetry
OpenTelemetry integration for MinimalLambda |
|
|
MinimalLambda.Testing
In-memory testing harness for MinimalLambda |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.6.0 | 125 | 6/12/2026 |
| 2.5.0 | 457 | 5/9/2026 |
| 2.4.0 | 453 | 4/17/2026 |
| 2.3.1 | 616 | 3/23/2026 |
| 2.3.0 | 138 | 3/21/2026 |
| 2.2.0 | 1,001 | 1/12/2026 |
| 2.2.0-beta.1 | 85 | 1/9/2026 |
| 2.1.1 | 364 | 12/22/2025 |
| 2.1.0-beta.6 | 133 | 12/20/2025 |
| 2.1.0-beta.5 | 161 | 12/19/2025 |
| 2.1.0-beta.4 | 177 | 12/19/2025 |
| 2.1.0-beta.3 | 179 | 12/19/2025 |
| 2.1.0-beta.2 | 181 | 12/19/2025 |
| 2.1.0-beta.1 | 258 | 12/19/2025 |
| 2.0.0 | 342 | 12/18/2025 |
| 2.0.0-beta.11 | 283 | 12/17/2025 |
| 2.0.0-beta.10 | 281 | 12/17/2025 |
| 2.0.0-beta.9 | 279 | 12/15/2025 |
| 2.0.0-beta.8 | 242 | 12/15/2025 |
| 2.0.0-beta.7 | 211 | 12/15/2025 |