Looks great, thanks for sharing!
I just noticed you committed your .beam files and the _build directory. I think that's a bit unusual.
If you don't use specific features of jsx and can restrict compatibility to more recent versions of Erlang/OTP (27+) you might be able to use the built-in json module https://erlang.org/documentation/doc-15.0-rc3/lib/stdlib-6.0...