about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/admin/tags_controller.rb44
-rw-r--r--app/controllers/api/v1/accounts/credentials_controller.rb2
-rw-r--r--app/controllers/directories_controller.rb48
-rw-r--r--app/controllers/settings/profiles_controller.rb2
-rw-r--r--app/helpers/admin/filter_helper.rb3
-rw-r--r--app/javascript/styles/mastodon/accounts.scss5
-rw-r--r--app/javascript/styles/mastodon/widgets.scss165
-rw-r--r--app/models/account.rb40
-rw-r--r--app/models/account_stat.rb12
-rw-r--r--app/models/account_tag_stat.rb24
-rw-r--r--app/models/concerns/account_associations.rb3
-rw-r--r--app/models/concerns/account_counters.rb1
-rw-r--r--app/models/tag.rb26
-rw-r--r--app/policies/tag_policy.rb15
-rw-r--r--app/services/update_account_service.rb5
-rw-r--r--app/views/admin/tags/_tag.html.haml12
-rw-r--r--app/views/admin/tags/index.html.haml19
-rw-r--r--app/views/directories/index.html.haml59
-rw-r--r--app/views/layouts/public.html.haml4
-rw-r--r--app/views/settings/profiles/show.html.haml4
-rw-r--r--config/locales/en.yml19
-rw-r--r--config/locales/simple_form.en.yml2
-rw-r--r--config/navigation.rb1
-rw-r--r--config/routes.rb12
-rw-r--r--db/migrate/20181203003808_create_accounts_tags_join_table.rb8
-rw-r--r--db/migrate/20181203021853_add_discoverable_to_accounts.rb5
-rw-r--r--db/migrate/20181204193439_add_last_status_at_to_account_stats.rb5
-rw-r--r--db/migrate/20181204215309_create_account_tag_stats.rb11
-rw-r--r--db/schema.rb21
-rw-r--r--spec/fabricators/account_tag_stat_fabricator.rb3
-rw-r--r--spec/models/account_tag_stat_spec.rb5
31 files changed, 7 insertions, 578 deletions
diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb
deleted file mode 100644
index 3f2256566..000000000
--- a/app/controllers/admin/tags_controller.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-module Admin
-  class TagsController < BaseController
-    before_action :set_tags, only: :index
-    before_action :set_tag, except: :index
-    before_action :set_filter_params
-
-    def index
-      authorize :tag, :index?
-    end
-
-    def hide
-      authorize @tag, :hide?
-      @tag.account_tag_stat.update!(hidden: true)
-      redirect_to admin_tags_path(@filter_params)
-    end
-
-    def unhide
-      authorize @tag, :unhide?
-      @tag.account_tag_stat.update!(hidden: true)
-      redirect_to admin_tags_path(@filter_params)
-    end
-
-    private
-
-    def set_tags
-      @tags = Tag.discoverable
-      @tags.merge!(Tag.hidden) if filter_params[:hidden]
-    end
-
-    def set_tag
-      @tag = Tag.find(params[:id])
-    end
-
-    def set_filter_params
-      @filter_params = filter_params.to_hash.symbolize_keys
-    end
-
-    def filter_params
-      params.permit(:hidden)
-    end
-  end
-end
diff --git a/app/controllers/api/v1/accounts/credentials_controller.rb b/app/controllers/api/v1/accounts/credentials_controller.rb
index e77f57910..dcd41b35c 100644
--- a/app/controllers/api/v1/accounts/credentials_controller.rb
+++ b/app/controllers/api/v1/accounts/credentials_controller.rb
@@ -21,7 +21,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
   private
 
   def account_params
-    params.permit(:display_name, :note, :avatar, :header, :locked, :bot, :discoverable, fields_attributes: [:name, :value])
+    params.permit(:display_name, :note, :avatar, :header, :locked, :bot, fields_attributes: [:name, :value])
   end
 
   def user_settings_params
diff --git a/app/controllers/directories_controller.rb b/app/controllers/directories_controller.rb
deleted file mode 100644
index 265fd5fab..000000000
--- a/app/controllers/directories_controller.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-class DirectoriesController < ApplicationController
-  layout 'public'
-
-  before_action :set_instance_presenter
-  before_action :set_tag, only: :show
-  before_action :set_tags
-  before_action :set_accounts
-
-  def index
-    render :index
-  end
-
-  def show
-    render :index
-  end
-
-  private
-
-  def set_tag
-    @tag = Tag.discoverable.find_by!(name: params[:id].downcase)
-  end
-
-  def set_tags
-    @tags = Tag.discoverable.limit(30)
-  end
-
-  def set_accounts
-    @accounts = Account.searchable.discoverable.page(params[:page]).per(50).tap do |query|
-      query.merge!(Account.tagged_with(@tag.id)) if @tag
-
-      if popular_requested?
-        query.merge!(Account.popular)
-      else
-        query.merge!(Account.by_recent_status)
-      end
-    end
-  end
-
-  def set_instance_presenter
-    @instance_presenter = InstancePresenter.new
-  end
-
-  def popular_requested?
-    request.path.ends_with?('/popular')
-  end
-end
diff --git a/app/controllers/settings/profiles_controller.rb b/app/controllers/settings/profiles_controller.rb
index 1a0b73d16..918dbc6c6 100644
--- a/app/controllers/settings/profiles_controller.rb
+++ b/app/controllers/settings/profiles_controller.rb
@@ -25,7 +25,7 @@ class Settings::ProfilesController < Settings::BaseController
   private
 
   def account_params
-    params.require(:account).permit(:display_name, :note, :avatar, :header, :locked, :bot, :discoverable, fields_attributes: [:name, :value])
+    params.require(:account).permit(:display_name, :note, :avatar, :header, :locked, :bot, fields_attributes: [:name, :value])
   end
 
   def set_account
diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb
index 8807cc784..9a663051c 100644
--- a/app/helpers/admin/filter_helper.rb
+++ b/app/helpers/admin/filter_helper.rb
@@ -5,9 +5,8 @@ module Admin::FilterHelper
   REPORT_FILTERS       = %i(resolved account_id target_account_id).freeze
   INVITE_FILTER        = %i(available expired).freeze
   CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze
-  TAGS_FILTERS         = %i(hidden).freeze
 
-  FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS
+  FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS
 
   def filter_link_to(text, link_to_params, link_class_params = link_to_params)
     new_url = filtered_url_for(link_to_params)
diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss
index 63a5c61b8..06effbdb2 100644
--- a/app/javascript/styles/mastodon/accounts.scss
+++ b/app/javascript/styles/mastodon/accounts.scss
@@ -189,11 +189,6 @@
   &--under-tabs {
     border-radius: 0 0 4px 4px;
   }
-
-  &--flexible {
-    box-sizing: border-box;
-    min-height: 100%;
-  }
 }
 
 .account-role {
diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss
index a838ca778..f843f0b42 100644
--- a/app/javascript/styles/mastodon/widgets.scss
+++ b/app/javascript/styles/mastodon/widgets.scss
@@ -240,168 +240,3 @@
     border-radius: 0;
   }
 }
-
-.page-header {
-  background: lighten($ui-base-color, 8%);
-  box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
-  border-radius: 4px;
-  padding: 60px 15px;
-  text-align: center;
-  margin: 10px 0;
-
-  h1 {
-    color: $primary-text-color;
-    font-size: 36px;
-    line-height: 1.1;
-    font-weight: 700;
-    margin-bottom: 10px;
-  }
-
-  p {
-    font-size: 15px;
-    color: $darker-text-color;
-  }
-}
-
-.directory {
-  background: $ui-base-color;
-  border-radius: 0 0 4px 4px;
-  box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
-
-  &__tag {
-    box-sizing: border-box;
-    margin-bottom: 10px;
-
-    a {
-      display: flex;
-      align-items: center;
-      justify-content: space-between;
-      background: $ui-base-color;
-      border-radius: 4px;
-      padding: 15px;
-      text-decoration: none;
-      color: inherit;
-      box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
-
-      &:hover,
-      &:active,
-      &:focus {
-        background: lighten($ui-base-color, 8%);
-      }
-    }
-
-    &.active a {
-      background: $ui-highlight-color;
-      cursor: default;
-    }
-
-    h4 {
-      flex: 1 1 auto;
-      font-size: 18px;
-      font-weight: 700;
-      color: $primary-text-color;
-
-      .fa {
-        color: $darker-text-color;
-      }
-
-      small {
-        display: block;
-        font-weight: 400;
-        font-size: 15px;
-        margin-top: 8px;
-        color: $darker-text-color;
-      }
-    }
-
-    &.active h4 {
-      &,
-      .fa,
-      small {
-        color: $primary-text-color;
-      }
-    }
-
-    .avatar-stack {
-      flex: 0 0 auto;
-      width: (36px + 4px) * 3;
-    }
-
-    &.active .avatar-stack .account__avatar {
-      border-color: $ui-highlight-color;
-    }
-  }
-}
-
-.avatar-stack {
-  display: flex;
-  justify-content: flex-end;
-
-  .account__avatar {
-    flex: 0 0 auto;
-    width: 36px;
-    height: 36px;
-    border-radius: 50%;
-    position: relative;
-    margin-left: -10px;
-    border: 2px solid $ui-base-color;
-
-    &:nth-child(1) {
-      z-index: 1;
-    }
-
-    &:nth-child(2) {
-      z-index: 2;
-    }
-
-    &:nth-child(3) {
-      z-index: 3;
-    }
-  }
-}
-
-.accounts-table {
-  width: 100%;
-
-  .account {
-    padding: 0;
-    border: 0;
-  }
-
-  thead th {
-    text-align: center;
-    text-transform: uppercase;
-    color: $darker-text-color;
-    font-weight: 700;
-    padding: 10px;
-
-    &:first-child {
-      text-align: left;
-    }
-  }
-
-  tbody td {
-    padding: 15px 0;
-    vertical-align: middle;
-    border-bottom: 1px solid lighten($ui-base-color, 8%);
-  }
-
-  tbody tr:last-child td {
-    border-bottom: 0;
-  }
-
-  &__count {
-    width: 120px;
-    text-align: center;
-    font-size: 15px;
-    font-weight: 500;
-    color: $primary-text-color;
-
-    small {
-      display: block;
-      color: $darker-text-color;
-      font-weight: 400;
-      font-size: 14px;
-    }
-  }
-}
diff --git a/app/models/account.rb b/app/models/account.rb
index f993b0765..e6b5bd69f 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -43,13 +43,11 @@
 #  featured_collection_url :string
 #  fields                  :jsonb
 #  actor_type              :string
-#  discoverable            :boolean
 #
 
 class Account < ApplicationRecord
   USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i
   MENTION_RE  = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[a-z0-9\.\-]+[a-z0-9]+)?)/i
-  MIN_FOLLOWERS_DISCOVERY = 10
 
   include AccountAssociations
   include AccountAvatar
@@ -95,10 +93,6 @@ class Account < ApplicationRecord
   scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
   scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
   scope :searchable, -> { where(suspended: false).where(moved_to_account_id: nil) }
-  scope :discoverable, -> { where(silenced: false).where(discoverable: true).joins(:account_stat).where(AccountStat.arel_table[:followers_count].gteq(MIN_FOLLOWERS_DISCOVERY)) }
-  scope :tagged_with, ->(tag) { joins(:accounts_tags).where(accounts_tags: { tag_id: tag }) }
-  scope :popular, -> { order('account_stats.followers_count desc') }
-  scope :by_recent_status, -> { order('(case when account_stats.last_status_at is null then 1 else 0 end) asc, account_stats.last_status_at desc') }
 
   delegate :email,
            :unconfirmed_email,
@@ -184,40 +178,6 @@ class Account < ApplicationRecord
     @keypair ||= OpenSSL::PKey::RSA.new(private_key || public_key)
   end
 
-  def tags_as_strings=(tag_names)
-    tag_names.map! { |name| name.mb_chars.downcase }
-    tag_names.uniq!(&:to_s)
-
-    # Existing hashtags
-    hashtags_map = Tag.where(name: tag_names).each_with_object({}) { |tag, h| h[tag.name] = tag }
-
-    # Initialize not yet existing hashtags
-    tag_names.each do |name|
-      next if hashtags_map.key?(name)
-      hashtags_map[name.downcase] = Tag.new(name: name)
-    end
-
-    # Remove hashtags that are to be deleted
-    tags.each do |tag|
-      if hashtags_map.key?(tag.name)
-        hashtags_map.delete(tag.name)
-      else
-        transaction do
-          tags.delete(tag)
-          tag.decrement_count!(:accounts_count)
-        end
-      end
-    end
-
-    # Add hashtags that were so far missing
-    hashtags_map.each_value do |tag|
-      transaction do
-        tags << tag
-        tag.increment_count!(:accounts_count)
-      end
-    end
-  end
-
   def fields
     (self[:fields] || []).map { |f| Field.new(self, f) }
   end
diff --git a/app/models/account_stat.rb b/app/models/account_stat.rb
index 9813aa84f..d5715268e 100644
--- a/app/models/account_stat.rb
+++ b/app/models/account_stat.rb
@@ -1,4 +1,5 @@
 # frozen_string_literal: true
+
 # == Schema Information
 #
 # Table name: account_stats
@@ -10,25 +11,16 @@
 #  followers_count :bigint(8)        default(0), not null
 #  created_at      :datetime         not null
 #  updated_at      :datetime         not null
-#  last_status_at  :datetime
 #
 
 class AccountStat < ApplicationRecord
   belongs_to :account, inverse_of: :account_stat
 
   def increment_count!(key)
-    update(attributes_for_increment(key))
+    update(key => public_send(key) + 1)
   end
 
   def decrement_count!(key)
     update(key => [public_send(key) - 1, 0].max)
   end
-
-  private
-
-  def attributes_for_increment(key)
-    attrs = { key => public_send(key) + 1 }
-    attrs[:last_status_at] = Time.now.utc if key == :statuses_count
-    attrs
-  end
 end
diff --git a/app/models/account_tag_stat.rb b/app/models/account_tag_stat.rb
deleted file mode 100644
index 3c36c155a..000000000
--- a/app/models/account_tag_stat.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-# == Schema Information
-#
-# Table name: account_tag_stats
-#
-#  id             :bigint(8)        not null, primary key
-#  tag_id         :bigint(8)        not null
-#  accounts_count :bigint(8)        default(0), not null
-#  hidden         :boolean          default(FALSE), not null
-#  created_at     :datetime         not null
-#  updated_at     :datetime         not null
-#
-
-class AccountTagStat < ApplicationRecord
-  belongs_to :tag, inverse_of: :account_tag_stat
-
-  def increment_count!(key)
-    update(key => public_send(key) + 1)
-  end
-
-  def decrement_count!(key)
-    update(key => [public_send(key) - 1, 0].max)
-  end
-end
diff --git a/app/models/concerns/account_associations.rb b/app/models/concerns/account_associations.rb
index 38e2481c5..9dba8000d 100644
--- a/app/models/concerns/account_associations.rb
+++ b/app/models/concerns/account_associations.rb
@@ -50,8 +50,5 @@ module AccountAssociations
 
     # Account migrations
     belongs_to :moved_to_account, class_name: 'Account', optional: true
-
-    # Hashtags
-    has_and_belongs_to_many :tags
   end
 end
diff --git a/app/models/concerns/account_counters.rb b/app/models/concerns/account_counters.rb
index 3581df8dd..fa3ec9a3d 100644
--- a/app/models/concerns/account_counters.rb
+++ b/app/models/concerns/account_counters.rb
@@ -16,7 +16,6 @@ module AccountCounters
            :followers_count=,
            :increment_count!,
            :decrement_count!,
-           :last_status_at,
            to: :account_stat
 
   def account_stat
diff --git a/app/models/tag.rb b/app/models/tag.rb
index b28e2cc18..4f31f796e 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -11,31 +11,12 @@
 
 class Tag < ApplicationRecord
   has_and_belongs_to_many :statuses
-  has_and_belongs_to_many :accounts
-
-  has_one :account_tag_stat, dependent: :destroy
 
   HASHTAG_NAME_RE = '[[:word:]_]*[[:alpha:]_·][[:word:]_]*'
   HASHTAG_RE = /(?:^|[^\/\)\w])#(#{HASHTAG_NAME_RE})/i
 
   validates :name, presence: true, uniqueness: true, format: { with: /\A#{HASHTAG_NAME_RE}\z/i }
 
-  scope :discoverable, -> { joins(:account_tag_stat).where(AccountTagStat.arel_table[:accounts_count].gt(0)).where(account_tag_stats: { hidden: false }).order(name: :asc) }
-  scope :hidden, -> { where(account_tag_stats: { hidden: true }) }
-
-  delegate :accounts_count,
-           :accounts_count=,
-           :increment_count!,
-           :decrement_count!,
-           :hidden?,
-           to: :account_tag_stat
-
-  after_save :save_account_tag_stat
-
-  def account_tag_stat
-    super || build_account_tag_stat
-  end
-
   def to_param
     name
   end
@@ -62,11 +43,4 @@ class Tag < ApplicationRecord
       Tag.where('lower(name) like lower(?)', pattern).order(:name).limit(limit)
     end
   end
-
-  private
-
-  def save_account_tag_stat
-    return unless account_tag_stat&.changed?
-    account_tag_stat.save
-  end
 end
diff --git a/app/policies/tag_policy.rb b/app/policies/tag_policy.rb
deleted file mode 100644
index c63de01db..000000000
--- a/app/policies/tag_policy.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class TagPolicy < ApplicationPolicy
-  def index?
-    staff?
-  end
-
-  def hide?
-    staff?
-  end
-
-  def unhide?
-    staff?
-  end
-end
diff --git a/app/services/update_account_service.rb b/app/services/update_account_service.rb
index 36665177d..ec69d944a 100644
--- a/app/services/update_account_service.rb
+++ b/app/services/update_account_service.rb
@@ -10,7 +10,6 @@ class UpdateAccountService < BaseService
 
       authorize_all_follow_requests(account) if was_locked && !account.locked
       check_links(account)
-      process_hashtags(account)
     end
   end
 
@@ -25,8 +24,4 @@ class UpdateAccountService < BaseService
   def check_links(account)
     VerifyAccountLinksWorker.perform_async(account.id)
   end
-
-  def process_hashtags(account)
-    account.tags_as_strings = Extractor.extract_hashtags(account.note)
-  end
 end
diff --git a/app/views/admin/tags/_tag.html.haml b/app/views/admin/tags/_tag.html.haml
deleted file mode 100644
index 961b83f93..000000000
--- a/app/views/admin/tags/_tag.html.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-%tr
-  %td
-    = link_to explore_hashtag_path(tag) do
-      = fa_icon 'hashtag'
-      = tag.name
-  %td
-    = t('directories.people', count: tag.accounts_count)
-  %td
-    - if tag.hidden?
-      = table_link_to 'eye', t('admin.tags.unhide'), unhide_admin_tag_path(tag.id, **@filter_params), method: :post
-    - else
-      = table_link_to 'eye-slash', t('admin.tags.hide'), hide_admin_tag_path(tag.id, **@filter_params), method: :post
diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml
deleted file mode 100644
index 4ba395860..000000000
--- a/app/views/admin/tags/index.html.haml
+++ /dev/null
@@ -1,19 +0,0 @@
-- content_for :page_title do
-  = t('admin.tags.title')
-
-.filters
-  .filter-subset
-    %strong= t('admin.reports.status')
-    %ul
-      %li= filter_link_to t('admin.tags.visible'), hidden: nil
-      %li= filter_link_to t('admin.tags.hidden'), hidden: '1'
-
-.table-wrapper
-  %table.table
-    %thead
-      %tr
-        %th= t('admin.tags.name')
-        %th= t('admin.tags.accounts')
-        %th
-    %tbody
-      = render @tags
diff --git a/app/views/directories/index.html.haml b/app/views/directories/index.html.haml
deleted file mode 100644
index 7cd6b50d4..000000000
--- a/app/views/directories/index.html.haml
+++ /dev/null
@@ -1,59 +0,0 @@
-- content_for :page_title do
-  = t('directories.explore_mastodon')
-
-- content_for :header_tags do
-  %meta{ name: 'description', content: t('directories.explanation') }
-
-  = opengraph 'og:site_name', site_title
-  = opengraph 'og:title', t('directories.explore_mastodon', title: site_title)
-  = opengraph 'og:description', t('directories.explanation')
-
-.page-header
-  %h1= t('directories.explore_mastodon', title: site_title)
-  %p= t('directories.explanation')
-
-.grid
-  .column-0
-    .account__section-headline
-      = active_link_to t('directories.most_recently_active'), @tag ? explore_hashtag_path(@tag) : explore_path
-      = active_link_to t('directories.most_popular'), @tag ? explore_hashtag_popular_path(@tag) : explore_popular_path
-
-    - if @accounts.empty?
-      = nothing_here
-    - else
-      .directory
-        %table.accounts-table
-          %tbody
-            - @accounts.each do |account|
-              %tr
-                %td= account_link_to account
-                %td.accounts-table__count
-                  = number_to_human account.statuses_count, strip_insignificant_zeros: true
-                  %small= t('accounts.posts', count: account.statuses_count)
-                %td.accounts-table__count
-                  = number_to_human account.followers_count, strip_insignificant_zeros: true
-                  %small= t('accounts.followers', count: account.followers_count)
-                %td.accounts-table__count
-                  - if account.last_status_at.present?
-                    %time.time-ago{ datetime: account.last_status_at.iso8601, title: l(account.last_status_at) }= l account.last_status_at
-                  - else
-                    \-
-                  %small= t('accounts.last_active')
-
-      = paginate @accounts
-
-  .column-1
-    - if @tags.empty?
-      .nothing-here.nothing-here--flexible
-    - else
-      - @tags.each do |tag|
-        .directory__tag{ class: tag.id == @tag&.id ? 'active' : nil }
-          = link_to explore_hashtag_path(tag) do
-            %h4
-              = fa_icon 'hashtag'
-              = tag.name
-              %small= t('directories.people', count: tag.accounts_count)
-
-            .avatar-stack
-              - tag.accounts.limit(3).each do |account|
-                = image_tag current_account&.user&.setting_auto_play_gif ? account.avatar_original_url : account.avatar_static_url, width: 48, height: 48, alt: '', class: 'account__avatar'
diff --git a/app/views/layouts/public.html.haml b/app/views/layouts/public.html.haml
index ee49ed06c..fd5c67a99 100644
--- a/app/views/layouts/public.html.haml
+++ b/app/views/layouts/public.html.haml
@@ -5,10 +5,6 @@
         .nav-left
           = link_to root_url, class: 'brand' do
             = image_tag asset_pack_path('logo_full.svg'), alt: 'Mastodon'
-
-          = link_to t('directories.directory'), explore_path, class: 'nav-link'
-          = link_to t('about.about_this'), about_more_path, class: 'nav-link'
-          = link_to t('about.apps'), 'https://joinmastodon.org/apps', class: 'nav-link'
         .nav-center
         .nav-right
           - if user_signed_in?
diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml
index 212c6cb44..2ba236fb5 100644
--- a/app/views/settings/profiles/show.html.haml
+++ b/app/views/settings/profiles/show.html.haml
@@ -18,6 +18,7 @@
 
       = f.input :avatar, wrapper: :with_label, input_html: { accept: AccountAvatar::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.avatar', dimensions: '400x400', size: number_to_human_size(AccountAvatar::LIMIT))
 
+
   %hr.spacer/
 
   .fields-group
@@ -26,9 +27,6 @@
   .fields-group
     = f.input :bot, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.bot')
 
-  .fields-group
-    = f.input :discoverable, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.discoverable_html', min_followers: Account::MIN_FOLLOWERS_DISCOVERY, path: explore_path)
-
   %hr.spacer/
 
   .fields-row
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 8e0b5f75a..58cf2a101 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -48,7 +48,6 @@ en:
       other: Followers
     following: Following
     joined: Joined %{date}
-    last_active: last active
     link_verified_on: Ownership of this link was checked on %{date}
     media: Media
     moved_html: "%{name} has moved to %{new_profile_link}:"
@@ -115,7 +114,6 @@ en:
       media_attachments: Media attachments
       memorialize: Turn into memoriam
       moderation:
-        active: Active
         all: All
         silenced: Silenced
         suspended: Suspended
@@ -441,14 +439,6 @@ en:
       proceed: Proceed
       title: Suspend %{acct}
       warning_html: 'Suspending this account will <strong>irreversibly</strong> delete data from this account, which includes:'
-    tags:
-      accounts: Accounts
-      hidden: Hidden
-      hide: Hide from directory
-      name: Hashtag
-      title: Hashtags
-      unhide: Show in directory
-      visible: Visible
     title: Administration
   admin_mailer:
     new_report:
@@ -527,15 +517,6 @@ en:
     success_msg: Your account was successfully deleted
     warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases.
     warning_title: Disseminated content availability
-  directories:
-    directory: Profile directory
-    explanation: Discover users based on their interests
-    explore_mastodon: Explore %{title}
-    most_popular: Most popular
-    most_recently_active: Most recently active
-    people:
-      one: "%{count} person"
-      other: "%{count} people"
   errors:
     '403': You don't have permission to view this page.
     '404': The page you were looking for doesn't exist.
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index f259fc117..e37952923 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -8,7 +8,6 @@ en:
         bot: This account mainly performs automated actions and might not be monitored
         context: One or multiple contexts where the filter should apply
         digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence
-        discoverable_html: The <a href="%{path}" target="_blank">directory</a> lets people find accounts based on interests and activity. Requires at least %{min_followers} followers
         email: You will be sent a confirmation e-mail
         fields: You can have up to 4 items displayed as a table on your profile
         header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
@@ -49,7 +48,6 @@ en:
         context: Filter contexts
         current_password: Current password
         data: Data
-        discoverable: List this account on the directory
         display_name: Display name
         email: E-mail address
         expires_in: Expire after
diff --git a/config/navigation.rb b/config/navigation.rb
index b90e44964..6fed173ef 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -34,7 +34,6 @@ SimpleNavigation::Configuration.run do |navigation|
       admin.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_url, highlights_on: %r{/admin/reports}
       admin.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_url, highlights_on: %r{/admin/accounts}
       admin.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path
-      admin.item :tags, safe_join([fa_icon('tag fw'), t('admin.tags.title')]), admin_tags_path
       admin.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url, highlights_on: %r{/admin/instances}, if: -> { current_user.admin? }
       admin.item :domain_blocks, safe_join([fa_icon('lock fw'), t('admin.domain_blocks.title')]), admin_domain_blocks_url, highlights_on: %r{/admin/domain_blocks}, if: -> { current_user.admin? }
       admin.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? }
diff --git a/config/routes.rb b/config/routes.rb
index 6b33d8baf..446aad58b 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -80,11 +80,6 @@ Rails.application.routes.draw do
   get  '/interact/:id', to: 'remote_interaction#new', as: :remote_interaction
   post '/interact/:id', to: 'remote_interaction#create'
 
-  get '/explore', to: 'directories#index', as: :explore
-  get '/explore/popular', to: 'directories#index', as: :explore_popular
-  get '/explore/:id', to: 'directories#show', as: :explore_hashtag
-  get '/explore/:id/popular', to: 'directories#show', as: :explore_hashtag_popular
-
   namespace :settings do
     resource :profile, only: [:show, :update]
 
@@ -215,13 +210,6 @@ Rails.application.routes.draw do
     end
 
     resources :account_moderation_notes, only: [:create, :destroy]
-
-    resources :tags, only: [:index] do
-      member do
-        post :hide
-        post :unhide
-      end
-    end
   end
 
   get '/admin', to: redirect('/admin/dashboard', status: 302)
diff --git a/db/migrate/20181203003808_create_accounts_tags_join_table.rb b/db/migrate/20181203003808_create_accounts_tags_join_table.rb
deleted file mode 100644
index 3c275c2b7..000000000
--- a/db/migrate/20181203003808_create_accounts_tags_join_table.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-class CreateAccountsTagsJoinTable < ActiveRecord::Migration[5.2]
-  def change
-    create_join_table :accounts, :tags do |t|
-      t.index [:account_id, :tag_id]
-      t.index [:tag_id, :account_id], unique: true
-    end
-  end
-end
diff --git a/db/migrate/20181203021853_add_discoverable_to_accounts.rb b/db/migrate/20181203021853_add_discoverable_to_accounts.rb
deleted file mode 100644
index 5bbae2203..000000000
--- a/db/migrate/20181203021853_add_discoverable_to_accounts.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddDiscoverableToAccounts < ActiveRecord::Migration[5.2]
-  def change
-    add_column :accounts, :discoverable, :boolean
-  end
-end
diff --git a/db/migrate/20181204193439_add_last_status_at_to_account_stats.rb b/db/migrate/20181204193439_add_last_status_at_to_account_stats.rb
deleted file mode 100644
index 946662707..000000000
--- a/db/migrate/20181204193439_add_last_status_at_to_account_stats.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddLastStatusAtToAccountStats < ActiveRecord::Migration[5.2]
-  def change
-    add_column :account_stats, :last_status_at, :datetime
-  end
-end
diff --git a/db/migrate/20181204215309_create_account_tag_stats.rb b/db/migrate/20181204215309_create_account_tag_stats.rb
deleted file mode 100644
index 15ed8587e..000000000
--- a/db/migrate/20181204215309_create_account_tag_stats.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class CreateAccountTagStats < ActiveRecord::Migration[5.2]
-  def change
-    create_table :account_tag_stats do |t|
-      t.belongs_to :tag, null: false, foreign_key: { on_delete: :cascade }, index: { unique: true }
-      t.bigint :accounts_count, default: 0, null: false
-      t.boolean :hidden, default: false, null: false
-
-      t.timestamps
-    end
-  end
-end
diff --git a/db/schema.rb b/db/schema.rb
index 6e30ed120..4db687137 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2018_12_04_215309) do
+ActiveRecord::Schema.define(version: 2018_11_27_165847) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -63,19 +63,9 @@ ActiveRecord::Schema.define(version: 2018_12_04_215309) do
     t.bigint "followers_count", default: 0, null: false
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
-    t.datetime "last_status_at"
     t.index ["account_id"], name: "index_account_stats_on_account_id", unique: true
   end
 
-  create_table "account_tag_stats", force: :cascade do |t|
-    t.bigint "tag_id", null: false
-    t.bigint "accounts_count", default: 0, null: false
-    t.boolean "hidden", default: false, null: false
-    t.datetime "created_at", null: false
-    t.datetime "updated_at", null: false
-    t.index ["tag_id"], name: "index_account_tag_stats_on_tag_id", unique: true
-  end
-
   create_table "accounts", force: :cascade do |t|
     t.string "username", default: "", null: false
     t.string "domain"
@@ -116,7 +106,6 @@ ActiveRecord::Schema.define(version: 2018_12_04_215309) do
     t.string "featured_collection_url"
     t.jsonb "fields"
     t.string "actor_type"
-    t.boolean "discoverable"
     t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
     t.index "lower((username)::text), lower((domain)::text)", name: "index_accounts_on_username_and_domain_lower", unique: true
     t.index ["moved_to_account_id"], name: "index_accounts_on_moved_to_account_id"
@@ -124,13 +113,6 @@ ActiveRecord::Schema.define(version: 2018_12_04_215309) do
     t.index ["url"], name: "index_accounts_on_url"
   end
 
-  create_table "accounts_tags", id: false, force: :cascade do |t|
-    t.bigint "account_id", null: false
-    t.bigint "tag_id", null: false
-    t.index ["account_id", "tag_id"], name: "index_accounts_tags_on_account_id_and_tag_id"
-    t.index ["tag_id", "account_id"], name: "index_accounts_tags_on_tag_id_and_account_id", unique: true
-  end
-
   create_table "admin_action_logs", force: :cascade do |t|
     t.bigint "account_id"
     t.string "action", default: "", null: false
@@ -667,7 +649,6 @@ ActiveRecord::Schema.define(version: 2018_12_04_215309) do
   add_foreign_key "account_pins", "accounts", column: "target_account_id", on_delete: :cascade
   add_foreign_key "account_pins", "accounts", on_delete: :cascade
   add_foreign_key "account_stats", "accounts", on_delete: :cascade
-  add_foreign_key "account_tag_stats", "tags", on_delete: :cascade
   add_foreign_key "accounts", "accounts", column: "moved_to_account_id", on_delete: :nullify
   add_foreign_key "admin_action_logs", "accounts", on_delete: :cascade
   add_foreign_key "backups", "users", on_delete: :nullify
diff --git a/spec/fabricators/account_tag_stat_fabricator.rb b/spec/fabricators/account_tag_stat_fabricator.rb
deleted file mode 100644
index 9edb550be..000000000
--- a/spec/fabricators/account_tag_stat_fabricator.rb
+++ /dev/null
@@ -1,3 +0,0 @@
-Fabricator(:account_tag_stat) do
-  accounts_count ""
-end
diff --git a/spec/models/account_tag_stat_spec.rb b/spec/models/account_tag_stat_spec.rb
deleted file mode 100644
index f1ebc5578..000000000
--- a/spec/models/account_tag_stat_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe AccountTagStat, type: :model do
-  pending "add some examples to (or delete) #{__FILE__}"
-end