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/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
-rw-r--r--app/javascript/flavours/glitch/locales/en.js4
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss4
-rw-r--r--app/javascript/mastodon/locales/de.json2
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json2
-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
-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.json6
-rw-r--r--app/lib/sanitize_config.rb3
-rw-r--r--config/environments/production.rb10
-rw-r--r--config/initializers/content_security_policy.rb4
-rw-r--r--config/locales/simple_form.en.yml2
-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
37 files changed, 267 insertions, 72 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 fa6abad5a..78e4daf9e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -125,13 +125,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 2277067c9..ff7478618 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.hides_followers? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
+    !user_signed_in? || (@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 93d4bd3a4..64e1bd2cd 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.hides_following? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
+    !user_signed_in? || (@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 114ee0a82..fe932f93c 100644
--- a/app/controllers/api/v1/accounts/statuses_controller.rb
+++ b/app/controllers/api/v1/accounts/statuses_controller.rb
@@ -26,6 +26,8 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
   end
 
   def 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/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.js b/app/javascript/flavours/glitch/locales/en.js
index 90e924d4a..528875e45 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 forked from {Glitchsoc} and {Mastodon}. You can contribute or report issues 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/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index a65581136..76167ec60 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -132,19 +132,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;
     }
   }
 
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index d0274b077..61d7bd58a 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -435,7 +435,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 14febf5c3..8a12c0ebd 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -1283,7 +1283,7 @@
         "id": "upload_form.undo"
       },
       {
-        "defaultMessage": "Edit",
+        "defaultMessage": "Describe",
         "id": "upload_form.edit"
       }
     ],
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 025ae6e7d..62f0ad66b 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -440,7 +440,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 c0615d757..d9cca021a 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -435,7 +435,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 44589aa4a..262ee2f4b 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -435,7 +435,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": "Change thumbnail",
   "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 6376ca351..a13bc2da9 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -435,7 +435,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 46957c615..8bf63287c 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -440,7 +440,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/nl.json b/app/javascript/mastodon/locales/nl.json
index 73e2b9a13..a69fee754 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -435,7 +435,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": "Change thumbnail",
   "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 042482240..cb5a81e63 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -440,7 +440,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": "Change thumbnail",
   "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 f494eaaa9..dae582437 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -435,7 +435,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": "Change thumbnail",
   "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 38d714525..0d1a401a2 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -435,7 +435,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 4e48d53c8..38bb7542f 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -435,7 +435,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 c9251d73c..0389e222d 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -433,12 +433,12 @@
   "upload_button.label": "Lägg till media",
   "upload_error.limit": "Filöverföringsgränsen överskriden.",
   "upload_error.poll": "Filuppladdning tillåts inte med omröstningar.",
-  "upload_form.audio_description": "Describe for people with hearing loss",
+  "upload_form.audio_description": "Beskriv för hörselskadade",
   "upload_form.description": "Beskriv för synskadade",
-  "upload_form.edit": "Redigera",
+  "upload_form.edit": "Beskriv",
   "upload_form.thumbnail": "Change thumbnail",
   "upload_form.undo": "Ta bort",
-  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "upload_form.video_description": "Beskriv för hörselskadade eller synskadade",
   "upload_modal.analyzing_picture": "Analyserar bild…",
   "upload_modal.apply": "Verkställ",
   "upload_modal.choose_image": "Choose image",
diff --git a/app/lib/sanitize_config.rb b/app/lib/sanitize_config.rb
index ccc3f4642..80e8f6cc7 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
@@ -83,7 +84,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/config/environments/production.rb b/config/environments/production.rb
index c2e8210f8..60219dae1 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -106,11 +106,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/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/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 0a8a6fd62..78735e9c3 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.'
       sessions:
         otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:'
       tag:
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 2a1783c95..46ad06242 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