Skip to content

Community Spec [DRAFT]

Jeffrey Paul edited this page Feb 8, 2017 · 19 revisions

Steemit Communities

Overview

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).

Specifications

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.

Member Types

  1. Owner: holder of the private key. Assigns admins.
  2. Admin: can edit admins and mods. Has mod powers.
  3. Mod: can remove posts, block users, add/remove contributors
  4. Contributor: in closed communities, an approved poster.
  5. Guest: a poster in a public community and a commenter in a restricted community

Community Types

  1. Public: anyone can post a topic
  2. Restricted: only mods and approved members can post topics

Either type of community can be "followed" by any user.

Community parameters (editable by mods)

Admin settings

  • type: restricted or public
  • 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 posts nsfw
  • 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)

Operations

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 the custom_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

Admin actions

Must be submitted by an admin or the community owner account.

Designate account as a community

["create", {
  "community": <account>, 
  "type": <type>,
  "admins": [<admins>]
}]
  • type is either restricted or public
  • must name at least 1 valid admin

Add admin

["addAdmins", {
  "community": <community>, 
  "admins": [ <account>, ... ]
}]

Remove admin

["removeAdmins", {
  "community": <community>, 
  "admins": [ <account>, ... ]
}]
  • there must remain at least 1 admin at all times

Add moderator

["addMods", {
  "community": <community>, 
  "mods": [ <account>, ... ]
}]

Remove moderator

["removeMods", {
  "community": <community>, 
  "mods": [ <account>, ... ]
}]

Moderator actions

Update settings

["updateSettings", {
  "community": <community>, 
  "settings": { <key:value>, ... }
}]

Valid keys are name, about, description, language, nsfw.

Add approved posters

In restricted communities, gives topic-creation permission to the named accounts.

["addPoster", {
  "community": <community>, 
  "posters": [ <account>, ... ]
}]

Remove approved posters

["removePosters", {
  "community": <community>, 
  "posters": [ <account>, ... ]
}]

Mute user

Muting a user prevents their topics and comments from being shown in the community.

["muteUser", {
  "community": <community>, 
  "user": <account>
}]

Unmute user

["unmuteUser", {
  "community": <community>, 
  "user": <account>
}]

Mute a post

Can be a topic or a comment.

["mutePost", {
  "community": <community>,
  "account": <account>,
  "permlink": <permlink>
  "comment": <comment>
}]

Unmute a post

["unmutePost", {
  "community": <community>,
  "account": <account>,
  "permlink": <permlink>,
  "comment": <comment>
}]

Set user title

["setUserTitle", {
  "community": <community>,
  "user": <account>,
  "title": <title>
}]

Pin/unpin a post

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>
}]

Public operations

Un/Following a community

Following and unfollowing communities is performed identically to following and unfollowing any other user.

Flag a post

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>
}]

Posting in a community

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.


Pages

  • 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)

TODO

  • 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)

global/top-level moderation

  • steemit.dmca
  • steemit.illegal
  • steemit.badtaste
  • steemit.abuse

SBDS prep

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)

SBDS - basic post feeds

  1. 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)
  2. Implement user public "blog" feed

    • everything this user has posted
      • plus everything they have resteemed

SBDS - global content ranking feeds

  • Implement trending/new/hot/promoted algorithms

Community db schema

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
Clone this wiki locally