View Options
Hashtags for the Open Internet
Octothorpes are hashtags and backlinks that can be used anywhere on the web, linking urls and resources across a network of domains.
How to Octothorpe
- Register with an Octothorpes Ring
- Create Hashtags on your site.
- Create Backlinks to other sites.
Why Tho
Octothorpes frees the fun and utility of hashtags from the confines of commercial platforms and individual domains.
Octothorpe servers expand on web rings and blog rolls, acting as feeds and search engines that small communities can easily own and manage.
Getting Started
Every Octothorpes Ring is a collection of verified domains, each opting in to being indexed and contributing it’s links to the overall network.
The first step is to add your domain to the Ring.
Register a Domain
In order to contribute to the Ring, domains need to be verified. You can register your domain on this Ring.
Registration allows Rings to manage spam and other unwanted content. Be sure to read a Rings terms before registering.
Verify a Domain
Note: Different Rings may have different rules for domain verification.
To verify a domain in this Ring, the administrator of the Ring will determine if the domain is appropriate and aligned with the goals and terms of the Ring.
Domain Approval
Once your domain has been registered, you will receive an email. Check to see if your domain is present on the Rings list of sites.
Web of Trust
Any domain that is verified on an Octothorpes Ring can endorse another domain, automatically verifying the new domain.
To endorse another domain, add a <link>
tag to a page on your website.
<link
rel="octo:endorses"
href="https://endorsed.example.com">
Tags
You can tag your pages with terms, which are collected on your Ring.
Indexing a Page
Pages are passively indexed by Octothorpe Rings. To index a page whenever someone visit it, add this link
tag to the documents head
.
<link
rel="preload"
as="fetch"
href="<ring>/?uri=<page>">
<ring>
: The URL for an Octothorpes Ring.
<page>
: The URL for the page being indexed.
A single page can request indexing from any number of Rings. Include one <link>
tag for each Ring.
By default, a ring will not index a page more regularly than once every five (5) minutes.
Octothorpes Are Links
Specifically, octothorpes are links between your page and a Ring’s tag. Create them by adding a <link>
tag to your pages <head>
.
<link
rel="octo:octothorpes"
href="architecture" >
rel=
: Defines the link
as an Octothorpe.
href=
: References a Tag on an Octothorpes Ring.
This <link>
will tag the page with the octothorpe #architecture.
Octothorpes Are Anchors
If you want a link to be an octothorpe in the content of your page rather than just metadata, you can use an <a>
tag.
<a
rel="octo:octothorpes"
href="<ring>/~/architecture">
Architecture
</a>
rel=
: Defines the link
as an Octothorpe.
href=
: References a Tag on an Octothorpes Ring as well as a URL on your website.
This <a>
will tag the page with the octothorpe #architecture.
Backlinks
Backlinks are links that go … back. Pages within a Ring can see which other pages linked to them.
Creating Backlinks
Backlinks are anchors. If you want a link to be saved as a backlink can define the relationship on the <a>
tag.
<a
rel="octo:octothorpes"
href="https://ideastore.dev/">
The Idea Store
</a>
This will allow https://ideastore.dev/
to backlink to this page.
Endorsing Backlinks
In order to be recorded in the Ring, a pages need to endorse backlinks. Any page can endorse backlinks from any origin by including a <link>
tag in the the <head>
of the page.
<link
rev="octo:octothorpes"
href="*">
Pages can limit the domains they endorse backlinks from:
<link
rev="octo:octothorpes"
href="https://originating-site.com">
That tells the Octothorpe server that you endorse links originating from the specified URL, and they’ll be registered as backlinks.
Fetching Backlinks
You can fetch a pages backlinks as a JSON object by GET
ing the following endpoint:
<ring>/~/<url>
Note; make sure to encode the URL
Bookmarks
Bookmarks are a combination of a backlink and a hashtag.
Bookmarks as Assertions
Creating a Bookmark is adding Hashtags to a URL that you don’t control. You create a bookmark by sending a URL that is not on your domain to the an Octothropes Ring for indexing, along with additional information you want to associate with the bookmark.
<link
rel="preload"
as="fetch"
href="<ring>
?uri=<not-your-url>
&octothorpes=<term>,<another>"
>
Communities
There are several ways to interact with an Octothorpes Ring.
Report a URL
To report any part of an Octothorpes ring, submit a report of the offending URL at that rings report form. This will alert the Octothorpe Rings admin to take appproriate action.
Moderation
Any verified domain on an Octothorpes Ring can take action to moderate that ring. These actions include:
- Ban a Term
- Ban a Domain
To perform moderation, visit the report form, authenticate a URL, and submit your report.
Authenticate a URL
- On the report form, click
Authenticate URL
. - Enter the URL and hit “Authenticate”.
- Copy the provided
<link>
tag to the<head>
of that URL.
Submit an Authenticated Report
- Enter the URL of the Site or Term to take action against.
- Select the URL to authenticate the action with.
- Submit the report.
Any domain or term that has an authenticated report against it will be removed from the Octothorpe Ring.
RSS Feeds
You can follow an entire Ring, and receive every new tag event, by subscribing to the Rings feed:
<ring>/rss
You can follow specific tag individualy by subscribing to those tags feeds:
<ring>/~/<tag>/rss
ActivityPub & Mastodon
An Octothorpes Ring, or any Tag in a Ring, can be followed as an ActivityPub Agent.
The username for the entire Ring is:
@~@<ring>
The username for a specific tag is:
@<tag>@<ring>
Hosting a Community
Anyone can host an Octothorpes Ring for their community. Use either the open source codebase directly, or reach out to admin@octothorp.es to inquire about a managed instance.
Technical Details
An Octothorpes ring is stored as a graph of statements – which URLs reference which term, which URLs link to which URLs, and which URLs bookmark other URLs with which terms.
How Indexing Works
When you use the <link>
to request that a page gets indexed, here’s what happens:
1. Your page sends a GET request to the server.
The ?uri=
query paramenter gets sent along with this request to tell the server which page it should index. The server only can see the originating domain, and this uri
parameter.
Any page on your domain can request any other page get indexed by sending this GET
request. Adding the <link>
element anywhere in your document does this on page load, but it can happen at any time in any way.
2. The server checks to see if this domain is verified.
If the domain requested for indexing is a verified member of the ring, it will get indexed. Otherwise it wont.
3. The uri
gets indexed.
The server will request the HTML body of uri
in order to index it. It will not make more than 1 request every five minutes to avoid DDoSing you.
This request is just a regular fetch
request to GET
your page. It should not impact your server any more than a single user visiting your site would.
4. Look for relationships.
In the HTML that comes directly from the server, we look for any tags, links, or bookmarks.
This means that any Octothorpes added with client-side JavaScript will not be verified. The relationships must be present in the HTML from your server to be trusted.
5. The server saves the relationships to it’s graph.
The graph is a series of statements about domains, pages, and their relationships.
Statements about a page that octothorpes a term are hashtags.
Statements about a page that octothorpes another page are backlinks.
Statements about a page that octothorpes another page with terms are bookmarks.
Bulk Indexing
You can send a json-ld
graph of your entire sites index to an Octothorpe ring in order to pro-actively add your tags, backlinks, and bookmarks to the graph.
REST API
You can fetch any Tag as a JSON object via a GET
request against the tags URL:
curl -X GET -H "Content-type: application/json" -H "Accept: application/json" "<ring>/~/<tag>"
GET https://octothorp.es/
Fetches information about the Ring.
Response:
{
"instance": "https://octothorp.es/"
}
GET https://octothorp.es/domains
Fetches a list of verified domains that are part of the Ring.
Response:
{
"domains": […]
}
GET https://octothorp.es/domains/<domain>
Fetches all pages, octothorpes, and backlinks associated with a domain.
Response:
{
"uri": <domain>,
"octothorpes": […]
}
GET https://octothorp.es/~
Fetches all the terms present on a Ring.
Response:
{
"octothorpes": […]
}
GET https://octothorp.es/~/<term>
Fetches all the URLs that octothorpe a given Term.
Response:
{
"uri":"https://octothorp.es/~/<term>",
"octothorpedBy": […url]
}
GET https://octothorp.es/index?uri=<uri>
Submits a given uri for indexing on the Ring.
Response:
200