Surreal is a bit of a mind bender. It is not a serialization library per-se and yet, when performance is crucial, can act as a drop-in replacement for Transit.
The need for it came about from Roam’s data-intensive frontend app which serializes and deserializes several megabytes of data on every load.
I can easily see how surreal can look like HACK to many. It strongly relies on the unchanging nature of Clojure. If the implementation details of CLJS data-structures change, chances are that surreal will break. On the flip side, if that happens, which is unlikely, breakage should be evident during dev. Your serialization / data-layer will break instantly. Not a bad trade-off if you ask me.
It’s early days for surreal. Thoughts, testers and contributors are very welcome!