about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.mailmap3
-rw-r--r--Dockerfile16
-rw-r--r--README.md35
-rw-r--r--app/controllers/api/v1/accounts/follower_accounts_controller.rb2
-rw-r--r--app/controllers/api/v1/accounts/following_accounts_controller.rb2
-rw-r--r--app/controllers/api/v1/accounts/relationships_controller.rb12
-rw-r--r--app/controllers/api/v1/accounts/search_controller.rb1
-rw-r--r--app/controllers/api/v1/accounts/statuses_controller.rb2
-rw-r--r--app/helpers/settings_helper.rb1
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/components/trends.js2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/link_footer.js5
-rw-r--r--app/javascript/flavours/glitch/features/ui/containers/status_list_container.js2
-rwxr-xr-xapp/javascript/flavours/glitch/locales/en-cafe.js8
-rw-r--r--app/javascript/flavours/glitch/locales/en.js4
-rw-r--r--app/javascript/flavours/glitch/styles/accounts.scss3
-rw-r--r--app/javascript/flavours/glitch/styles/components/drawer.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss16
-rw-r--r--app/javascript/flavours/glitch/styles/forms.scss6
-rwxr-xr-xapp/javascript/locales/locale-data/en-cafe.js8
-rw-r--r--app/javascript/mastodon/locales/de.json2
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json2
-rwxr-xr-xapp/javascript/mastodon/locales/en-cafe.json13
-rw-r--r--app/javascript/mastodon/locales/en.json2
-rw-r--r--app/javascript/mastodon/locales/es.json2
-rw-r--r--app/javascript/mastodon/locales/fi.json2
-rw-r--r--app/javascript/mastodon/locales/fr.json2
-rw-r--r--app/javascript/mastodon/locales/ja.json2
-rwxr-xr-xapp/javascript/mastodon/locales/locale-data/en-cafe.js8
-rw-r--r--app/javascript/mastodon/locales/nl.json2
-rw-r--r--app/javascript/mastodon/locales/pl.json2
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json2
-rw-r--r--app/javascript/mastodon/locales/ru.json2
-rw-r--r--app/javascript/mastodon/locales/sk.json2
-rw-r--r--app/javascript/mastodon/locales/sv.json2
-rwxr-xr-xapp/javascript/mastodon/locales/whitelist_en-cafe.json2
-rw-r--r--app/javascript/styles/mastodon-light/diff.scss6
-rw-r--r--app/javascript/styles/mastodon/accounts.scss3
-rw-r--r--app/javascript/styles/mastodon/forms.scss6
-rw-r--r--app/lib/sanitize_config.rb3
-rw-r--r--app/services/activitypub/process_account_service.rb6
-rw-r--r--app/validators/poll_validator.rb4
-rw-r--r--app/views/settings/preferences/appearance/show.html.haml2
-rw-r--r--app/views/settings/preferences/other/show.html.haml4
-rw-r--r--app/views/settings/profiles/show.html.haml2
-rw-r--r--app/workers/reset_account_worker.rb16
-rw-r--r--config/application.rb6
-rw-r--r--config/environments/production.rb14
-rw-r--r--config/i18n-tasks.yml2
-rw-r--r--config/initializers/content_security_policy.rb4
-rw-r--r--config/initializers/simple_form.rb10
-rwxr-xr-xconfig/locales/en-cafe.yml18
-rw-r--r--config/locales/simple_form.ar.yml1
-rw-r--r--config/locales/simple_form.ast.yml1
-rw-r--r--config/locales/simple_form.ca.yml1
-rw-r--r--config/locales/simple_form.co.yml1
-rw-r--r--config/locales/simple_form.cs.yml1
-rw-r--r--config/locales/simple_form.cy.yml1
-rw-r--r--config/locales/simple_form.da.yml1
-rw-r--r--config/locales/simple_form.de.yml1
-rw-r--r--config/locales/simple_form.el.yml1
-rw-r--r--config/locales/simple_form.en.yml3
-rw-r--r--config/locales/simple_form.eo.yml1
-rw-r--r--config/locales/simple_form.es-AR.yml1
-rw-r--r--config/locales/simple_form.es.yml1
-rw-r--r--config/locales/simple_form.et.yml1
-rw-r--r--config/locales/simple_form.eu.yml1
-rw-r--r--config/locales/simple_form.fa.yml1
-rw-r--r--config/locales/simple_form.fi.yml1
-rw-r--r--config/locales/simple_form.fr.yml1
-rw-r--r--config/locales/simple_form.gl.yml1
-rw-r--r--config/locales/simple_form.hu.yml1
-rw-r--r--config/locales/simple_form.hy.yml1
-rw-r--r--config/locales/simple_form.id.yml1
-rw-r--r--config/locales/simple_form.is.yml1
-rw-r--r--config/locales/simple_form.it.yml1
-rw-r--r--config/locales/simple_form.ja.yml1
-rw-r--r--config/locales/simple_form.kab.yml1
-rw-r--r--config/locales/simple_form.kk.yml1
-rw-r--r--config/locales/simple_form.ko.yml1
-rw-r--r--config/locales/simple_form.nl.yml1
-rw-r--r--config/locales/simple_form.nn.yml1
-rw-r--r--config/locales/simple_form.no.yml1
-rw-r--r--config/locales/simple_form.oc.yml1
-rw-r--r--config/locales/simple_form.pl.yml1
-rw-r--r--config/locales/simple_form.pt-BR.yml1
-rw-r--r--config/locales/simple_form.pt-PT.yml1
-rw-r--r--config/locales/simple_form.ro.yml1
-rw-r--r--config/locales/simple_form.ru.yml1
-rw-r--r--config/locales/simple_form.sk.yml1
-rw-r--r--config/locales/simple_form.sl.yml1
-rw-r--r--config/locales/simple_form.sq.yml1
-rw-r--r--config/locales/simple_form.sv.yml1
-rw-r--r--config/locales/simple_form.th.yml1
-rw-r--r--config/locales/simple_form.tr.yml1
-rw-r--r--config/locales/simple_form.uk.yml1
-rw-r--r--config/locales/simple_form.vi.yml1
-rw-r--r--config/locales/simple_form.zh-CN.yml1
-rw-r--r--config/locales/simple_form.zh-HK.yml1
-rw-r--r--config/locales/simple_form.zh-TW.yml1
-rw-r--r--db/migrate/20180617162849_remove_unused_indexes.rb7
-rw-r--r--db/migrate/20180628181026_create_custom_filters.rb13
-rwxr-xr-xhooks/build3
-rw-r--r--lib/mastodon/version.rb8
-rw-r--r--public/avatars/original/missing.pngbin3292 -> 23951 bytes
-rwxr-xr-xpublic/avatars/original/plural-knot.svg169
-rwxr-xr-x[-rw-r--r--]public/favicon.icobin9086 -> 9662 bytes
106 files changed, 371 insertions, 166 deletions
diff --git a/.mailmap b/.mailmap
new file mode 100644
index 000000000..e066fd34a
--- /dev/null
+++ b/.mailmap
@@ -0,0 +1,3 @@
+Starfall <us@starfall.systems> Starfall <admin@plural.cafe>
+Starfall <us@starfall.systems> <root@starfall.blue>
+
diff --git a/Dockerfile b/Dockerfile
index 84e6435f3..b69dacf42 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -130,13 +130,21 @@ ENV NODE_ENV="production"
 ENV RAILS_SERVE_STATIC_FILES="true"
 ENV BIND="0.0.0.0"
 
-# Set the run user
 USER mastodon
 
+ARG SOURCE_COMMIT
+ENV SOURCE_TAG $SOURCE_COMMIT
+
 # Precompile assets
-RUN cd ~ && \
-	OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
-	yarn cache clean
+RUN cd ~ && OTP_SECRET=_ SECRET_KEY_BASE=_ rails assets:precompile --trace && yarn cache clean
+
+# Empty temporary files
+USER root
+
+RUN rm -rf /opt/mastodon/tmp/*
+
+# Set the run user
+USER mastodon
 
 # Set the work dir and the container entry point
 WORKDIR /opt/mastodon
diff --git a/README.md b/README.md
index 470e379dc..502e0d8db 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,33 @@
-#  Mastodon Glitch Edition  #
+![Mastodon](https://i.imgur.com/NhZc40l.png)
+========
 
->   Now with automated deploys!
+[![Build Status](https://img.shields.io/docker/cloud/build/pluralcafe/mastodon)](https://hub.docker.com/repository/docker/pluralcafe/mastodon) [![Site Status](https://img.shields.io/website?label=plural.cafe&logo=mastodon&url=https%3A%2F%2Fplural.cafe)](https://plural.cafe)
 
-[![Build Status](https://img.shields.io/circleci/project/github/glitch-soc/mastodon.svg)][circleci]
+Mastodon is a **free, open-source social network server** based on **open web protocols** like ActivityPub and OStatus. The social focus of the project is a viable decentralized alternative to commercial social media silos that returns the control of the content distribution channels to the people. The technical focus of the project is a good user interface, a clean REST API for 3rd party apps and robust anti-abuse tools.
 
-[circleci]: https://circleci.com/gh/glitch-soc/mastodon
+**Ruby on Rails** is used for the back-end, while **React.js** and Redux are used for the dynamic front-end. A static front-end for public resources (profiles and statuses) is also provided.
 
-So here's the deal: we all work on this code, and then it runs on dev.glitch.social and anyone who uses that does so absolutely at their own risk. can you dig it?
+This repository specifically is for [Plural Café](https://plural.cafe) and has three branches:
 
-- You can view documentation for this project at [glitch-soc.github.io/docs/](https://glitch-soc.github.io/docs/).
-- And contributing guidelines are available [here](CONTRIBUTING.md) and [here](https://glitch-soc.github.io/docs/contributing/).
+* **main** (**edge** on Docker Hub) for all development and staging work,
+* **glitch** for all commits from upstream that will automatically be synched to this repository, and
+* **production** (**latest** on Docker Hub) for what goes onto the main website.
+
+In addition, there are several repositories in this GitHub organization:
+
+* **pluralcafe/mastodon** is this repository and is the codebase for what Plural Café runs,
+* [**pluralcafe/utils**](https://github.com/pluralcafe/utils) are an assortment of scripts and tutorials to help in Mastodon system administration or general helper files this instance uses,
+* [**pluralcafe/barkeep**](https://github.com/pluralcafe/barkeep) is forked from [mbilokonsky/ambassador](https://github.com/mbilokonsky/ambassador) and serves as the Ambassador bot that is run on the instance.
+
+This instance is a fork of a fork: this has the [Mastodon Glitch Edition](https://github.com/glitch-soc/mastodon) commits. Documentation for Mastodon Glitch Edition [can be found here](https://glitch-soc.github.io/docs/). Anyone wishing to use Glitch Edition in a Docker image for their own site can use the `pluralcafe/mastodon:glitch` image.
+
+---
+
+## Notable changes from upstream
+
+See output of `git log glitch..main --oneline | grep -v '[mM]erge' | less` for a (more) complete history.
+
+* &lt;ol&gt; margin issue fixed so numbered lists aren't cut off a few pixels shy of 1 number
+* HTML summary/details tags are allowed in toots
+* gemini protocol links are supported (not yet supported: automatically marking gemini:// text as links)
+* authentication required for account api endpoints to block some naive scrapers
diff --git a/app/controllers/api/v1/accounts/follower_accounts_controller.rb b/app/controllers/api/v1/accounts/follower_accounts_controller.rb
index a665863eb..dbb8cac5e 100644
--- a/app/controllers/api/v1/accounts/follower_accounts_controller.rb
+++ b/app/controllers/api/v1/accounts/follower_accounts_controller.rb
@@ -25,7 +25,7 @@ class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
   end
 
   def hide_results?
-    @account.suspended? || (@account.hides_followers? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
+    !user_signed_in? || @account.suspended? || (@account.hides_followers? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
   end
 
   def default_accounts
diff --git a/app/controllers/api/v1/accounts/following_accounts_controller.rb b/app/controllers/api/v1/accounts/following_accounts_controller.rb
index 7d885a212..8c650570f 100644
--- a/app/controllers/api/v1/accounts/following_accounts_controller.rb
+++ b/app/controllers/api/v1/accounts/following_accounts_controller.rb
@@ -25,7 +25,7 @@ class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
   end
 
   def hide_results?
-    @account.suspended? || (@account.hides_following? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
+    !user_signed_in? || @account.suspended? || (@account.hides_following? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
   end
 
   def default_accounts
diff --git a/app/controllers/api/v1/accounts/relationships_controller.rb b/app/controllers/api/v1/accounts/relationships_controller.rb
index 1d3992a28..865529e25 100644
--- a/app/controllers/api/v1/accounts/relationships_controller.rb
+++ b/app/controllers/api/v1/accounts/relationships_controller.rb
@@ -5,10 +5,14 @@ class Api::V1::Accounts::RelationshipsController < Api::BaseController
   before_action :require_user!
 
   def index
-    accounts = Account.where(id: account_ids).select('id')
-    # .where doesn't guarantee that our results are in the same order
-    # we requested them, so return the "right" order to the requestor.
-    @accounts = accounts.index_by(&:id).values_at(*account_ids).compact
+    if user_signed_in?
+      accounts = Account.where(id: account_ids).select('id')
+      # .where doesn't guarantee that our results are in the same order
+      # we requested them, so return the "right" order to the requestor.
+      @accounts = accounts.index_by(&:id).values_at(*account_ids).compact
+    else
+      @accounts = Account.none
+    end
     render json: @accounts, each_serializer: REST::RelationshipSerializer, relationships: relationships
   end
 
diff --git a/app/controllers/api/v1/accounts/search_controller.rb b/app/controllers/api/v1/accounts/search_controller.rb
index 3061fcb7e..aa8745931 100644
--- a/app/controllers/api/v1/accounts/search_controller.rb
+++ b/app/controllers/api/v1/accounts/search_controller.rb
@@ -12,6 +12,7 @@ class Api::V1::Accounts::SearchController < Api::BaseController
   private
 
   def account_search
+    return Account.none unless user_signed_in?
     AccountSearchService.new.call(
       params[:q],
       current_account,
diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb
index 92ccb8061..6e44f5c01 100644
--- a/app/controllers/api/v1/accounts/statuses_controller.rb
+++ b/app/controllers/api/v1/accounts/statuses_controller.rb
@@ -22,6 +22,8 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
   end
 
   def cached_account_statuses
+    return Status.none unless user_signed_in?
+
     statuses = truthy_param?(:pinned) ? pinned_scope : permitted_account_statuses
 
     statuses.merge!(only_media_scope) if truthy_param?(:only_media)
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index 5b39497b6..ae9a69826 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -15,6 +15,7 @@ module SettingsHelper
     de: 'Deutsch',
     el: 'Ελληνικά',
     en: 'English',
+    'en-cafe': 'English (Plural Café)',
     eo: 'Esperanto',
     'es-AR': 'Español (Argentina)',
     es: 'Español',
diff --git a/app/javascript/flavours/glitch/features/getting_started/components/trends.js b/app/javascript/flavours/glitch/features/getting_started/components/trends.js
index 0734ec72b..c60f78f7e 100644
--- a/app/javascript/flavours/glitch/features/getting_started/components/trends.js
+++ b/app/javascript/flavours/glitch/features/getting_started/components/trends.js
@@ -38,7 +38,7 @@ export default class Trends extends ImmutablePureComponent {
       <div className='getting-started__trends'>
         <h4><FormattedMessage id='trends.trending_now' defaultMessage='Trending now' /></h4>
 
-        {trends.take(3).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
+        {trends.take(1).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
       </div>
     );
   }
diff --git a/app/javascript/flavours/glitch/features/ui/components/link_footer.js b/app/javascript/flavours/glitch/features/ui/components/link_footer.js
index 4d7fc36c2..d26bbe9f8 100644
--- a/app/javascript/flavours/glitch/features/ui/components/link_footer.js
+++ b/app/javascript/flavours/glitch/features/ui/components/link_footer.js
@@ -58,9 +58,10 @@ class LinkFooter extends React.PureComponent {
         <p>
           <FormattedMessage
             id='getting_started.open_source_notice'
-            defaultMessage='Glitchsoc is open source software, a friendly fork of {Mastodon}. You can contribute or report issues on GitHub at {github}.'
+            defaultMessage='GlitchCafe is open source software, based on {Glitchsoc} which is a friendly fork of {Mastodon}. You can contribute or report issues on GitHub at {github}.'
             values={{
-              github: <span><a href='https://github.com/glitch-soc/mastodon' rel='noopener noreferrer' target='_blank'>glitch-soc/mastodon</a> (v{version})</span>,
+              github: <span><a href='https://github.com/pluralcafe/mastodon' rel='noopener noreferrer' target='_blank'>pluralcafe/mastodon</a> (v{version})</span>,
+              Glitchsoc: <a href='https://github.com/glitch-soc/mastodon' rel='noopener noreferrer' target='_blank'>glitch-soc/mastodon</a>,
               Mastodon: <a href='https://github.com/tootsuite/mastodon' rel='noopener noreferrer' target='_blank'>Mastodon</a> }}
           />
         </p>
diff --git a/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js
index bd2d2eb4e..abcbf13db 100644
--- a/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js
@@ -33,8 +33,6 @@ const makeGetStatusIds = (pending = false) => createSelector([
     const statusForId = statuses.get(id);
     let showStatus    = true;
 
-    if (statusForId.get('account') === me) return true;
-
     if (columnSettings.getIn(['shows', 'reblog']) === false) {
       showStatus = showStatus && statusForId.get('reblog') === null;
     }
diff --git a/app/javascript/flavours/glitch/locales/en-cafe.js b/app/javascript/flavours/glitch/locales/en-cafe.js
new file mode 100755
index 000000000..6886de5d3
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/en-cafe.js
@@ -0,0 +1,8 @@
+import base_english from 'flavours/glitch/locales/en';
+import inherited from 'mastodon/locales/en-cafe.json';
+
+const messages = {
+  //  No new translations for glitch-soc strings.
+};
+
+export default Object.assign({}, base_english, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/en.js b/app/javascript/flavours/glitch/locales/en.js
index 90e924d4a..699affd70 100644
--- a/app/javascript/flavours/glitch/locales/en.js
+++ b/app/javascript/flavours/glitch/locales/en.js
@@ -1,7 +1,7 @@
 import inherited from 'mastodon/locales/en.json';
 
 const messages = {
-  'getting_started.open_source_notice': 'Glitchsoc is free open source software forked from {Mastodon}. You can contribute or report issues on GitHub at {github}.',
+  'getting_started.open_source_notice': 'GlitchCafe is free open source software based on {Glitchsoc} and {Mastodon}. You can see our source code on GitHub at {github}.',
   'layout.auto': 'Auto',
   'layout.current_is': 'Your current layout is:',
   'layout.desktop': 'Desktop',
@@ -10,7 +10,7 @@ const messages = {
   'getting_started.onboarding': 'Show me around',
   'onboarding.page_one.federation': '{domain} is an \'instance\' of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.',
   'onboarding.page_one.welcome': 'Welcome to {domain}!',
-  'onboarding.page_six.github': '{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}, and is compatible with any Mastodon instance or app. Glitchsoc is entirely free and open-source. You can report bugs, request features, or contribute to the code on {github}.',
+  'onboarding.page_six.github': '{domain} runs on GlitchCafe, which is based on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}, and is compatible with any Mastodon instance or app. GlitchCafe includes Plural Cafe-specific additions to Glitchsoc. Glitchsoc is entirely free and open-source. You can report bugs, request features, or contribute to the code on {github}.',
   'settings.auto_collapse': 'Automatic collapsing',
   'settings.auto_collapse_all': 'Everything',
   'settings.auto_collapse_lengthy': 'Lengthy toots',
diff --git a/app/javascript/flavours/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss
index a5ddde937..d66a2b237 100644
--- a/app/javascript/flavours/glitch/styles/accounts.scss
+++ b/app/javascript/flavours/glitch/styles/accounts.scss
@@ -203,8 +203,7 @@
   }
 }
 
-.account-role,
-.simple_form .recommended {
+.account-role {
   display: inline-block;
   padding: 4px 6px;
   cursor: default;
diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss
index fa410234a..570813831 100644
--- a/app/javascript/flavours/glitch/styles/components/drawer.scss
+++ b/app/javascript/flavours/glitch/styles/components/drawer.scss
@@ -111,6 +111,10 @@
   flex: 1 1 auto;
   margin-left: 8px;
   overflow: hidden;
+
+  & > a:hover {
+    text-decoration: underline;
+  }
 }
 
 .drawer--results {
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index d6fbfbaa4..e067c9335 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -134,19 +134,19 @@
     }
 
     ul, ol {
-      margin-left: 1em;
-
       p {
         margin: 0;
       }
     }
 
     ul {
+      margin-left: 1em;
       list-style-type: disc;
     }
 
     ol {
       list-style-type: decimal;
+      list-style-position: inside;
     }
   }
 
@@ -377,7 +377,7 @@
     }
 
     .display-name:hover .display-name__html {
-      text-decoration: none;
+      text-decoration: underline;
     }
 
     .status__content {
@@ -396,7 +396,7 @@
       }
       
       a:hover {
-        text-decoration: none;
+        text-decoration: underline;
       }
     }
     &:focus > .status__content:after {
@@ -417,6 +417,10 @@
 
   .notification__message {
     margin: -10px 0px 10px 0;
+
+	a:hover {
+	  text-decoration: underline;
+	}
   }
 }
 
@@ -561,6 +565,10 @@
     overflow: hidden;
     text-overflow: ellipsis;
   }
+
+  a:hover {
+    text-decoration: underline;
+  }
 }
 
 .status__action-bar {
diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss
index 8ea507333..0c7cb443b 100644
--- a/app/javascript/flavours/glitch/styles/forms.scss
+++ b/app/javascript/flavours/glitch/styles/forms.scss
@@ -83,12 +83,6 @@ code {
           text-decoration: none;
         }
       }
-
-      .recommended {
-        position: absolute;
-        margin: 0 4px;
-        margin-top: -2px;
-      }
     }
   }
 
diff --git a/app/javascript/locales/locale-data/en-cafe.js b/app/javascript/locales/locale-data/en-cafe.js
new file mode 100755
index 000000000..363aabc2b
--- /dev/null
+++ b/app/javascript/locales/locale-data/en-cafe.js
@@ -0,0 +1,8 @@
+/*eslint eqeqeq: "off"*/
+/*eslint no-nested-ternary: "off"*/
+/*eslint quotes: "off"*/
+
+export default [{
+  locale: "en-cafe',
+  parentLocale: 'en',
+}];
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 1c1773029..1cc962880 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -459,7 +459,7 @@
   "upload_error.poll": "Dateiuploads sind in Kombination mit Umfragen nicht erlaubt.",
   "upload_form.audio_description": "Beschreibe die Audiodatei für Menschen mit Hörschädigungen",
   "upload_form.description": "Für Menschen mit Sehbehinderung beschreiben",
-  "upload_form.edit": "Bearbeiten",
+  "upload_form.edit": "Beschreiben",
   "upload_form.thumbnail": "Miniaturansicht ändern",
   "upload_form.undo": "Löschen",
   "upload_form.video_description": "Beschreibe das Video für Menschen mit einer Hör- oder Sehbehinderung",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index a653704f3..4ffedfbfb 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -1325,7 +1325,7 @@
         "id": "upload_form.undo"
       },
       {
-        "defaultMessage": "Edit",
+        "defaultMessage": "Describe",
         "id": "upload_form.edit"
       }
     ],
diff --git a/app/javascript/mastodon/locales/en-cafe.json b/app/javascript/mastodon/locales/en-cafe.json
new file mode 100755
index 000000000..2f048f662
--- /dev/null
+++ b/app/javascript/mastodon/locales/en-cafe.json
@@ -0,0 +1,13 @@
+{
+  "upload_form.edit": "Describe",
+  "upload_modal.description_placeholder": "Jackdaws love my big sphinx of quartz",
+  "upload_modal.edit_media": "Add description",
+
+  "column.community": "Plural Café",
+  "directory.local": "From Plural Café only",
+  "empty_column.community": "The Plural Café timeline is empty. Write something publicly to get the ball rolling!",
+  "getting_started.open_source_notice": "GlitchCafé is open source software. You can contribute or report issues on GitHub at {github}.",
+  "introduction.federation.local.text": "Public posts from people on Plural Café will appear in the local timeline.",
+  "navigation_bar.community_timeline": "Plural Café timeline",
+  "tabs_bar.local_timeline": "Plural Café"
+}
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index e6773487b..5bea4e816 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -464,7 +464,7 @@
   "upload_error.poll": "File upload not allowed with polls.",
   "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "Describe",
   "upload_form.thumbnail": "Change thumbnail",
   "upload_form.undo": "Delete",
   "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index dfad44c6d..e769d7a48 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -459,7 +459,7 @@
   "upload_error.poll": "Subida de archivos no permitida con encuestas.",
   "upload_form.audio_description": "Describir para personas con problemas auditivos",
   "upload_form.description": "Describir para los usuarios con dificultad visual",
-  "upload_form.edit": "Editar",
+  "upload_form.edit": "Describir",
   "upload_form.thumbnail": "Cambiar miniatura",
   "upload_form.undo": "Borrar",
   "upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 8916d4339..28ff603e9 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -459,7 +459,7 @@
   "upload_error.poll": "Tiedon lataaminen ei ole sallittua kyselyissä.",
   "upload_form.audio_description": "Kuvaile kuulovammaisille",
   "upload_form.description": "Anna kuvaus näkörajoitteisia varten",
-  "upload_form.edit": "Muokkaa",
+  "upload_form.edit": "Kuvaile",
   "upload_form.thumbnail": "Vaihda pikkukuva",
   "upload_form.undo": "Peru",
   "upload_form.video_description": "Kuvaile kuulo- tai näkövammaisille",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 214f3aeea..8eedb8d85 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -459,7 +459,7 @@
   "upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.",
   "upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition",
   "upload_form.description": "Décrire pour les malvoyant·e·s",
-  "upload_form.edit": "Modifier",
+  "upload_form.edit": "Décrire",
   "upload_form.thumbnail": "Changer la vignette",
   "upload_form.undo": "Supprimer",
   "upload_form.video_description": "Décrire pour les personnes ayant des problèmes d’audition ou de vision",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 74a621c22..e4334ccc4 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -464,7 +464,7 @@
   "upload_error.poll": "アンケートではファイルをアップロードできません。",
   "upload_form.audio_description": "聴取が難しいユーザーへの説明",
   "upload_form.description": "閲覧が難しいユーザーへの説明",
-  "upload_form.edit": "編集",
+  "upload_form.edit": "説明",
   "upload_form.thumbnail": "サムネイルを変更",
   "upload_form.undo": "削除",
   "upload_form.video_description": "視聴が難しいユーザーへの説明",
diff --git a/app/javascript/mastodon/locales/locale-data/en-cafe.js b/app/javascript/mastodon/locales/locale-data/en-cafe.js
new file mode 100755
index 000000000..363aabc2b
--- /dev/null
+++ b/app/javascript/mastodon/locales/locale-data/en-cafe.js
@@ -0,0 +1,8 @@
+/*eslint eqeqeq: "off"*/
+/*eslint no-nested-ternary: "off"*/
+/*eslint quotes: "off"*/
+
+export default [{
+  locale: "en-cafe',
+  parentLocale: 'en',
+}];
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index e19f0b6d3..095114255 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -459,7 +459,7 @@
   "upload_error.poll": "Het uploaden van bestanden is in polls niet toegestaan.",
   "upload_form.audio_description": "Omschrijf dit voor mensen met een auditieve beperking",
   "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking",
-  "upload_form.edit": "Bewerken",
+  "upload_form.edit": "Omschrijf",
   "upload_form.thumbnail": "Miniatuurafbeelding wijzigen",
   "upload_form.undo": "Verwijderen",
   "upload_form.video_description": "Omschrijf dit voor mensen met een auditieve of visuele beperking",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 780ef3697..f03a0086e 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -464,7 +464,7 @@
   "upload_error.poll": "Dołączanie plików nie dozwolone z głosowaniami.",
   "upload_form.audio_description": "Opisz dla osób niesłyszących i niedosłyszących",
   "upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących",
-  "upload_form.edit": "Edytuj",
+  "upload_form.edit": "Opisz",
   "upload_form.thumbnail": "Zmień miniaturę",
   "upload_form.undo": "Usuń",
   "upload_form.video_description": "Opisz dla osób niesłyszących, niedosłyszących, niewidomych i niedowidzących",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 65d5815ed..2e0adfa9c 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -459,7 +459,7 @@
   "upload_error.poll": "Não é possível fazer upload de arquivos com enquetes.",
   "upload_form.audio_description": "Descrever para pessoas com deficiência auditiva",
   "upload_form.description": "Descreva para deficientes visuais",
-  "upload_form.edit": "Editar",
+  "upload_form.edit": "Descreva",
   "upload_form.thumbnail": "Alterar miniatura",
   "upload_form.undo": "Excluir",
   "upload_form.video_description": "Descreva para pessoas com deficiência auditiva ou visual",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 2853b3302..3ce050759 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -459,7 +459,7 @@
   "upload_error.poll": "К опросам нельзя прикреплять файлы.",
   "upload_form.audio_description": "Опишите аудиофайл для людей с нарушением слуха",
   "upload_form.description": "Добавьте описание для людей с нарушениями зрения:",
-  "upload_form.edit": "Изменить",
+  "upload_form.edit": "Опишите",
   "upload_form.thumbnail": "Изменить обложку",
   "upload_form.undo": "Отменить",
   "upload_form.video_description": "Опишите видео для людей с нарушением слуха или зрения",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 6640d5472..9bb0aa8ce 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -459,7 +459,7 @@
   "upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.",
   "upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu",
   "upload_form.description": "Opis pre slabo vidiacich",
-  "upload_form.edit": "Uprav",
+  "upload_form.edit": "Popíš",
   "upload_form.thumbnail": "Change thumbnail",
   "upload_form.undo": "Vymaž",
   "upload_form.video_description": "Popíš, pre ľudí so stratou sluchu, alebo očným znevýhodnením",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index a75cca8b5..a0fc4a4f3 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -459,7 +459,7 @@
   "upload_error.poll": "Filuppladdning tillåts inte med omröstningar.",
   "upload_form.audio_description": "Beskriv för personer med hörselnedsättning",
   "upload_form.description": "Beskriv för synskadade",
-  "upload_form.edit": "Redigera",
+  "upload_form.edit": "Beskriv",
   "upload_form.thumbnail": "Ändra miniatyr",
   "upload_form.undo": "Ta bort",
   "upload_form.video_description": "Beskriv för personer med hörsel- eller synnedsättning",
diff --git a/app/javascript/mastodon/locales/whitelist_en-cafe.json b/app/javascript/mastodon/locales/whitelist_en-cafe.json
new file mode 100755
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_en-cafe.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index d4290d7e6..18d1f7ad0 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -656,12 +656,6 @@ html {
     background: rgba($error-red, 0.5);
     text-shadow: none;
   }
-
-  .recommended {
-    border-color: $ui-highlight-color;
-    color: $ui-highlight-color;
-    background-color: rgba($ui-highlight-color, 0.1);
-  }
 }
 
 .compose-form .compose-form__warning {
diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss
index 2c78e81be..332b9f420 100644
--- a/app/javascript/styles/mastodon/accounts.scss
+++ b/app/javascript/styles/mastodon/accounts.scss
@@ -201,8 +201,7 @@
   }
 }
 
-.account-role,
-.simple_form .recommended {
+.account-role {
   display: inline-block;
   padding: 4px 6px;
   cursor: default;
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index e0604303b..5ace0d97c 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -83,12 +83,6 @@ code {
           text-decoration: none;
         }
       }
-
-      .recommended {
-        position: absolute;
-        margin: 0 4px;
-        margin-top: -2px;
-      }
     }
   }
 
diff --git a/app/lib/sanitize_config.rb b/app/lib/sanitize_config.rb
index ecaec2f84..fed504cf2 100644
--- a/app/lib/sanitize_config.rb
+++ b/app/lib/sanitize_config.rb
@@ -15,6 +15,7 @@ class Sanitize
       ipfs
       ipns
       ssb
+      gemini
       gopher
       xmpp
       magnet
@@ -84,7 +85,7 @@ class Sanitize
     end
 
     MASTODON_STRICT ||= freeze_config(
-      elements: %w(p br span a abbr del pre blockquote code b strong u sub sup i em h1 h2 h3 h4 h5 ul ol li),
+      elements: %w(p br span a abbr del pre blockquote code b strong u sub sup i em h1 h2 h3 h4 h5 ul ol li details summary),
 
       attributes: {
         'a'          => %w(href rel class title),
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 6afeb92d6..27b088240 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -38,13 +38,14 @@ class ActivityPub::ProcessAccountService < BaseService
     return if @account.nil?
 
     after_protocol_change! if protocol_changed?
-    after_key_change! if key_changed? && !@options[:signed_with_known_key]
     clear_tombstones! if key_changed?
     after_suspension_change! if suspension_changed?
+    return after_key_change! if key_changed? && !@options[:signed_with_known_key]
 
     unless @options[:only_key] || @account.suspended?
       check_featured_collection! if @account.featured_collection_url.present?
       check_links! unless @account.fields.empty?
+      process_sync
     end
 
     @account
@@ -131,7 +132,8 @@ class ActivityPub::ProcessAccountService < BaseService
   end
 
   def after_key_change!
-    RefollowWorker.perform_async(@account.id)
+    ResetAccountWorker.perform_async(@account.id)
+    nil
   end
 
   def after_suspension_change!
diff --git a/app/validators/poll_validator.rb b/app/validators/poll_validator.rb
index 1aaf5a5d0..d48073995 100644
--- a/app/validators/poll_validator.rb
+++ b/app/validators/poll_validator.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class PollValidator < ActiveModel::Validator
-  MAX_OPTIONS      = (ENV['MAX_POLL_OPTIONS'] || 5).to_i
+  MAX_OPTIONS      = (ENV['MAX_POLL_OPTIONS'] || 6).to_i
   MAX_OPTION_CHARS = (ENV['MAX_POLL_OPTION_CHARS'] || 100).to_i
   MAX_EXPIRATION   = 1.month.freeze
   MIN_EXPIRATION   = 5.minutes.freeze
@@ -9,7 +9,7 @@ class PollValidator < ActiveModel::Validator
   def validate(poll)
     current_time = Time.now.utc
 
-    poll.errors.add(:options, I18n.t('polls.errors.too_few_options')) unless poll.options.size > 1
+    poll.errors.add(:options, I18n.t('polls.errors.too_few_options')) unless poll.options.size > 0
     poll.errors.add(:options, I18n.t('polls.errors.too_many_options', max: MAX_OPTIONS)) if poll.options.size > MAX_OPTIONS
     poll.errors.add(:options, I18n.t('polls.errors.over_character_limit', max: MAX_OPTION_CHARS)) if poll.options.any? { |option| option.mb_chars.grapheme_length > MAX_OPTION_CHARS }
     poll.errors.add(:options, I18n.t('polls.errors.duplicate_options')) unless poll.options.uniq.size == poll.options.size
diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml
index ccea2e9b7..4170c9e44 100644
--- a/app/views/settings/preferences/appearance/show.html.haml
+++ b/app/views/settings/preferences/appearance/show.html.haml
@@ -25,7 +25,7 @@
     = f.input :setting_use_pending_items, as: :boolean, wrapper: :with_label
 
   .fields-group
-    = f.input :setting_auto_play_gif, as: :boolean, wrapper: :with_label, recommended: true
+    = f.input :setting_auto_play_gif, as: :boolean, wrapper: :with_label
     = f.input :setting_reduce_motion, as: :boolean, wrapper: :with_label
     = f.input :setting_disable_swiping, as: :boolean, wrapper: :with_label
     = f.input :setting_system_font_ui, as: :boolean, wrapper: :with_label
diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml
index 3b5c7016d..372d934fb 100644
--- a/app/views/settings/preferences/other/show.html.haml
+++ b/app/views/settings/preferences/other/show.html.haml
@@ -14,7 +14,7 @@
     = f.input :setting_hide_network, as: :boolean, wrapper: :with_label
 
   .fields-group
-    = f.input :setting_aggregate_reblogs, as: :boolean, wrapper: :with_label, recommended: true
+    = f.input :setting_aggregate_reblogs, as: :boolean, wrapper: :with_label
 
   - unless Setting.hide_followers_count
     .fields-group
@@ -33,7 +33,7 @@
     = f.input :setting_default_sensitive, as: :boolean, wrapper: :with_label
 
   .fields-group
-    = f.input :setting_show_application, as: :boolean, wrapper: :with_label, recommended: true
+    = f.input :setting_show_application, as: :boolean, wrapper: :with_label
 
   .fields-group
     = f.input :setting_default_content_type, collection: ['text/plain', 'text/markdown', 'text/html'], wrapper: :with_label, include_blank: false, label_method: lambda { |item| safe_join([t("simple_form.labels.defaults.setting_default_content_type_#{item.split('/')[1]}"), content_tag(:span, t("simple_form.hints.defaults.setting_default_content_type_#{item.split('/')[1]}"), class: 'hint')]) }, required: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li'
diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml
index 6061e9cfd..fb7ce6780 100644
--- a/app/views/settings/profiles/show.html.haml
+++ b/app/views/settings/profiles/show.html.haml
@@ -31,7 +31,7 @@
 
   - if Setting.profile_directory
     .fields-group
-      = f.input :discoverable, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.discoverable'), recommended: true
+      = f.input :discoverable, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.discoverable')
 
   %hr.spacer/
 
diff --git a/app/workers/reset_account_worker.rb b/app/workers/reset_account_worker.rb
new file mode 100644
index 000000000..f63d8682a
--- /dev/null
+++ b/app/workers/reset_account_worker.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class ResetAccountWorker
+  include Sidekiq::Worker
+
+  def perform(account_id)
+    account = Account.find(account_id)
+    return if account.local?
+
+    account_uri = account.uri
+    SuspendAccountService.new.call(account)
+    ResolveAccountService.new.call(account_uri)
+  rescue ActiveRecord::RecordNotFound
+    true
+  end
+end
diff --git a/config/application.rb b/config/application.rb
index 116eaf29d..93f258190 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -63,6 +63,7 @@ module Mastodon
       :de,
       :el,
       :en,
+      :'en-cafe',
       :eo,
       :es,
       :'es-AR',
@@ -128,9 +129,12 @@ module Mastodon
     config.i18n.default_locale = ENV['DEFAULT_LOCALE']&.to_sym
 
     unless config.i18n.available_locales.include?(config.i18n.default_locale)
-      config.i18n.default_locale = :en
+      config.i18n.default_locale = :'en-cafe'
     end
 
+    # fall back to English when a translation cannot be found
+    config.i18n.fallbacks = [:'en-cafe', :en]
+
     # config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
     # config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
 
diff --git a/config/environments/production.rb b/config/environments/production.rb
index c2e8210f8..bdda469ba 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -58,10 +58,6 @@ Rails.application.configure do
   # Set this to true and configure the email server for immediate delivery to raise delivery errors.
   # config.action_mailer.raise_delivery_errors = false
 
-  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
-  # English when a translation cannot be found).
-  config.i18n.fallbacks = [:en]
-
   # Send deprecation notices to registered listeners.
   config.active_support.deprecation = :notify
 
@@ -106,11 +102,11 @@ Rails.application.configure do
 
   config.action_dispatch.default_headers = {
     'Server'                  => 'Mastodon',
-    'X-Frame-Options'         => 'DENY',
-    'X-Content-Type-Options'  => 'nosniff',
-    'X-XSS-Protection'        => '1; mode=block',
-    'Referrer-Policy'         => 'same-origin',
-    'Strict-Transport-Security' => 'max-age=63072000; includeSubDomains; preload',
+    #'X-Frame-Options'         => 'DENY',
+    #'X-Content-Type-Options'  => 'nosniff',
+    #'X-XSS-Protection'        => '1; mode=block',
+    #'Referrer-Policy'         => 'same-origin',
+    #'Strict-Transport-Security' => 'max-age=63072000; includeSubDomains; preload',
     'X-Clacks-Overhead' => 'GNU Natalie Nguyen'
 
   }
diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml
index e09f4262b..3db1bc602 100644
--- a/config/i18n-tasks.yml
+++ b/config/i18n-tasks.yml
@@ -51,7 +51,7 @@ ignore_unused:
   - 'activerecord.errors.*'
   - '{devise,pagination,doorkeeper}.*'
   - '{date,datetime,time,number}.*'
-  - 'simple_form.{yes,no,recommended}'
+  - 'simple_form.{yes,no}'
   - 'simple_form.{placeholders,hints,labels}.*'
   - 'simple_form.{error_notification,required}.:'
   - 'errors.messages.*'
diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb
index 68d3751fc..a0d48eafd 100644
--- a/config/initializers/content_security_policy.rb
+++ b/config/initializers/content_security_policy.rb
@@ -33,9 +33,9 @@ if Rails.env.production?
     p.frame_ancestors :none
     p.script_src      :self, assets_host
     p.font_src        :self, assets_host
-    p.img_src         :self, :data, :blob, *data_hosts
+    p.img_src         :self, :data, :blob, *data_hosts, "pool.jortage.com", "blob.jortage.com", "s3-us-east-2.amazonaws.com"
     p.style_src       :self, assets_host
-    p.media_src       :self, :data, *data_hosts
+    p.media_src       :self, :data, *data_hosts, "pool.jortage.com", "blob.jortage.com", "s3-us-east-2.amazonaws.com"
     p.frame_src       :self, :https
     p.child_src       :self, :blob, assets_host
     p.worker_src      :self, :blob, assets_host
diff --git a/config/initializers/simple_form.rb b/config/initializers/simple_form.rb
index 3a2097d2f..8ec642653 100644
--- a/config/initializers/simple_form.rb
+++ b/config/initializers/simple_form.rb
@@ -8,16 +8,7 @@ module AppendComponent
   end
 end
 
-module RecommendedComponent
-  def recommended(_wrapper_options = nil)
-    return unless options[:recommended]
-    options[:label_text] = ->(raw_label_text, _required_label_text, _label_present) { safe_join([raw_label_text, ' ', content_tag(:span, I18n.t('simple_form.recommended'), class: 'recommended')]) }
-    nil
-  end
-end
-
 SimpleForm.include_component(AppendComponent)
-SimpleForm.include_component(RecommendedComponent)
 
 SimpleForm.setup do |config|
   # Wrappers are used by the form builder to generate a
@@ -74,7 +65,6 @@ SimpleForm.setup do |config|
     b.use :html5
 
     b.wrapper tag: :div, class: :label_input do |ba|
-      ba.optional :recommended
       ba.use :label
 
       ba.wrapper tag: :div, class: :label_input__wrapper do |bb|
diff --git a/config/locales/en-cafe.yml b/config/locales/en-cafe.yml
new file mode 100755
index 000000000..b91edcf1d
--- /dev/null
+++ b/config/locales/en-cafe.yml
@@ -0,0 +1,18 @@
+---
+en-cafe:
+  about:
+    hosted_on: GlitchCafé hosted on %{domain}
+    unavailable_content: Domain blocks
+    unavailable_content_description:
+      domain: Instance
+      reason: Reason
+      rejecting_media: 'Media files from these instances will not be processed or stored, and no thumbnails will be displayed, requiring manual click-through to the original file:'
+      rejecting_media_title: Filtered media
+      silenced: 'Posts from these instances will be hidden in public timelines and conversations, and no notifications will be generated from their users interactions, unless you are following them:'
+      silenced_title: Silenced instances
+      suspended: 'No data from these instances will be processed, stored or exchanged, making any interaction or communication with users from these instances impossible:'
+      suspended_title: Suspended instances
+  auth:
+    description:
+      prefix_invited_by_user: "@%{name} invites you to join Plural Café!"
+      prefix_sign_up: Sign up on Plural Café today!
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index 63f122b78..0663c65b4 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -180,7 +180,6 @@ ar:
         trendable: السماح لهذه الكلمة المفتاحية بالظهور تحت المتداوَلة
         usable: اسمح للتبويقات باستخدام هذا الوسم
     'no': لا
-    recommended: موصى بها
     required:
       mark: "*"
       text: مطلوب
diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml
index 1a62eb76b..1fe5fa798 100644
--- a/config/locales/simple_form.ast.yml
+++ b/config/locales/simple_form.ast.yml
@@ -94,7 +94,6 @@ ast:
       tag:
         name: Etiqueta
     'no': Non
-    recommended: Aconséyase
     required:
       mark: "*"
       text: ríquese
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index b3692f5ba..181f7d504 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -203,7 +203,6 @@ ca:
         trendable: Permet que aquesta etiqueta aparegui en les tendències
         usable: Permet als tuts emprar aquesta etiqueta
     'no': 'No'
-    recommended: Recomanat
     required:
       mark: "*"
       text: necessari
diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml
index 1d41066d1..a36ad17c6 100644
--- a/config/locales/simple_form.co.yml
+++ b/config/locales/simple_form.co.yml
@@ -203,7 +203,6 @@ co:
         trendable: Auturizà stu hashtag à esse vistu in e tendenze
         usable: Auturizà i statuti à utilizà stu hashtag
     'no': Nò
-    recommended: Ricumandati
     required:
       mark: "*"
       text: riquisiti
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index d03636247..9f3f36b1e 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -184,7 +184,6 @@ cs:
         trendable: Povolit tento hashtag v trendech
         usable: Povolit používat tento hashtag v tootech
     'no': Ne
-    recommended: Doporučeno
     required:
       mark: "*"
       text: vyžadováno
diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml
index cb3f75c1a..1b4250c0c 100644
--- a/config/locales/simple_form.cy.yml
+++ b/config/locales/simple_form.cy.yml
@@ -184,7 +184,6 @@ cy:
         trendable: Gadewch i'r hashnod hwn ymddangos o dan dueddiadau
         usable: Caniatáu i tŵtiau ddefnyddio'r hashnod hwn
     'no': Na
-    recommended: Argymhellwyd
     required:
       mark: "*"
       text: gofynnol
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index 1c16c8e37..fb011f573 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -156,7 +156,6 @@ da:
         trendable: Tillad at dette hashtag vises under trends
         usable: Tillad toots at benytte dette hashtag
     'no': Nej
-    recommended: Anbefalet
     required:
       mark: "*"
       text: påkrævet
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 711dbf5c6..48c2b08f8 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -203,7 +203,6 @@ de:
         trendable: Erlaube es diesen Hashtag in den Trends erscheinen zu lassen
         usable: Beiträge erlauben, diesen Hashtag zu verwenden
     'no': Nein
-    recommended: Empfohlen
     required:
       mark: "*"
       text: Pflichtfeld
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index d4c8a2da6..9cb84bddd 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -201,7 +201,6 @@ el:
         trendable: Εμφάνιση της ετικέτας στις τάσεις
         usable: Χρήση της ετικέτας σε τουτ
     'no': Όχι
-    recommended: Προτείνεται
     required:
       mark: "*"
       text: απαιτείται
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 4b5ff7ae8..0e7c3b453 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -64,7 +64,7 @@ en:
       imports:
         data: CSV file exported from another Mastodon server
       invite_request:
-        text: This will help us review your application
+        text: 'If you are interested in signing up, please put whether you are a plural system or singlet in the "Why do you want to join" box. This is purely to ward off spam bots. If this is not answered, your request to join the instance will be rejected.'
       ip_block:
         comment: Optional. Remember why you added this rule.
         expires_in: IP addresses are a finite resource, they are sometimes shared and often change hands. For this reason, indefinite IP blocks are not recommended.
@@ -207,7 +207,6 @@ en:
         trendable: Allow this hashtag to appear under trends
         usable: Allow toots to use this hashtag
     'no': 'No'
-    recommended: Recommended
     required:
       mark: "*"
       text: required
diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml
index 3f399deae..16b3f7d18 100644
--- a/config/locales/simple_form.eo.yml
+++ b/config/locales/simple_form.eo.yml
@@ -172,7 +172,6 @@ eo:
         trendable: Permesi al ĉi tiu kradvorto aperi en furoraĵoj
         usable: Permesi mesaĝojn uzi ĉi tiun kradvorton
     'no': Ne
-    recommended: Rekomendita
     required:
       mark: "*"
       text: bezonata
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
index 153c1101d..64bf8c799 100644
--- a/config/locales/simple_form.es-AR.yml
+++ b/config/locales/simple_form.es-AR.yml
@@ -203,7 +203,6 @@ es-AR:
         trendable: Permitir que esta etiqueta aparezca bajo tendencias
         usable: Permitir a los toots usar esta etiqueta
     'no': 'No'
-    recommended: Opción recomendada
     required:
       mark: "*"
       text: obligatorio
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index 5da47d54a..5608b529c 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -203,7 +203,6 @@ es:
         trendable: Permitir que esta etiqueta aparezca bajo tendencias
         usable: Permitir a los toots usar esta etiqueta
     'no': 'No'
-    recommended: Recomendado
     required:
       mark: "*"
       text: necesario
diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml
index 79934c0b1..93154745d 100644
--- a/config/locales/simple_form.et.yml
+++ b/config/locales/simple_form.et.yml
@@ -183,7 +183,6 @@ et:
         trendable: Luba sellel sildil trendida
         usable: Luba tuututustel seda silti kasutada
     'no': Ei
-    recommended: Soovituslik
     required:
       mark: "*"
       text: kohustuslik
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index c3520b072..41eded347 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -183,7 +183,6 @@ eu:
         trendable: Baimendu traola hau joeretan agertzea
         usable: Baimendu tootek traola hau erabiltzea
     'no': Ez
-    recommended: Aholkatua
     required:
       mark: "*"
       text: beharrezkoa
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index 5960c2610..a081f81e5 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -203,7 +203,6 @@ fa:
         trendable: بگذارید که این برچسب در موضوعات پرطرفدار دیده شود
         usable: بگذارید که این برچسب در بوق‌ها به کار بروند
     'no': خیر
-    recommended: توصیه می‌شود
     required:
       mark: "*"
       text: ضروری
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index 1b4acc9b9..74eda70fc 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -128,7 +128,6 @@ fi:
         trendable: Salli tämän aihetunnisteen näkyä trendeissä
         usable: Salli tuuttauksien käyttää tätä aihetunnistetta
     'no': Ei
-    recommended: Suositeltu
     required:
       mark: "*"
       text: pakollinen tieto
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index e173dc0dc..fa90dfe55 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -203,7 +203,6 @@ fr:
         trendable: Autoriser ce hashtag à apparaitre dans les tendances
         usable: Autoriser les pouets à utiliser ce hashtag
     'no': Non
-    recommended: Recommandé
     required:
       mark: "*"
       text: champs requis
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 799312e33..e9a33cd0d 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -203,7 +203,6 @@ gl:
         trendable: Permitir que este cancelo apareza en tendencias
         usable: Permitir que os toots utilicen este cancelo
     'no': Non
-    recommended: Recomendado
     required:
       mark: "*"
       text: requerido
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index d5e82ecb2..276a3a1b4 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -203,7 +203,6 @@ hu:
         trendable: A hashtag megjelenhet a trendek között
         usable: Tülkök használhatják ezt a hashtaget
     'no': Nem
-    recommended: Ajánlott
     required:
       mark: "*"
       text: kötelező
diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml
index ff4bfcaab..b7b4f2d30 100644
--- a/config/locales/simple_form.hy.yml
+++ b/config/locales/simple_form.hy.yml
@@ -203,7 +203,6 @@ hy:
         trendable: Թոյլատրել, որ այս պիտակը յայտնուի թրենդներում
         usable: Թոյլատրել թթերին օգտագործել այս պիտակը
     'no': Ոչ
-    recommended: Խորհուրդ է տրվում
     required:
       mark: "*"
       text: պարտադիր
diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml
index 4b469cd93..0ae63f356 100644
--- a/config/locales/simple_form.id.yml
+++ b/config/locales/simple_form.id.yml
@@ -203,7 +203,6 @@ id:
         trendable: Izinkan tagar ini muncul di bawah tren
         usable: Izinkan toot memakai tagar ini
     'no': Tidak
-    recommended: Direkomendasikan
     required:
       mark: "*"
       text: wajib
diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml
index 53e34f00c..6e64f0478 100644
--- a/config/locales/simple_form.is.yml
+++ b/config/locales/simple_form.is.yml
@@ -203,7 +203,6 @@ is:
         trendable: Leyfa þessu myllumerki að birtast undir tilhneigingum
         usable: Leyfa tístum að nota þetta myllumerki
     'no': Nei
-    recommended: Mælt með
     required:
       mark: "*"
       text: nauðsynlegt
diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml
index 82f12861f..cc660fd8d 100644
--- a/config/locales/simple_form.it.yml
+++ b/config/locales/simple_form.it.yml
@@ -203,7 +203,6 @@ it:
         trendable: Permetti a questo hashtag di apparire nelle tendenze
         usable: Permetti ai toot di utilizzare questo hashtag
     'no': 'No'
-    recommended: Consigliato
     required:
       mark: "*"
       text: richiesto
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index abe986acd..b6df486bc 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -203,7 +203,6 @@ ja:
         trendable: トレンドへの表示を許可する
         usable: トゥートへの使用を許可する
     'no': いいえ
-    recommended: おすすめ
     required:
       mark: "*"
       text: 必須
diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml
index bbc23ed51..2e7f93a34 100644
--- a/config/locales/simple_form.kab.yml
+++ b/config/locales/simple_form.kab.yml
@@ -99,7 +99,6 @@ kab:
       tag:
         name: Ahacṭag
     'no': Ala
-    recommended: Yettuwelleh
     required:
       mark: "*"
       text: ilaq
diff --git a/config/locales/simple_form.kk.yml b/config/locales/simple_form.kk.yml
index 544c684a6..859c70418 100644
--- a/config/locales/simple_form.kk.yml
+++ b/config/locales/simple_form.kk.yml
@@ -164,7 +164,6 @@ kk:
         trendable: Хештегті трендтерде көрсетуге рұқсат бер
         usable: Бұл хештегті қолдануға рұқсат бер
     'no': Жоқ
-    recommended: Рекоменделген
     required:
       mark: "*"
       text: міндетті
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index 5c47a99c4..18f60dd9e 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -203,7 +203,6 @@ ko:
         trendable: 이 해시태그가 유행에 보여지도록 허용
         usable: 이 해시태그를 툿에 사용 가능하도록 허용
     'no': 아니오
-    recommended: 추천함
     required:
       mark: "*"
       text: 필수 항목
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index 8abc9448c..41dc2f28b 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -198,7 +198,6 @@ nl:
         trendable: Toestaan dat deze hashtag onder trends te zien valt
         usable: Toestaan dat deze hashtag in toots gebruikt mag worden
     'no': Nee
-    recommended: Aanbevolen
     required:
       mark: "*"
       text: vereist
diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml
index f4a62ac07..a28bcaef8 100644
--- a/config/locales/simple_form.nn.yml
+++ b/config/locales/simple_form.nn.yml
@@ -195,7 +195,6 @@ nn:
         trendable: Tillat denne emneknaggen til å synast under trendar
         usable: Gje tut lov til å nytta denne emneknaggen
     'no': Nei
-    recommended: Tilrådt
     required:
       mark: "*"
       text: obligatorisk
diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml
index cdf3d61e8..65eb6fba8 100644
--- a/config/locales/simple_form.no.yml
+++ b/config/locales/simple_form.no.yml
@@ -195,7 +195,6 @@
         trendable: Tillat denne emneknaggen til å vises under trender
         usable: Tillat tuter å bruke denne emneknaggen
     'no': Nei
-    recommended: Anbefalt
     required:
       mark: "*"
       text: obligatorisk
diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml
index 79c621ee2..28dfd05d8 100644
--- a/config/locales/simple_form.oc.yml
+++ b/config/locales/simple_form.oc.yml
@@ -203,7 +203,6 @@ oc:
         trendable: Permetre a aquesta etiqueta d’aparéisser a las tendéncias
         usable: Permetre als tuts d’utilizar aquesta etiqueta
     'no': Non
-    recommended: Recomandat
     required:
       mark: "*"
       text: requesit
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index 6fc33ab08..865b26d91 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -203,7 +203,6 @@ pl:
         trendable: Pozwól na wyświetlanie tego hashtagu w „Na czasie”
         usable: Pozwól na umieszczanie tego hashtagu we wpisach
     'no': Nie
-    recommended: Polecane
     required:
       mark: "*"
       text: pole wymagane
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index 574a3e3dc..bc1dc0d12 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -203,7 +203,6 @@ pt-BR:
         trendable: Permitir que esta hashtag fique em alta
         usable: Permitir que toots usem esta hashtag
     'no': Não
-    recommended: Recomendado
     required:
       mark: "*"
       text: obrigatório
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index 869ecaddc..6cd5511eb 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -203,7 +203,6 @@ pt-PT:
         trendable: Permitir que esta hashtag apareça em destaque
         usable: Permitir que toots utilizem esta hashtag
     'no': Não
-    recommended: Recomendado
     required:
       mark: "*"
       text: obrigatório
diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml
index aa0b07708..36ac81b65 100644
--- a/config/locales/simple_form.ro.yml
+++ b/config/locales/simple_form.ro.yml
@@ -183,7 +183,6 @@ ro:
         trendable: Permite acestui hashtag să apară sub tendințe
         usable: Permite postărilor să folosească acest hashtag
     'no': Nu
-    recommended: Recomandat
     required:
       mark: "*"
       text: obligatoriu
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
index 5baa9d46e..ad9fc3323 100644
--- a/config/locales/simple_form.ru.yml
+++ b/config/locales/simple_form.ru.yml
@@ -203,7 +203,6 @@ ru:
         trendable: Разрешить показ хэштега в трендах
         usable: Разрешить использовать этот хэштег в постах
     'no': Нет
-    recommended: Рекомендуем
     required:
       mark: "*"
       text: обязательно
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index 9e03d7254..a5fdc2a69 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -170,7 +170,6 @@ sk:
         trendable: Povoľ zobrazovanie tohto haštagu medzi trendujúcimi
         usable: Povoľ používanie tohto haštagu v príspevkoch
     'no': Nie
-    recommended: Odporúčané
     required:
       mark: "*"
       text: povinné
diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml
index 771edf383..31648b119 100644
--- a/config/locales/simple_form.sl.yml
+++ b/config/locales/simple_form.sl.yml
@@ -137,7 +137,6 @@ sl:
         reblog: Pošlji e-pošto, ko nekdo sune vaše stanje
         report: Pošlji e-pošto, ko je oddana nova prijava
     'no': Ne
-    recommended: Priporočeno
     required:
       mark: "*"
       text: zahtevano
diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml
index 18211e69e..f00030ccf 100644
--- a/config/locales/simple_form.sq.yml
+++ b/config/locales/simple_form.sq.yml
@@ -203,7 +203,6 @@ sq:
         trendable: Lejoje këtë hashtag të shfaqet në prirje
         usable: Lejoji mesazhet të përdorin këtë hashtag
     'no': Jo
-    recommended: E rekomanduar
     required:
       mark: "*"
       text: e domosdoshme
diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml
index 8500f109e..0bfcd8fca 100644
--- a/config/locales/simple_form.sv.yml
+++ b/config/locales/simple_form.sv.yml
@@ -121,7 +121,6 @@ sv:
         mention: Skicka e-post när någon nämner dig
         reblog: Skicka e-post när någon knuffar din status
     'no': Nej
-    recommended: Rekommenderad
     required:
       mark: "*"
       text: obligatorisk
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index 23add1d45..0e2187c5a 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -195,7 +195,6 @@ th:
         trendable: อนุญาตให้แฮชแท็กนี้ปรากฏภายใต้แนวโน้ม
         usable: อนุญาตให้โพสต์ใช้แฮชแท็กนี้
     'no': ไม่
-    recommended: แนะนำ
     required:
       mark: "*"
       text: ต้องระบุ
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index 39ae58dc2..834a22207 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -203,7 +203,6 @@ tr:
         trendable: Bu etiketin gündem altında görünmesine izin ver
         usable: Tootların bu etiketi kullanmasına izin ver
     'no': Hayır
-    recommended: Önerilen
     required:
       mark: "*"
       text: gerekli
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index adfc07a09..7580ef0c1 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -185,7 +185,6 @@ uk:
         trendable: Дозволити появу цього хештеґа у списку популярних хештеґів
         usable: Дозволити дмухам використовувати цей хештеґ
     'no': Ні
-    recommended: Рекомендовано
     required:
       mark: "*"
       text: обов'язкове
diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml
index dfe1ae36e..b9b15cc0e 100644
--- a/config/locales/simple_form.vi.yml
+++ b/config/locales/simple_form.vi.yml
@@ -203,7 +203,6 @@ vi:
         trendable: Cho phép hashtag này xuất hiện trong xu hướng
         usable: Cho phép dùng hashtag này trong tút
     'no': Tắt
-    recommended: Khuyến nghị
     required:
       mark: "*"
       text: yêu cầu
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index 35222c076..0e7b1e665 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -203,7 +203,6 @@ zh-CN:
         trendable: 允许在热门下显示此话题
         usable: 允许嘟文使用此话题标签
     'no': 否
-    recommended: 推荐
     required:
       mark: "*"
       text: 必填
diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml
index eaed6e32b..ffa2fcde5 100644
--- a/config/locales/simple_form.zh-HK.yml
+++ b/config/locales/simple_form.zh-HK.yml
@@ -203,7 +203,6 @@ zh-HK:
         trendable: 允許此主題標籤在趨勢下顯示
         usable: 允許文章使用此主題標籤
     'no': 否
-    recommended: 建議
     required:
       mark: "*"
       text: 必須填寫
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index 000ec529b..fbc2ff98b 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -170,7 +170,6 @@ zh-TW:
         trendable: 允許此主題標籤在趨勢下顯示
         usable: 允許嘟文使用此主題標籤
     'no': 否
-    recommended: 建議
     required:
       mark: "*"
       text: 必須填寫
diff --git a/db/migrate/20180617162849_remove_unused_indexes.rb b/db/migrate/20180617162849_remove_unused_indexes.rb
deleted file mode 100644
index 61add6385..000000000
--- a/db/migrate/20180617162849_remove_unused_indexes.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-class RemoveUnusedIndexes < ActiveRecord::Migration[5.2]
-  def change
-    remove_index :statuses, name: "index_statuses_on_conversation_id"
-    remove_index :users, name: "index_users_on_filtered_languages"
-    remove_index :backups, name: "index_backups_on_user_id"
-  end
-end
diff --git a/db/migrate/20180628181026_create_custom_filters.rb b/db/migrate/20180628181026_create_custom_filters.rb
deleted file mode 100644
index d19cf2e9d..000000000
--- a/db/migrate/20180628181026_create_custom_filters.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class CreateCustomFilters < ActiveRecord::Migration[5.2]
-  def change
-    create_table :custom_filters do |t|
-      t.belongs_to :account, foreign_key: { on_delete: :cascade }
-      t.datetime :expires_at
-      t.text :phrase, null: false, default: ''
-      t.string :context, array: true, null: false, default: []
-      t.boolean :irreversible, null: false, default: false
-
-      t.timestamps
-    end
-  end
-end
diff --git a/hooks/build b/hooks/build
new file mode 100755
index 000000000..4f7259bec
--- /dev/null
+++ b/hooks/build
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+echo "Building from ${SOURCE_COMMIT}"
+docker build --build-arg SOURCE_COMMIT=`head -c 7 <<< $SOURCE_COMMIT` -t $IMAGE_NAME .
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 12581f3e1..970ee4fb2 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -21,7 +21,11 @@ module Mastodon
     end
 
     def suffix
-      '+glitch'
+      if source_tag
+        "+cafe.#{source_tag}"
+      else
+        "+cafe"
+      end
     end
 
     def to_a
@@ -33,7 +37,7 @@ module Mastodon
     end
 
     def repository
-      ENV.fetch('GITHUB_REPOSITORY', 'glitch-soc/mastodon')
+      ENV.fetch('GITHUB_REPOSITORY', 'pluralcafe/mastodon')
     end
 
     def source_base_url
diff --git a/public/avatars/original/missing.png b/public/avatars/original/missing.png
index 34c8e45e6..0fefd3c3a 100644
--- a/public/avatars/original/missing.png
+++ b/public/avatars/original/missing.png
Binary files differdiff --git a/public/avatars/original/plural-knot.svg b/public/avatars/original/plural-knot.svg
new file mode 100755
index 000000000..bf4a7a8ff
--- /dev/null
+++ b/public/avatars/original/plural-knot.svg
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:export-ydpi="63.82"
+   inkscape:export-xdpi="63.82"
+   inkscape:export-filename="C:\devil\pluralcafe\mastodon\public\avatars\original\missing.png"
+   sodipodi:docname="plural-knot.svg"
+   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+   id="svg8"
+   version="1.1"
+   viewBox="0 0 159.20357 159.20357"
+   height="159.20357mm"
+   width="159.20357mm">
+  <defs
+     id="defs2" />
+  <sodipodi:namedview
+     fit-margin-bottom="0"
+     fit-margin-right="0"
+     fit-margin-left="0"
+     fit-margin-top="0"
+     inkscape:window-maximized="1"
+     inkscape:window-y="-8"
+     inkscape:window-x="1912"
+     inkscape:window-height="1058"
+     inkscape:window-width="1858"
+     showgrid="false"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="layer3"
+     inkscape:document-units="mm"
+     inkscape:cy="316.5168"
+     inkscape:cx="277.46816"
+     inkscape:zoom="0.98994949"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-21.064414,-4.308929)"
+     style="display:inline"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1">
+    <g
+       style="display:none"
+       transform="translate(-8.94689,-52.449395)"
+       inkscape:label="guide"
+       id="layer2">
+      <g
+         id="g870"
+         style="display:inline">
+        <g
+           id="g868-3"
+           transform="matrix(4.4223215,0,0,4.4223215,30.011304,56.758324)"
+           style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:0.39886;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
+          <path
+             id="path854-6"
+             d="m 36,32 c 0,2.209 -1.791,4 -4,4 H 4 C 1.791,36 0,34.209 0,32 V 4 C 0,1.791 1.791,0 4,0 h 28 c 2.209,0 4,1.791 4,4 z"
+             inkscape:connector-curvature="0"
+             style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:0.39886;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             inkscape:export-filename="/home/mordecai/alt-key-purple.png"
+             inkscape:export-xdpi="92.813103"
+             inkscape:export-ydpi="92.813103" />
+        </g>
+        <g
+           id="g868-3-7"
+           transform="matrix(3.2281286,0,0,3.2281286,51.506777,78.253798)"
+           style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:0.39886;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
+          <path
+             id="path854-6-5"
+             d="m 36,32 c 0,2.209 -1.791,4 -4,4 H 4 C 1.791,36 0,34.209 0,32 V 4 C 0,1.791 1.791,0 4,0 h 28 c 2.209,0 4,1.791 4,4 z"
+             inkscape:connector-curvature="0"
+             style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:0.39886;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+             inkscape:export-filename="/home/mordecai/alt-key-purple.png"
+             inkscape:export-xdpi="92.813103"
+             inkscape:export-ydpi="92.813103" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     transform="translate(-21.064414,-4.308929)"
+     inkscape:label="rings"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <g
+       id="g1151">
+      <g
+         style="display:inline;fill:#d9e1e8;fill-opacity:1;stroke:none;stroke-opacity:1"
+         transform="matrix(4.4223215,0,0,4.4223215,21.064414,4.308929)"
+         id="g868">
+        <path
+           inkscape:export-ydpi="92.813103"
+           inkscape:export-xdpi="92.813103"
+           inkscape:export-filename="/home/mordecai/alt-key-purple.png"
+           style="fill:#d9e1e8;fill-opacity:1;stroke:none;stroke-opacity:1"
+           inkscape:connector-curvature="0"
+           d="m 36,32 c 0,2.209 -1.791,4 -4,4 H 4 C 1.791,36 0,34.209 0,32 V 4 C 0,1.791 1.791,0 4,0 h 28 c 2.209,0 4,1.791 4,4 z"
+           id="path854" />
+      </g>
+      <path
+         d="m 100.6155,26.313866 a 35.80561,35.80561 0 0 0 -35.725991,35.805567 35.80561,35.80561 0 0 0 35.805571,35.805565 35.80561,35.80561 0 0 0 35.80557,-35.805565 35.80561,35.80561 0 0 0 -35.80557,-35.805567 35.80561,35.80561 0 0 0 -0.0796,0 z m 0.0796,7.020245 A 28.785372,28.785372 0 0 1 129.4804,62.119433 28.785372,28.785372 0 0 1 100.69508,90.904755 28.785372,28.785372 0 0 1 71.909752,62.119433 28.785372,28.785372 0 0 1 100.69508,33.334111 Z"
+         style="vector-effect:none;fill:#889fbe;fill-opacity:1;stroke:none;stroke-width:7.82577;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         id="path1039" />
+      <path
+         d="m 100.58906,69.886559 a 35.80561,35.80561 0 0 0 -35.725988,35.805561 35.80561,35.80561 0 0 0 35.805568,35.80557 35.80561,35.80561 0 0 0 35.80557,-35.80557 35.80561,35.80561 0 0 0 -35.80557,-35.805561 35.80561,35.80561 0 0 0 -0.0796,0 z m 0.0796,7.020246 a 28.785373,28.785373 0 0 1 28.7853,28.785315 28.785373,28.785373 0 0 1 -28.78532,28.78532 28.785373,28.785373 0 0 1 -28.785325,-28.78532 28.785373,28.785373 0 0 1 28.785325,-28.785315 z"
+         style="vector-effect:none;fill:#a3b6cf;fill-opacity:1;stroke:none;stroke-width:7.82577;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         id="circle1031-9" />
+      <path
+         id="circle1031-9-0"
+         style="vector-effect:none;fill:#b4c3d6;fill-opacity:1;stroke:none;stroke-width:7.82577;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         d="M 78.728456,48.105159 A 35.80561,35.80561 0 0 0 43.002467,83.910721 35.80561,35.80561 0 0 0 78.808035,119.71629 35.80561,35.80561 0 0 0 114.61361,83.910721 35.80561,35.80561 0 0 0 78.808035,48.105159 a 35.80561,35.80561 0 0 0 -0.0796,0 z m 0.0796,7.020247 A 28.785373,28.785373 0 0 1 107.59336,83.910721 28.785373,28.785373 0 0 1 78.808035,112.69604 28.785373,28.785373 0 0 1 50.02271,83.910721 28.785373,28.785373 0 0 1 78.808035,55.125406 Z" />
+      <path
+         id="circle1031"
+         style="vector-effect:none;fill:#c1cddb;fill-opacity:1;stroke:none;stroke-width:29.5777;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+         d="M 462.51562,181.81445 A 135.32829,135.32829 0 0 0 327.48828,317.14258 135.32829,135.32829 0 0 0 462.81641,452.4707 135.32829,135.32829 0 0 0 598.14453,317.14258 135.32829,135.32829 0 0 0 462.81641,181.81445 a 135.32829,135.32829 0 0 0 -0.30079,0 z m 0.30079,26.53321 A 108.79511,108.79511 0 0 1 571.61133,317.14258 108.79511,108.79511 0 0 1 462.81641,425.9375 108.79511,108.79511 0 0 1 354.02148,317.14258 108.79511,108.79511 0 0 1 462.81641,208.34766 Z"
+         transform="scale(0.26458333)" />
+      <path
+         id="rect1071"
+         style="fill:#889fbe;fill-opacity:1;stroke:none;stroke-width:26.6683;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 285.22266,182.40625 a 135.32829,135.32829 0 0 0 -32.14844,7.0332 135.32829,135.32829 0 0 0 -7.17383,32.11719 108.79511,108.79511 0 0 1 28.53906,-10.6582 108.79511,108.79511 0 0 1 10.78321,-28.49219 z"
+         transform="scale(0.26458333)" />
+      <path
+         id="rect1073"
+         style="fill:#889fbe;fill-opacity:1;stroke:none;stroke-width:26.6683;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 328.10938,330.08789 a 135.32829,135.32829 0 0 0 7.13085,32.20117 135.32829,135.32829 0 0 0 32.19336,7.17969 108.79511,108.79511 0 0 1 -10.7832,-28.55664 108.79511,108.79511 0 0 1 -28.54101,-10.82422 z"
+         transform="scale(0.26458333)" />
+      <path
+         id="rect1075"
+         style="fill:#889fbe;fill-opacity:1;stroke:none;stroke-width:29.9925;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 469.4668,297.51172 a 108.79511,108.79511 0 0 1 -17.83203,19.65625 108.79511,108.79511 0 0 1 17.81054,19.67578 135.32829,135.32829 0 0 0 18.47852,-19.6543 135.32829,135.32829 0 0 0 -18.45703,-19.67773 z"
+         transform="scale(0.26458333)" />
+      <path
+         id="rect1079"
+         style="fill:#a3b6cf;fill-opacity:1;stroke:none;stroke-width:26.6683;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 393.19727,264.73828 a 108.79511,108.79511 0 0 1 10.79687,28.50391 108.79511,108.79511 0 0 1 28.54297,10.69336 135.32829,135.32829 0 0 0 -7.17578,-32.13867 135.32829,135.32829 0 0 0 -32.16406,-7.0586 z"
+         transform="scale(0.26458333)" />
+      <path
+         id="rect1081"
+         style="fill:#a3b6cf;fill-opacity:1;stroke:none;stroke-width:26.6683;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 515.17773,412.50781 a 108.79511,108.79511 0 0 1 -28.54687,10.79102 108.79511,108.79511 0 0 1 -10.79297,28.54297 135.32829,135.32829 0 0 0 32.1875,-7.14453 135.32829,135.32829 0 0 0 7.15234,-32.18946 z"
+         transform="scale(0.26458333)" />
+      <path
+         id="rect1083"
+         style="fill:#b4c3d6;fill-opacity:1;stroke:none;stroke-width:33.4685;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 380.33594,209.85547 a 135.32829,135.32829 0 0 0 -19.63282,18.48242 108.79511,108.79511 0 0 1 19.63477,17.85938 108.79511,108.79511 0 0 1 19.63281,-17.85938 135.32829,135.32829 0 0 0 -19.63476,-18.48242 z"
+         transform="scale(0.26458333)" />
+    </g>
+  </g>
+</svg>
diff --git a/public/favicon.ico b/public/favicon.ico
index 79000c9cc..c6ecf1314 100644..100755
--- a/public/favicon.ico
+++ b/public/favicon.ico
Binary files differ