Skip to content

Federation you can read.

Versia is a federation protocol: signed JSON over HTTP, with a small core and namespaced extensions. Here is one message, whole. Read the introduction, or start with entities.

POST /.versia/v0.7/inboxHost: b.exampleContent-Type: application/vnd.versia+json

One inbox. A single endpoint receives messages for every user on the instance.

Versia-Signed-By: a.exampleVersia-Signed-At: 1733051946Versia-Signature: vWLvWY6eu+B0iROzaDaIZsrX2wQNHMfZiCo8ob89B34m8ACwKj2BKJL+XRLyIS0ltAijrYKLHSTyoI0ho6KNCg==

Signed. Requests are signed with the instance’s Ed25519 key, and rejected if the timestamp is more than 5 minutes off.

{    "id": "033r20svqa000",    "type": "pub.versia:social/Note",    "created_at": "2024-12-01T11:19:04Z",    "attachments": [],    "author": "a.example:034d45r3e6003",    "category": "microblog",

Self-description. Headers and transport stay out of the data. One plain JSON object holds everything needed to process the entity, with no JSON-LD.

    "content": "<p>Hello, @joe@b.example! How are you doing today?</p>",    "visibility": "public",    "is_sensitive": false,    "mentions": [        "b.example:034de9r4fr006"    ],    "previews": [],

Determinism. Rich text is one HTML string with a fixed set of elements: one way to represent any single piece of data.

    "extensions": {        "pub.versia:custom_emojis": {            "emojis": []        }    }}

Extensions. Anything beyond the core sits under a namespaced key. Implementations that do not support it can ignore it.

What a.example sends b.example when someone posts. The signature is real: it was made with the example key, so you can verify it. See the whole exchange.

Extensions

The core stays small. Everything else is a namespaced extension, implemented in any combination.

Implement it

Versia can be implemented in any language. Start with the guide to implementing a receiver, or use the official TypeScript SDK.

Verso is the reference implementation. It also implements the Mastodon client API, so it works with the apps people already use. It is in early development and isn’t ready for production yet.

This community could include you! Check out our Git repository to see how you can contribute.

Maintainer

Versia, formerly known as Lysand, is maintained by Jesse (@CPlusPatch). You can ask Jesse for help with anything Versia-related, or if you just want to chat!

Thanks

Thanks to Fastly for supporting us with their resources!