-
Notifications
You must be signed in to change notification settings - Fork 430
Community Spec [DRAFT]
As described in the Steemit 2017 Roadmap:
We believe that high-quality content and communities of content producers and their audiences are the primary driver of growth of the steemit.com site, and in turn the wider adoption of the platform and STEEM. To this end, we wish to enable many users to build communities in parallel around curating specific types of content valuable to their audiences.
To enable this, we intend to augment our current tag-based organizational structure for posts with a new system called “communities”, a special group into which others can post articles. Two types of communities will exist: communities into which anyone in the world can post (where community founders (or their delegated moderators) can decide, post-hoc, which posts to hide from view) or communities in which only community founders’ (or their delegated authors’) posts will appear.
This system of moderation will function identically to the aforementioned comment moderation system, with all content (including hidden or moderated content) published permanently in the blockchain to prevent censorship. The steemit.com web site will respect the display preferences of the specific community maintainers (within their own community namespace only) while simultaneously propagating every participant’s voice throughout the blockchain to the entire world (regardless of moderator opinions).
We believe this unique approach finally solves one of the largest problems currently presented to social media services: the dichotomy between maintaining a high Signal-to-Noise Ratio (SNR) for a quality content experience free of spam and low-value comments, whilst simultaneously preventing any type of censorship.
It is our hope and design goal for our services (all of which are published with full source code for easy deployment by anyone) to be replicated by others, displaying content according to the wishes and whims of each individual website operator, giving readers ultimate choice over the set of moderation opinions they wish to heed.
Any user can create a new community, and each becomes a tuned 'lens' into the blockchain. Currently, there is one large window into the Steem blockchain and that is the global namespace as shown on Steemit.com. This is not ideal because everyone effectively has to share a single sandbox while having different goals as to what they want to see and what they want to build.
Many members want to see long-form, original content while many others just want to share links and snippets. We have a diverse set of sub-communities though they share a global tag namespace with no ownership and little ability to formally organize.
The goal of the community feature is to empower users to create tighter groups and focus on what's important to them. For instance:
- microblogging
- link sharing
- world news
- curation guilds (cross-posting undervalued posts, overvalued posts, plagiarism, etc)
- original photography
- funny youtube videos
- etc
Posts either "belong" to a single community, or are in the user's own blog (not in a community).
Communities are created by designating an account as a community. Each community has a set of admins and moderators who maintain it and control settings over the look and feel.
- Owner: holder of the private key. Assigns admins.
- Admin: can edit admins and mods. Has mod powers.
- Mod: can remove posts, block users, add/remove contributors
- Contributor: in closed communities, an approved poster.
- Guest: a poster in a public community and a commenter in a restricted community
- Public: anyone can post a topic
- Restricted: only mods and approved members can post topics
Either type of community can be "followed" by any user.
Admin settings
-
type
:restricted
orpublic
-
public_comments
: for restricted communities,on
means guests can comment
Mod settings
-
name
: the name of this community (32 chars) -
about
: short blurb about this community (512 chars) -
description
: a blob of markdown to describe purpose, enumerate rules, etc. (5000 chars) -
language
: primary language.en
,es
,ru
, etc -
nsfw
: if this community is 18+, UI automatically tags all postsnsfw
-
bg_color
: hex-encoded RGB value (e.g.EEDDCC
) -
bg_color2
: hex-encoded RGB value, if provided, creates a gradient -
comment_sort
: RESERVED - default sort/display method for comments (e.g.votes
,trending
,age
,forum
) -
display
: RESERVED - graphical layout in communities (version >1.0)
Communities are not part of blockchain consensus, so all actions make use of standard operations. Standalone services will monitor the blockchain for relevant ops to build and maintain state.
The standard format for custom_json
ops:
{
required_auths: [],
required_posting_auths: [<account>],
id: "com.steemit.community",
json: [
<action>,
{
community: <community>,
<params*>
}
]
}
-
<account>
is the account submitting thecustom_json
operation. -
<action>
is a string which names a valid action, outlined below. -
<community>
required parameter for all ops and names a valid community. -
<params*>
is any number of other parameters for the action being performed
Must be submitted by an admin or the community owner account.
["create", {
"community": <account>,
"type": <type>,
"admins": [<admins>]
}]
- type is either
restricted
orpublic
- must name at least 1 valid admin
["addAdmins", {
"community": <community>,
"admins": [ <account>, ... ]
}]
["removeAdmins", {
"community": <community>,
"admins": [ <account>, ... ]
}]
- there must remain at least 1 admin at all times
["addMods", {
"community": <community>,
"mods": [ <account>, ... ]
}]
["removeMods", {
"community": <community>,
"mods": [ <account>, ... ]
}]
["updateSettings", {
"community": <community>,
"settings": { <key:value>, ... }
}]
Valid keys are name
, about
, description
, language
, nsfw
.
In restricted communities, gives topic-creation permission to the named accounts.
["addPoster", {
"community": <community>,
"posters": [ <account>, ... ]
}]
["removePosters", {
"community": <community>,
"posters": [ <account>, ... ]
}]
Muting a user prevents their topics and comments from being shown in the community.
["muteUser", {
"community": <community>,
"user": <account>
}]
["unmuteUser", {
"community": <community>,
"user": <account>
}]
Can be a topic or a comment.
["mutePost", {
"community": <community>,
"account": <account>,
"permlink": <permlink>
"comment": <comment>
}]
["unmutePost", {
"community": <community>,
"account": <account>,
"permlink": <permlink>,
"comment": <comment>
}]
["setUserTitle", {
"community": <community>,
"user": <account>,
"title": <title>
}]
Stickies a post to the top of the community homepage. If multiple posts are stickied, the newest ones are shown first.
["pinPost", {
"community": <community>,
"account": <account>,
"permlink": <permlink>
}]
["unPinPost", {
"community": <community>,
"account": <account>,
"permlink": <permlink>
}]
Following and unfollowing communities is performed identically to following and unfollowing any other user.
Places a post in the review queue. It's up to the community to define what constitutes flagging.
["flagPost", {
"community": <community>,
"author": <author>,
"permlink": <permlink>,
"comment": <comment>
}]
To mark a post as belonging to a community, set the community
key in json_metadata
. Do not use an @
prefix.
{
"community": "steemit",
"app": "steemit/0.1",
"format": "html",
"tags": ["steemit", "steem"],
[...]
}
If a post is edited to name a different community, this change will be ignored. If a post is posted "into" a community that the user does not have permission to post into, the json will be interpreted as if the "community" key does not exist, and the post will be posted onto the user's own blog.
- admin
- Create a community
- Edit community
- Assign Admins/Mods
- mod
- Edit settings
- Edit approved posters
- Moderation queue
- Moderation log
- Muted users
- elements
- user titles
- pin/unpin post
- mute/unmute user
- mute/unmute post
- home
- Main page (Posts list)
- trending/popular communities (+search)
- sharing of post revenue with community account
- post size/type limits per community?
- custom Flag Dropdown text
- UI components to be created (tasks for designers)
- steemit.dmca
- steemit.illegal
- steemit.badtaste
- steemit.abuse
As a first step and concept, we need to have SBDS handle basic feeds.
SBDS should return all the metadata we need to render various post lists without us having to query steemd.
Required metadata includes:
- title
- author
- permlink
- category (later, community)
- net_rshares (must be up-to-date! we will use it to derive pending payout)
- active_votes
- array of all votes: account, weight(%), rshares.
- OR, If not all votes, then aggregate stats, plus indication of current logged in user vote status
- json_metadata
- specifically, we need preview img URL
- post_preview
- requires us to clean & parse a post's body, perform certain transformations, and truncate it.
- a naive implementation can return first 1024 chars and we'll truncate it client-side
- is_nsfw
- comment_count (future: do not count comments by globally muted spam accounts)
-
Implement personalized "homepage" feed
- return posts from everyone you follow
- plus resteems by users you follow (should include their names in the response)
- sorted by creation date (OR first resteem date)
- return posts from everyone you follow
-
Implement user public "blog" feed
- everything this user has posted
- plus everything they have resteemed
- everything this user has posted
- Implement trending/new/hot/promoted algorithms
Investigate overlap of posts
table with SBDS generic
communities
account
is_restricted
followers
is_open_comment
name
about
description
language
is_nsfw
bg_color
bg_color2
community_members
community
account
is_admin
is_mod
is_approved
is_muted
title
community_posts
id
parent_id (or parent_author + parent_permlink)
author
permlink
title
preview
community
is_pinned
is_muted
created_at
payout_at
rshares (important to update this whenever a vote is placed/changed. used for ranking)
community_flags
community
account
comment
author
permlink
community_mod_actions
account
action
params