{
  "url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/releases/300983638",
  "assets_url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/releases/300983638/assets",
  "upload_url": "https://uploads.github.com/repos/FastEndpoints/FastEndpoints/releases/300983638/assets{?name,label}",
  "html_url": "https://github.com/FastEndpoints/FastEndpoints/releases/tag/v8.1",
  "id": 300983638,
  "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_kwDOGEKwbs4R8KVW",
  "tag_name": "v8.1",
  "target_commitish": "main",
  "name": "v8.1 Release",
  "draft": false,
  "immutable": false,
  "prerelease": false,
  "created_at": "2026-03-25T03:51:53Z",
  "updated_at": "2026-03-25T03:54:28Z",
  "published_at": "2026-03-25T03:54:28Z",
  "assets": [

  ],
  "tarball_url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/tarball/v8.1",
  "zipball_url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/zipball/v8.1",
  "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>Dual mode testing support for 'AppFixture'</summary>\r\n\r\nYou can now use the same app fixture (without any conditional code in your tests) to run WAF based tests during regular development, and run smoke tests against a native aot build during a CI/CD pipeline run by simply doing `dotnet test MyTestProject.csproj -p:NativeAotTestMode=true` in the pipeline. This way you are able to have a faster feedback loop during development and also verify that everything works the same once the app is built with native aot by running the same set of tests against the aot build without any special handling in your code. See the documentation [here](https://fast-endpoints.com/docs/native-aot#testing-native-aot-builds).\r\n\r\n</details>\r\n\r\n<details><summary>Fluent generics support for serializer context generator</summary>\r\n\r\nThe STJ serializer context generator now supports endpoints defined with [fluent generics](https://fast-endpoints.com/docs/get-started#fluent-generics).\r\n\r\n</details>\r\n\r\n<details><summary>Referenced project + Nuget package support for the serializer context generator</summary>\r\n\r\nThe generated serializer context will now have `JsonSerializable` attributes for request and response DTOs from referenced source projects as well as Nuget packages. Previously the generator was only capable of generating attributes for DTOs from the current project directory.\r\n\r\n</details>\r\n\r\n<details><summary>Ability to configure a pre-determined list of \"known subscribers\" for remote event queues</summary>\r\n\r\nRemote event subscribers can now supply an explicit `subscriberID` instead of relying on the auto generated client identity, and event hubs can be configured with a known list of subscriber IDs to begin queuing events for them from app startup onward. Known subscriber pre-seeding does not affect round-robin mode, which still delivers only to currently connected subscribers.\r\n\r\n</details>\r\n\r\n## Fixes 🪲\r\n\r\n<details><summary>Stack overflow issue with .NET 8 and 9</summary>\r\n\r\nA stack overflow exception was being thrown in .NET 8/9 due to cyclical calls in TypeInfoResolver, which .NET 10 has solved. We've added a workaround to prevent this from happening.\r\n\r\n</details>\r\n\r\n<details><summary>Serializer context generator was skipping collection DTO types</summary>\r\n\r\nThe serializer context generator tool was not creating `JsonSerializable` attributes for request and response DTO types if they were collection types such as `List<Request>`, `IEnumerable<Response>`, etc.\r\n\r\n</details>\r\n\r\n<details><summary>Job queue storage provider query translation issue</summary>\r\n\r\nThe job queue search predicate has been improved to allow EF Core (and potentially other ORMs) to translate the expression correctly when the storage provider is configured in non-distributed mode. Previously, an unmapped `DequeueAfter` property was included in the expression causing EF Core translation errors.\r\n\r\n</details>\r\n\r\n<details><summary>Regression in OData library</summary>\r\n\r\nDue to recent changes in FastEndpoints v8, the OData library stopped producing results. This has now been fixed, and comprehensive tests added to prevent a reoccurrence.\r\n\r\n</details>\r\n\r\n## Improvements 🚀\r\n\r\n<details><summary>Prune stale remote event hub subscribers after 24 hours</summary>\r\n\r\nRemote event hubs now stop creating event records for disconnected subscribers that have not been seen for 24 hours. This keeps temporarily disconnected subscribers eligible to receive queued events when they reconnect, while preventing dead subscribers from accumulating new records indefinitely.\r\n\r\n</details>\r\n\r\n<details><summary>Remote event queue persistence retry handling</summary>\r\n\r\nThe publisher event hub and remote event subscriber now retry only the actual event storage operations and perform their semaphore wake-up signaling separately. This avoids re-persisting already stored event records if the post-store notification step fails.\r\n\r\n</details>\r\n\r\n<details><summary>Optimize serializer context generator</summary>\r\n\r\nThe serializer context generator has been improved to use less resources and do the generation in a more efficient and faster manner.\r\n\r\n</details>\r\n\r\n<details><summary>Custom value parser registration internals</summary>\r\n\r\nv8 matches custom value parsers by the underlying type (due to native aot intricacies) and if a user would register the parser with the nullable type, it would not match. This has been solved by always registering the underlying type even if the user supplies a nullable type.\r\n\r\n</details>\r\n\r\n<details><summary>Job queue executor refilling and shutdown behavior</summary>\r\n\r\nJob queue executors now refill newly freed concurrency slots immediately instead of waiting for the whole fetched batch to finish. During shutdown, the executor also drains already running jobs before exiting, and distributed storage providers only claim as many jobs as there are currently available execution slots.\r\n\r\n</details>\r\n\r\n<details><summary>Remote event queue executor refilling with stable event record IDs</summary>\r\n\r\nRemote event storage records now carry a library generated `TrackingID`, which allows event subscribers to refill newly freed execution slots immediately without re-scheduling the same in-flight durable record. This improves concurrency utilization for persistent remote event queues, especially when a slow handler would otherwise hold up the next batch.\r\n\r\n</details>\r\n\r\n## Minor Breaking Changes ⚠️\r\n\r\n<details><summary>Remote event storage records now require a TrackingID</summary>\r\n\r\nThe `IEventStorageRecord` contract now includes a `Guid TrackingID` property. If you maintain custom persistent event storage record types for remote event hubs or subscribers, you must add this property to your record models and map/persist it in storage. The library will automatically populate the value when creating new event records. This was a necessary addition in order to maximize concurrency utilization.\r\n\r\n</details>",
  "reactions": {
    "url": "https://api.github.com/repos/FastEndpoints/FastEndpoints/releases/300983638/reactions",
    "total_count": 17,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 11,
    "rocket": 5,
    "eyes": 1
  }
}
