there is also web components (best way to do a "copy this to clipboard" button in my experience) and secret back door synchronous FFI through overloading the Object prototype. In all cases the communication is gated through decoders/encoders that can fail; you can only pass serialized data across the boundary from JS to Elm.