Skip to content
Kumar Chandrachooda
Series

FastEndpoints in Depth

In reading order.

  • 17 parts
  • ≈ 83 min total
  • 17 published
Part 1 06 Aug 2025 5 min read

A Class Per Endpoint: Why FastEndpoints Exists

Controllers grow sideways and Minimal APIs grow into soup. FastEndpoints bets on a third shape - one class per endpoint - and this series reads its source to see how the bet is implemented. Part 1 of FastEndpoints in Depth.

Part 2 26 Aug 2025 5 min read

One Scanner, Five Interfaces: How FastEndpoints Finds Your Code

AddFastEndpoints never asks you to register an endpoint. Reading the discovery code shows how a reflection scan over five interfaces becomes a validated endpoint catalogue - and which mistakes it turns into startup crashes on purpose. Part 2 of FastEndpoints in Depth.

Part 3 22 Sep 2025 6 min read

The Endpoint That Pretends to Be a Result

Every FastEndpoints route is mapped as a Minimal API whose handler returns the same singleton IResult - and that one weird trick is the door into the whole per-request pipeline. Part 3 of FastEndpoints in Depth.

Part 4 29 Oct 2025 5 min read

Eight Sources, One DTO: Model Binding Under the Hood

FastEndpoints binds a single request DTO from JSON, form, route, query, claims, headers, cookies and permissions - in that order, with compiled setters cached per DTO type. Reading the binder explains every binding surprise I have ever hit. Part 4 of FastEndpoints in Depth.

Part 5 06 Dec 2025 5 min read

Validators Are Singletons: FluentValidation, the FastEndpoints Way

FastEndpoints wires FluentValidation into the pipeline by request-DTO type, runs validators as singletons, and shares one failure list between binder, validator and handler. The lifetime rule is the part that bites. Part 5 of FastEndpoints in Depth.

Part 6 12 Jan 2026 4 min read

Pre-Processors, Post-Processors, and the Exception That Waits

FastEndpoints' processors are its cross-cutting hook - but their exact pipeline position, the shared state trick, and a captured exception that waits in a finally block are what make them genuinely useful. Part 6 of FastEndpoints in Depth.

Part 7 16 Feb 2026 5 min read

A Policy Per Endpoint: How Declarative Security Compiles

Permissions(), Claims() and Scopes() in Configure() feel like magic until you read the mapping code - every endpoint gets its own named authorization policy built from closures at startup, and roles ride a plain AuthorizeAttribute. Part 7 of FastEndpoints in Depth.

Part 8 16 Mar 2026 5 min read

JWTs, Refresh Tokens, and Revocation Without the Ceremony

The FastEndpoints.Security package covers the token lifecycle end to end - creation with symmetric or RSA keys, an abstract refresh-token service that is secretly an endpoint, and a revocation middleware that makes you pay the lookup tax honestly. Part 8 of FastEndpoints in Depth.

Part 9 03 Apr 2026 5 min read

Versioning at the End of the Route

FastEndpoints suffixes versions by default - /api/orders/v2 - and its release-group model versions endpoints, not APIs. Reading the route-building code explains the philosophy, and the AspVersioning bridge covers everyone it doesn't fit. Part 9 of FastEndpoints in Depth.

Part 10 16 Apr 2026 5 min read

Teaching NSwag What Your Endpoints Mean

FastEndpoints' Swagger support is a thousand-line translation layer that knows which DTO properties are route params, which FluentValidation rules are schema constraints, and which endpoint versions belong in which document. Part 10 of FastEndpoints in Depth.

Part 11 23 Apr 2026 4 min read

An Event Bus and a Command Bus, No Extra Package Required

FastEndpoints ships in-process messaging that covers most MediatR use cases - events with three wait modes, commands with middleware pipelines, generic and streaming handlers. The dispatch code makes some sharp lifetime choices worth knowing. Part 11 of FastEndpoints in Depth.

Part 12 30 Apr 2026 4 min read

Commands Over gRPC, No Proto Files

FastEndpoints.Messaging.Remote executes the same ICommand on another machine over gRPC, serialized with MessagePack instead of protobuf contracts - plus an event hub mode that turns a server into a lightweight broker. Reading it explains both the magic and the trade. Part 12 of FastEndpoints in Depth.

Part 13 05 May 2026 5 min read

A Job Queue Is a Command With a Tracking ID

FastEndpoints' job queues persist commands through a storage provider you supply and execute them with a semaphore design that idles without polling. The state machine in JobQueue.cs is worth the read on its own. Part 13 of FastEndpoints in Depth.

Part 14 11 May 2026 5 min read

Route-less Tests: Integration Testing With Typed Clients

FastEndpoints ships a testing package where tests call endpoints by class name, apps boot once per fixture, and even command handlers can be faked - the route string never appears in a test. Part 14 of FastEndpoints in Depth.

Part 15 16 May 2026 5 min read

Trading Reflection for Roslyn: Source Generators and Native AOT

Everything FastEndpoints does with reflection - discovery, setters, factories - has a compile-time twin in its source generators, and following that migration is a case study in making a reflection-heavy library AOT-ready. Part 15 of FastEndpoints in Depth.

Part 16 20 May 2026 5 min read

Throttling, Idempotency, and an HTTP 402 Surprise

The cross-cutting drawer of FastEndpoints holds a rate limiter that documents its own limitations, idempotency built on output caching, server-sent events - and a full implementation of the x402 micro-payments protocol. Part 16 of FastEndpoints in Depth.

Part 17 23 May 2026 5 min read

When Not to Use FastEndpoints

After sixteen parts inside the source, the honest retrospective - what the library gets right, the sharp edges that will cut you (singletons, statics, magic), and the projects where I would leave it on the shelf. Part 17, the conclusion of FastEndpoints in Depth.