Web of People - draft specification

Abstract

The Web of People is a loose, informal graph of relationships between internet-connected sites (not necessarily people, despite the name) — a loose Web of Trust — for the purpose of discovering authentic and high-quality web presences, in an ocean of enshittification and AI spam content.

Each participating site publishes a simple plain-text "endorsement file" on the public internet. Endorsement files link to each other and to other resources, creating a loose web of trust which can be crawled to find high-quality content. As in any web of trust, bad actors can be blacklisted and ignored.

Since the network is loose and probably inconsistent at any given time, it shouldn't be used for other purposes besides discoverability, such as calculating trust scores. A spider may calculate a rough trust score at the time of crawling. Discovered links liked by users could be persistently marked as trusted, even if the intermediate chain breaks later.

This document is not final.

File format

An endorsement file is a simple plain-text file, in UTF-8 encoding, with lines ending with LF or CRLF. Endorsement files could exist in other formats in the future, such as JSON or binary.

The first line is the exact ASCII string "WEB OF PEOPLE" (without quotes, and followed by a line ending). It must not be a comment or attribute line.

Blank lines and lines starting with # (ASCII 35) are comment lines, and are ignored.

Lines starting with space (ASCII 32) are attribute lines, which affect the preceding line which is not a comment line or attribute line. No attributes are currently defined, so all attribute lines should be ignored and none should be written. Attribute lines will always be valid UTF-8. Clients written using this draft specification may choose to display all of the attribute lines to the user in raw form.

Other lines are link lines which define the web.

A reference line is written as a keyword "link" or "outlink", a space, a reputation score, a space, and a URI.

URIs never contain spaces. Following a URI in any reference line may be a space and some text to be defined in a later revision.

URIs never begin with {. If a URI or a reference line begins with { it's probably JSON, defined in a later revision.

Reputation scores are "0" or "1" (without quotes). Only the exact string "0" or "1" should be written, but it should be interpreted as a signed integer or floating-point number; only the sign matters.

Semantics

Links refer to other endorsement files. The https scheme is preferred; http is acceptable; other resource-retrieval protocols such as gopher are allowed, but discouraged as they aren't likely to be supported by all spiders. In a future revision, it may be specified that links can point to other file types, such as OPML blogrolls or Fediverse following collections.

Outlinks refer to end resources which are to be discovered through the web of trust/query. They may use any URI scheme, including mailto or news. Clients may not be able to utilize all outlinks, and that is fine.

A reputation of "1" is the default, indicating the maintainer of this file has a generally positive opinion of the other file. This is the normal case - if you believe something is worth linking to, you should have at least a slightly positive feeling about it. Reputation "0" indicates the maintainer has a generally neutral opinion or no opinion. This isn't the normal case, but it could be used by automated indexing processes which discover things without any knowledge of their contents. There are no negative-reputation links, since they have no use; the target of a negative-reputation link could rename the target to avoid the negative reputation.

Spiders SHOULD set the Referer header when spidering, unless there is a particular privacy concern.

ABNF syntax

line-end = [CR] LF

; any byte sequence not containing NUL, CR or LF
anything = *(%x01-09 / %x0B-0C / %x0E-FF)

reputation = "0" / "1"

comment-line = "#" anything
attribute-line = SP anything
link-line = ("outlink" / "link") SP reputation SP uri [SP anything]

line = comment-line / attribute-line / link-line
file = "WEB OF PEOPLE" *(line-end [line])
Postel's Law applies.

Example

WEB OF PEOPLE
# some of the URLs in this example don't actually exist
link 1 https://www.webofpeople.org/wop.txt
outlink 1 https://www.webofpeople.org/
 (future defined attribute)
 (another future defined attribute)
link 1 https://www.example.com/wop.txt
link 0 https://www.google.com/wop.txt