<article>
	<h1>Fediverse ID (Fediverse)</h1>
	<section>
		<address class="h-card">
			by
			<a rel="author" class="u-url" href="http://changelog.ca/"><span class="p-given-name">Charles</span> <span class="p-additional-name">Iliya</span> <span class="p-family-name">Krempeaux</span></a>
		</address>
	</section>
	<section>
		<p>
			The final say for what is and is not a valid <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link> are the many implementations of <ziba-link transform="lowercase">WebFinger</ziba-link> in-the-wild in all the different <ziba-link transform="lowercase">Fediverse software</ziba-link> out there.
			(Which could be different from each other.)
		</p>
		<p>
			Because, from a technical point-of-view, a <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link> is turned into an <ziba-link>acct URI</ziba-link> and then resolved with <ziba-link transform="lowercase">WebFinger</ziba-link>.
		</p>
		<p>
			Also, there currently is no canonical syntax for a <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link>.
			Currently, the syntax of a <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link> is whatever each implementation supports.
			(Which again could be different from each other.)
		</p>
		<p>
			But, having said that, we can infer a <em>minimum syntax</em> for what should be considered a valid<ziba-link transform="lowerllamacase">Fediverse ID</ziba-link>.
			I.e., the syntax that any implmentation for <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link>s <em>should</em> support.
			But, to say it explicitly, an implemention for <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link>s <em>could</em> support more than just what is given by this syntax.
		</p>
	<section>
		<h2>acct URI</h2>
		<p>
			Part of the process of <strong>resolving</strong> a <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link> transfomrs a <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link> into an <ziba-link>acct URI</ziba-link>.
			(And then using that <ziba-link>acct URI</ziba-link> version of the <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link> makes a request to <ziba-link transform="lowercase">WebFinger</ziba-link>.)
		</p>
		<p>
			Here is an example of transforming a <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link> into an <ziba-link>acct URI</ziba-link>:
		</p>
<pre>

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

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

</pre>
		<p>
			A client would then make a request to:
		</p>
<pre>
https://example.com/.well-known/host-meta
</pre>
		<p>
			To discover what the (template) URL for <ziba-link transform="lowercase">WebFinger</ziba-link> is.
			And then, for example, if it is at:
		</p>
<pre>
https://example.com/.well-known/webfinger?resource={uri}
</pre>
		<p>
			Then make a request to:
		</p>
<pre>
https://example.com/.well-known/webfinger?resource=acct:joeblow@example.com
</pre>
	</section>
	<section>
		<h2>Fediverse ID Syntax</h2>
		<p>
			Inferring from IETF RFC-7565 (The 'acct' URI Scheme) and referenced IEFC RFCs, the syntax of a <ziba-link transform="lowerllamacase">Fediverse ID</ziba-link> is:
		</p>
<pre>
fediverseID = "@" actor "@" host
</pre>
		<p>
			Where “actor” is defined as:
		</p>
<pre>
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"
</pre>
		<p>
			(Again note that an implementation <em>could</em> support more characters for “actor” than what is given by this definition.)
		</p>
		<p>
			And “host” is defined as
		</p>
<pre>
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 )
</pre>
	</section>
</article>