This allows the backend to store modifications of types for which it doesn't have a model class for serialization/deserialization. These modifications have the type "custom" and are represented with the class CustomModificationHolder, which can hold any arbitrary properties. When they are serialized and sent to an R5 worker, their type is replaced with the contents of their property "r5type". The R5 worker (which might be a custom version with experimental modification types) then deserializes the modification as the specified type.
This allows the backend to store modifications of types for which it doesn't have a model class for serialization/deserialization. These modifications have the type "custom" and are represented with the class CustomModificationHolder, which can hold any arbitrary properties. When they are serialized and sent to an R5 worker, their type is replaced with the contents of their property "r5type". The R5 worker (which might be a custom version with experimental modification types) then deserializes the modification as the specified type.