{
  "url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/releases/276395732",
  "assets_url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/releases/276395732/assets",
  "upload_url": "https://uploads.github.com/repos/FastEndpoints/FastEndpoints/releases/276395732/assets{?name,label}",
  "html_url": "https://github.com/FastEndpoints/FastEndpoints/releases/tag/v7.2",
  "id": 276395732,
  "author": {
    "login": "github-actions[bot]",
    "id": 41898282,
    "node_id": "MDM6Qm90NDE4OTgyODI=",
    "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/github-actions%5Bbot%5D",
    "html_url": "https://github.com/apps/github-actions",
    "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
    "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
    "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
    "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
    "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
    "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
    "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
    "type": "Bot",
    "user_view_type": "public",
    "site_admin": false
  },
  "node_id": "RE_kwDOGEKwbs4QeXbU",
  "tag_name": "v7.2",
  "target_commitish": "main",
  "name": "v7.2 Release",
  "draft": false,
  "immutable": false,
  "prerelease": false,
  "created_at": "2026-01-13T14:45:59Z",
  "updated_at": "2026-01-13T14:49:03Z",
  "published_at": "2026-01-13T14:49:03Z",
  "assets": [

  ],
  "tarball_url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/tarball/v7.2",
  "zipball_url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/zipball/v7.2",
  "body": "---\r\n\r\n## ⚠️ Sponsorship Level Critically Low ⚠️\r\n\r\nDue to low financial backing by the community, FastEndpoints will soon be going into \"Bugfix Only\" mode until the situation improves. Please [join the discussion here](https://github.com/FastEndpoints/FastEndpoints/issues/1042) and help out if you can.\r\n\r\n---\r\n\r\n[//]: # (<details><summary>title text</summary></details>)\r\n\r\n## New 🎉\r\n\r\n<details><summary>Standalone package for Event/Command Bus functionality</summary>\r\n\r\nThe in-process Event Bus and Command Bus features have been liberated from the clutches of the FastEndpoints main library. A new, independent `FastEndpoints.Messaging` package has been created. This package can be used in any .NET 8+ application, even with Blazor WASM. Simply install the nuget package and register it with the IOC container like so:\r\n\r\n```csharp\r\nbuilder.Services.AddMessaging();\r\nvar host = builder.Build();\r\nhost.Services.UseMessaging();\r\n```\r\n\r\nThere's no setup (nor code changes) needed for projects using FastEndpoints main library. The above is only for when you want to use the messaging functionality in projects that don't have FastEndpoints.\r\n\r\n</details>\r\n\r\n<details><summary>Standalone package for Job Queues functionality</summary>\r\n\r\nThe job queuing functionality has also been extracted out to a separate package `FastEndpoints.JobQueues` which can be used independently of the main FE library. No code changes are needed for existing FE projects.\r\n\r\n</details>\r\n\r\n<details><summary>Aspire Testing support for routeless test helpers</summary>\r\n\r\nYou can now use the routeless test helpers such as `.GETAsync<MyEndpoint>()` with Aspire `DistributedApplication` testing like so:\r\n\r\n```csharp\r\n[Fact]\r\npublic async Task Endpoint_Returns_Ok_Response()\r\n{\r\n    // Arrange\r\n    var ct = TestContext.Current.CancellationToken;\r\n    var appHost = await DistributedApplicationTestingBuilder.CreateAsync<Projects.AspireApp_AppHost>(ct);\r\n    await using var app = await appHost.BuildAsync(ct).WaitAsync(_defaultTimeout, ct);\r\n    await app.StartAsync(ct).WaitAsync(_defaultTimeout, ct);\r\n    await app.ResourceNotifications.WaitForResourceHealthyAsync(\"apiservice\", ct).WaitAsync(_defaultTimeout, ct);\r\n\r\n    // Act\r\n    var httpClient = app.CreateHttpClient(\"apiservice\");\r\n    var (response, _) = await httpClient.GETAsync<HelloEndpoint, EmptyResponse>();\r\n\r\n    // Assert\r\n    Assert.Equal(HttpStatusCode.OK, response.StatusCode);\r\n}\r\n```\r\n\r\n</details>\r\n\r\n<details><summary>'FastEndpoints.HealthChecks' package</summary>\r\n\r\nAn opt-in library that eliminates boilerplate health check wiring for apps running behind orchestrators such as Kubernetes/.NET Aspire. You can now use the following convenient extension method and it's overloads:\r\n\r\n```csharp\r\n// Defaults: \r\n// - /health/live (liveness)\r\n// - /health/ready (readiness)\r\nbuilder.Services.AddServiceHealthChecks();\r\n\r\n// Custom paths\r\nbuilder.Services.AddServiceHealthChecks(\r\n    configureOptions: opts =>\r\n    {\r\n        opts.LivePath = \"/alive\";\r\n        opts.ReadyPath = \"/ready\";\r\n    });\r\n\r\n// Add custom health checks\r\nbuilder.Services.AddServiceHealthChecks(\r\n    configureChecks: hc =>\r\n    {\r\n        hc.AddNpgSql(connectionString, name: \"postgres\");\r\n        hc.AddRedis(\"localhost:6379\", name: \"redis\");\r\n    });\r\n```\r\n\r\nLiveness returns 200 if process is alive (no dependency checks). Readiness runs all registered health checks and returns aggregate status with optional JSON response.\r\n\r\n</details>\r\n\r\n<details><summary>Test/verify command executions in endpoints without mocks/fakes</summary>\r\n\r\nIn a similar fashion to the previously released [Test Event Receivers](https://gist.github.com/dj-nitehawk/ae85c63fefb1e8163fdd37ca6dcb7bfd) feature, you can now use [Test Command Receivers](https://gist.github.com/dj-nitehawk/abf3fd08bae544ee3bcafb5c5f487c4a) to verify that a certain command execution was initiated by an endpoint or service without having to register fake command handlers.\r\n\r\nTypically, you'd unit test the command/handlers in isolation to verify the business logic in those handlers and use the \"Test Event/Command Receivers\" to validate that certain entrypoints in your application actually do trigger/issue particular commands and events.\r\n\r\n</details>\r\n\r\n## Improvements 🚀\r\n\r\n<details><summary>Strong-Name-Signed Assemblies</summary>\r\n\r\nAll FastEndpoints assemblies are now strong-name-signed. This only matters if your project is utilizing assembly signing. Signed projects will no longer show warnings about FastEndpoints not being signed.\r\n\r\n</details>\r\n\r\n<details><summary>Increased frequency of stream flushing in SSE</summary>\r\n\r\nSSE streams are now flushed after each write as opposed to after every batch. This eliminates random pauses on the client-side due to stream buffering.\r\n\r\n</details>\r\n\r\n<details><summary>Job storage performance optimization</summary>\r\n\r\nOptimized the `JobQueue` startup initialization by reusing the results of the existing scheduled-jobs query to determine whether the queue is in use, allowing the system to skip the additional query for future scheduled jobs when current jobs are already present, thereby reducing database load and improving startup performance without changing observable behavior.\r\n\r\n</details>\r\n\r\n## Fixes 🪲\r\n\r\n<details><summary>Group summary overriding endpoint level summary data</summary>\r\n\r\nThere was an oversight that resulted in endpoint level summary data being overwritten by group level summary data in situations such as the following:\r\n\r\n```csharp\r\nsealed class MyGroup : Group\r\n{\r\n    public MyGroup()\r\n    {\r\n        Configure(\"group\", ep => ep.Summary(s => s.Description = \"group level text\"));\r\n    }\r\n}\r\n\r\nsealed class MyEndpoint : EndpointWithoutRequest\r\n{\r\n    public override void Configure()\r\n    {\r\n        Get(\"/something\");\r\n        Group<MyGroup>();\r\n        Summary(s => s.Description = \"endpoint level text\"); //this would get loss due to the bug\r\n    }\r\n}\r\n```\r\n\r\n</details>\r\n\r\n<details><summary>Routeless test helpers and optional query params issue</summary>\r\n\r\nGiven a request DTO class such as:\r\n\r\n```csharp\r\npublic class MyRequest \r\n{\r\n    [RouteParam]\r\n    public string? Something\r\n}\r\n```\r\n\r\nWhen you don't supply a value for `Something` during testing with the routeless test helpers such as `.GETAsync<>()`, and empty query parameter would be appended to the request URL like so:\r\n\r\n```csharp\r\n/my/endpoint?Something=\r\n```\r\n\r\nWhile this isn't inherently wrong, the common behavior in most REST clients, is to not send in a query parameter at all for when the value is empty. The test helpers will also follow suit from now on.\r\n\r\n</details>\r\n\r\n<details><summary>Request binder exception when request DTO ctor has a optional struct argument</summary>\r\n\r\nThe default request binder was throwing an exception when a request DTO has an optional constructor argument that is a struct type like the following.\r\n\r\n```csharp\r\nsealed class MyRequest(SomeStruct someOptionalStruct = default)\r\n{\r\n  ...\r\n}\r\n```\r\n\r\n</details>\r\n\r\n\r\n[//]: # (## Breaking Changes ⚠️)\r\n",
  "reactions": {
    "url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/releases/276395732/reactions",
    "total_count": 12,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 12,
    "eyes": 0
  }
}
