
MD Transfer Protocol
Sign and publish Markdown under ENS names. Verify integrity and current team authorization.
Demo
About
Markdown is becoming a shared working format for people and AI agents. Teams use it for instructions, research, and decisions, but plain Markdown provides no built-in proof of who signed a document, whether its content changed, or which published version the team intends people to follow. MDTP, the Markdown Transfer Protocol, connects two workflows through one team ENS namespace: signed in private and published in public. ENSv2 subnames identify team members, and current ownership determines whether their signatures or publications verify. Private documents stay offchain and carry two frontmatter fields: signer and signature. MDTP checks the signature over the normalized Markdown body against the current owner of the signer name. Changes to the signed content fail verification. Once a member's subname is revoked onchain, their signed files return Unauthorized on the next verification. Readers need no wallet to verify them. For public documents, MDTP stores Markdown in a Sepolia transaction and points the document name's mdtp text record to it. The transaction preserves that publication, while authorized publishers can update the ENS pointer to a new version. Readers can check the publisher, publication time, and recorded versions. The team chooses which publication to treat as its official source. Memona, our existing local-first Markdown app, is MDTP's first integration. It brings signing, publishing, verification badges, and mdtp:// links into the document workflow. Published documents can also be opened in the browser-based MDTP reader. Our demo follows a research team using fictional token data. Tom, an analyst, signs the team's portfolio strategy. After someone removes RUGY from its blocklist, Helen opens the shared copy and Memona flags it as Tampered. Eric, the team lead, restores the intended content, signs it, and publishes it under the team's designated document name as the official strategy. Without a wallet, Helen follows ENS links to that publication and checks who published it and when. She then asks the Folder Agent to use that strategy. Memona's mdtp_read tool returns the published document only when verification succeeds. Using that source, the agent screens 30 tokens, returns four candidates, and excludes RUGY. When the request points to the unauthorized ghost publication, the tool withholds the content and the demo agent stops without generating a report. Only published Markdown goes onchain; referenced images and videos remain on conventional web servers. The live demo runs on Sepolia. The MDTP core, CLI, WebAssembly bindings, and web demo are open source under the MIT license.
How it's made
MDTP has a Rust core with no network or filesystem I/O. It builds Ethereum calls and decodes responses, while the host application executes them. The CLI, WebAssembly bindings, web demo, and Memona integration reuse this core verification logic. For private files, we sign an EIP-191 personal_sign message containing the ENS signer name and the SHA-256 hash of the normalized Markdown body. Verification recovers the signing address and calls ENSv2's UniversalResolverV2.findOwner to check current ownership. We deliberately use ownership rather than the addr record: wildcard resolution can still return a parent's address after a child name has been revoked. Team setup deploys UserRegistry and PermissionedResolver contracts through VerifiableFactory and registers a name through ETHRegistrar using Sepolia MockUSDC. Members receive subnames with a zero role bitmap, preventing them from transferring or unregistering those names. Administrators manage membership through ROLE_REGISTRAR and ROLE_UNREGISTER. Separately, authorizeTextRoles grants resolver permissions for publishing to a document name's mdtp text record. Publishing sends two Sepolia transactions: a self-send containing the Markdown, followed by an authorized update of the document name's mdtp text record. The web reader discovers recorded versions from the current resolver's TextChanged logs, retrieves the referenced transaction content, and rechecks the publisher's current authorization. The Memona integration connects these two workflows to people and agents. Humans see verification badges and publication details. The mdtp_read tool checks a published document before returning its content to the Folder Agent. In the demo, the agent uses this tool to read the team's designated strategy and stops the report task when the tool refuses an unauthorized publication. Memona predates this hackathon. During ETHGlobal Tokyo, we built the open-source MDTP core, CLI, WebAssembly demo, and the Memona integration for signing, publishing, reading mdtp:// documents, and supplying verified published instructions to the Folder Agent. Claude Code agents wrote most of the implementation, tests, and documentation under our team's direction. Our team defined the product design, file format, and ENSv2 permission model and directed the development work. The repository documents the existing and new components and the AI assistance used.