about summary refs log tree commit diff
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/application.rb6
-rw-r--r--config/environments/development.rb2
-rw-r--r--config/environments/production.rb2
-rw-r--r--config/environments/test.rb4
-rw-r--r--config/initializers/2_whitelist_mode.rb2
-rw-r--r--config/initializers/doorkeeper.rb9
-rw-r--r--config/initializers/inflections.rb2
-rw-r--r--config/initializers/locale.rb1
-rw-r--r--config/initializers/rack_attack.rb4
-rw-r--r--config/initializers/sidekiq.rb4
-rw-r--r--config/locales/en-MP.yml174
-rw-r--r--config/locales/simple_form.en-MP.yml82
-rw-r--r--config/navigation.rb11
-rw-r--r--config/routes.rb53
-rw-r--r--config/settings.yml2
-rw-r--r--config/sidekiq.yml12
16 files changed, 344 insertions, 26 deletions
diff --git a/config/application.rb b/config/application.rb
index ad6cf82d7..66f14061a 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -45,6 +45,7 @@ module Mastodon
     # All translations from config/locales/*.rb,yml are auto loaded.
     # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
     config.i18n.available_locales = [
+      :'en-MP',
       :ar,
       :ast,
       :bg,
@@ -116,10 +117,11 @@ module Mastodon
       :'zh-TW',
     ]
 
-    config.i18n.default_locale = ENV['DEFAULT_LOCALE']&.to_sym
+    config.i18n.default_locale = ENV.fetch('DEFAULT_LOCALE', 'en-MP')&.to_sym
+    config.i18n.fallbacks = [:'en-MP', :en]
 
     unless config.i18n.available_locales.include?(config.i18n.default_locale)
-      config.i18n.default_locale = :en
+      config.i18n.default_locale = :'en-MP'
     end
 
     # config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 0791b82ab..a1a9bad5b 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -7,7 +7,7 @@ Rails.application.configure do
   config.cache_classes = false
 
   # Do not eager load code on boot.
-  config.eager_load = false
+  config.eager_load = true
 
   # Show full error reports.
   config.consider_all_requests_local = true
diff --git a/config/environments/production.rb b/config/environments/production.rb
index c2e8210f8..e5900a0bb 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -60,7 +60,7 @@ Rails.application.configure do
 
   # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
   # English when a translation cannot be found).
-  config.i18n.fallbacks = [:en]
+  config.i18n.fallbacks = [:'en-MP', :en]
 
   # Send deprecation notices to registered listeners.
   config.active_support.deprecation = :notify
diff --git a/config/environments/test.rb b/config/environments/test.rb
index a35cadcfa..7bdfe15e7 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -54,8 +54,8 @@ Rails.application.configure do
   # Raises error for missing translations
   # config.action_view.raise_on_missing_translations = true
 
-  config.i18n.default_locale = :en
-  config.i18n.fallbacks = true
+  config.i18n.default_locale = :'en-MP'
+  config.i18n.fallbacks = [:'en-MP', :en]
 end
 
 Paperclip::Attachment.default_options[:path] = "#{Rails.root}/spec/test_files/:class/:id_partition/:style.:extension"
diff --git a/config/initializers/2_whitelist_mode.rb b/config/initializers/2_whitelist_mode.rb
index 1cc6a8e72..3ac6d7a09 100644
--- a/config/initializers/2_whitelist_mode.rb
+++ b/config/initializers/2_whitelist_mode.rb
@@ -1,5 +1,5 @@
 # frozen_string_literal: true
 
 Rails.application.configure do
-  config.x.whitelist_mode = (ENV['LIMITED_FEDERATION_MODE'] || ENV['WHITELIST_MODE']) == 'true'
+  config.x.whitelist_mode = true
 end
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 63cff7c59..1c790e90a 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -76,6 +76,10 @@ Doorkeeper.configure do
                   :'write:notifications',
                   :'write:reports',
                   :'write:statuses',
+                  :'write:statuses:publish',
+                  :'write:domain_permissions',
+                  :'write:domain_permissions:account',
+                  :'write:domain_permissions:statuses',
                   :read,
                   :'read:accounts',
                   :'read:blocks',
@@ -88,11 +92,16 @@ Doorkeeper.configure do
                   :'read:notifications',
                   :'read:search',
                   :'read:statuses',
+                  :'read:domain_permissions',
+                  :'read:domain_permissions:account',
+                  :'read:domain_permissions:statuses',
                   :follow,
                   :push,
                   :'admin:read',
                   :'admin:read:accounts',
                   :'admin:read:reports',
+                  :'admin:read:domain_blocks',
+                  :'admin:read:domain_allows',
                   :'admin:write',
                   :'admin:write:accounts',
                   :'admin:write:reports',
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
index ebb7541eb..4170b69ba 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -22,4 +22,6 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
   inflect.acronym 'Ed25519'
 
   inflect.singular 'data', 'data'
+
+  inflect.irregular 'publish', 'publishing'
 end
diff --git a/config/initializers/locale.rb b/config/initializers/locale.rb
index fed182a71..aa271dc56 100644
--- a/config/initializers/locale.rb
+++ b/config/initializers/locale.rb
@@ -5,3 +5,4 @@ I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'flavours', '*', 'nam
 I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'skins', '*', '*', 'names.{rb,yml}').to_s]
 I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'skins', '*', '*', 'names', '*.{rb,yml}').to_s]
 I18n.load_path += Dir[Rails.root.join('config', 'locales-glitch', '*.{rb,yml}').to_s]
+I18n.load_path += Dir[Rails.root.join('config', 'locales-monsterfork', '*.{rb,yml}').to_s]
diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index cd29afac5..f11e87b11 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -105,6 +105,10 @@ class Rack::Attack
     req.session[:attempt_user_id] || req.params.dig('user', 'email').presence if req.post? && req.path == '/auth/sign_in'
   end
 
+  throttle('throttle_matrix_auth_attempts/ip', limit: 5, period: 1.minute) do |req|
+    req.remote_ip if req.path == '/_matrix-internal/identity/v1/check_credentials'
+  end
+
   self.throttled_response = lambda do |env|
     now        = Time.now.utc
     match_data = env['rack.attack.match_data']
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index f2733562f..2ed0554de 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -15,8 +15,8 @@ Sidekiq.configure_server do |config|
   end
 
   config.death_handlers << lambda do |job, _ex|
-    digest = job['lock_digest']
-    SidekiqUniqueJobs::Digests.delete_by_digest(digest) if digest
+    SidekiqUniqueJobs::Digests.delete_by_digest(job['lock_digest']) if job['lock_digest']
+    SidekiqUniqueJobs::Digests.delete_by_digest(job['unique_digest']) if job['unique_digest']
   end
 end
 
diff --git a/config/locales/en-MP.yml b/config/locales/en-MP.yml
new file mode 100644
index 000000000..481787c00
--- /dev/null
+++ b/config/locales/en-MP.yml
@@ -0,0 +1,174 @@
+---
+en-MP:
+  about:
+    about_hashtag_html: These are public roars tagged with <strong>#%{hashtag}</strong> from around the fediverse.
+    available_content: Connected servers
+    available_content_html: 'Users and content from these servers can be interacted with from here:'
+    browse_local_posts: Browse a live stream of public roars from Monsterpit
+    browse_public_posts: Browse a live stream of public roars on the fediverse
+    federation_hint_html: Join Monsterpit and meet creatures around the fediverse.
+    hosted_on: Monsterfork hosted on %{domain}
+    instance_actor_flash: This account is a virtual actor used to represent the server itself. It is used for federation purposes and should not be blocked unless you want to block the whole server, in which case you should use a domain block.
+    unavailable_content: Admin overrides
+    unavailable_content_description:
+      silenced: "Posts from these servers will be hidden in public timelines and no notifications will be generated from their users' interactions, unless you are following them or vise-versa.  These are typically set for curation purposes rather than "
+  accounts:
+    endorsements_hint: You can endorse creatures you follow from the web interface, and they will show up here.
+    location:
+      claimed: Claimed
+      unclaimed: Unclaimed
+    people_followed_by: Creatures whom %{name} follows
+    people_who_follow: Creatures who follow %{name}
+    pin_errors:
+      following: You must be already following the creature you want to endorse
+    posts:
+      one: Roar
+      other: Roars
+    posts_tab_heading: Blog
+    posts_with_replies: Replies
+    reblogs: Boosts
+    threads: Threads
+    mentions: Mentions
+  admin:
+    accounts:
+      search_same_email_domain: Other creatures with the same e-mail domain
+      search_same_ip: Other creatures with the same IP
+    action_logs:
+      actions:
+        update_status: "%{name} updated roar by %{target}"
+      deleted_status: "(deleted roar)"
+    custom_emojis:
+      claim: Claim
+      owner: Contributor
+      ownership_warning: "NOTE: You can only make changes to custom emoji that you upload or copy unless you are a moderator."
+      unclaim: Unclaim
+      unclaimed: (unclaimed)
+    dashboard:
+      pending_users: creatures waiting for review
+      feature_hcaptcha: hCaptcha
+      recent_users: Recent creatures
+      single_user_mode: Single creature mode
+      total_users: creatures in total
+      week_users_new: creatures this week
+    domain_allows:
+      hidden: Exclude from public server list
+    relays:
+      description_html: A <strong>federation relay</strong> is an intermediary server that exchanges large volumes of public roars between servers that subscribe and publish to it. <strong>It can help small and medium servers discover content from the fediverse</strong>, which would otherwise require local users manually following other people on remote servers.
+      enable_hint: Once enabled, your server will subscribe to all public roars from this relay, and will begin sending this server's public toots to it.
+    settings:
+      activity_api_enabled:
+        desc_html: Counts of locally posted roars, active creatures, and new registrations in weekly buckets
+        title: Publish aggregate statistics about creature activity
+      bootstrap_timeline_accounts:
+        title: Default follows for new creatures
+      default_noindex:
+        desc_html: Affects all creatures who have not changed this setting themselves
+        title: Opt creatures out of search engine indexing by default
+      domain_allows:
+        title: Show allowed domains
+      domain_blocks:
+        users: To logged-in local creatures
+      enable_bootstrap_timeline_accounts:
+        title: Enable default follows for new creatures
+      profile_directory:
+        desc_html: Allow creatures to be discoverable
+      registrations:
+        errors:
+          captcha_fail: Captcha verification failed
+      show_staff_badge:
+        desc_html: Display staff badges on profiles
+  appearance:
+    toot_layout: Roar layout
+    custom_css: Custom CSS
+    custom_css_error: "There are problems with the above CSS that must be fixed before it can be applied:"
+  auth:
+    description:
+      prefix_invited_by_user: "@%{name} invites you to join Monsterpit!"
+      prefix_sign_up: Roar with Monsterpit!
+      suffix: On Monsterpit, you'll be able to commune with creatures across the fediverse!
+  authorize_follow:
+    already_following: You are already following this creature
+    already_requested: You have already sent a follow request to that creature
+    error: Unfortunately, there was an error looking up that creature's account
+    post_follow:
+      return: Show the creature's profile
+  domain_permissions:
+    success: Domain permissions saved!
+  existing_username_validator:
+    not_found: could not find a local creature with that username
+  exports:
+    archive_takeout:
+      hint_html: You can request an archive of your <strong>roars and media</strong>. The exported data will be in the ActivityPub format, readable by any compliant software. You can request an archive every 7 days.
+  notification_mailer:
+    favourite:
+      body: 'Your status was admired by %{name}:'
+      subject: "%{name} admired your roar"
+      title: New admiration
+    reblog:
+      body: 'Your roar was boosted by %{name}:'
+      subject: "%{name} boosted your roar"
+      title: New roar
+  preferences:
+    advanced_publishing: Advanced publishing options
+    filtering: Filtering options
+    publishing: Advanced publishing
+    privacy: Privacy options
+  remote_interaction:
+    favourite:
+      proceed: Proceed to admire
+      prompt: 'You want to admire this roar:'
+    reblog:
+      proceed: Proceed to boost
+      prompt: 'You want to boost this roar:'
+    reply:
+      proceed: Proceed to reply
+      prompt: 'You want to reply to this roar:'
+  scheduled_statuses:
+    over_daily_limit: You have exceeded the limit of %{limit} scheduled roars for that day
+    over_total_limit: You have exceeded the limit of %{limit} scheduled roars
+  stream_entries:
+    pinned: ''
+    reblogged: ''
+  pin_errors:
+      limit: You have already pinned the maximum number of roars
+      ownership: Someone else's roar cannot be pinned
+      private: Non-public roar cannot be pinned
+  settings:
+    monsterfork: Monsterfork
+    profiles:
+      privacy: Privacy
+      privacy_html: These options allow you to adjust how much information is visible on your public profile on Monsterpit.  <strong>Be aware that other servers you send your roars to have their own profile systems and may not honor these options.  You will need to use <em>followers-only</em> or <em>direct</em> privacy for roars you do not want displayed in other servers' public profiles.</strong>
+      advanced_privacy: Advanced privacy
+      advanced_privacy_html: These options can increase your privacy at the expense of compatability with other servers. <strong>They can potentially cause roars to not be delivered to some of your followers.  Only enable them if you're fully aware of their side effects.</strong>
+  timer:
+    '0': Never
+    1: 1 minute
+    2: 2 minutes
+    3: 3 minutes
+    5: 5 minutes
+    10: 10 minutes
+    15: 15 minutes
+    30: 30 minutes
+    60: 1 hour
+    120: 2 hours
+    180: 3 hours
+    360: 6 hours
+    720: 12 hours
+    1440: 1 day
+    2880: 2 days
+    4320: 3 days
+    7200: 5 days
+    10080: 1 week
+    20160: 2 weeks
+    30240: 3 weeks
+    60480: 6 weeks
+    120960: 12 weeks
+    181440: 18 weeks
+    241920: 24 weeks
+    362880: 36 weeks
+    524160: 52 weeks
+  user_mailer:
+    warning:
+      explanation:
+        silence: While your account is limited, only creatures who are already following you will see your roars on this server, and you may be excluded from various public listings. However, others may still manually follow you.
+        suspend: Your account has been suspended, and all of your roars and your uploaded media files have been irreversibly removed from this server, and servers where you had followers.
diff --git a/config/locales/simple_form.en-MP.yml b/config/locales/simple_form.en-MP.yml
new file mode 100644
index 000000000..65b62b9de
--- /dev/null
+++ b/config/locales/simple_form.en-MP.yml
@@ -0,0 +1,82 @@
+---
+en-MP:
+  simple_form:
+    hints:
+      account_warning_preset:
+        text: You can use roar syntax, such as URLs, hashtags and mentions
+      admin_account_action:
+        include_statuses: The creature will see which roars have caused the moderation action or warning
+        send_email_notification: The creature will receive an explanation of what happened with their account
+        text_html: Optional. You can use roar syntax. You can <a href="%{path}">add warning presets</a> to save time
+      announcement:
+        text: You can use roar syntax. Please be mindful of the space the announcement will take up on the user's screen
+      defaults:
+        irreversible: Filtered roars will disappear irreversibly, even if filter is later removed
+        phrase: Will be matched regardless of casing in text or content warning of a roar
+        private: Only allow authenticated followers to view your local profile.
+        require_auth: Require viewers to log in to access your profile, roars, and threads from Monsterpit.
+        require_dereference_html: "When enabled, Monsterpit will deliver your roars to other servers as pointers and require an authenticated request to access their (non-public) content.  This allows permissions and blocks you've set to be enforced more stringently.  <strong>This feature will make your roars inaccessible from Mastodon servers older than 3.2.0.</strong>"
+        setting_aggregate_reblogs: Do not show new boosts for roars that have been recently boosted (only affects newly-received boosts)
+        setting_default_content_type_html: When composing roars, assume they are written in raw HTML, unless specified otherwise
+        setting_default_content_type_markdown: When composing roars, assume they are using Markdown for rich text formatting, unless specified otherwise
+        setting_default_content_type_plain: When composing roars, assume they are plain text with no special formatting, unless specified otherwise (default)
+        setting_default_content_type_html_html: "<strong>&lt;strong&gt;Bold&lt;/strong&gt;</strong>, <u>&lt;u&gt;Underline&lt;/u&gt;</u>, <em>&lt;em&gt;Italic&lt;/em&gt;</em>, <code>&lt;code&gt;Console&lt;/code&gt;</code>, ..."
+        setting_default_content_type_markdown_html: "<strong>**Bold**</strong>, <u>_Underline_</u>, <em>*Italic*</em>, <code>`Console`</code>, ..."
+        setting_default_content_type_plain_html: No formatting.
+        setting_default_content_type_console_html: <code>Plain-text console formatting.</code>
+        setting_default_content_type_bbcode_html: "<strong>[b]Bold[/b]</strong>, <u>[u]Underline[/u]</u>, <em>[i]Italic[/i]</em>, <code>[code]Console[/code]</code>, ..."
+        setting_default_language: The language of your roars can be detected automatically, but it's not always accurate
+        setting_filter_from_unknown: Do not show boosts from unfollowed accounts on your home timeline.  Takes effect for newly-pushed items.
+        setting_no_boosts_home: Filters boosts from the home timeline, reguardless of the app you use.  These boosts will still be available in the Boosts list.
+        setting_manual_publish: This allows you to draft, proofread, and edit your roars before publishing them.  You can publish a roar from its <strong>action menu</strong> (the three dots).
+        setting_rss_disabled: Improves privacy by turning off your account's public RSS feed.
+        setting_show_application: The application you use to toot will be displayed in the detailed view of your roars
+        setting_skin: Reskins the selected UI flavour
+        setting_unpublish_on_delete: When enabled, deleting a published roar will unpublish it then make it local-only. Deleting an unpublished roar will permanently destroy it.
+        show_replies: Disable if you'd prefer your replies not be a part of your public profile
+        show_unlisted: Disable if you'd prefer to only show unlisted roars on your profile page to visitors who are logged-in or are your followers.
+        text: This helps us determine if registrations are made in sincerity and prevents spam. It is only visible to admins.
+      user:
+        chosen_languages: When checked, only roars in selected languages will be displayed in public timelines
+    labels:
+      admin_account_action:
+        include_statuses: Include reported roars in the e-mail
+      defaults:
+        bot: This is an automated account
+        private: Private mode
+        require_auth: Disallow anonymous access
+        require_dereference: Indirect federation mode
+        setting_crop_images: Crop images in non-expanded roars to 16x9
+        setting_default_content_type: Default format for roars
+        setting_default_language: Roar language
+        setting_default_privacy: Roar privacy
+        setting_delete_modal: Show confirmation dialog before deleting a roar
+        setting_display_media_hide_all: Hide all
+        setting_display_media_show_all: Reveal all
+        setting_expand_spoilers: Always expand roars marked with content warnings
+        setting_favourite_modal: Show confirmation dialog before admiring (applies to Glitch flavour only)
+        setting_filter_from_unknown: Filter boosts from unfollowed accounts
+        setting_manual_publish: Manually publish roars
+        setting_no_boosts_home: Disable boosts in home timeline
+        setting_publish_in: Auto-publish
+        setting_show_application: Disclose application used to send roars
+        setting_style_css_profile: Custom CSS for profile page
+        setting_style_css_webapp: Custom CSS for web interface
+        setting_style_dashed_nest: Use dashed nest level indicators
+        setting_style_underline_a: Underline hyperlinks
+        setting_style_wide_media: Wide media attachments
+        setting_boost_every: Automatically queue and space out boosts
+        setting_boost_jitter: Add a random delay up to
+        setting_boost_random: Boost in random order
+        setting_rss_disabled: Disable RSS feed
+        setting_unpublish_delete: Delete after unpublishing
+        setting_unpublish_in: Then unpublish after
+        setting_unpublish_on_delete: Unpublish on delete
+        setting_use_pending_items: Relax mode
+        show_replies: Show replies on profile
+        show_unlisted: Show unlisted roars to anonymous visitors
+        username_confirmation: Confirm your username
+      invite_request:
+        text: "Introduce yourself and let the admins know what brings you to Monsterpit."
+      notification_emails:
+        favourite: Someone admired your roar
diff --git a/config/navigation.rb b/config/navigation.rb
index 6ea267ab0..5fcbd2fe4 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -12,8 +12,11 @@ SimpleNavigation::Configuration.run do |navigation|
 
     n.item :preferences, safe_join([fa_icon('cog fw'), t('settings.preferences')]), settings_preferences_url, if: -> { current_user.functional? } do |s|
       s.item :appearance, safe_join([fa_icon('desktop fw'), t('settings.appearance')]), settings_preferences_appearance_url
+      s.item :other, safe_join([fa_icon('cog fw'), t('preferences.posting_defaults')]), settings_preferences_other_url
+      s.item :privacy, safe_join([fa_icon('lock fw'), t('preferences.privacy')]), settings_preferences_privacy_url
+      s.item :publishing, safe_join([fa_icon('pencil-square-o fw'), t('preferences.publishing')]), settings_preferences_publishing_url
       s.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_preferences_notifications_url
-      s.item :other, safe_join([fa_icon('cog fw'), t('preferences.other')]), settings_preferences_other_url
+      s.item :filters, safe_join([fa_icon('filter fw'), t('preferences.filters')]), settings_preferences_filters_url, highlights_on: %r{/settings/preferences/filters}
     end
 
     n.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_url do |flavours|
@@ -23,7 +26,7 @@ SimpleNavigation::Configuration.run do |navigation|
     end
 
     n.item :relationships, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_url, if: -> { current_user.functional? }
-    n.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{/filters}, if: -> { current_user.functional? }
+    n.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{^/filters}, if: -> { current_user.functional? }
 
     n.item :security, safe_join([fa_icon('lock fw'), t('settings.account')]), edit_user_registration_url do |s|
       s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete|/settings/migration|/settings/aliases}
@@ -36,6 +39,7 @@ SimpleNavigation::Configuration.run do |navigation|
       s.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url
     end
 
+    n.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), custom_emojis_url, highlights_on: %r{/custom_emojis}
     n.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: proc { Setting.min_invite_role == 'user' && current_user.functional? }
     n.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_url, if: -> { current_user.functional? }
 
@@ -45,7 +49,7 @@ SimpleNavigation::Configuration.run do |navigation|
       s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_url, highlights_on: %r{/admin/accounts|/admin/pending_accounts}
       s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path
       s.item :tags, safe_join([fa_icon('hashtag fw'), t('admin.tags.title')]), admin_tags_path, highlights_on: %r{/admin/tags}
-      s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url(limited: whitelist_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.admin? }
+      s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url, highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.admin? }
       s.item :email_domain_blocks, safe_join([fa_icon('envelope fw'), t('admin.email_domain_blocks.title')]), admin_email_domain_blocks_url, highlights_on: %r{/admin/email_domain_blocks}, if: -> { current_user.admin? }
     end
 
@@ -53,7 +57,6 @@ SimpleNavigation::Configuration.run do |navigation|
       s.item :dashboard, safe_join([fa_icon('tachometer fw'), t('admin.dashboard.title')]), admin_dashboard_url
       s.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url, if: -> { current_user.admin? }, highlights_on: %r{/admin/settings}
       s.item :announcements, safe_join([fa_icon('bullhorn fw'), t('admin.announcements.title')]), admin_announcements_path, highlights_on: %r{/admin/announcements}
-      s.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_url, highlights_on: %r{/admin/custom_emojis}
       s.item :relays, safe_join([fa_icon('exchange fw'), t('admin.relays.title')]), admin_relays_url, if: -> { current_user.admin? && !whitelist_mode? }, highlights_on: %r{/admin/relays}
       s.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url, link_html: { target: 'sidekiq' }, if: -> { current_user.admin? }
       s.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url, link_html: { target: 'pghero' }, if: -> { current_user.admin? }
diff --git a/config/routes.rb b/config/routes.rb
index 25c9b93ec..13b744bf8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -35,6 +35,9 @@ Rails.application.routes.draw do
   get 'intent', to: 'intents#show'
   get 'custom.css', to: 'custom_css#show', as: :custom_css
 
+  get '/custom/:id/profile.css', to: 'user_profile_css#show', as: :user_profile_css
+  get '/custom/:id/webapp.css', to: 'user_webapp_css#show', as: :user_webapp_css
+
   resource :instance_actor, path: 'actor', only: [:show] do
     resource :inbox, only: [:create], module: :activitypub
     resource :outbox, only: [:show], module: :activitypub
@@ -52,10 +55,10 @@ Rails.application.routes.draw do
 
   devise_for :users, path: 'auth', controllers: {
     omniauth_callbacks: 'auth/omniauth_callbacks',
-    sessions:           'auth/sessions',
-    registrations:      'auth/registrations',
-    passwords:          'auth/passwords',
-    confirmations:      'auth/confirmations',
+    sessions: 'auth/sessions',
+    registrations: 'auth/registrations',
+    passwords: 'auth/passwords',
+    confirmations: 'auth/confirmations',
   }
 
   get '/users/:username', to: redirect('/@%{username}'), constraints: lambda { |req| req.format.nil? || req.format.html? }
@@ -88,8 +91,11 @@ Rails.application.routes.draw do
   resource :inbox, only: [:create], module: :activitypub
 
   get '/@:username', to: 'accounts#show', as: :short_account
+  get '/@:username/threads', to: 'accounts#show', as: :short_account_threads
   get '/@:username/with_replies', to: 'accounts#show', as: :short_account_with_replies
   get '/@:username/media', to: 'accounts#show', as: :short_account_media
+  get '/@:username/reblogs', to: 'accounts#show', as: :short_account_reblogs
+  get '/@:username/mentions', to: 'accounts#show', as: :short_account_mentions
   get '/@:username/tagged/:tag', to: 'accounts#show', as: :short_account_tag
   get '/@:account_username/:id', to: 'statuses#show', as: :short_account_status
   get '/@:account_username/:id/embed', to: 'statuses#embed', as: :embed_short_account_status
@@ -113,6 +119,9 @@ Rails.application.routes.draw do
       resource :appearance, only: [:show, :update], controller: :appearance
       resource :notifications, only: [:show, :update]
       resource :other, only: [:show, :update], controller: :other
+      resource :filters, only: [:show, :update], controller: :filters
+      resource :publishing, only: [:show, :update], controller: :publishing
+      resource :privacy, only: [:show, :update], controller: :privacy
     end
 
     resource :import, only: [:show, :create]
@@ -180,6 +189,12 @@ Rails.application.routes.draw do
   resources :filters, except: [:show]
   resource :relationships, only: [:show, :update]
 
+  resources :custom_emojis, only: [:index, :new, :create] do
+    collection do
+      post :batch
+    end
+  end
+
   get '/public', to: 'public_timelines#show', as: :public_timeline
   get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy
 
@@ -279,12 +294,6 @@ Rails.application.routes.draw do
       resource :two_factor_authentication, only: [:destroy]
     end
 
-    resources :custom_emojis, only: [:index, :new, :create] do
-      collection do
-        post :batch
-      end
-    end
-
     resources :account_moderation_notes, only: [:create, :destroy]
 
     resources :tags, only: [:index, :show, :update] do
@@ -307,7 +316,7 @@ Rails.application.routes.draw do
 
     # JSON / REST API
     namespace :v1 do
-      resources :statuses, only: [:create, :show, :destroy] do
+      resources :statuses, only: [:create, :update, :show, :destroy] do
         scope module: :statuses do
           resources :reblogged_by, controller: :reblogged_by_accounts, only: :index
           resources :favourited_by, controller: :favourited_by_accounts, only: :index
@@ -320,11 +329,16 @@ Rails.application.routes.draw do
           resource :bookmark, only: :create
           post :unbookmark, to: 'bookmarks#destroy'
 
-          resource :mute, only: :create
+          resource :mute, only: [:create, :update]
           post :unmute, to: 'mutes#destroy'
 
           resource :pin, only: :create
           post :unpin, to: 'pins#destroy'
+
+          resource :hide, only: :create
+          post :unhide, to: 'mutes#destroy'
+
+          resource :publish, only: :create
         end
 
         member do
@@ -408,6 +422,8 @@ Rails.application.routes.draw do
       resource :domain_blocks, only: [:show, :create, :destroy]
       resource :directory, only: [:show]
 
+      resource :domain_permissions, only: [:show, :create, :update, :destroy]
+
       resources :follow_requests, only: [:index] do
         member do
           post :authorize
@@ -486,6 +502,9 @@ Rails.application.routes.draw do
           resource :action, only: [:create], controller: 'account_actions'
         end
 
+        resource :domain_blocks, only: [:show]
+        resource :domain_allows, only: [:show]
+
         resources :reports, only: [:index, :show] do
           member do
             post :assign_to_self
@@ -513,10 +532,18 @@ Rails.application.routes.draw do
     end
   end
 
+  namespace :matrix, path: '_matrix-internal' do
+    namespace :identity do
+      namespace :v1 do
+        resource :check_credentials, only: [:create]
+      end
+    end
+  end
+
   get '/web/(*any)', to: 'home#index', as: :web
 
   get '/about',        to: 'about#show'
-  get '/about/more',   to: 'about#more'
+  get '/about/more',   to: redirect('/about')
   get '/terms',        to: 'about#terms'
 
   match '/', via: [:post, :put, :patch, :delete], to: 'application#raise_not_found', format: false
diff --git a/config/settings.yml b/config/settings.yml
index c61454e9e..be9fe093a 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -79,6 +79,8 @@ defaults: &defaults
   show_domain_blocks_rationale: 'disabled'
   outgoing_spoilers: ''
 
+  show_domain_allows: 'disabled'
+
 development:
   <<: *defaults
 
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 5de25de23..73f87de34 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -36,3 +36,15 @@
   pghero_scheduler:
     cron: '0 0 * * *'
     class: Scheduler::PgheroScheduler
+  ambassador_scheduler:
+    every: '<%= ENV.fetch('AMBASSADOR_DELAY', '30m') %>'
+    class: Scheduler::AmbassadorScheduler
+  database_cleanup_scheduler:
+    every: '1d'
+    class: Scheduler::DatabaseCleanupScheduler
+  status_cleanup_scheduler:
+    every: '1m'
+    class: Scheduler::StatusCleanupScheduler
+  publish_status_scheduler:
+    every: '1m'
+    class: Scheduler::PublishStatusScheduler
\ No newline at end of file