The following is an initial non-technical specification for a protocol I am working on. I am looking for general feedback before I take too many next steps. There is a technical specification in the works but wanted to use this opportunity to get some initial feedback before too many things are solidified. I have listed a few concerns about the protocol at the end but I am interested in any concerns/problems anyone has on the general direction of the protocol.
Purpose
The goal of the {awesome_name} Protocol is to create a standardized model of communication between content creators and content consumers. In the current web model, the users and content creators are tied to an online service and locked into the serviceâs ecosystem. In the Web3 era of ownership and interoperability, this protocol aims to allow creators and consumers stay connected no matter what service is being used. In its most basic form, this protocol allows consumers to subscribe to any number of creatorsâ content. Doing so will push new content to wherever a consumer wants.
Overview
The protocol is designed to have many different online services be able to send new content to consumers with minimal implementation requirements. The online services that could use this protocol are services that host blogs, videos, podcasts, social media, or any form of content a user would consume. The service would do exactly it does right now except when new content is posted, that content would be sent to a subscriber directly (outside the service).
The content consumer end can also be implemented in any application with a minimal implementation requirements. All the application would need to do is be able to accept new content and then display that content to the user. It could be implemented as a simple standalone application or be integrated into an already existing application. A content consumer will also be able to directly react to content such as like, share, tip, etc⌠to allow for feedback directly in their content feed instead of having to go to each site individually.
On top of this the content creator can move the source of their distribution at any time. This means if a content creator no longer wants to post their content on Site1, they can move to Site2 and will not lose connection to their subscribers. The same goes for content consumers, they are not locked into a single application and can migrate at anytime.
The protocol can be thought of an RSS feed for the Web3 era with two way communication and real time updates.
Terms
Channel
A channel is a content source that outputs any media, such as blogs, videos, or social media posts. When a consumer subscribes to a channel, that channel will push its content to that subscriberâs feed.
Channel requirements:
- Contain a function to modify a subscription for a feed
- Send new content to subscribed feeds
- Convert the content into a common format that the channel and feed both understand
The channel is tied to its owner rather than an application. A feed only checks for a valid owner on a message rather than the source of the message. This allows the owner of a channel to send content from anywhere, to any feed subscribed to that channel, meaning:
- An application can upgrade its code without breaking channels
- A content creator can switch online applications and maintain all their subscribers
Subscription
A contract between a feed and channel that defines what content the channel should send to a feed, and where to send it.
Subscriptions contain:
- A callback function to add content to a feed
- The feed ownerâs identifier
- Optional data to only include a subset of the channel content
Subscriptions can only be modified by the feedâs owner.
Feed
An inbox that can subscribe to one or more channels and receives new content from them through a subscription. Subscriptions can be modified to send content to a different application by the owner of a feed. The feed then can move between different applications with little friction.
Reaction
Reactions are optional callbacks that allows feeds to communicate reactions to content from a channel.
Examples of reactions include liking, re-sharing, tipping and commenting. Reactions are not required and are to be specified by the channel.
Content
Content is any form of media that a creator has made and wants to share with an audience. This can come in the form of text, html, videos, audio, etc⌠Each content update to a feed will have a standardized (but expandable) format so the feed will be able properly display all content.
Flow
Subscribing to a Channel
In order for a feed to receive content from a channel, the feed needs to create a subscription with it. The feed just needs to know is where that Channel is located and follow the protocol subscription parameters. Channel discovery is not defined in the protocol but things like a Channel Registry (see Additional Features
section) can be used to lookup channels.
Once the feed makes a request to setup a subscription with a channel , the channel can decide whether to accept it or not. This can be useful for NFT gating, charging fees, or just making sure that both the feed and the channel use the same content formats.
If accepted then the channel must save the subscription information to know what feed to push content to and what content to send to it. At any time the channel may unsubscribe a feed for any reason. Some reasons may be the feed canister no longer exists, the feed owner no longer has the gating NFT or if the channel wants to purge subscriptions.
Each subscription can include filters to only subscribe to a subset of the channel content. This allows a channel to have as much content as they want while also allowing a feed to only receive the content it desires.
Posting new content to a Channel
When the channel posts content, it sends the content (or a link to that content) to all feeds with applicable subscriptions. The feed should validate that the content is from the channel creator (signature) rather than from the application the content came from (cannister id). This allows content creators to be decoupled from any application.
Reacting to Channel content
When a user is consuming content they can respond to that content with a specified list of actions provided by the channel. Examples can be likes, shares and comments. This is an optional feature that is specified by the channel.
Updating a subscription
At anytime the feed can modify or cancel the subscription to a channel. The user just needs to resubscribe with the proper info and prove they own their feed (signature). This allows the channel to know that the request is coming from the same user that originally created it.
Protocol Flexibility
The protocol is designed for flexibility to allow it to evolve over time and for features to be easily implemented on top of it. To do this, certain aspects of the protocol are open-ended.
Content, signatures, and reaction formats have initial specifications but allow for additional formats that donât currently exist or are only specific to certain applications.
During the subscribing process, the formats to be used for communication are agreed upon by the channel and the feed. This allows channels and feeds to add new features but fall back to a simpler format if not supported by both.
Protocol Extensions
Channel Registries
The ability for feeds to discover channels isnât directly a part of the protocol. This can be solved for by using one or more registries that contain basic information for a channel, such as locations and content descriptions.
User Identity
An important part of user interaction or discovery is knowing what users are a part of channels and what users are consuming the channel content. This is not built directly into the protocol due to there being many identity services and protocols, but this protocol design will include extendable aspects to integrate user identity.
Minimal Implementation Design
The simple design has 2 canisters, one for the channel and one for the feed
Setup subscription:
Content consumption:
Sources of Inspiration
This protocol is inspired by ActivityPubâs federated protocol and RSS feeds.
ActivityPub tries to connect social media networks with a common set of rules and structures but is challenging to implement because it requires services to be designed from the ground up around the protocol. The {awesome_name} Protocol is designed as a small extension that can be added to an existing service.
RSS feeds are a simple but outdated standard provide limited functionality beyond sharing updates between websites when a consumer requests (polls) those updates. {awesome_name} Protocol allows for the ability to get insights on who is consuming content and allows those consumers to communicate with the content creator.
Concerns with Protocol
Adoption by content publishing services (monetization)
Due to Web3 being so new this one is my biggest concern. If this were a Web2 protocol, it might not work because of the dependence of ads to online services. This protocol might get in the way of content consumers getting all their content from the site directly, which is needed so eyeballs look at the ads and suggestions the site displays.
The HOPE is that Web3 monetizes a different way than just advertising but even if it doesnât, my assumption is that most sites will want someone on their site more than a feed off their site. So will having a protocol that needs to be implemented by content sites work out if there is a down side for it.
That being said, there are some advantages:
- Smaller sites can have a larger user base since they donât have to compete as hard against the top site
- Content publishing sites can implement a feed into their own site and have both content publishing AND content consuming. There could be competition of who has the best âdashboardâ for content consumption
Social Media
This protocol focuses on publishing large pieces of content but may struggle with some social media with small and frequent posts. The idea was that this protocol could unite ALL online content publishing services, but if connected to something such as Distrikt or Seers it could(?) be overwhelming unless bundled together. There are possible solutions but this is the current state of the protocol.