Skip to content

XMTP Overview

Umul's messaging is not homegrown; it sits on top of the XMTP protocol. This chapter explains what that protocol is and why it has the shape it does. For which parts Umul actually uses, see How Umul Uses XMTP.

In one line: XMTP (Extensible Message Transport Protocol) is a wallet-identity-based end-to-end encrypted messaging protocol, plus a shared node network that carries those messages.

The email analogy

A Gmail user can write to a Naver Mail user not because the two companies struck a deal, but because both follow the same protocol (SMTP). XMTP is aiming for that role in the messaging world.

Two things differ from email. Accounts start from a wallet rather than an email address, and end-to-end encryption is the default, so even the service operator cannot read the contents.

The terms, as a house

Protocol vocabulary doesn't stick at first. Read it as a house and the relationships become visible.

Analogy Protocol term Meaning
You, the person = the house Inbox Where messages arrive. One per person
Family members holding keys = devices installation Phone, laptop, each separately. The actual encrypt/decrypt agent
A conversation = a shared vault MLS group Members share a passphrase only they know
The post office = a node xmtpd Carries envelopes and keeps copies
The registry office = the blockchain — Officially records only "whose house" and "who is in the vault"

The part that matters is that several family members hold keys. There is one house (Inbox), but the phone and the laptop each hold a different key, and a new member who has never opened the vault cannot hear what was said before. That is what leads to the recovery limits in Message History.

Three layers

The protocol splits into three layers, and the rest of this chapter follows that split.

Layer Question it answers Document
Identity Who is sending and who is receiving Identity
Encryption How the contents are hidden Encryption and Delivery
Delivery How a message arrives Encryption and Delivery
flowchart LR
  subgraph apps["Apps (Umul, Base App, Convos, ...)"]
    a1["App A client"]
    a2["App B client"]
  end
  subgraph proto["XMTP protocol"]
    id["Identity<br/>who sends and receives"]
    enc["Encryption<br/>contents hidden by MLS"]
    del["Delivery<br/>arrival via topic subscription"]
  end
  subgraph net["Shared node network"]
    n1["Node 1"]
    n2["Node 2"]
    n3["Node 3 ..."]
    n1 <-->|"replicate copies"| n2
    n2 <-->|"replicate copies"| n3
  end
  a1 --> id
  a2 --> id
  id --> enc
  enc --> del
  del -->|"connect to any node"| n1

The key point is that the network is several nodes, not one box. Nodes run by different operators each replicate a full copy of the ciphertext, so a client can attach to any node and messages survive a node going down.

Messages cross app boundaries

They do — with the caveat "among apps that adopted XMTP."

The principle is where the data lives. In a conventional messenger the account and the conversations sit on one company's servers, which is why a KakaoTalk account cannot message a LINE friend. In XMTP the account (Inbox) and the encrypted messages live on the shared network rather than in a particular app, and the app is a window onto that inbox. With the same Inbox you can pick up in app B a conversation you started in app A.

Reading this as "any messaging service at all" is wrong, though. Five conditions have to hold.

Condition Detail
XMTP adoption No interop with WhatsApp, Telegram, or KakaoTalk. Same as email not reaching a fax machine, which doesn't speak SMTP
Same network environment dev / production / local are entirely separate and incompatible. Across environments neither identity nor messages carry over
Same protocol generation v2 conversations were not migrated to v3. Across generations the link breaks
Content type support The message arrives, but if the receiving app doesn't know the type it shows only the fallback text
Consent state Messages from unknown senders arrive but may be routed to a request inbox (consent)

Umul uses the dev environment. So it does not currently interoperate with XMTP apps on production. That is a choice rather than a constraint, and it is covered in How Umul Uses XMTP.

A short history

The early versions (v1/v2), started in 2021, used a homegrown encryption scheme. From June 2024 the project moved to v3, based on the IETF standard MLS, and v2 was retired to read-only on 2025-06-23 (XIP-53). Since December 2025 the company-operated central network has been migrating to a decentralized node network.

That is one generational change in four years, and building an app on XMTP means accepting the operational cost of following such changes. It is noted again under Limits.