diff --git a/annotation/huma.pb.go b/annotation/huma.pb.go
index 5d1e657..651c6ca 100644
--- a/annotation/huma.pb.go
+++ b/annotation/huma.pb.go
@@ -33,8 +33,8 @@ var file_huma_proto_extTypes = []protoimpl.ExtensionInfo{
 		ExtendedType:  (*descriptorpb.FieldOptions)(nil),
 		ExtensionType: (*bool)(nil),
 		Field:         84842,
-		Name:          "huma.readOnly",
-		Tag:           "varint,84842,opt,name=readOnly",
+		Name:          "huma.read_only",
+		Tag:           "varint,84842,opt,name=read_only",
 		Filename:      "huma.proto",
 	},
 	{
@@ -61,10 +61,10 @@ var (
 	//
 	// optional bool public = 84841;
 	E_Public = &file_huma_proto_extTypes[0]
-	// ReadOnly marks that a field is set by the server. The client can only
+	// Read-only marks that a field is set by the server. The client can only
 	// read its value, e.g. resource creation date.
 	//
-	// optional bool readOnly = 84842;
+	// optional bool read_only = 84842;
 	E_ReadOnly = &file_huma_proto_extTypes[1]
 	// Name specifies the Huma Go field name. For example, a field might be cased
 	// as `Mp2T` but should be `MP2T` because it is a non-common initialism.
@@ -91,21 +91,21 @@ var file_huma_proto_rawDesc = []byte{
 	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
 	0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe9, 0x96,
 	0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x88, 0x01, 0x01,
-	0x3a, 0x3e, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x2e, 0x67,
-	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,
-	0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xea, 0x96, 0x05, 0x20,
-	0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01,
-	0x3a, 0x36, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,
-	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xeb, 0x96, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e,
-	0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
-	0xec, 0x96, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01,
-	0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69,
-	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x68, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x3a, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xea, 0x96, 0x05,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01,
+	0x01, 0x3a, 0x36, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,
+	0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xeb, 0x96, 0x05, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x3a, 0x36, 0x0a, 0x04, 0x6a, 0x73, 0x6f,
+	0x6e, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x18, 0xec, 0x96, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x88, 0x01,
+	0x01, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+	0x69, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x68, 0x75, 0x6d, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f,
+	0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var file_huma_proto_goTypes = []interface{}{
@@ -113,7 +113,7 @@ var file_huma_proto_goTypes = []interface{}{
 }
 var file_huma_proto_depIdxs = []int32{
 	0, // 0: huma.public:extendee -> google.protobuf.FieldOptions
-	0, // 1: huma.readOnly:extendee -> google.protobuf.FieldOptions
+	0, // 1: huma.read_only:extendee -> google.protobuf.FieldOptions
 	0, // 2: huma.name:extendee -> google.protobuf.FieldOptions
 	0, // 3: huma.json:extendee -> google.protobuf.FieldOptions
 	4, // [4:4] is the sub-list for method output_type
diff --git a/annotation/huma.proto b/annotation/huma.proto
index 6d27644..3920e59 100644
--- a/annotation/huma.proto
+++ b/annotation/huma.proto
@@ -9,9 +9,9 @@ extend google.protobuf.FieldOptions {
   // Public marks that a field should be included in the generated Huma model.
   optional bool public = 84841;
 
-  // ReadOnly marks that a field is set by the server. The client can only
+  // Read-only marks that a field is set by the server. The client can only
   // read its value, e.g. resource creation date.
-  optional bool readOnly = 84842;
+  optional bool read_only = 84842;
 
   // Name specifies the Huma Go field name. For example, a field might be cased
   // as `Mp2T` but should be `MP2T` because it is a non-common initialism.