Matrix, self-hosted, and the Bridge to Signal is unreliable and puts the keys to the kingdom on the bridgge server, which I didn't like.
Unfortunately the protocols are just sightly different (Signal protocol reuses a 25519 key whereas Matrix splits it out into two separate keys) so messages can't just go through and be decrypted at the client end. So it's e2ee from the sender to the bridge, and then e2ee again from the bridge to the recipient.
I ran it for a while, but ended up tearing it down after it stopped working a few times. The only way I've seen that actually keeps e2ee really e2e is using a client like Pidgin which can speak all the protocols and connect to all the servers.