Migrating Between Matrix (Element) Accounts for Beeper

Migrating Between Matrix (Element) Accounts for Beeper

I was recently invited to Beeper (one chat app for fb/insta/discord/linkedin/etc). It has definitely helped me stay up-to-date with replying to friends across different chat apps as I can now see them all in one place.

Beeper doesn’t let you connect a Matrix account (yet). Which kinda makes sense since Beeper gives you a Matrix account when you sign up. Since I’ve been enjoying Beeper so much I decided to try to move a few chats from my main Matrix account to there.

I Kagi’d around a bit and didn’t see too much about how one should migrate accounts. I did see this tool to do it for you. However, the tool says “This is a labs feature and should be used with caution” and I don’t want to share my credentials to see how well it works. It does say this though:

Migration is performed by logging in on behalf of your old and new accounts and automatically inviting your new account in to all of the rooms that your old account is in. You can optionally request that your old user leaves rooms once the new user has successfully joined.

I decided to try it for myself manually. First, I created a chat between my Beeper and Matrix.org accounts. Then I added my Beeper account to a 1:1 chat with a friend.

Decrypting Messages

Unfortunately, that’s where I hit my first snag, the dreaded error message:

Unable to decrypt: The sender's device has not sent us the keys for this message.

Screenshot of Beeper chat with previously metioned error message.

It was showing this for messages from my Matrix account and from my friend. I waited a while. I clicked the “force sync” button. I didn’t see any request on my other devices to send keys. I found this relatively recent (2023) meta issue about encryption issues and how they’re being addressed by the Element R (rust) crypto library being rolled out. This tells me it is still an issue. The blog post linked in the thread gave me the idea to poke around in my settings and see what I can find. I “verified” the session between my two accounts but it didn't help. I kept digging around.

Lo and behold: there’s an option to Import and Export “E2E room keys.” It seemed like it might help and it couldn’t hurt so I went ahead and exported the keys from my Matrix account and imported them into my Beeper account. Voilà, now all the messages are decrypted! 👏

I added my Beeper account to a big (10+) E2E group chat. The same issue happened, but over a few minutes some of the messages showed up from people who were online but most remained encrypted. I once again imported the same keys to Beeper and boom, all the messages were readable. Awesome!

Making Accounts Admin

One other issue, I want to make my Beeper account Admin in these rooms. I click “Room Info” -> “People” -> My Beeper account but don’t see any option to make someone else an admin. I just see these options:

Confused, I google “How to make someone a room admin in Matrix” and similar phrases but don’t come up with anything. After a while, I figured out to click “setting” on the room and then under “Role & Permissions” you can add someone as admin. It’s a bit tucked away, and definitely room for improvement with the Element clients but it worked like a charm.


The migration was a bit annoying, but overall I’m happy that it was relatively easy to migrate accounts and that, with a little polish, the process should be no problem in the future.

On a side note: I do worry about completely relying on Beeper for my Matrix chats. They are a VC-backed company that may not be around too long. However, they’ve built a great experience that I’m willing to pay for when the time comes so I’ll enjoy it while it lasts. Oh, also it sucks that Beeper MITM all your messages but… the end UX is nice enough to justify it for now.

PS: Someone should make a video demo of the Matrix migration tool so people can see how it works. Specifically, does it move all your chats or let you select which ones to move? Does it handle the keys issue I had to deal with manually?