macro debug(n: varargs[typed]): typed =
result = newNimNode(nnkStmtList, n)
for x in n:
let xRepr = toStrLit(x)
result.add(quote do: writeLine(stdout, `xRepr` & ": " & $`x`)) http://flyx.github.io/NimYAML/
The examples there show how easy it is to provide the user with a generic interface for serialization in a statically typed language. The implementation does not differ much from what you'd do in a dynamic language: Provide a pair of serialization/deserialization handlers for each of [simple types (string, int, float, enums), array/sequence types, tuple/object/struct types, dict/map types, pointer/reference types].
fwiw if you use the Jitsi widget, you can share the URL to your Jitsi room with anyone and they do not need Element or Matrix to join.
The whole voice/video thing is a design problem as protocols like Matrix or XMPP are designed for non-realtime communication, while voice/video is very much realtime. You cannot possibly federate a video stream, so Matrix or XMPP can, by design, only supply the routing (i.e. connecting the people who want to participate in a realtime chat) and the participants then need to agree on some server/software combo that provides the actual video conferencing.