Fediverse ID (Fediverse)

by

A Fediverse ID is an identifier that conceptually is usually used to point to a person, but also can be conceptually used to point to an application, a group, a organization, a service, or any types of entities.

Here are some sample Fediverse IDs:

Resemblance With E-Mail Addresses

A Fediverse ID looks similar to an e-mail address.

The main superficial difference being that a Fediverse ID starts with an at sign (“@”) (Unicode character U+0040), but an e-mail address does not.


     at sign
       ↓
       @joeblow@example.com ← Fediverse ID

        joeblow@example.com ← e-mail address
       ↑
  no at sign

Usage

Fediverse IDs appear in posts on the Fediverse, and are typed (something with the help of some form of autocomplete) by users.

acct URI

Part of the process of resolving a Fediverse ID transfomrs a Fediverse ID into an acct URI. (And then using that acct URI version of the Fediverse ID to make a request to WebFinger.)

Here is an example:


     at sign
       ↓
       @joeblow@example.com ← Fediverse ID

   acct:joeblow@example.com ← acct URI
       ↑
  no at sign

Fediverse ID Syntax

The final say for what is and is not a valid Fediverse IDs are the many implementations of WebFinger in-the-wild. (Which could be different from each other.)

But, having said that, what we can infer what an implementation that uses Fediverse IDs should probably support at minimum. I.e., an implmentation consider more than just this as a valid Fediverse ID — but all these should work.

Because Fediverse IDs are, from a technical point-of-view, closely tied to acct URI (because of WebFinger) it can affect what is a valid Fediverse ID.

Inferring from IETF RFC-7565 (The 'acct' URI Scheme), the syntax of a Fediverse ID is:

fediverseID = "@" actor "@" host

Where “actor” is defined as:

actor       = unreserved / sub-delims 0*( unreserved / pct-encoded / sub-delims )

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

pct-encoded = "%" HEXDIG HEXDIG

ALPHA       =  %x41-5A / %x61-7A   ; A-Z / a-z

DIGIT       =  %x30-39             ; 0-9

HEXDIG      =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"

(Again note that an implementation could support more characters for “actor” than what is given by this definition.)

And “host” is defined as

host        = IP-literal / IPv4address / reg-name

IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"

IPv6address =                            6( h16 ":" ) ls32
            /                       "::" 5( h16 ":" ) ls32
            / [               h16 ] "::" 4( h16 ":" ) ls32
            / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
            / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
            / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
            / [ *4( h16 ":" ) h16 ] "::"              ls32
            / [ *5( h16 ":" ) h16 ] "::"              h16
            / [ *6( h16 ":" ) h16 ] "::"

h16         = 1*4HEXDIG

ls32        = ( h16 ":" h16 ) / IPv4address

IPvFuture   = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

dec-octet   = DIGIT                 ; 0-9
            / %x31-39 DIGIT         ; 10-99
            / "1" 2DIGIT            ; 100-199
            / "2" %x30-34 DIGIT     ; 200-249
            / "25" %x30-35          ; 250-255

reg-name    = *( unreserved / pct-encoded / sub-delims )