It holds your hand from declaring your Value Object to using it in a database, to serializing it to JSON and beyond. No boilerplate code, just a simple Attribute!
dotnet add package NoPrimitives
[ValueObject<Guid>]
partial record UserId;
...
app.MapGet("/v1/users/{{id}}", async (UserId id) => {
// use your value object and enjoy it being always valid!
})