);
+
+Table.propTypes = {
+ headers: PropTypes.array,
+ commenters: PropTypes.array,
+ onHeaderClickHandler: PropTypes.func,
+ onRoleChange: PropTypes.func,
+ onCommenterStatusChange: PropTypes.func,
+ viewUserDetail: PropTypes.func,
+};
+
+export default Table;
diff --git a/client/coral-admin/src/routes/Community/containers/Table.js b/client/coral-admin/src/routes/Community/containers/Table.js
index 5d4e4914f..086a56638 100644
--- a/client/coral-admin/src/routes/Community/containers/Table.js
+++ b/client/coral-admin/src/routes/Community/containers/Table.js
@@ -1,10 +1,10 @@
import React, {Component} from 'react';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';
-import {compose} from 'react-apollo';
import {setRole, setCommenterStatus} from '../../../actions/community';
import Table from '../components/Table';
import {viewUserDetail} from '../../../actions/userDetail';
+import PropTypes from 'prop-types';
class TableContainer extends Component {
@@ -22,6 +22,12 @@ class TableContainer extends Component {
}
}
+TableContainer.propTypes = {
+ setRole: PropTypes.func,
+ setCommenterStatus: PropTypes.func,
+ commenters: PropTypes.array,
+};
+
const mapStateToProps = (state) => ({
commenters: state.community.accounts,
});
@@ -33,7 +39,5 @@ const mapDispatchToProps = (dispatch) =>
viewUserDetail,
}, dispatch);
-export default compose(
- connect(mapStateToProps, mapDispatchToProps),
-)(TableContainer);
+export default connect(mapStateToProps, mapDispatchToProps)(TableContainer);
diff --git a/client/coral-admin/src/routes/Configure/components/Configure.css b/client/coral-admin/src/routes/Configure/components/Configure.css
index 33a0c9c6f..82760acff 100644
--- a/client/coral-admin/src/routes/Configure/components/Configure.css
+++ b/client/coral-admin/src/routes/Configure/components/Configure.css
@@ -20,7 +20,7 @@
.mainContent {
width: calc(100% - 300px);
- padding: 10px 14px;
+ padding: 10px 14px 80px 14px;
box-sizing: border-box;
max-width: 718px;
}
diff --git a/client/coral-framework/components/ConfigureCard.css b/client/coral-framework/components/ConfigureCard.css
index 0aafcf7f4..f72ea0c73 100644
--- a/client/coral-framework/components/ConfigureCard.css
+++ b/client/coral-framework/components/ConfigureCard.css
@@ -3,6 +3,7 @@
align-items: flex-start;
min-height: 100px;
max-width: 600px;
+ overflow: visible;
}
.header {
diff --git a/client/talk-plugin-commentbox/CommentForm.js b/client/talk-plugin-commentbox/CommentForm.js
index 55d248994..7c9f1342f 100644
--- a/client/talk-plugin-commentbox/CommentForm.js
+++ b/client/talk-plugin-commentbox/CommentForm.js
@@ -85,9 +85,14 @@ export class CommentForm extends React.Component {
render() {
const {maxCharCount, submitEnabled, cancelButtonClassName, submitButtonClassName, charCountEnable, body, loadingState} = this.props;
- const length = body.trim().length;
- const isRespectingMaxCount = (length) => charCountEnable && maxCharCount && length > maxCharCount;
- const disableSubmitButton = !length || isRespectingMaxCount(length) || !submitEnabled({body}) || loadingState === 'loading';
+ const length = body.length;
+ const isRespectingMaxCount = (length) => charCountEnable && maxCharCount && length > maxCharCount;
+ const disableSubmitButton =
+ !length ||
+ body.trim().length === 0 ||
+ isRespectingMaxCount(length) ||
+ !submitEnabled({body}) ||
+ loadingState === 'loading';
const disableCancelButton = loadingState === 'loading';
const disableTextArea = loadingState === 'loading';
diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock
index 62b708a5d..d42fb530c 100644
--- a/docs/Gemfile.lock
+++ b/docs/Gemfile.lock
@@ -4,11 +4,8 @@ GEM
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
colorator (1.1.0)
- cssminify2 (2.0.1)
- execjs (2.7.0)
ffi (1.9.18)
forwardable-extended (2.6.0)
- htmlcompressor (0.3.1)
jekyll (3.5.2)
addressable (~> 2.4)
colorator (~> 1.0)
@@ -20,11 +17,6 @@ GEM
pathutil (~> 0.9)
rouge (~> 1.7)
safe_yaml (~> 1.0)
- jekyll-minifier (0.1.4)
- cssminify2 (~> 2.0)
- htmlcompressor (~> 0.3)
- jekyll (~> 3.5)
- uglifier (~> 3.2)
jekyll-sass-converter (1.5.0)
sass (~> 3.4)
jekyll-seo-tag (2.3.0)
@@ -50,15 +42,12 @@ GEM
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
- uglifier (3.2.0)
- execjs (>= 0.3.0, < 3)
PLATFORMS
ruby
DEPENDENCIES
jekyll (= 3.5.2)
- jekyll-minifier (~> 0.1.4)
jekyll-seo-tag (~> 2.1)
tzinfo-data
diff --git a/docs/_data/nav.yaml b/docs/_data/nav.yaml
index 51b44f025..eeb7c2ebc 100644
--- a/docs/_data/nav.yaml
+++ b/docs/_data/nav.yaml
@@ -13,7 +13,21 @@ items:
url: /configuration/
- title: Advanced Configuration
url: /advanced-configuration/
+ - title: Product Guide
+ children:
+ - title: How Talk Works
+ url: /how-talk-works/
+ - title: Trust
+ url: /trust/
+ - title: Toxic Comments
+ url: /toxic-comments/
- title: Plugins
children:
- title: Plugins Overview
- url: /plugins/
\ No newline at end of file
+ url: /plugins/
+ - title: Default Plugins
+ url: /default-plugins/
+ - title: Additional Plugins
+ url: /additional-plugins/
+ - title: Plugin Recipes
+ url: /plugin-recipes/
diff --git a/docs/_docs/installation-talk-quickstart.md b/docs/_docs/01-01-talk-quickstart.md
similarity index 100%
rename from docs/_docs/installation-talk-quickstart.md
rename to docs/_docs/01-01-talk-quickstart.md
diff --git a/docs/_docs/installation-from-docker.md b/docs/_docs/01-02-installation-from-docker.md
similarity index 100%
rename from docs/_docs/installation-from-docker.md
rename to docs/_docs/01-02-installation-from-docker.md
diff --git a/docs/_docs/installation-from-source.md b/docs/_docs/01-03-installation-from-source.md
similarity index 100%
rename from docs/_docs/installation-from-source.md
rename to docs/_docs/01-03-installation-from-source.md
diff --git a/docs/_docs/running-required-configuration.md b/docs/_docs/02-01-required-configuration.md
similarity index 96%
rename from docs/_docs/running-required-configuration.md
rename to docs/_docs/02-01-required-configuration.md
index 2f5d28049..84a7236db 100644
--- a/docs/_docs/running-required-configuration.md
+++ b/docs/_docs/02-01-required-configuration.md
@@ -19,7 +19,7 @@ If you've already configured your application with the required configuration,
you can further customize it's behavior by applying
[Advanced Configuration]({{ "/advanced-configuration/" | relative_url }}).
-## TALK_MONGO_URL
+### TALK_MONGO_URL
The database connection string for the MongoDB database. This usually takes the
form of:
@@ -31,7 +31,7 @@ TALK_MONGO_URL=mongodb://:@:` component
of the [TALK_ROOT_URL]({{ "/configuration/#talk_root_url" | relative_url }}){: .param}.
@@ -361,7 +361,7 @@ Then all the routes for the API will be expecting to be hit on `/talk/`, such as
can perform the path stripping when serving an upstream proxy, but some CDN's
cannot. You would use this option in the latter situation.
-## TALK_SMTP_EMAIL
+### TALK_SMTP_EMAIL
The email address to send emails from using the SMTP provider in the format:
@@ -371,23 +371,23 @@ TALK_SMTP_EMAIL="The Coral Project"
Including the name and email address.
-## TALK_SMTP_HOST
+### TALK_SMTP_HOST
The domain for the SMTP provider that you are using.
-## TALK_SMTP_PASSWORD
+### TALK_SMTP_PASSWORD
The password for the SMTP provider you are using.
-## TALK_SMTP_PORT
+### TALK_SMTP_PORT
The port for the SMTP provider that you are using.
-## TALK_SMTP_USERNAME
+### TALK_SMTP_USERNAME
The username of the SMTP provider you are using.
-## TALK_STATIC_URI
+### TALK_STATIC_URI
Used to set the uri where the static assets should be served from. This is used
when you want to upload the static assets through your build process to a
@@ -395,14 +395,14 @@ service like Google Cloud Storage or Amazon S3 and you would then specify the
CDN/Storage url. (Defaults to value of
[TALK_ROOT_URL]({{ "/configuration/#talk_root_url" | relative_url }}){: .param})
-## TALK_THREADING_LEVEL
+### TALK_THREADING_LEVEL
Specify the maximum depth of the comment thread. (Default `3`)
**Note that a high value for `TALK_THREADING_LEVEL` will result in large
performance impacts.**
-## TALK_WEBSOCKET_LIVE_URI
+### TALK_WEBSOCKET_LIVE_URI
Used to override the location to connect to the websocket endpoint to
potentially another host. This should be used when you need to route websocket
@@ -419,7 +419,7 @@ is `FALSE`, or the path component of
**Warning: if used without managing the auth state manually, auth
cannot be persisted due to browser restrictions.**
-## TRUST_THRESHOLDS
+### TRUST_THRESHOLDS
Configure the reliability thresholds for flagging and commenting. (Default
`comment:2,-1;flag:2,-1`)
diff --git a/docs/_docs/plugins-overview.md b/docs/_docs/03-01-plugins-overview.md
similarity index 99%
rename from docs/_docs/plugins-overview.md
rename to docs/_docs/03-01-plugins-overview.md
index 5194bef04..b67ff53be 100644
--- a/docs/_docs/plugins-overview.md
+++ b/docs/_docs/03-01-plugins-overview.md
@@ -116,4 +116,4 @@ assets inside the image as well.
For more information on the onbuild image, refer to the
[Installation from Docker]({{ "/installation-from-docker/" | relative_url }})
-documentation.
\ No newline at end of file
+documentation.
diff --git a/docs/_docs/03-02-default-plugins.md b/docs/_docs/03-02-default-plugins.md
new file mode 100644
index 000000000..ab843f21b
--- /dev/null
+++ b/docs/_docs/03-02-default-plugins.md
@@ -0,0 +1,152 @@
+---
+title: Default Plugins
+permalink: /default-plugins/
+class: configuration
+---
+
+The default Talk plugins can be found in the `plugins.default.json` file
+[here](https://github.com/coralproject/talk/blob/master/plugins.default.json).
+
+Talk ships out of the box with these plugins enabled:
+
+{% include toc.html %}
+
+We ship [Additional Plugins]({{ "/additional-plugins/" | relative_url }}) with
+Talk that are not enabled by default. You can enable these or disable these
+default plugins by consulting the [Plugins Overview]({{ "/plugins/" | relative_url }})
+page.
+
+### talk-plugin-auth
+
+Source: [plugins/talk-plugin-auth](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-auth){:target="_blank"}
+
+Enables generic registration via an email address, a username, a password, and a
+password confirmation. To sync Talk auth with your own auth systems, you can use
+this plugin as a template.
+
+### talk-plugin-facebook-auth
+
+Source: [plugins/talk-plugin-auth](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-auth){:target="_blank"}
+
+Requires: [talk-plugin-facebook-auth](#talk-plugin-facebook-auth){:.param}
+
+Enables sign-in via Facebook via the server side passport middleware.
+
+Configuration:
+
+{:.no_toc}
+
+- [TALK_FACEBOOK_APP_ID]({{ "/configuration/#talk_facebook_app_id" | relative_url }}){:.param} (**required**) - See the existing documentation for the [TALK_FACEBOOK_APP_ID]({{ "/configuration/#talk_facebook_app_id" | relative_url }}){:.param}.
+- [TALK_FACEBOOK_APP_SECRET]({{ "/configuration/#talk_facebook_app_secret" | relative_url }}){:.param} (**required**) - See the existing documentation for the [TALK_FACEBOOK_APP_SECRET]({{ "/configuration/#talk_facebook_app_secret" | relative_url }}){:.param}.
+
+### talk-plugin-featured-comments
+
+Source: [plugins/talk-plugin-featured-comments](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-featured-comments){:target="_blank"}
+
+Enables the ability for Moderators to feature and un-feature comments via the
+Stream and the Admin. Featured comments show in a first-place tab on the Stream
+if there are any featured comments on that story.
+
+### talk-plugin-respect
+
+Source: [plugins/talk-plugin-respect](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-respect){:target="_blank"}
+
+Enables a `respect` reaction button. Why a "respect" button, you ask?
+[Read more here](https://mediaengagement.org/research/engagement-buttons/).
+
+### talk-plugin-comment-content
+
+Source: [plugins/talk-plugin-comment-content](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-comment-content){:target="_blank"}
+
+Pluginizes the text of a comment to support custom treatment of this text. This
+plugin currently parses the given text to see if it contains a link, and makes
+them clickable.
+
+### talk-plugin-ignore-user
+
+Source: [plugins/talk-plugin-ignore-user](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-ignore-user){:target="_blank"}
+
+Enables ability for users to ignore (or "mute") other users. If a user is
+ignored, you will not see any of their comments. You can un-ignore a user via
+the My Profile tab.
+
+### talk-plugin-permalink
+
+Source: [plugins/talk-plugin-permalink](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-permalink){:target="_blank"}
+
+Enables a `Link` button that will provide a permalink to the comment that can be
+shared with others.
+
+### talk-plugin-viewing-options
+
+Source: [plugins/talk-plugin-viewing-options](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-viewing-options){:target="_blank"}
+
+Pluginizes the sorting/viewing options for a comment stream.
+
+### talk-plugin-sort-newest
+
+Source: [plugins/talk-plugin-sort-newest](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-newest){:target="_blank"}
+
+Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param}
+
+Provides a sort for the newest comments first. This isn't necessarily required
+as the default sort without options/plugins is newest first.
+
+### talk-plugin-sort-oldest
+
+Source: [plugins/talk-plugin-sort-oldest](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-oldest){:target="_blank"}
+
+Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param}
+
+Provides a sort for the newest comments first.
+
+### talk-plugin-most-respected
+
+Source: [plugins/talk-plugin-most-respected](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-most-respected){:target="_blank"}
+
+Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param}, [talk-plugin-respect](#talk-plugin-respect){:.param}
+
+Provides a sort for the comments with the most `respect` reactions first.
+
+### talk-plugin-most-replied
+
+Source: [plugins/talk-plugin-most-replied](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-most-replied){:target="_blank"}
+
+Requires: [talk-plugin-viewing-options](#talk-plugin-viewing-options){:.param}
+
+Provides a sort for the comments with the most replies first.
+
+### talk-plugin-offtopic
+
+Source: [plugins/talk-plugin-offtopic](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-offtopic){:target="_blank"}
+
+Allows the comment authors to tag their comment as `Off-Topic` which will add a
+visible badge on the frontend to other users that their comment is off-topic.
+
+### talk-plugin-author-menu
+
+Source: [plugins/talk-plugin-author-menu](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-author-menu){:target="_blank"}
+
+Pluginizes the author's name on hover.
+
+### talk-plugin-member-since
+
+Source: [plugins/talk-plugin-member-since](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-member-since){:target="_blank"}
+
+Requires: [talk-plugin-author-menu](#talk-plugin-author-menu){:.param}
+
+Displays the date that the user was created as a `Member Since ${created_at}`.
+
+### talk-plugin-moderation-actions
+
+Source: [plugins/talk-plugin-moderation-actions](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-moderation-actions){:target="_blank"}
+
+Enables in-stream moderation so that Moderators can reject, approve comments,
+as well as ban users, directly from the comment stream. When [talk-plugin-featured-comments](#talk-plugin-featured-comments){:.param} is enabled
+
+### talk-plugin-flag-details
+
+Source: [plugins/talk-plugin-flag-details](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-flag-details){:target="_blank"}
+
+Pluginizes the Flag Details area of comments in the Moderation Queues to display
+data. Some basic details are already included on flags by default.
diff --git a/docs/_docs/03-03-additional-plugins.md b/docs/_docs/03-03-additional-plugins.md
new file mode 100644
index 000000000..9be7f1cd2
--- /dev/null
+++ b/docs/_docs/03-03-additional-plugins.md
@@ -0,0 +1,106 @@
+---
+title: Additional Plugins
+permalink: /additional-plugins/
+class: configuration
+---
+
+Talk ships with several plugins that aren't enabled by default:
+
+{% include toc.html %}
+
+These plugins can be enabled by consulting the
+[Plugins Overview]({{ "/plugins/" | relative_url }}) page.
+
+### talk-plugin-like
+
+Source: [plugins/talk-plugin-like](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-like){:target="_blank"}
+
+Enables a `like` reaction button.
+
+### talk-plugin-sort-most-liked
+
+Source: [plugins/talk-plugin-sort-most-liked](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-most-liked){:target="_blank"}
+
+Requires: [talk-plugin-viewing-options]({{ "/default-plugins/#talk-plugin-viewing-options" | relative_url }}){:.param}, [talk-plugin-like](#talk-plugin-like){:.param}
+
+Provides a sort for the comments with the most `like` reactions first.
+
+### talk-plugin-love
+
+Source: [plugins/talk-plugin-love](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-love){:target="_blank"}
+
+Enables a `love` reaction button.
+
+### talk-plugin-sort-most-loved
+
+Source: [plugins/talk-plugin-sort-most-loved](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-sort-most-loved){:target="_blank"}
+
+Requires: [talk-plugin-viewing-options]({{ "/default-plugins/#talk-plugin-viewing-options" | relative_url }}){:.param}, [talk-plugin-love](#talk-plugin-love){:.param}
+
+Provides a sort for the comments with the most `love` reactions first.
+
+### talk-plugin-remember-sort
+
+Source: [plugins/talk-plugin-remember-sort](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-remember-sort){:target="_blank"}
+
+Requires: [talk-plugin-viewing-options]({{ "/default-plugins/#talk-plugin-viewing-options" | relative_url }}){:.param}
+
+Enables saving a user’s last sort selection as they browse other articles.
+
+### talk-plugin-deep-reply-count
+
+Source: [plugins/talk-plugin-deep-reply-count](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-deep-reply-count){:target="_blank"}
+
+Enables counting of comments to include replies via a new graph edge. Not
+recommended for large installations as it will unreasonably reduce the query
+efficiency to compute this number.
+
+### talk-plugin-slack-notifications
+
+Source: [plugins/talk-plugin-slack-notifications](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-slack-notifications){:target="_blank"}
+
+Enables all new comments that are written to be posted to a Slack channel as
+well. Configure an
+[Incoming Webhook](https://api.slack.com/incoming-webhooks){:target="_blank"}
+app and provide that url in the form of the `SLACK_WEBHOOK_URL`
+detailed below.
+
+*Warning: On high volume sites, this means every single comment will flow into
+Slack, if this isn't what you want, be sure to use the provided plugin as a
+recipe to further customize the behavior*.
+
+Configuration:
+{:.no_toc}
+
+- `SLACK_WEBHOOK_URL` (**required**) - The webhook url that will be
+ used to post new comments to.
+
+### talk-plugin-toxic-comments
+
+Source: [plugins/talk-plugin-toxic-comments](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-toxic-comments){:target="_blank"}
+
+Using the [Perspective API](http://perspectiveapi.com/){:target="_blank"}, this
+plugin will warn users and reject comments that exceed the predefined toxicity
+threshold. For more information on what Toxic Comments are, check out the
+[Toxic Comments]({{ "/toxic-comments/" | relative_url }}) documentation.
+
+Configuration:
+{:.no_toc}
+
+- `TALK_PERSPECTIVE_API_KEY` (**required**) - The API Key for Perspective. You
+ can register and get your own key at [http://perspectiveapi.com/](http://perspectiveapi.com/){:target="_blank"}.
+- `TALK_TOXICITY_THRESHOLD` - If the comments toxicity exceeds this threshold,
+ the comment will be rejected. (Default `0.8`)
+- `TALK_PERSPECTIVE_API_ENDPOINT` - API Endpoint for hitting the
+ perspective API. (Default `https://commentanalyzer.googleapis.com/v1alpha1`)
+- `TALK_PERSPECTIVE_TIMEOUT` - The timeout for sending a comment to
+ be processed before it will skip the toxicity analysis, parsed by
+ [ms](https://www.npmjs.com/package/ms){:target="_blank"}. (Default `300ms`)
+
+### talk-plugin-subscriber
+
+Source: [plugins/talk-plugin-subscriber](https://github.com/coralproject/talk/tree/master/plugins/talk-plugin-subscriber){:target="_blank"}
+
+Enables a `Subscriber` badge to be added to comments where the author has the
+`SUBSCRIBER` tag. This must match with a custom auth integration that adds the
+tag to the users that are subscribed to the service.
diff --git a/docs/_docs/03-04-plugin-recipes.md b/docs/_docs/03-04-plugin-recipes.md
new file mode 100644
index 000000000..6b76a54ca
--- /dev/null
+++ b/docs/_docs/03-04-plugin-recipes.md
@@ -0,0 +1,50 @@
+---
+title: Plugin Recipes
+permalink: /plugin-recipes/
+class: configuration
+---
+
+Plugin Recipes are plugin templates used to help bootstrap the development of a
+plugin. Recipes are available at the
+[coralproject/talk-recipes](https://github.com/coralproject/talk-recipes) repo.
+When first developing a plugin with a recipe, you can simply visit the
+aforementioned repository to find the desired recipe, and using the file
+listings on the page, determine which files need to be modified to suit your
+needs.
+
+The following are the available recipes for use:
+
+{% include toc.html %}
+
+### recipe-avatar
+
+Source: [talk-recipes/tree/master/plugins/avatar](https://github.com/coralproject/talk-recipes/tree/master/plugins/avatar){:target="_blank"}
+
+Provides support for avatars hosted via third party, extends the User Model and
+provides UI on the client-side too.
+
+
+### recipe-translations
+
+Source: [talk-recipes/tree/master/plugins/translations](https://github.com/coralproject/talk-recipes/tree/master/plugins/translations){:target="_blank"}
+
+Provides an example for overriding application text through the translation
+system.
+
+
+### recipe-subscriber
+
+Source: [talk-recipes/tree/master/plugins/subscriber](https://github.com/coralproject/talk-recipes/tree/master/plugins/subscriber){:target="_blank"}
+
+Provides an example for adding `SUBSCRIBER` badges for users with the
+`SUBSCRIBER` tag added to their user model through a direct server plugin with
+the auth system.
+
+
+### recipe-author-name
+
+Source: [talk-recipes/tree/master/plugins/author-name](https://github.com/coralproject/talk-recipes/tree/master/plugins/author-name){:target="_blank"}
+
+Enables the ability to hover over a commenter’s name and add plugin
+functionality there. The Member Since plugin that is provided in this recipe is
+an example of this.
diff --git a/docs/_docs/04-01-product-guide-how-talk-works.md b/docs/_docs/04-01-product-guide-how-talk-works.md
new file mode 100644
index 000000000..8f8dca6dd
--- /dev/null
+++ b/docs/_docs/04-01-product-guide-how-talk-works.md
@@ -0,0 +1,40 @@
+---
+title: How Talk Works
+permalink: /how-talk-works/
+---
+
+Talk is an open-source commenting platform. It has two pieces. One is the
+embedded script, which allows newsrooms to have a unique comments section on
+each story/post/page they have on their site, and allows their readers to
+comment and discuss articles. The other is the Admin, which is where newsrooms
+moderate their comments and manage and configure Talk.
+
+## Talk Core
+
+As we’re building Talk, our vision was always to have it be very modular, so
+there are features we have built and are opinionated about, but we allow
+newsrooms and their developers to customize Talk easily so that it fits their
+use cases and needs.
+
+Talk Core is the core application of Talk - this contains all of the standard
+commenting features that are necessary for a comment section, and ones that we
+believe are important to be universal. If you would like to contribute to Talk,
+be sure to check out our
+[Contributor's Guide](https://github.com/coralproject/talk/blob/master/CONTRIBUTING.md){:target="_blank"}.
+
+## Plugins
+
+Plugins are additional functionality which are optional to use with Talk. You
+can turn these on or off, depending on your specific needs. Plugins are either
+part of our core plugins, which ship with Talk, or they are developed by 3rd
+parties and either used privately and internally, or are open sourced for use
+across the greater community. You can explore the plugins we offer by visiting our [Default Plugins]({{ "/default-plugins/" | relative_url}})
+and [Additional Plugins]({{ "/additional-plugins/" | relative_url }}) pages.
+
+## Recipes
+
+Recipes are plugin templates that are created by the Talk team and 3rd party
+developers, in order to help contributors and newsrooms build plugins easily.
+You can explore the recipes we offer by visiting our [Plugin Recipes]({{ "/plugin-recipes/" | relative_url}})
+page.
+
diff --git a/docs/_docs/04-02-product-guide-trust.md b/docs/_docs/04-02-product-guide-trust.md
new file mode 100644
index 000000000..42587d203
--- /dev/null
+++ b/docs/_docs/04-02-product-guide-trust.md
@@ -0,0 +1,49 @@
+---
+title: Trust
+permalink: /trust/
+---
+
+Trust is a set of components within Talk that incorporate automated moderation
+features based on a user's previous behavior.
+
+### User Karma Score
+
+Using Trust’s calculations, Talk will automatically pre-moderate comments of
+users who have a negative karma score. All users start out with a `0` neutral
+karma score. If they have a comment approved by a moderator, their score
+increases by `1`; if they have a comment rejected by a moderator, it decreases
+by `1`. When a commenter is labeled as Unreliable, their comments must be
+moderated before they are posted.
+
+When a commenter has one comment rejected, their next comment must be moderated
+once in order to post freely again. If they instead get rejected again, then
+they must have two of their comments approved in order to get added back to the
+queue.
+
+Here are the default thresholds:
+
+```text
+-2 and lower: Unreliable
+-1 to +2: Neutral
++3 and higher: Reliable
+```
+
+You can configure your own Trust thresholds by using [TRUST_THRESHOLD]({{"/advanced-configuration/#trust_thresholds" | relative_url }}{:.param}) in your
+configuration.
+
+
+### Reliable and Unreliable Flaggers
+
+Trust also calculates how reliable users are in terms of the comments they
+report. This information is displayed to moderators in the User History drawer,
+which is accessed by clicking on a user’s name in the Admin.
+
+If a user's reports mostly match what moderators reject, their Report status
+will display to moderators as Reliable in the user information drawer. If a
+user's reports mostly differ from what moderators reject, their Report status
+will show as Unreliable.
+
+If we don't have enough reports to make a call, or the reports even out, their
+status is Neutral.
+
+Note: Report Karma doesn't include reports of "I don't agree with this comment".
diff --git a/docs/_docs/04-03-product-guide-toxic-comments.md b/docs/_docs/04-03-product-guide-toxic-comments.md
new file mode 100644
index 000000000..56677a421
--- /dev/null
+++ b/docs/_docs/04-03-product-guide-toxic-comments.md
@@ -0,0 +1,59 @@
+---
+title: Toxic Comments
+permalink: /toxic-comments/
+---
+
+Leveraging Google's Perspective API, you can now set a Toxicity Threshold for
+Talk (0.8 or 80% is the default), which works like this:
+
+- If a comment exceeds the threshold, the commenter is warned that their comment
+ may be toxic, and are given the chance to modify their comment before posting
+- If the revised comment is below the Toxicity Threshold, it is posted and
+ displayed normally
+- If the revised comment still exceeds the Toxicity Threshold, it is not
+ displayed on the stream and instead is sent to the Reported queue for
+ moderation
+- If the moderator accepts the comment, it's displayed on the stream; if it's
+ rejected, it will not be displayed
+- Moderators see a Toxic Probability Score on toxic comments in the Moderation
+ queues
+
+Read more about Coral’s take on toxicity
+[on our blog](https://blog.coralproject.net/toxic-avenging/){:target="_blank"}.
+
+### What is the Perspective API?
+
+The likely toxicity of a comment is evaluated using scores generated from
+[Perspective API](http://perspectiveapi.com/){:target="_blank"}. This is part of
+the [Conversation AI](https://conversationai.github.io/){:target="_blank"}
+research effort run by Jigsaw (a section of Google that works on global problems
+around speech and access to information).
+
+Perspective API uses machine learning, based on existing databases of
+accepted/rejected comments, to guess the probability that a comment is abusive
+and/or toxic. It is currently English only, but the system is designed to work
+with multiple languages.
+
+In order to activate our plugin, each news organization applies for an API key
+from Jigsaw (click “Request API access” on this site.) Sites can also work with
+Jigsaw to create an individualized data set specifically trained on their own
+comment history.
+
+Perspective API was released earlier this year, and is currently in alpha
+(meaning that it is being continually refined and improved.) Jigsaw should
+certainly be praised for devoting serious resources to this issue, and making
+their work available for others, including us, to use.
+
+We’ve talked with their team on several occasions, and have been impressed by
+their dedication and commitment to this issue. These are smart people who are
+trying to improve a broken part of the internet.
+
+### How do I add the Toxic Comments plugin?
+To enable this behavior, visit the
+[talk-plugin-toxic-comments]({{ "/additional-plugins/#talk-plugin-toxic-comments" | relative_url }})
+plugin documentation.
+
+
+### Request an API Key
+
+You can read more about Google's Perspective API and/or request an API key here: [http://perspectiveapi.com/](http://perspectiveapi.com/).
diff --git a/docs/_layouts/doc.html b/docs/_layouts/doc.html
index 0325ea9fe..53d49adf0 100644
--- a/docs/_layouts/doc.html
+++ b/docs/_layouts/doc.html
@@ -2,7 +2,7 @@
layout: default
---
- Suggest Edits
+ Suggest Edits