Showing preview only (8,900K chars total). Download the full file or copy to clipboard to get everything.
Repository: florence-social/mastodon-fork
Branch: main
Commit: 147c3cfcbb35
Files: 2374
Total size: 7.4 MB
Directory structure:
gitextract_pog1r_hd/
├── .buildpacks
├── .circleci/
│ └── config.yml
├── .codeclimate.yml
├── .dependabot/
│ └── config.yml
├── .dockerignore
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .foreman
├── .gitattributes
├── .gitignore
├── .haml-lint.yml
├── .nanoignore
├── .nvmrc
├── .profile
├── .rspec
├── .rubocop.yml
├── .ruby-version
├── .sass-lint.yml
├── .slugignore
├── .yarnclean
├── AUTHORS.md
├── Aptfile
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Capfile
├── Dockerfile
├── Gemfile
├── LICENSE
├── Procfile
├── Procfile.dev
├── README.md
├── Rakefile
├── Vagrantfile
├── app/
│ ├── chewy/
│ │ └── statuses_index.rb
│ ├── controllers/
│ │ ├── about_controller.rb
│ │ ├── account_follow_controller.rb
│ │ ├── account_unfollow_controller.rb
│ │ ├── accounts_controller.rb
│ │ ├── activitypub/
│ │ │ ├── collections_controller.rb
│ │ │ ├── inboxes_controller.rb
│ │ │ └── outboxes_controller.rb
│ │ ├── admin/
│ │ │ ├── account_actions_controller.rb
│ │ │ ├── account_moderation_notes_controller.rb
│ │ │ ├── accounts_controller.rb
│ │ │ ├── action_logs_controller.rb
│ │ │ ├── base_controller.rb
│ │ │ ├── change_emails_controller.rb
│ │ │ ├── confirmations_controller.rb
│ │ │ ├── custom_emojis_controller.rb
│ │ │ ├── dashboard_controller.rb
│ │ │ ├── domain_blocks_controller.rb
│ │ │ ├── email_domain_blocks_controller.rb
│ │ │ ├── followers_controller.rb
│ │ │ ├── instances_controller.rb
│ │ │ ├── invites_controller.rb
│ │ │ ├── pending_accounts_controller.rb
│ │ │ ├── relays_controller.rb
│ │ │ ├── report_notes_controller.rb
│ │ │ ├── reported_statuses_controller.rb
│ │ │ ├── reports_controller.rb
│ │ │ ├── resets_controller.rb
│ │ │ ├── roles_controller.rb
│ │ │ ├── settings_controller.rb
│ │ │ ├── statuses_controller.rb
│ │ │ ├── subscriptions_controller.rb
│ │ │ ├── tags_controller.rb
│ │ │ ├── two_factor_authentications_controller.rb
│ │ │ └── warning_presets_controller.rb
│ │ ├── api/
│ │ │ ├── base_controller.rb
│ │ │ ├── oembed_controller.rb
│ │ │ ├── proofs_controller.rb
│ │ │ ├── push_controller.rb
│ │ │ ├── salmon_controller.rb
│ │ │ ├── subscriptions_controller.rb
│ │ │ ├── v1/
│ │ │ │ ├── accounts/
│ │ │ │ │ ├── credentials_controller.rb
│ │ │ │ │ ├── follower_accounts_controller.rb
│ │ │ │ │ ├── following_accounts_controller.rb
│ │ │ │ │ ├── identity_proofs_controller.rb
│ │ │ │ │ ├── lists_controller.rb
│ │ │ │ │ ├── pins_controller.rb
│ │ │ │ │ ├── relationships_controller.rb
│ │ │ │ │ ├── search_controller.rb
│ │ │ │ │ └── statuses_controller.rb
│ │ │ │ ├── accounts_controller.rb
│ │ │ │ ├── apps/
│ │ │ │ │ └── credentials_controller.rb
│ │ │ │ ├── apps_controller.rb
│ │ │ │ ├── blocks_controller.rb
│ │ │ │ ├── conversations_controller.rb
│ │ │ │ ├── custom_emojis_controller.rb
│ │ │ │ ├── domain_blocks_controller.rb
│ │ │ │ ├── endorsements_controller.rb
│ │ │ │ ├── favourites_controller.rb
│ │ │ │ ├── filters_controller.rb
│ │ │ │ ├── follow_requests_controller.rb
│ │ │ │ ├── follows_controller.rb
│ │ │ │ ├── instances/
│ │ │ │ │ ├── activity_controller.rb
│ │ │ │ │ └── peers_controller.rb
│ │ │ │ ├── instances_controller.rb
│ │ │ │ ├── lists/
│ │ │ │ │ └── accounts_controller.rb
│ │ │ │ ├── lists_controller.rb
│ │ │ │ ├── media_controller.rb
│ │ │ │ ├── mutes_controller.rb
│ │ │ │ ├── notifications_controller.rb
│ │ │ │ ├── polls/
│ │ │ │ │ └── votes_controller.rb
│ │ │ │ ├── polls_controller.rb
│ │ │ │ ├── preferences_controller.rb
│ │ │ │ ├── push/
│ │ │ │ │ └── subscriptions_controller.rb
│ │ │ │ ├── reports_controller.rb
│ │ │ │ ├── scheduled_statuses_controller.rb
│ │ │ │ ├── search_controller.rb
│ │ │ │ ├── statuses/
│ │ │ │ │ ├── favourited_by_accounts_controller.rb
│ │ │ │ │ ├── favourites_controller.rb
│ │ │ │ │ ├── mutes_controller.rb
│ │ │ │ │ ├── pins_controller.rb
│ │ │ │ │ ├── reblogged_by_accounts_controller.rb
│ │ │ │ │ └── reblogs_controller.rb
│ │ │ │ ├── statuses_controller.rb
│ │ │ │ ├── streaming_controller.rb
│ │ │ │ ├── suggestions_controller.rb
│ │ │ │ └── timelines/
│ │ │ │ ├── direct_controller.rb
│ │ │ │ ├── home_controller.rb
│ │ │ │ ├── list_controller.rb
│ │ │ │ ├── public_controller.rb
│ │ │ │ └── tag_controller.rb
│ │ │ ├── v2/
│ │ │ │ └── search_controller.rb
│ │ │ └── web/
│ │ │ ├── base_controller.rb
│ │ │ ├── embeds_controller.rb
│ │ │ ├── push_subscriptions_controller.rb
│ │ │ └── settings_controller.rb
│ │ ├── application_controller.rb
│ │ ├── auth/
│ │ │ ├── confirmations_controller.rb
│ │ │ ├── omniauth_callbacks_controller.rb
│ │ │ ├── passwords_controller.rb
│ │ │ ├── registrations_controller.rb
│ │ │ └── sessions_controller.rb
│ │ ├── authorize_interactions_controller.rb
│ │ ├── concerns/
│ │ │ ├── account_controller_concern.rb
│ │ │ ├── accountable_concern.rb
│ │ │ ├── authorization.rb
│ │ │ ├── export_controller_concern.rb
│ │ │ ├── localized.rb
│ │ │ ├── obfuscate_filename.rb
│ │ │ ├── rate_limit_headers.rb
│ │ │ ├── session_tracking_concern.rb
│ │ │ ├── signature_authentication.rb
│ │ │ ├── signature_verification.rb
│ │ │ └── user_tracking_concern.rb
│ │ ├── custom_css_controller.rb
│ │ ├── directories_controller.rb
│ │ ├── emojis_controller.rb
│ │ ├── filters_controller.rb
│ │ ├── follower_accounts_controller.rb
│ │ ├── following_accounts_controller.rb
│ │ ├── home_controller.rb
│ │ ├── intents_controller.rb
│ │ ├── invites_controller.rb
│ │ ├── manifests_controller.rb
│ │ ├── media_controller.rb
│ │ ├── media_proxy_controller.rb
│ │ ├── oauth/
│ │ │ ├── authorizations_controller.rb
│ │ │ ├── authorized_applications_controller.rb
│ │ │ └── tokens_controller.rb
│ │ ├── public_timelines_controller.rb
│ │ ├── relationships_controller.rb
│ │ ├── remote_follow_controller.rb
│ │ ├── remote_interaction_controller.rb
│ │ ├── remote_unfollows_controller.rb
│ │ ├── settings/
│ │ │ ├── applications_controller.rb
│ │ │ ├── base_controller.rb
│ │ │ ├── deletes_controller.rb
│ │ │ ├── exports/
│ │ │ │ ├── blocked_accounts_controller.rb
│ │ │ │ ├── blocked_domains_controller.rb
│ │ │ │ ├── following_accounts_controller.rb
│ │ │ │ ├── lists_controller.rb
│ │ │ │ └── muted_accounts_controller.rb
│ │ │ ├── exports_controller.rb
│ │ │ ├── featured_tags_controller.rb
│ │ │ ├── identity_proofs_controller.rb
│ │ │ ├── imports_controller.rb
│ │ │ ├── migrations_controller.rb
│ │ │ ├── preferences/
│ │ │ │ ├── appearance_controller.rb
│ │ │ │ ├── notifications_controller.rb
│ │ │ │ └── other_controller.rb
│ │ │ ├── preferences_controller.rb
│ │ │ ├── profiles_controller.rb
│ │ │ ├── sessions_controller.rb
│ │ │ ├── two_factor_authentication/
│ │ │ │ ├── confirmations_controller.rb
│ │ │ │ └── recovery_codes_controller.rb
│ │ │ └── two_factor_authentications_controller.rb
│ │ ├── shares_controller.rb
│ │ ├── statuses_controller.rb
│ │ ├── stream_entries_controller.rb
│ │ ├── tags_controller.rb
│ │ └── well_known/
│ │ ├── host_meta_controller.rb
│ │ ├── keybase_proof_config_controller.rb
│ │ └── webfinger_controller.rb
│ ├── helpers/
│ │ ├── admin/
│ │ │ ├── account_moderation_notes_helper.rb
│ │ │ ├── action_logs_helper.rb
│ │ │ ├── dashboard_helper.rb
│ │ │ └── filter_helper.rb
│ │ ├── application_helper.rb
│ │ ├── flashes_helper.rb
│ │ ├── home_helper.rb
│ │ ├── instance_helper.rb
│ │ ├── jsonld_helper.rb
│ │ ├── routing_helper.rb
│ │ ├── settings_helper.rb
│ │ └── stream_entries_helper.rb
│ ├── javascript/
│ │ ├── mastodon/
│ │ │ ├── actions/
│ │ │ │ ├── accounts.js
│ │ │ │ ├── alerts.js
│ │ │ │ ├── blocks.js
│ │ │ │ ├── bundles.js
│ │ │ │ ├── columns.js
│ │ │ │ ├── compose.js
│ │ │ │ ├── conversations.js
│ │ │ │ ├── custom_emojis.js
│ │ │ │ ├── domain_blocks.js
│ │ │ │ ├── dropdown_menu.js
│ │ │ │ ├── emojis.js
│ │ │ │ ├── favourites.js
│ │ │ │ ├── filters.js
│ │ │ │ ├── height_cache.js
│ │ │ │ ├── identity_proofs.js
│ │ │ │ ├── importer/
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── normalizer.js
│ │ │ │ ├── interactions.js
│ │ │ │ ├── lists.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── mutes.js
│ │ │ │ ├── notifications.js
│ │ │ │ ├── onboarding.js
│ │ │ │ ├── pin_statuses.js
│ │ │ │ ├── polls.js
│ │ │ │ ├── push_notifications/
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── registerer.js
│ │ │ │ │ └── setter.js
│ │ │ │ ├── reports.js
│ │ │ │ ├── search.js
│ │ │ │ ├── settings.js
│ │ │ │ ├── statuses.js
│ │ │ │ ├── store.js
│ │ │ │ ├── streaming.js
│ │ │ │ ├── suggestions.js
│ │ │ │ └── timelines.js
│ │ │ ├── api.js
│ │ │ ├── base_polyfills.js
│ │ │ ├── common.js
│ │ │ ├── compare_id.js
│ │ │ ├── components/
│ │ │ │ ├── __tests__/
│ │ │ │ │ ├── __snapshots__/
│ │ │ │ │ │ ├── autosuggest_emoji-test.js.snap
│ │ │ │ │ │ ├── avatar-test.js.snap
│ │ │ │ │ │ ├── avatar_overlay-test.js.snap
│ │ │ │ │ │ ├── button-test.js.snap
│ │ │ │ │ │ └── display_name-test.js.snap
│ │ │ │ │ ├── autosuggest_emoji-test.js
│ │ │ │ │ ├── avatar-test.js
│ │ │ │ │ ├── avatar_overlay-test.js
│ │ │ │ │ ├── button-test.js
│ │ │ │ │ └── display_name-test.js
│ │ │ │ ├── account.js
│ │ │ │ ├── attachment_list.js
│ │ │ │ ├── autosuggest_emoji.js
│ │ │ │ ├── autosuggest_input.js
│ │ │ │ ├── autosuggest_textarea.js
│ │ │ │ ├── avatar.js
│ │ │ │ ├── avatar_composite.js
│ │ │ │ ├── avatar_overlay.js
│ │ │ │ ├── button.js
│ │ │ │ ├── column.js
│ │ │ │ ├── column_back_button.js
│ │ │ │ ├── column_back_button_slim.js
│ │ │ │ ├── column_header.js
│ │ │ │ ├── display_name.js
│ │ │ │ ├── domain.js
│ │ │ │ ├── dropdown_menu.js
│ │ │ │ ├── error_boundary.js
│ │ │ │ ├── extended_video_player.js
│ │ │ │ ├── hashtag.js
│ │ │ │ ├── icon.js
│ │ │ │ ├── icon_button.js
│ │ │ │ ├── icon_with_badge.js
│ │ │ │ ├── intersection_observer_article.js
│ │ │ │ ├── load_gap.js
│ │ │ │ ├── load_more.js
│ │ │ │ ├── loading_indicator.js
│ │ │ │ ├── media_gallery.js
│ │ │ │ ├── missing_indicator.js
│ │ │ │ ├── modal_root.js
│ │ │ │ ├── permalink.js
│ │ │ │ ├── poll.js
│ │ │ │ ├── relative_timestamp.js
│ │ │ │ ├── scrollable_list.js
│ │ │ │ ├── setting_text.js
│ │ │ │ ├── status.js
│ │ │ │ ├── status_action_bar.js
│ │ │ │ ├── status_content.js
│ │ │ │ └── status_list.js
│ │ │ ├── containers/
│ │ │ │ ├── account_container.js
│ │ │ │ ├── compose_container.js
│ │ │ │ ├── domain_container.js
│ │ │ │ ├── dropdown_menu_container.js
│ │ │ │ ├── intersection_observer_article_container.js
│ │ │ │ ├── mastodon.js
│ │ │ │ ├── media_container.js
│ │ │ │ ├── poll_container.js
│ │ │ │ ├── status_container.js
│ │ │ │ └── timeline_container.js
│ │ │ ├── extra_polyfills.js
│ │ │ ├── features/
│ │ │ │ ├── account/
│ │ │ │ │ └── components/
│ │ │ │ │ └── header.js
│ │ │ │ ├── account_gallery/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── media_item.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── account_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── header.js
│ │ │ │ │ │ └── moved_note.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── header_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── blocks/
│ │ │ │ │ └── index.js
│ │ │ │ ├── community_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── column_settings.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── column_settings_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── compose/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── action_bar.js
│ │ │ │ │ │ ├── autosuggest_account.js
│ │ │ │ │ │ ├── character_counter.js
│ │ │ │ │ │ ├── compose_form.js
│ │ │ │ │ │ ├── emoji_picker_dropdown.js
│ │ │ │ │ │ ├── navigation_bar.js
│ │ │ │ │ │ ├── poll_button.js
│ │ │ │ │ │ ├── poll_form.js
│ │ │ │ │ │ ├── privacy_dropdown.js
│ │ │ │ │ │ ├── reply_indicator.js
│ │ │ │ │ │ ├── search.js
│ │ │ │ │ │ ├── search_results.js
│ │ │ │ │ │ ├── text_icon_button.js
│ │ │ │ │ │ ├── upload.js
│ │ │ │ │ │ ├── upload_button.js
│ │ │ │ │ │ ├── upload_form.js
│ │ │ │ │ │ ├── upload_progress.js
│ │ │ │ │ │ └── warning.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ ├── autosuggest_account_container.js
│ │ │ │ │ │ ├── compose_form_container.js
│ │ │ │ │ │ ├── emoji_picker_dropdown_container.js
│ │ │ │ │ │ ├── navigation_container.js
│ │ │ │ │ │ ├── poll_button_container.js
│ │ │ │ │ │ ├── poll_form_container.js
│ │ │ │ │ │ ├── privacy_dropdown_container.js
│ │ │ │ │ │ ├── reply_indicator_container.js
│ │ │ │ │ │ ├── search_container.js
│ │ │ │ │ │ ├── search_results_container.js
│ │ │ │ │ │ ├── sensitive_button_container.js
│ │ │ │ │ │ ├── spoiler_button_container.js
│ │ │ │ │ │ ├── upload_button_container.js
│ │ │ │ │ │ ├── upload_container.js
│ │ │ │ │ │ ├── upload_form_container.js
│ │ │ │ │ │ ├── upload_progress_container.js
│ │ │ │ │ │ └── warning_container.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── util/
│ │ │ │ │ ├── counter.js
│ │ │ │ │ └── url_regex.js
│ │ │ │ ├── direct_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── conversation.js
│ │ │ │ │ │ └── conversations_list.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ ├── conversation_container.js
│ │ │ │ │ │ └── conversations_list_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── domain_blocks/
│ │ │ │ │ └── index.js
│ │ │ │ ├── emoji/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── emoji-test.js
│ │ │ │ │ │ └── emoji_index-test.js
│ │ │ │ │ ├── emoji.js
│ │ │ │ │ ├── emoji_compressed.js
│ │ │ │ │ ├── emoji_map.json
│ │ │ │ │ ├── emoji_mart_data_light.js
│ │ │ │ │ ├── emoji_mart_search_light.js
│ │ │ │ │ ├── emoji_picker.js
│ │ │ │ │ ├── emoji_unicode_mapping_light.js
│ │ │ │ │ ├── emoji_utils.js
│ │ │ │ │ ├── unicode_to_filename.js
│ │ │ │ │ └── unicode_to_unified_name.js
│ │ │ │ ├── favourited_statuses/
│ │ │ │ │ └── index.js
│ │ │ │ ├── favourites/
│ │ │ │ │ └── index.js
│ │ │ │ ├── follow_requests/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── account_authorize.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── account_authorize_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── followers/
│ │ │ │ │ └── index.js
│ │ │ │ ├── following/
│ │ │ │ │ └── index.js
│ │ │ │ ├── generic_not_found/
│ │ │ │ │ └── index.js
│ │ │ │ ├── getting_started/
│ │ │ │ │ └── index.js
│ │ │ │ ├── hashtag_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── column_settings.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── column_settings_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── home_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── column_settings.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── column_settings_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── introduction/
│ │ │ │ │ └── index.js
│ │ │ │ ├── keyboard_shortcuts/
│ │ │ │ │ └── index.js
│ │ │ │ ├── list_adder/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── account.js
│ │ │ │ │ │ └── list.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── list_editor/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── account.js
│ │ │ │ │ │ ├── edit_list_form.js
│ │ │ │ │ │ └── search.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── list_timeline/
│ │ │ │ │ └── index.js
│ │ │ │ ├── lists/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── new_list_form.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── mutes/
│ │ │ │ │ └── index.js
│ │ │ │ ├── notifications/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── clear_column_button.js
│ │ │ │ │ │ ├── column_settings.js
│ │ │ │ │ │ ├── filter_bar.js
│ │ │ │ │ │ ├── notification.js
│ │ │ │ │ │ └── setting_toggle.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ ├── column_settings_container.js
│ │ │ │ │ │ ├── filter_bar_container.js
│ │ │ │ │ │ └── notification_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── pinned_statuses/
│ │ │ │ │ └── index.js
│ │ │ │ ├── public_timeline/
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── column_settings_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── reblogs/
│ │ │ │ │ └── index.js
│ │ │ │ ├── report/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── status_check_box.js
│ │ │ │ │ └── containers/
│ │ │ │ │ └── status_check_box_container.js
│ │ │ │ ├── search/
│ │ │ │ │ └── index.js
│ │ │ │ ├── standalone/
│ │ │ │ │ ├── compose/
│ │ │ │ │ │ └── index.js
│ │ │ │ │ ├── hashtag_timeline/
│ │ │ │ │ │ └── index.js
│ │ │ │ │ └── public_timeline/
│ │ │ │ │ └── index.js
│ │ │ │ ├── status/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── action_bar.js
│ │ │ │ │ │ ├── card.js
│ │ │ │ │ │ └── detailed_status.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── detailed_status_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── ui/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ │ └── column-test.js
│ │ │ │ │ │ ├── actions_modal.js
│ │ │ │ │ │ ├── boost_modal.js
│ │ │ │ │ │ ├── bundle.js
│ │ │ │ │ │ ├── bundle_column_error.js
│ │ │ │ │ │ ├── bundle_modal_error.js
│ │ │ │ │ │ ├── column.js
│ │ │ │ │ │ ├── column_header.js
│ │ │ │ │ │ ├── column_link.js
│ │ │ │ │ │ ├── column_loading.js
│ │ │ │ │ │ ├── column_subheading.js
│ │ │ │ │ │ ├── columns_area.js
│ │ │ │ │ │ ├── compose_panel.js
│ │ │ │ │ │ ├── confirmation_modal.js
│ │ │ │ │ │ ├── drawer_loading.js
│ │ │ │ │ │ ├── embed_modal.js
│ │ │ │ │ │ ├── focal_point_modal.js
│ │ │ │ │ │ ├── follow_requests_nav_link.js
│ │ │ │ │ │ ├── image_loader.js
│ │ │ │ │ │ ├── link_footer.js
│ │ │ │ │ │ ├── list_panel.js
│ │ │ │ │ │ ├── media_modal.js
│ │ │ │ │ │ ├── modal_loading.js
│ │ │ │ │ │ ├── modal_root.js
│ │ │ │ │ │ ├── mute_modal.js
│ │ │ │ │ │ ├── navigation_panel.js
│ │ │ │ │ │ ├── notifications_counter_icon.js
│ │ │ │ │ │ ├── report_modal.js
│ │ │ │ │ │ ├── tabs_bar.js
│ │ │ │ │ │ ├── upload_area.js
│ │ │ │ │ │ ├── video_modal.js
│ │ │ │ │ │ └── zoomable_image.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ ├── bundle_container.js
│ │ │ │ │ │ ├── columns_area_container.js
│ │ │ │ │ │ ├── loading_bar_container.js
│ │ │ │ │ │ ├── modal_container.js
│ │ │ │ │ │ ├── notifications_container.js
│ │ │ │ │ │ └── status_list_container.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── util/
│ │ │ │ │ ├── async-components.js
│ │ │ │ │ ├── fullscreen.js
│ │ │ │ │ ├── get_rect_from_entry.js
│ │ │ │ │ ├── intersection_observer_wrapper.js
│ │ │ │ │ ├── optional_motion.js
│ │ │ │ │ ├── react_router_helpers.js
│ │ │ │ │ ├── reduced_motion.js
│ │ │ │ │ └── schedule_idle_task.js
│ │ │ │ └── video/
│ │ │ │ └── index.js
│ │ │ ├── initial_state.js
│ │ │ ├── is_mobile.js
│ │ │ ├── load_polyfills.js
│ │ │ ├── locales/
│ │ │ │ ├── ar.json
│ │ │ │ ├── ast.json
│ │ │ │ ├── bg.json
│ │ │ │ ├── bn.json
│ │ │ │ ├── ca.json
│ │ │ │ ├── co.json
│ │ │ │ ├── cs.json
│ │ │ │ ├── cy.json
│ │ │ │ ├── da.json
│ │ │ │ ├── de.json
│ │ │ │ ├── defaultMessages.json
│ │ │ │ ├── el.json
│ │ │ │ ├── en.json
│ │ │ │ ├── eo.json
│ │ │ │ ├── es.json
│ │ │ │ ├── eu.json
│ │ │ │ ├── fa.json
│ │ │ │ ├── fi.json
│ │ │ │ ├── fr.json
│ │ │ │ ├── gl.json
│ │ │ │ ├── he.json
│ │ │ │ ├── hi.json
│ │ │ │ ├── hr.json
│ │ │ │ ├── hu.json
│ │ │ │ ├── hy.json
│ │ │ │ ├── id.json
│ │ │ │ ├── index.js
│ │ │ │ ├── io.json
│ │ │ │ ├── it.json
│ │ │ │ ├── ja.json
│ │ │ │ ├── ka.json
│ │ │ │ ├── kk.json
│ │ │ │ ├── ko.json
│ │ │ │ ├── locale-data/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── co.js
│ │ │ │ │ └── oc.js
│ │ │ │ ├── lt.json
│ │ │ │ ├── lv.json
│ │ │ │ ├── ms.json
│ │ │ │ ├── nl.json
│ │ │ │ ├── no.json
│ │ │ │ ├── oc.json
│ │ │ │ ├── pl.json
│ │ │ │ ├── pt-BR.json
│ │ │ │ ├── pt.json
│ │ │ │ ├── ro.json
│ │ │ │ ├── ru.json
│ │ │ │ ├── sk.json
│ │ │ │ ├── sl.json
│ │ │ │ ├── sq.json
│ │ │ │ ├── sr-Latn.json
│ │ │ │ ├── sr.json
│ │ │ │ ├── sv.json
│ │ │ │ ├── ta.json
│ │ │ │ ├── te.json
│ │ │ │ ├── th.json
│ │ │ │ ├── tr.json
│ │ │ │ ├── uk.json
│ │ │ │ ├── whitelist_ar.json
│ │ │ │ ├── whitelist_ast.json
│ │ │ │ ├── whitelist_bg.json
│ │ │ │ ├── whitelist_bn.json
│ │ │ │ ├── whitelist_ca.json
│ │ │ │ ├── whitelist_co.json
│ │ │ │ ├── whitelist_cs.json
│ │ │ │ ├── whitelist_cy.json
│ │ │ │ ├── whitelist_da.json
│ │ │ │ ├── whitelist_de.json
│ │ │ │ ├── whitelist_el.json
│ │ │ │ ├── whitelist_en.json
│ │ │ │ ├── whitelist_eo.json
│ │ │ │ ├── whitelist_es.json
│ │ │ │ ├── whitelist_eu.json
│ │ │ │ ├── whitelist_fa.json
│ │ │ │ ├── whitelist_fi.json
│ │ │ │ ├── whitelist_fr.json
│ │ │ │ ├── whitelist_gl.json
│ │ │ │ ├── whitelist_he.json
│ │ │ │ ├── whitelist_hi.json
│ │ │ │ ├── whitelist_hr.json
│ │ │ │ ├── whitelist_hu.json
│ │ │ │ ├── whitelist_hy.json
│ │ │ │ ├── whitelist_id.json
│ │ │ │ ├── whitelist_io.json
│ │ │ │ ├── whitelist_it.json
│ │ │ │ ├── whitelist_ja.json
│ │ │ │ ├── whitelist_ka.json
│ │ │ │ ├── whitelist_kk.json
│ │ │ │ ├── whitelist_ko.json
│ │ │ │ ├── whitelist_lt.json
│ │ │ │ ├── whitelist_lv.json
│ │ │ │ ├── whitelist_ms.json
│ │ │ │ ├── whitelist_nl.json
│ │ │ │ ├── whitelist_no.json
│ │ │ │ ├── whitelist_oc.json
│ │ │ │ ├── whitelist_pl.json
│ │ │ │ ├── whitelist_pt-BR.json
│ │ │ │ ├── whitelist_pt.json
│ │ │ │ ├── whitelist_ro.json
│ │ │ │ ├── whitelist_ru.json
│ │ │ │ ├── whitelist_sk.json
│ │ │ │ ├── whitelist_sl.json
│ │ │ │ ├── whitelist_sq.json
│ │ │ │ ├── whitelist_sr-Latn.json
│ │ │ │ ├── whitelist_sr.json
│ │ │ │ ├── whitelist_sv.json
│ │ │ │ ├── whitelist_ta.json
│ │ │ │ ├── whitelist_te.json
│ │ │ │ ├── whitelist_th.json
│ │ │ │ ├── whitelist_tr.json
│ │ │ │ ├── whitelist_uk.json
│ │ │ │ ├── whitelist_zh-CN.json
│ │ │ │ ├── whitelist_zh-HK.json
│ │ │ │ ├── whitelist_zh-TW.json
│ │ │ │ ├── zh-CN.json
│ │ │ │ ├── zh-HK.json
│ │ │ │ └── zh-TW.json
│ │ │ ├── main.js
│ │ │ ├── middleware/
│ │ │ │ ├── errors.js
│ │ │ │ ├── loading_bar.js
│ │ │ │ └── sounds.js
│ │ │ ├── performance.js
│ │ │ ├── ready.js
│ │ │ ├── reducers/
│ │ │ │ ├── accounts.js
│ │ │ │ ├── accounts_counters.js
│ │ │ │ ├── alerts.js
│ │ │ │ ├── compose.js
│ │ │ │ ├── contexts.js
│ │ │ │ ├── conversations.js
│ │ │ │ ├── custom_emojis.js
│ │ │ │ ├── domain_lists.js
│ │ │ │ ├── dropdown_menu.js
│ │ │ │ ├── filters.js
│ │ │ │ ├── height_cache.js
│ │ │ │ ├── identity_proofs.js
│ │ │ │ ├── index.js
│ │ │ │ ├── list_adder.js
│ │ │ │ ├── list_editor.js
│ │ │ │ ├── lists.js
│ │ │ │ ├── media_attachments.js
│ │ │ │ ├── meta.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── mutes.js
│ │ │ │ ├── notifications.js
│ │ │ │ ├── polls.js
│ │ │ │ ├── push_notifications.js
│ │ │ │ ├── relationships.js
│ │ │ │ ├── reports.js
│ │ │ │ ├── search.js
│ │ │ │ ├── settings.js
│ │ │ │ ├── status_lists.js
│ │ │ │ ├── statuses.js
│ │ │ │ ├── suggestions.js
│ │ │ │ ├── timelines.js
│ │ │ │ └── user_lists.js
│ │ │ ├── rtl.js
│ │ │ ├── scroll.js
│ │ │ ├── selectors/
│ │ │ │ └── index.js
│ │ │ ├── service_worker/
│ │ │ │ ├── entry.js
│ │ │ │ ├── web_push_locales.js
│ │ │ │ └── web_push_notifications.js
│ │ │ ├── settings.js
│ │ │ ├── storage/
│ │ │ │ ├── db.js
│ │ │ │ └── modifier.js
│ │ │ ├── store/
│ │ │ │ └── configureStore.js
│ │ │ ├── stream.js
│ │ │ ├── test_setup.js
│ │ │ ├── utils/
│ │ │ │ ├── __tests__/
│ │ │ │ │ ├── base64-test.js
│ │ │ │ │ └── html-test.js
│ │ │ │ ├── base64.js
│ │ │ │ ├── html.js
│ │ │ │ ├── numbers.js
│ │ │ │ └── resize_image.js
│ │ │ └── uuid.js
│ │ ├── packs/
│ │ │ ├── about.js
│ │ │ ├── admin.js
│ │ │ ├── application.js
│ │ │ ├── error.js
│ │ │ ├── mailer.js
│ │ │ ├── public.js
│ │ │ └── share.js
│ │ └── styles/
│ │ ├── application.scss
│ │ ├── contrast/
│ │ │ ├── diff.scss
│ │ │ └── variables.scss
│ │ ├── contrast.scss
│ │ ├── fonts/
│ │ │ ├── montserrat.scss
│ │ │ ├── roboto-mono.scss
│ │ │ └── roboto.scss
│ │ ├── mailer.scss
│ │ ├── mastodon/
│ │ │ ├── _mixins.scss
│ │ │ ├── about.scss
│ │ │ ├── accessibility.scss
│ │ │ ├── accounts.scss
│ │ │ ├── admin.scss
│ │ │ ├── basics.scss
│ │ │ ├── boost.scss
│ │ │ ├── compact_header.scss
│ │ │ ├── components.scss
│ │ │ ├── containers.scss
│ │ │ ├── dashboard.scss
│ │ │ ├── emoji_picker.scss
│ │ │ ├── footer.scss
│ │ │ ├── forms.scss
│ │ │ ├── introduction.scss
│ │ │ ├── lists.scss
│ │ │ ├── modal.scss
│ │ │ ├── polls.scss
│ │ │ ├── reset.scss
│ │ │ ├── rtl.scss
│ │ │ ├── stream_entries.scss
│ │ │ ├── tables.scss
│ │ │ ├── variables.scss
│ │ │ └── widgets.scss
│ │ ├── mastodon-light/
│ │ │ ├── diff.scss
│ │ │ └── variables.scss
│ │ └── mastodon-light.scss
│ ├── lib/
│ │ ├── activity_tracker.rb
│ │ ├── activitypub/
│ │ │ ├── activity/
│ │ │ │ ├── accept.rb
│ │ │ │ ├── add.rb
│ │ │ │ ├── announce.rb
│ │ │ │ ├── block.rb
│ │ │ │ ├── create.rb
│ │ │ │ ├── delete.rb
│ │ │ │ ├── flag.rb
│ │ │ │ ├── follow.rb
│ │ │ │ ├── like.rb
│ │ │ │ ├── move.rb
│ │ │ │ ├── reject.rb
│ │ │ │ ├── remove.rb
│ │ │ │ ├── undo.rb
│ │ │ │ └── update.rb
│ │ │ ├── activity.rb
│ │ │ ├── adapter.rb
│ │ │ ├── case_transform.rb
│ │ │ ├── linked_data_signature.rb
│ │ │ ├── serializer.rb
│ │ │ └── tag_manager.rb
│ │ ├── application_extension.rb
│ │ ├── delivery_failure_tracker.rb
│ │ ├── entity_cache.rb
│ │ ├── exceptions.rb
│ │ ├── extractor.rb
│ │ ├── fast_geometry_parser.rb
│ │ ├── feed_manager.rb
│ │ ├── formatter.rb
│ │ ├── hash_object.rb
│ │ ├── inline_renderer.rb
│ │ ├── language_detector.rb
│ │ ├── ostatus/
│ │ │ ├── activity/
│ │ │ │ ├── base.rb
│ │ │ │ ├── creation.rb
│ │ │ │ ├── deletion.rb
│ │ │ │ ├── general.rb
│ │ │ │ ├── post.rb
│ │ │ │ ├── remote.rb
│ │ │ │ └── share.rb
│ │ │ ├── atom_serializer.rb
│ │ │ └── tag_manager.rb
│ │ ├── potential_friendship_tracker.rb
│ │ ├── proof_provider/
│ │ │ ├── keybase/
│ │ │ │ ├── badge.rb
│ │ │ │ ├── config_serializer.rb
│ │ │ │ ├── serializer.rb
│ │ │ │ ├── verifier.rb
│ │ │ │ └── worker.rb
│ │ │ └── keybase.rb
│ │ ├── proof_provider.rb
│ │ ├── request.rb
│ │ ├── rss_builder.rb
│ │ ├── sanitize_config.rb
│ │ ├── settings/
│ │ │ ├── extend.rb
│ │ │ └── scoped_settings.rb
│ │ ├── sidekiq_error_handler.rb
│ │ ├── status_filter.rb
│ │ ├── status_finder.rb
│ │ ├── tag_manager.rb
│ │ ├── themes.rb
│ │ ├── user_settings_decorator.rb
│ │ └── webfinger_resource.rb
│ ├── mailers/
│ │ ├── admin_mailer.rb
│ │ ├── application_mailer.rb
│ │ ├── notification_mailer.rb
│ │ └── user_mailer.rb
│ ├── models/
│ │ ├── account.rb
│ │ ├── account_conversation.rb
│ │ ├── account_domain_block.rb
│ │ ├── account_filter.rb
│ │ ├── account_identity_proof.rb
│ │ ├── account_moderation_note.rb
│ │ ├── account_pin.rb
│ │ ├── account_stat.rb
│ │ ├── account_tag_stat.rb
│ │ ├── account_warning.rb
│ │ ├── account_warning_preset.rb
│ │ ├── admin/
│ │ │ ├── account_action.rb
│ │ │ └── action_log.rb
│ │ ├── admin.rb
│ │ ├── application_record.rb
│ │ ├── backup.rb
│ │ ├── block.rb
│ │ ├── concerns/
│ │ │ ├── account_associations.rb
│ │ │ ├── account_avatar.rb
│ │ │ ├── account_counters.rb
│ │ │ ├── account_finder_concern.rb
│ │ │ ├── account_header.rb
│ │ │ ├── account_interactions.rb
│ │ │ ├── attachmentable.rb
│ │ │ ├── cacheable.rb
│ │ │ ├── domain_normalizable.rb
│ │ │ ├── expireable.rb
│ │ │ ├── ldap_authenticable.rb
│ │ │ ├── omniauthable.rb
│ │ │ ├── paginable.rb
│ │ │ ├── pam_authenticable.rb
│ │ │ ├── redisable.rb
│ │ │ ├── relationship_cacheable.rb
│ │ │ ├── remotable.rb
│ │ │ ├── status_threading_concern.rb
│ │ │ ├── streamable.rb
│ │ │ └── user_roles.rb
│ │ ├── context.rb
│ │ ├── conversation.rb
│ │ ├── conversation_mute.rb
│ │ ├── custom_emoji.rb
│ │ ├── custom_emoji_filter.rb
│ │ ├── custom_filter.rb
│ │ ├── domain_block.rb
│ │ ├── email_domain_block.rb
│ │ ├── export.rb
│ │ ├── favourite.rb
│ │ ├── featured_tag.rb
│ │ ├── feed.rb
│ │ ├── follow.rb
│ │ ├── follow_request.rb
│ │ ├── form/
│ │ │ ├── account_batch.rb
│ │ │ ├── admin_settings.rb
│ │ │ ├── delete_confirmation.rb
│ │ │ ├── migration.rb
│ │ │ ├── status_batch.rb
│ │ │ └── two_factor_confirmation.rb
│ │ ├── home_feed.rb
│ │ ├── identity.rb
│ │ ├── import.rb
│ │ ├── instance.rb
│ │ ├── instance_filter.rb
│ │ ├── invite.rb
│ │ ├── invite_filter.rb
│ │ ├── list.rb
│ │ ├── list_account.rb
│ │ ├── list_feed.rb
│ │ ├── media_attachment.rb
│ │ ├── mention.rb
│ │ ├── mute.rb
│ │ ├── notification.rb
│ │ ├── poll.rb
│ │ ├── poll_vote.rb
│ │ ├── preview_card.rb
│ │ ├── relay.rb
│ │ ├── remote_follow.rb
│ │ ├── remote_profile.rb
│ │ ├── report.rb
│ │ ├── report_filter.rb
│ │ ├── report_note.rb
│ │ ├── scheduled_status.rb
│ │ ├── search.rb
│ │ ├── session_activation.rb
│ │ ├── setting.rb
│ │ ├── site_upload.rb
│ │ ├── status.rb
│ │ ├── status_pin.rb
│ │ ├── status_stat.rb
│ │ ├── stream_entry.rb
│ │ ├── subscription.rb
│ │ ├── tag.rb
│ │ ├── tombstone.rb
│ │ ├── trending_tags.rb
│ │ ├── user.rb
│ │ ├── user_invite_request.rb
│ │ ├── web/
│ │ │ ├── push_subscription.rb
│ │ │ └── setting.rb
│ │ └── web.rb
│ ├── policies/
│ │ ├── account_moderation_note_policy.rb
│ │ ├── account_policy.rb
│ │ ├── account_warning_preset_policy.rb
│ │ ├── application_policy.rb
│ │ ├── backup_policy.rb
│ │ ├── custom_emoji_policy.rb
│ │ ├── domain_block_policy.rb
│ │ ├── email_domain_block_policy.rb
│ │ ├── instance_policy.rb
│ │ ├── invite_policy.rb
│ │ ├── poll_policy.rb
│ │ ├── relay_policy.rb
│ │ ├── report_note_policy.rb
│ │ ├── report_policy.rb
│ │ ├── settings_policy.rb
│ │ ├── status_policy.rb
│ │ ├── subscription_policy.rb
│ │ ├── tag_policy.rb
│ │ └── user_policy.rb
│ ├── presenters/
│ │ ├── account_relationships_presenter.rb
│ │ ├── activitypub/
│ │ │ └── collection_presenter.rb
│ │ ├── initial_state_presenter.rb
│ │ ├── instance_presenter.rb
│ │ └── status_relationships_presenter.rb
│ ├── serializers/
│ │ ├── activitypub/
│ │ │ ├── accept_follow_serializer.rb
│ │ │ ├── activity_serializer.rb
│ │ │ ├── actor_serializer.rb
│ │ │ ├── add_serializer.rb
│ │ │ ├── block_serializer.rb
│ │ │ ├── collection_serializer.rb
│ │ │ ├── delete_actor_serializer.rb
│ │ │ ├── delete_serializer.rb
│ │ │ ├── emoji_serializer.rb
│ │ │ ├── flag_serializer.rb
│ │ │ ├── follow_serializer.rb
│ │ │ ├── image_serializer.rb
│ │ │ ├── like_serializer.rb
│ │ │ ├── note_serializer.rb
│ │ │ ├── outbox_serializer.rb
│ │ │ ├── public_key_serializer.rb
│ │ │ ├── reject_follow_serializer.rb
│ │ │ ├── remove_serializer.rb
│ │ │ ├── undo_announce_serializer.rb
│ │ │ ├── undo_block_serializer.rb
│ │ │ ├── undo_follow_serializer.rb
│ │ │ ├── undo_like_serializer.rb
│ │ │ ├── update_poll_serializer.rb
│ │ │ ├── update_serializer.rb
│ │ │ └── vote_serializer.rb
│ │ ├── initial_state_serializer.rb
│ │ ├── manifest_serializer.rb
│ │ ├── oembed_serializer.rb
│ │ ├── rest/
│ │ │ ├── account_serializer.rb
│ │ │ ├── application_serializer.rb
│ │ │ ├── context_serializer.rb
│ │ │ ├── conversation_serializer.rb
│ │ │ ├── credential_account_serializer.rb
│ │ │ ├── custom_emoji_serializer.rb
│ │ │ ├── filter_serializer.rb
│ │ │ ├── identity_proof_serializer.rb
│ │ │ ├── instance_serializer.rb
│ │ │ ├── list_serializer.rb
│ │ │ ├── media_attachment_serializer.rb
│ │ │ ├── notification_serializer.rb
│ │ │ ├── poll_serializer.rb
│ │ │ ├── preferences_serializer.rb
│ │ │ ├── preview_card_serializer.rb
│ │ │ ├── relationship_serializer.rb
│ │ │ ├── report_serializer.rb
│ │ │ ├── scheduled_status_serializer.rb
│ │ │ ├── search_serializer.rb
│ │ │ ├── status_serializer.rb
│ │ │ ├── tag_serializer.rb
│ │ │ ├── v2/
│ │ │ │ └── search_serializer.rb
│ │ │ └── web_push_subscription_serializer.rb
│ │ ├── rss/
│ │ │ ├── account_serializer.rb
│ │ │ └── tag_serializer.rb
│ │ ├── web/
│ │ │ └── notification_serializer.rb
│ │ └── webfinger_serializer.rb
│ ├── services/
│ │ ├── account_search_service.rb
│ │ ├── activitypub/
│ │ │ ├── fetch_featured_collection_service.rb
│ │ │ ├── fetch_remote_account_service.rb
│ │ │ ├── fetch_remote_key_service.rb
│ │ │ ├── fetch_remote_poll_service.rb
│ │ │ ├── fetch_remote_status_service.rb
│ │ │ ├── fetch_replies_service.rb
│ │ │ ├── process_account_service.rb
│ │ │ ├── process_collection_service.rb
│ │ │ └── process_poll_service.rb
│ │ ├── after_block_domain_from_account_service.rb
│ │ ├── after_block_service.rb
│ │ ├── app_sign_up_service.rb
│ │ ├── authorize_follow_service.rb
│ │ ├── backup_service.rb
│ │ ├── base_service.rb
│ │ ├── batched_remove_status_service.rb
│ │ ├── block_domain_service.rb
│ │ ├── block_service.rb
│ │ ├── bootstrap_timeline_service.rb
│ │ ├── concerns/
│ │ │ ├── author_extractor.rb
│ │ │ ├── payloadable.rb
│ │ │ └── stream_entry_renderer.rb
│ │ ├── fan_out_on_write_service.rb
│ │ ├── favourite_service.rb
│ │ ├── fetch_atom_service.rb
│ │ ├── fetch_link_card_service.rb
│ │ ├── fetch_oembed_service.rb
│ │ ├── fetch_remote_account_service.rb
│ │ ├── fetch_remote_status_service.rb
│ │ ├── follow_service.rb
│ │ ├── hashtag_query_service.rb
│ │ ├── import_service.rb
│ │ ├── mute_service.rb
│ │ ├── notify_service.rb
│ │ ├── post_status_service.rb
│ │ ├── precompute_feed_service.rb
│ │ ├── process_feed_service.rb
│ │ ├── process_hashtags_service.rb
│ │ ├── process_interaction_service.rb
│ │ ├── process_mentions_service.rb
│ │ ├── pubsubhubbub/
│ │ │ ├── subscribe_service.rb
│ │ │ └── unsubscribe_service.rb
│ │ ├── reblog_service.rb
│ │ ├── reject_follow_service.rb
│ │ ├── remove_status_service.rb
│ │ ├── report_service.rb
│ │ ├── resolve_account_service.rb
│ │ ├── resolve_url_service.rb
│ │ ├── search_service.rb
│ │ ├── send_interaction_service.rb
│ │ ├── subscribe_service.rb
│ │ ├── suspend_account_service.rb
│ │ ├── unblock_domain_service.rb
│ │ ├── unblock_service.rb
│ │ ├── unfavourite_service.rb
│ │ ├── unfollow_service.rb
│ │ ├── unmute_service.rb
│ │ ├── unsubscribe_service.rb
│ │ ├── update_account_service.rb
│ │ ├── update_remote_profile_service.rb
│ │ ├── verify_link_service.rb
│ │ ├── verify_salmon_service.rb
│ │ └── vote_service.rb
│ ├── validators/
│ │ ├── blacklisted_email_validator.rb
│ │ ├── disallowed_hashtags_validator.rb
│ │ ├── email_mx_validator.rb
│ │ ├── existing_username_validator.rb
│ │ ├── follow_limit_validator.rb
│ │ ├── html_validator.rb
│ │ ├── note_length_validator.rb
│ │ ├── poll_validator.rb
│ │ ├── status_length_validator.rb
│ │ ├── status_pin_validator.rb
│ │ ├── unique_username_validator.rb
│ │ ├── unreserved_username_validator.rb
│ │ ├── url_validator.rb
│ │ └── vote_validator.rb
│ ├── views/
│ │ ├── about/
│ │ │ ├── _login.html.haml
│ │ │ ├── _registration.html.haml
│ │ │ ├── more.html.haml
│ │ │ ├── show.html.haml
│ │ │ └── terms.html.haml
│ │ ├── accounts/
│ │ │ ├── _bio.html.haml
│ │ │ ├── _header.html.haml
│ │ │ ├── _moved.html.haml
│ │ │ ├── _og.html.haml
│ │ │ └── show.html.haml
│ │ ├── admin/
│ │ │ ├── account_actions/
│ │ │ │ └── new.html.haml
│ │ │ ├── account_moderation_notes/
│ │ │ │ └── _account_moderation_note.html.haml
│ │ │ ├── account_warnings/
│ │ │ │ └── _account_warning.html.haml
│ │ │ ├── accounts/
│ │ │ │ ├── _account.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── action_logs/
│ │ │ │ ├── _action_log.html.haml
│ │ │ │ └── index.html.haml
│ │ │ ├── change_emails/
│ │ │ │ └── show.html.haml
│ │ │ ├── custom_emojis/
│ │ │ │ ├── _custom_emoji.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── dashboard/
│ │ │ │ └── index.html.haml
│ │ │ ├── domain_blocks/
│ │ │ │ ├── new.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── email_domain_blocks/
│ │ │ │ ├── _email_domain_block.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── followers/
│ │ │ │ └── index.html.haml
│ │ │ ├── instances/
│ │ │ │ ├── index.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── invites/
│ │ │ │ ├── _invite.html.haml
│ │ │ │ └── index.html.haml
│ │ │ ├── pending_accounts/
│ │ │ │ ├── _account.html.haml
│ │ │ │ └── index.html.haml
│ │ │ ├── relays/
│ │ │ │ ├── _relay.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── report_notes/
│ │ │ │ └── _report_note.html.haml
│ │ │ ├── reports/
│ │ │ │ ├── _action_log.html.haml
│ │ │ │ ├── _status.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── settings/
│ │ │ │ └── edit.html.haml
│ │ │ ├── statuses/
│ │ │ │ ├── index.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── subscriptions/
│ │ │ │ ├── _subscription.html.haml
│ │ │ │ └── index.html.haml
│ │ │ ├── tags/
│ │ │ │ ├── _tag.html.haml
│ │ │ │ └── index.html.haml
│ │ │ └── warning_presets/
│ │ │ ├── edit.html.haml
│ │ │ └── index.html.haml
│ │ ├── admin_mailer/
│ │ │ ├── new_pending_account.text.erb
│ │ │ └── new_report.text.erb
│ │ ├── application/
│ │ │ ├── _card.html.haml
│ │ │ ├── _flashes.html.haml
│ │ │ └── _sidebar.html.haml
│ │ ├── auth/
│ │ │ ├── confirmations/
│ │ │ │ ├── finish_signup.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── passwords/
│ │ │ │ ├── edit.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── registrations/
│ │ │ │ ├── _sessions.html.haml
│ │ │ │ ├── edit.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── sessions/
│ │ │ │ ├── new.html.haml
│ │ │ │ └── two_factor.html.haml
│ │ │ └── shared/
│ │ │ └── _links.html.haml
│ │ ├── authorize_interactions/
│ │ │ ├── _post_follow_actions.html.haml
│ │ │ ├── error.html.haml
│ │ │ ├── show.html.haml
│ │ │ └── success.html.haml
│ │ ├── directories/
│ │ │ └── index.html.haml
│ │ ├── errors/
│ │ │ ├── 403.html.haml
│ │ │ ├── 404.html.haml
│ │ │ ├── 410.html.haml
│ │ │ ├── 422.html.haml
│ │ │ └── 500.html.haml
│ │ ├── filters/
│ │ │ ├── _fields.html.haml
│ │ │ ├── edit.html.haml
│ │ │ ├── index.html.haml
│ │ │ └── new.html.haml
│ │ ├── follower_accounts/
│ │ │ └── index.html.haml
│ │ ├── following_accounts/
│ │ │ └── index.html.haml
│ │ ├── home/
│ │ │ └── index.html.haml
│ │ ├── invites/
│ │ │ ├── _form.html.haml
│ │ │ ├── _invite.html.haml
│ │ │ └── index.html.haml
│ │ ├── kaminari/
│ │ │ ├── _next_page.html.haml
│ │ │ ├── _paginator.html.haml
│ │ │ └── _prev_page.html.haml
│ │ ├── layouts/
│ │ │ ├── admin.html.haml
│ │ │ ├── application.html.haml
│ │ │ ├── auth.html.haml
│ │ │ ├── embedded.html.haml
│ │ │ ├── error.html.haml
│ │ │ ├── mailer.html.haml
│ │ │ ├── mailer.text.erb
│ │ │ ├── modal.html.haml
│ │ │ ├── plain_mailer.html.haml
│ │ │ └── public.html.haml
│ │ ├── media/
│ │ │ └── player.html.haml
│ │ ├── notification_mailer/
│ │ │ ├── _status.html.haml
│ │ │ ├── _status.text.erb
│ │ │ ├── digest.html.haml
│ │ │ ├── digest.text.erb
│ │ │ ├── favourite.html.haml
│ │ │ ├── favourite.text.erb
│ │ │ ├── follow.html.haml
│ │ │ ├── follow.text.erb
│ │ │ ├── follow_request.html.haml
│ │ │ ├── follow_request.text.erb
│ │ │ ├── mention.html.haml
│ │ │ ├── mention.text.erb
│ │ │ ├── reblog.html.haml
│ │ │ └── reblog.text.erb
│ │ ├── oauth/
│ │ │ ├── authorizations/
│ │ │ │ ├── error.html.haml
│ │ │ │ ├── new.html.haml
│ │ │ │ └── show.html.haml
│ │ │ └── authorized_applications/
│ │ │ └── index.html.haml
│ │ ├── public_timelines/
│ │ │ └── show.html.haml
│ │ ├── relationships/
│ │ │ ├── _account.html.haml
│ │ │ └── show.html.haml
│ │ ├── remote_follow/
│ │ │ └── new.html.haml
│ │ ├── remote_interaction/
│ │ │ └── new.html.haml
│ │ ├── remote_unfollows/
│ │ │ ├── _card.html.haml
│ │ │ ├── _post_follow_actions.html.haml
│ │ │ ├── error.html.haml
│ │ │ └── success.html.haml
│ │ ├── settings/
│ │ │ ├── applications/
│ │ │ │ ├── _fields.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ ├── new.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── deletes/
│ │ │ │ └── show.html.haml
│ │ │ ├── exports/
│ │ │ │ └── show.html.haml
│ │ │ ├── featured_tags/
│ │ │ │ └── index.html.haml
│ │ │ ├── identity_proofs/
│ │ │ │ ├── _proof.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── imports/
│ │ │ │ └── show.html.haml
│ │ │ ├── migrations/
│ │ │ │ └── show.html.haml
│ │ │ ├── preferences/
│ │ │ │ ├── appearance/
│ │ │ │ │ └── show.html.haml
│ │ │ │ ├── notifications/
│ │ │ │ │ └── show.html.haml
│ │ │ │ └── other/
│ │ │ │ └── show.html.haml
│ │ │ ├── profiles/
│ │ │ │ └── show.html.haml
│ │ │ ├── shared/
│ │ │ │ └── _links.html.haml
│ │ │ ├── two_factor_authentication/
│ │ │ │ ├── confirmations/
│ │ │ │ │ └── new.html.haml
│ │ │ │ └── recovery_codes/
│ │ │ │ └── index.html.haml
│ │ │ └── two_factor_authentications/
│ │ │ └── show.html.haml
│ │ ├── shared/
│ │ │ ├── _error_messages.html.haml
│ │ │ └── _og.html.haml
│ │ ├── shares/
│ │ │ └── show.html.haml
│ │ ├── stream_entries/
│ │ │ ├── _attachment_list.html.haml
│ │ │ ├── _detailed_status.html.haml
│ │ │ ├── _og_description.html.haml
│ │ │ ├── _og_image.html.haml
│ │ │ ├── _poll.html.haml
│ │ │ ├── _simple_status.html.haml
│ │ │ ├── _status.html.haml
│ │ │ ├── embed.html.haml
│ │ │ └── show.html.haml
│ │ ├── tags/
│ │ │ ├── _og.html.haml
│ │ │ └── show.html.haml
│ │ ├── user_mailer/
│ │ │ ├── backup_ready.html.haml
│ │ │ ├── backup_ready.text.erb
│ │ │ ├── confirmation_instructions.html.haml
│ │ │ ├── confirmation_instructions.text.erb
│ │ │ ├── email_changed.html.haml
│ │ │ ├── email_changed.text.erb
│ │ │ ├── password_change.html.haml
│ │ │ ├── password_change.text.erb
│ │ │ ├── reconfirmation_instructions.html.haml
│ │ │ ├── reconfirmation_instructions.text.erb
│ │ │ ├── reset_password_instructions.html.haml
│ │ │ ├── reset_password_instructions.text.erb
│ │ │ ├── warning.html.haml
│ │ │ ├── warning.text.erb
│ │ │ ├── welcome.html.haml
│ │ │ └── welcome.text.erb
│ │ └── well_known/
│ │ ├── host_meta/
│ │ │ └── show.xml.ruby
│ │ └── webfinger/
│ │ └── show.xml.ruby
│ └── workers/
│ ├── activitypub/
│ │ ├── delivery_worker.rb
│ │ ├── distribute_poll_update_worker.rb
│ │ ├── distribution_worker.rb
│ │ ├── fetch_replies_worker.rb
│ │ ├── low_priority_delivery_worker.rb
│ │ ├── post_upgrade_worker.rb
│ │ ├── processing_worker.rb
│ │ ├── raw_distribution_worker.rb
│ │ ├── reply_distribution_worker.rb
│ │ ├── synchronize_featured_collection_worker.rb
│ │ └── update_distribution_worker.rb
│ ├── admin/
│ │ └── suspension_worker.rb
│ ├── after_account_domain_block_worker.rb
│ ├── after_remote_follow_request_worker.rb
│ ├── after_remote_follow_worker.rb
│ ├── authorize_follow_worker.rb
│ ├── backup_worker.rb
│ ├── block_worker.rb
│ ├── bootstrap_timeline_worker.rb
│ ├── concerns/
│ │ └── exponential_backoff.rb
│ ├── digest_mailer_worker.rb
│ ├── distribution_worker.rb
│ ├── domain_block_worker.rb
│ ├── feed_insert_worker.rb
│ ├── fetch_reply_worker.rb
│ ├── import/
│ │ └── relationship_worker.rb
│ ├── import_worker.rb
│ ├── link_crawl_worker.rb
│ ├── local_notification_worker.rb
│ ├── maintenance/
│ │ ├── destroy_media_worker.rb
│ │ ├── redownload_account_media_worker.rb
│ │ └── uncache_media_worker.rb
│ ├── merge_worker.rb
│ ├── mute_worker.rb
│ ├── notification_worker.rb
│ ├── poll_expiration_notify_worker.rb
│ ├── processing_worker.rb
│ ├── publish_scheduled_status_worker.rb
│ ├── pubsubhubbub/
│ │ ├── confirmation_worker.rb
│ │ ├── delivery_worker.rb
│ │ ├── distribution_worker.rb
│ │ ├── raw_distribution_worker.rb
│ │ ├── subscribe_worker.rb
│ │ └── unsubscribe_worker.rb
│ ├── push_conversation_worker.rb
│ ├── push_update_worker.rb
│ ├── refollow_worker.rb
│ ├── regeneration_worker.rb
│ ├── remote_profile_update_worker.rb
│ ├── removal_worker.rb
│ ├── resolve_account_worker.rb
│ ├── salmon_worker.rb
│ ├── scheduler/
│ │ ├── backup_cleanup_scheduler.rb
│ │ ├── doorkeeper_cleanup_scheduler.rb
│ │ ├── email_scheduler.rb
│ │ ├── feed_cleanup_scheduler.rb
│ │ ├── ip_cleanup_scheduler.rb
│ │ ├── media_cleanup_scheduler.rb
│ │ ├── pghero_scheduler.rb
│ │ ├── scheduled_statuses_scheduler.rb
│ │ ├── subscriptions_cleanup_scheduler.rb
│ │ ├── subscriptions_scheduler.rb
│ │ └── user_cleanup_scheduler.rb
│ ├── thread_resolve_worker.rb
│ ├── unfavourite_worker.rb
│ ├── unfollow_follow_worker.rb
│ ├── unmerge_worker.rb
│ ├── verify_account_links_worker.rb
│ └── web/
│ └── push_notification_worker.rb
├── app.json
├── babel.config.js
├── bin/
│ ├── bundle
│ ├── rails
│ ├── rake
│ ├── retry
│ ├── rspec
│ ├── setup
│ ├── tootctl
│ ├── update
│ ├── webpack
│ ├── webpack-dev-server
│ └── yarn
├── boxfile.yml
├── config/
│ ├── application.rb
│ ├── boot.rb
│ ├── brakeman.ignore
│ ├── database.yml
│ ├── deploy.rb
│ ├── environment.rb
│ ├── environments/
│ │ ├── development.rb
│ │ ├── production.rb
│ │ └── test.rb
│ ├── i18n-tasks.yml
│ ├── initializers/
│ │ ├── 0_post_deployment_migrations.rb
│ │ ├── 1_hosts.rb
│ │ ├── active_model_serializers.rb
│ │ ├── application_controller_renderer.rb
│ │ ├── assets.rb
│ │ ├── backtrace_silencers.rb
│ │ ├── blacklists.rb
│ │ ├── chewy.rb
│ │ ├── content_security_policy.rb
│ │ ├── cookies_serializer.rb
│ │ ├── cors.rb
│ │ ├── delivery_job.rb
│ │ ├── devise.rb
│ │ ├── doorkeeper.rb
│ │ ├── fast_blank.rb
│ │ ├── ffmpeg.rb
│ │ ├── filter_parameter_logging.rb
│ │ ├── http_client_proxy.rb
│ │ ├── httplog.rb
│ │ ├── inflections.rb
│ │ ├── instrumentation.rb
│ │ ├── json_ld.rb
│ │ ├── kaminari_config.rb
│ │ ├── mime_types.rb
│ │ ├── oj.rb
│ │ ├── omniauth.rb
│ │ ├── open_uri_redirection.rb
│ │ ├── pagination.rb
│ │ ├── paperclip.rb
│ │ ├── premailer_rails.rb
│ │ ├── rack_attack.rb
│ │ ├── rack_attack_logging.rb
│ │ ├── redis.rb
│ │ ├── session_activations.rb
│ │ ├── session_store.rb
│ │ ├── sidekiq.rb
│ │ ├── simple_form.rb
│ │ ├── single_user_mode.rb
│ │ ├── statsd.rb
│ │ ├── stoplight.rb
│ │ ├── strong_migrations.rb
│ │ ├── suppress_csrf_warnings.rb
│ │ ├── trusted_proxies.rb
│ │ ├── twitter_regex.rb
│ │ ├── vapid.rb
│ │ └── wrap_parameters.rb
│ ├── locales/
│ │ ├── activerecord.ar.yml
│ │ ├── activerecord.ast.yml
│ │ ├── activerecord.bg.yml
│ │ ├── activerecord.bn.yml
│ │ ├── activerecord.ca.yml
│ │ ├── activerecord.co.yml
│ │ ├── activerecord.cs.yml
│ │ ├── activerecord.cy.yml
│ │ ├── activerecord.da.yml
│ │ ├── activerecord.de.yml
│ │ ├── activerecord.el.yml
│ │ ├── activerecord.en.yml
│ │ ├── activerecord.eo.yml
│ │ ├── activerecord.es.yml
│ │ ├── activerecord.eu.yml
│ │ ├── activerecord.fa.yml
│ │ ├── activerecord.fi.yml
│ │ ├── activerecord.fr.yml
│ │ ├── activerecord.gl.yml
│ │ ├── activerecord.he.yml
│ │ ├── activerecord.hr.yml
│ │ ├── activerecord.hu.yml
│ │ ├── activerecord.hy.yml
│ │ ├── activerecord.id.yml
│ │ ├── activerecord.io.yml
│ │ ├── activerecord.it.yml
│ │ ├── activerecord.ja.yml
│ │ ├── activerecord.ka.yml
│ │ ├── activerecord.kk.yml
│ │ ├── activerecord.ko.yml
│ │ ├── activerecord.lt.yml
│ │ ├── activerecord.lv.yml
│ │ ├── activerecord.ms.yml
│ │ ├── activerecord.nl.yml
│ │ ├── activerecord.no.yml
│ │ ├── activerecord.oc.yml
│ │ ├── activerecord.pl.yml
│ │ ├── activerecord.pt-BR.yml
│ │ ├── activerecord.pt.yml
│ │ ├── activerecord.ro.yml
│ │ ├── activerecord.ru.yml
│ │ ├── activerecord.sk.yml
│ │ ├── activerecord.sl.yml
│ │ ├── activerecord.sq.yml
│ │ ├── activerecord.sr-Latn.yml
│ │ ├── activerecord.sr.yml
│ │ ├── activerecord.sv.yml
│ │ ├── activerecord.ta.yml
│ │ ├── activerecord.te.yml
│ │ ├── activerecord.th.yml
│ │ ├── activerecord.tr.yml
│ │ ├── activerecord.uk.yml
│ │ ├── activerecord.zh-CN.yml
│ │ ├── activerecord.zh-HK.yml
│ │ ├── activerecord.zh-TW.yml
│ │ ├── activerecord.zh_Hant.yml
│ │ ├── ar.yml
│ │ ├── ast.yml
│ │ ├── bg.yml
│ │ ├── bn.yml
│ │ ├── ca.yml
│ │ ├── co.yml
│ │ ├── cs.yml
│ │ ├── cy.yml
│ │ ├── da.yml
│ │ ├── de.yml
│ │ ├── devise.ar.yml
│ │ ├── devise.ast.yml
│ │ ├── devise.bg.yml
│ │ ├── devise.bn.yml
│ │ ├── devise.ca.yml
│ │ ├── devise.co.yml
│ │ ├── devise.cs.yml
│ │ ├── devise.cy.yml
│ │ ├── devise.da.yml
│ │ ├── devise.de.yml
│ │ ├── devise.el.yml
│ │ ├── devise.en.yml
│ │ ├── devise.eo.yml
│ │ ├── devise.es.yml
│ │ ├── devise.eu.yml
│ │ ├── devise.fa.yml
│ │ ├── devise.fi.yml
│ │ ├── devise.fr.yml
│ │ ├── devise.gl.yml
│ │ ├── devise.he.yml
│ │ ├── devise.hr.yml
│ │ ├── devise.hu.yml
│ │ ├── devise.hy.yml
│ │ ├── devise.id.yml
│ │ ├── devise.io.yml
│ │ ├── devise.it.yml
│ │ ├── devise.ja.yml
│ │ ├── devise.ka.yml
│ │ ├── devise.kk.yml
│ │ ├── devise.ko.yml
│ │ ├── devise.lt.yml
│ │ ├── devise.lv.yml
│ │ ├── devise.ms.yml
│ │ ├── devise.nl.yml
│ │ ├── devise.no.yml
│ │ ├── devise.oc.yml
│ │ ├── devise.pl.yml
│ │ ├── devise.pt-BR.yml
│ │ ├── devise.pt.yml
│ │ ├── devise.ro.yml
│ │ ├── devise.ru.yml
│ │ ├── devise.sk.yml
│ │ ├── devise.sl.yml
│ │ ├── devise.sq.yml
│ │ ├── devise.sr-Latn.yml
│ │ ├── devise.sr.yml
│ │ ├── devise.sv.yml
│ │ ├── devise.ta.yml
│ │ ├── devise.te.yml
│ │ ├── devise.th.yml
│ │ ├── devise.tr.yml
│ │ ├── devise.uk.yml
│ │ ├── devise.zh-CN.yml
│ │ ├── devise.zh-HK.yml
│ │ ├── devise.zh-TW.yml
│ │ ├── doorkeeper.ar.yml
│ │ ├── doorkeeper.ast.yml
│ │ ├── doorkeeper.bg.yml
│ │ ├── doorkeeper.bn.yml
│ │ ├── doorkeeper.ca.yml
│ │ ├── doorkeeper.co.yml
│ │ ├── doorkeeper.cs.yml
│ │ ├── doorkeeper.cy.yml
│ │ ├── doorkeeper.da.yml
│ │ ├── doorkeeper.de.yml
│ │ ├── doorkeeper.el.yml
│ │ ├── doorkeeper.en.yml
│ │ ├── doorkeeper.eo.yml
│ │ ├── doorkeeper.es.yml
│ │ ├── doorkeeper.eu.yml
│ │ ├── doorkeeper.fa.yml
│ │ ├── doorkeeper.fi.yml
│ │ ├── doorkeeper.fr.yml
│ │ ├── doorkeeper.gl.yml
│ │ ├── doorkeeper.he.yml
│ │ ├── doorkeeper.hr.yml
│ │ ├── doorkeeper.hu.yml
│ │ ├── doorkeeper.hy.yml
│ │ ├── doorkeeper.id.yml
│ │ ├── doorkeeper.io.yml
│ │ ├── doorkeeper.it.yml
│ │ ├── doorkeeper.ja.yml
│ │ ├── doorkeeper.ka.yml
│ │ ├── doorkeeper.kk.yml
│ │ ├── doorkeeper.ko.yml
│ │ ├── doorkeeper.lt.yml
│ │ ├── doorkeeper.lv.yml
│ │ ├── doorkeeper.ms.yml
│ │ ├── doorkeeper.nl.yml
│ │ ├── doorkeeper.no.yml
│ │ ├── doorkeeper.oc.yml
│ │ ├── doorkeeper.pl.yml
│ │ ├── doorkeeper.pt-BR.yml
│ │ ├── doorkeeper.pt.yml
│ │ ├── doorkeeper.ro.yml
│ │ ├── doorkeeper.ru.yml
│ │ ├── doorkeeper.sk.yml
│ │ ├── doorkeeper.sl.yml
│ │ ├── doorkeeper.sq.yml
│ │ ├── doorkeeper.sr-Latn.yml
│ │ ├── doorkeeper.sr.yml
│ │ ├── doorkeeper.sv.yml
│ │ ├── doorkeeper.ta.yml
│ │ ├── doorkeeper.te.yml
│ │ ├── doorkeeper.th.yml
│ │ ├── doorkeeper.tr.yml
│ │ ├── doorkeeper.uk.yml
│ │ ├── doorkeeper.zh-CN.yml
│ │ ├── doorkeeper.zh-HK.yml
│ │ ├── doorkeeper.zh-TW.yml
│ │ ├── el.yml
│ │ ├── en.yml
│ │ ├── en_GB.yml
│ │ ├── eo.yml
│ │ ├── es.yml
│ │ ├── eu.yml
│ │ ├── fa.yml
│ │ ├── fi.yml
│ │ ├── fr.yml
│ │ ├── ga.yml
│ │ ├── gl.yml
│ │ ├── he.yml
│ │ ├── hi.yml
│ │ ├── hr.yml
│ │ ├── hu.yml
│ │ ├── hy.yml
│ │ ├── id.yml
│ │ ├── io.yml
│ │ ├── it.yml
│ │ ├── ja.yml
│ │ ├── ka.yml
│ │ ├── kk.yml
│ │ ├── ko.yml
│ │ ├── lt.yml
│ │ ├── lv.yml
│ │ ├── ms.yml
│ │ ├── nl.yml
│ │ ├── no.yml
│ │ ├── oc.yml
│ │ ├── pl.yml
│ │ ├── pt-BR.yml
│ │ ├── pt.yml
│ │ ├── ro.yml
│ │ ├── ru.yml
│ │ ├── simple_form.ar.yml
│ │ ├── simple_form.ast.yml
│ │ ├── simple_form.bg.yml
│ │ ├── simple_form.bn.yml
│ │ ├── simple_form.ca.yml
│ │ ├── simple_form.co.yml
│ │ ├── simple_form.cs.yml
│ │ ├── simple_form.cy.yml
│ │ ├── simple_form.da.yml
│ │ ├── simple_form.de.yml
│ │ ├── simple_form.el.yml
│ │ ├── simple_form.en.yml
│ │ ├── simple_form.en_GB.yml
│ │ ├── simple_form.eo.yml
│ │ ├── simple_form.es.yml
│ │ ├── simple_form.eu.yml
│ │ ├── simple_form.fa.yml
│ │ ├── simple_form.fi.yml
│ │ ├── simple_form.fr.yml
│ │ ├── simple_form.gl.yml
│ │ ├── simple_form.he.yml
│ │ ├── simple_form.hr.yml
│ │ ├── simple_form.hu.yml
│ │ ├── simple_form.hy.yml
│ │ ├── simple_form.id.yml
│ │ ├── simple_form.io.yml
│ │ ├── simple_form.it.yml
│ │ ├── simple_form.ja.yml
│ │ ├── simple_form.ka.yml
│ │ ├── simple_form.kk.yml
│ │ ├── simple_form.ko.yml
│ │ ├── simple_form.lt.yml
│ │ ├── simple_form.lv.yml
│ │ ├── simple_form.ms.yml
│ │ ├── simple_form.nl.yml
│ │ ├── simple_form.no.yml
│ │ ├── simple_form.oc.yml
│ │ ├── simple_form.pl.yml
│ │ ├── simple_form.pt-BR.yml
│ │ ├── simple_form.pt.yml
│ │ ├── simple_form.ro.yml
│ │ ├── simple_form.ru.yml
│ │ ├── simple_form.sk.yml
│ │ ├── simple_form.sl.yml
│ │ ├── simple_form.sq.yml
│ │ ├── simple_form.sr-Latn.yml
│ │ ├── simple_form.sr.yml
│ │ ├── simple_form.sv.yml
│ │ ├── simple_form.ta.yml
│ │ ├── simple_form.te.yml
│ │ ├── simple_form.th.yml
│ │ ├── simple_form.tr.yml
│ │ ├── simple_form.uk.yml
│ │ ├── simple_form.zh-CN.yml
│ │ ├── simple_form.zh-HK.yml
│ │ ├── simple_form.zh-TW.yml
│ │ ├── sk.yml
│ │ ├── sl.yml
│ │ ├── sq.yml
│ │ ├── sr-Latn.rb
│ │ ├── sr-Latn.yml
│ │ ├── sr.rb
│ │ ├── sr.yml
│ │ ├── sv.yml
│ │ ├── ta.yml
│ │ ├── te.yml
│ │ ├── th.yml
│ │ ├── tr.yml
│ │ ├── uk.yml
│ │ ├── zh-CN.yml
│ │ ├── zh-HK.yml
│ │ └── zh-TW.yml
│ ├── navigation.rb
│ ├── puma.rb
│ ├── routes.rb
│ ├── secrets.yml
│ ├── settings.yml
│ ├── sidekiq.yml
│ ├── themes.yml
│ ├── webpack/
│ │ ├── configuration.js
│ │ ├── development.js
│ │ ├── generateLocalePacks.js
│ │ ├── production.js
│ │ ├── rules/
│ │ │ ├── babel.js
│ │ │ ├── css.js
│ │ │ ├── file.js
│ │ │ ├── index.js
│ │ │ ├── mark.js
│ │ │ └── node_modules.js
│ │ ├── shared.js
│ │ ├── test.js
│ │ └── translationRunner.js
│ └── webpacker.yml
├── config.ru
├── db/
│ ├── migrate/
│ │ ├── 20160220174730_create_accounts.rb
│ │ ├── 20160220211917_create_statuses.rb
│ │ ├── 20160221003140_create_users.rb
│ │ ├── 20160221003621_create_follows.rb
│ │ ├── 20160222122600_create_stream_entries.rb
│ │ ├── 20160222143943_add_profile_fields_to_accounts.rb
│ │ ├── 20160223162837_add_metadata_to_statuses.rb
│ │ ├── 20160223164502_make_uris_nullable_in_statuses.rb
│ │ ├── 20160223165723_add_url_to_statuses.rb
│ │ ├── 20160223165855_add_url_to_accounts.rb
│ │ ├── 20160223171800_create_favourites.rb
│ │ ├── 20160224223247_create_mentions.rb
│ │ ├── 20160227230233_add_attachment_avatar_to_accounts.rb
│ │ ├── 20160305115639_add_devise_to_users.rb
│ │ ├── 20160306172223_create_doorkeeper_tables.rb
│ │ ├── 20160312193225_add_attachment_header_to_accounts.rb
│ │ ├── 20160314164231_add_owner_to_application.rb
│ │ ├── 20160316103650_add_missing_indices.rb
│ │ ├── 20160322193748_add_avatar_remote_url_to_accounts.rb
│ │ ├── 20160325130944_add_admin_to_users.rb
│ │ ├── 20160826155805_add_superapp_to_oauth_applications.rb
│ │ ├── 20160905150353_create_media_attachments.rb
│ │ ├── 20160919221059_add_subscription_expires_at_to_accounts.rb
│ │ ├── 20160920003904_remove_verify_token_from_accounts.rb
│ │ ├── 20160926213048_remove_owner_from_application.rb
│ │ ├── 20161003142332_add_confirmable_to_users.rb
│ │ ├── 20161003145426_create_blocks.rb
│ │ ├── 20161006213403_rails_settings_migration.rb
│ │ ├── 20161009120834_create_domain_blocks.rb
│ │ ├── 20161027172456_add_silenced_to_accounts.rb
│ │ ├── 20161104173623_create_tags.rb
│ │ ├── 20161105130633_create_statuses_tags_join_table.rb
│ │ ├── 20161116162355_add_locale_to_users.rb
│ │ ├── 20161119211120_create_notifications.rb
│ │ ├── 20161122163057_remove_unneeded_indexes.rb
│ │ ├── 20161123093447_add_sensitive_to_statuses.rb
│ │ ├── 20161128103007_create_subscriptions.rb
│ │ ├── 20161130142058_add_last_successful_delivery_at_to_subscriptions.rb
│ │ ├── 20161130185319_add_visibility_to_statuses.rb
│ │ ├── 20161202132159_add_in_reply_to_account_id_to_statuses.rb
│ │ ├── 20161203164520_add_from_account_id_to_notifications.rb
│ │ ├── 20161205214545_add_suspended_to_accounts.rb
│ │ ├── 20161221152630_add_hidden_to_stream_entries.rb
│ │ ├── 20161222201034_add_locked_to_accounts.rb
│ │ ├── 20161222204147_create_follow_requests.rb
│ │ ├── 20170105224407_add_shortcode_to_media_attachments.rb
│ │ ├── 20170109120109_create_web_settings.rb
│ │ ├── 20170112154826_migrate_settings.rb
│ │ ├── 20170114194937_add_application_to_statuses.rb
│ │ ├── 20170114203041_add_website_to_oauth_application.rb
│ │ ├── 20170119214911_create_preview_cards.rb
│ │ ├── 20170123162658_add_severity_to_domain_blocks.rb
│ │ ├── 20170123203248_add_reject_media_to_domain_blocks.rb
│ │ ├── 20170125145934_add_spoiler_text_to_statuses.rb
│ │ ├── 20170127165745_add_devise_two_factor_to_users.rb
│ │ ├── 20170129000348_create_devices.rb
│ │ ├── 20170205175257_remove_devices.rb
│ │ ├── 20170209184350_add_reply_to_statuses.rb
│ │ ├── 20170214110202_create_reports.rb
│ │ ├── 20170217012631_add_reblog_of_id_foreign_key_to_statuses.rb
│ │ ├── 20170301222600_create_mutes.rb
│ │ ├── 20170303212857_add_last_emailed_at_to_users.rb
│ │ ├── 20170304202101_add_type_to_media_attachments.rb
│ │ ├── 20170317193015_add_search_index_to_accounts.rb
│ │ ├── 20170318214217_add_header_remote_url_to_accounts.rb
│ │ ├── 20170322021028_add_lowercase_index_to_accounts.rb
│ │ ├── 20170322143850_change_primary_key_to_bigint_on_statuses.rb
│ │ ├── 20170322162804_add_search_index_to_tags.rb
│ │ ├── 20170330021336_add_counter_caches.rb
│ │ ├── 20170330163835_create_imports.rb
│ │ ├── 20170330164118_add_attachment_data_to_imports.rb
│ │ ├── 20170403172249_add_action_taken_by_account_id_to_reports.rb
│ │ ├── 20170405112956_add_index_on_mentions_status_id.rb
│ │ ├── 20170406215816_add_notifications_and_favourites_indices.rb
│ │ ├── 20170409170753_add_last_webfingered_at_to_accounts.rb
│ │ ├── 20170414080609_add_devise_two_factor_backupable_to_users.rb
│ │ ├── 20170414132105_add_language_to_statuses.rb
│ │ ├── 20170418160728_add_indexes_to_reports_for_accounts.rb
│ │ ├── 20170423005413_add_allowed_languages_to_user.rb
│ │ ├── 20170424003227_create_account_domain_blocks.rb
│ │ ├── 20170424112722_add_status_id_index_to_statuses_tags.rb
│ │ ├── 20170425131920_add_media_attachment_meta.rb
│ │ ├── 20170425202925_add_oembed_to_preview_cards.rb
│ │ ├── 20170427011934_re_add_owner_to_application.rb
│ │ ├── 20170506235850_create_conversations.rb
│ │ ├── 20170507000211_add_conversation_id_to_statuses.rb
│ │ ├── 20170507141759_optimize_index_subscriptions.rb
│ │ ├── 20170508230434_create_conversation_mutes.rb
│ │ ├── 20170516072309_add_index_accounts_on_uri.rb
│ │ ├── 20170520145338_change_language_filter_to_opt_out.rb
│ │ ├── 20170601210557_add_index_on_media_attachments_account_id.rb
│ │ ├── 20170604144747_add_foreign_keys_for_accounts.rb
│ │ ├── 20170606113804_change_tag_search_index_to_btree.rb
│ │ ├── 20170609145826_remove_default_language_from_statuses.rb
│ │ ├── 20170610000000_add_statuses_index_on_account_id_id.rb
│ │ ├── 20170623152212_create_session_activations.rb
│ │ ├── 20170624134742_add_description_to_session_activations.rb
│ │ ├── 20170625140443_add_access_token_id_to_session_activations.rb
│ │ ├── 20170711225116_fix_null_booleans.rb
│ │ ├── 20170713112503_make_tag_search_case_insensitive.rb
│ │ ├── 20170713175513_create_web_push_subscriptions.rb
│ │ ├── 20170713190709_add_web_push_subscription_to_session_activations.rb
│ │ ├── 20170714184731_add_domain_to_subscriptions.rb
│ │ ├── 20170716191202_add_hide_notifications_to_mute.rb
│ │ ├── 20170718211102_add_activitypub_to_accounts.rb
│ │ ├── 20170720000000_add_index_favourites_on_account_id_and_id.rb
│ │ ├── 20170823162448_create_status_pins.rb
│ │ ├── 20170824103029_add_timestamps_to_status_pins.rb
│ │ ├── 20170829215220_remove_status_pins_account_index.rb
│ │ ├── 20170901141119_truncate_preview_cards.rb
│ │ ├── 20170901142658_create_join_table_preview_cards_statuses.rb
│ │ ├── 20170905044538_add_index_id_account_id_activity_type_on_notifications.rb
│ │ ├── 20170905165803_add_local_to_statuses.rb
│ │ ├── 20170913000752_create_site_uploads.rb
│ │ ├── 20170917153509_create_custom_emojis.rb
│ │ ├── 20170918125918_ids_to_bigints.rb
│ │ ├── 20170920024819_status_ids_to_timestamp_ids.rb
│ │ ├── 20170920032311_fix_reblogs_in_feeds.rb
│ │ ├── 20170924022025_ids_to_bigints2.rb
│ │ ├── 20170927215609_add_description_to_media_attachments.rb
│ │ ├── 20170928082043_create_email_domain_blocks.rb
│ │ ├── 20171005102658_create_account_moderation_notes.rb
│ │ ├── 20171005171936_add_disabled_to_custom_emojis.rb
│ │ ├── 20171006142024_add_uri_to_custom_emojis.rb
│ │ ├── 20171010023049_add_foreign_key_to_account_moderation_notes.rb
│ │ ├── 20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
│ │ ├── 20171020084748_add_visible_in_picker_to_custom_emoji.rb
│ │ ├── 20171028221157_add_reblogs_to_follows.rb
│ │ ├── 20171107143332_add_memorial_to_accounts.rb
│ │ ├── 20171107143624_add_disabled_to_users.rb
│ │ ├── 20171109012327_add_moderator_to_accounts.rb
│ │ ├── 20171114080328_add_index_domain_to_email_domain_blocks.rb
│ │ ├── 20171114231651_create_lists.rb
│ │ ├── 20171116161857_create_list_accounts.rb
│ │ ├── 20171118012443_add_moved_to_account_id_to_accounts.rb
│ │ ├── 20171119172437_create_admin_action_logs.rb
│ │ ├── 20171122120436_add_index_account_and_reblog_of_id_to_statuses.rb
│ │ ├── 20171125024930_create_invites.rb
│ │ ├── 20171125031751_add_invite_id_to_users.rb
│ │ ├── 20171125185353_add_index_reblog_of_id_and_account_to_statuses.rb
│ │ ├── 20171125190735_remove_old_reblog_index_on_statuses.rb
│ │ ├── 20171129172043_add_index_on_stream_entries.rb
│ │ ├── 20171130000000_add_embed_url_to_preview_cards.rb
│ │ ├── 20171201000000_change_account_id_nonnullable_in_lists.rb
│ │ ├── 20171212195226_remove_duplicate_indexes_in_lists.rb
│ │ ├── 20171226094803_more_faster_index_on_notifications.rb
│ │ ├── 20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│ │ ├── 20180109143959_add_remember_token_to_users.rb
│ │ ├── 20180204034416_create_identities.rb
│ │ ├── 20180206000000_change_user_id_nonnullable.rb
│ │ ├── 20180211015820_create_backups.rb
│ │ ├── 20180304013859_add_featured_collection_url_to_accounts.rb
│ │ ├── 20180310000000_change_columns_in_notifications_nonnullable.rb
│ │ ├── 20180402031200_add_assigned_account_id_to_reports.rb
│ │ ├── 20180402040909_create_report_notes.rb
│ │ ├── 20180410204633_add_fields_to_accounts.rb
│ │ ├── 20180416210259_add_uri_to_relationships.rb
│ │ ├── 20180506221944_add_actor_type_to_accounts.rb
│ │ ├── 20180510214435_add_access_token_id_to_web_push_subscriptions.rb
│ │ ├── 20180510230049_migrate_web_push_subscriptions.rb
│ │ ├── 20180514130000_improve_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│ │ ├── 20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│ │ ├── 20180528141303_fix_accounts_unique_index.rb
│ │ ├── 20180608213548_reject_following_blocked_users.rb
│ │ ├── 20180609104432_migrate_web_push_subscriptions2.rb
│ │ ├── 20180615122121_add_autofollow_to_invites.rb
│ │ ├── 20180616192031_add_chosen_languages_to_users.rb
│ │ ├── 20180617162849_remove_unused_indexes.rb
│ │ ├── 20180628181026_create_custom_filters.rb
│ │ ├── 20180707154237_add_whole_word_to_custom_filter.rb
│ │ ├── 20180711152640_create_relays.rb
│ │ ├── 20180808175627_create_account_pins.rb
│ │ ├── 20180812123222_change_relays_enabled.rb
│ │ ├── 20180812162710_create_status_stats.rb
│ │ ├── 20180812173710_copy_status_stats.rb
│ │ ├── 20180814171349_add_confidential_to_doorkeeper_application.rb
│ │ ├── 20180820232245_add_foreign_key_indices.rb
│ │ ├── 20180929222014_create_account_conversations.rb
│ │ ├── 20181007025445_create_pghero_space_stats.rb
│ │ ├── 20181010141500_add_silent_to_mentions.rb
│ │ ├── 20181017170937_add_reject_reports_to_domain_blocks.rb
│ │ ├── 20181018205649_add_unread_to_account_conversations.rb
│ │ ├── 20181024224956_migrate_account_conversations.rb
│ │ ├── 20181026034033_remove_faux_remote_account_duplicates.rb
│ │ ├── 20181116165755_create_account_stats.rb
│ │ ├── 20181116173541_copy_account_stats.rb
│ │ ├── 20181127130500_identity_id_to_bigint.rb
│ │ ├── 20181203003808_create_accounts_tags_join_table.rb
│ │ ├── 20181203021853_add_discoverable_to_accounts.rb
│ │ ├── 20181204193439_add_last_status_at_to_account_stats.rb
│ │ ├── 20181204215309_create_account_tag_stats.rb
│ │ ├── 20181207011115_downcase_custom_emoji_domains.rb
│ │ ├── 20181213184704_create_account_warnings.rb
│ │ ├── 20181213185533_create_account_warning_presets.rb
│ │ ├── 20181219235220_add_created_by_application_id_to_users.rb
│ │ ├── 20181226021420_add_also_known_as_to_accounts.rb
│ │ ├── 20190103124649_create_scheduled_statuses.rb
│ │ ├── 20190103124754_add_scheduled_status_id_to_media_attachments.rb
│ │ ├── 20190117114553_create_tombstones.rb
│ │ ├── 20190201012802_add_overwrite_to_imports.rb
│ │ ├── 20190203180359_create_featured_tags.rb
│ │ ├── 20190225031541_create_polls.rb
│ │ ├── 20190225031625_create_poll_votes.rb
│ │ ├── 20190226003449_add_poll_id_to_statuses.rb
│ │ ├── 20190304152020_add_uri_to_poll_votes.rb
│ │ ├── 20190306145741_add_lock_version_to_polls.rb
│ │ ├── 20190307234537_add_approved_to_users.rb
│ │ ├── 20190314181829_migrate_open_registrations_setting.rb
│ │ ├── 20190316190352_create_account_identity_proofs.rb
│ │ ├── 20190317135723_add_uri_to_reports.rb
│ │ ├── 20190409054914_create_user_invite_requests.rb
│ │ ├── 20190420025523_add_blurhash_to_media_attachments.rb
│ │ ├── 20190509164208_add_by_moderator_to_tombstone.rb
│ │ ├── 20190511134027_add_silenced_at_suspended_at_to_accounts.rb
│ │ └── 20190529143559_preserve_old_layout_for_existing_users.rb
│ ├── post_migrate/
│ │ ├── .gitkeep
│ │ ├── 20180813113448_copy_status_stats_cleanup.rb
│ │ ├── 20181116184611_copy_account_stats_cleanup.rb
│ │ ├── 20190511152737_remove_suspended_silenced_account_fields.rb
│ │ └── 20190519130537_remove_boosts_widening_audience.rb
│ ├── schema.rb
│ └── seeds.rb
├── dist/
│ ├── mastodon-sidekiq.service
│ ├── mastodon-streaming.service
│ ├── mastodon-web.service
│ └── nginx.conf
├── docker-compose.yml
├── lib/
│ ├── assets/
│ │ └── .keep
│ ├── cli.rb
│ ├── devise/
│ │ └── ldap_authenticatable.rb
│ ├── florence/
│ │ └── version.rb
│ ├── generators/
│ │ └── post_deployment_migration_generator.rb
│ ├── json_ld/
│ │ └── security.rb
│ ├── mastodon/
│ │ ├── accounts_cli.rb
│ │ ├── cache_cli.rb
│ │ ├── cli_helper.rb
│ │ ├── domains_cli.rb
│ │ ├── emoji_cli.rb
│ │ ├── feeds_cli.rb
│ │ ├── media_cli.rb
│ │ ├── migration_helpers.rb
│ │ ├── premailer_webpack_strategy.rb
│ │ ├── redis_config.rb
│ │ ├── search_cli.rb
│ │ ├── settings_cli.rb
│ │ ├── snowflake.rb
│ │ ├── statuses_cli.rb
│ │ └── version.rb
│ ├── paperclip/
│ │ ├── blurhash_transcoder.rb
│ │ ├── gif_transcoder.rb
│ │ ├── lazy_thumbnail.rb
│ │ └── video_transcoder.rb
│ ├── tasks/
│ │ ├── assets.rake
│ │ ├── auto_annotate_models.rake
│ │ ├── db.rake
│ │ ├── emojis.rake
│ │ ├── mastodon.rake
│ │ ├── repo.rake
│ │ └── statistics.rake
│ └── templates/
│ ├── haml/
│ │ └── scaffold/
│ │ └── _form.html.haml
│ └── rails/
│ └── post_deployment_migration/
│ └── migration.rb
├── log/
│ └── .keep
├── nanobox/
│ ├── nginx-local.conf
│ ├── nginx-stream.conf.erb
│ └── nginx-web.conf.erb
├── package.json
├── postcss.config.js
├── priv-config
├── public/
│ ├── browserconfig.xml
│ ├── embed.js
│ ├── robots.txt
│ └── sounds/
│ └── boop.ogg
├── scalingo.json
├── spec/
│ ├── controllers/
│ │ ├── about_controller_spec.rb
│ │ ├── account_follow_controller_spec.rb
│ │ ├── account_unfollow_controller_spec.rb
│ │ ├── accounts_controller_spec.rb
│ │ ├── activitypub/
│ │ │ ├── collections_controller_spec.rb
│ │ │ ├── inboxes_controller_spec.rb
│ │ │ └── outboxes_controller_spec.rb
│ │ ├── admin/
│ │ │ ├── account_moderation_notes_controller_spec.rb
│ │ │ ├── accounts_controller_spec.rb
│ │ │ ├── action_logs_controller_spec.rb
│ │ │ ├── base_controller_spec.rb
│ │ │ ├── change_email_controller_spec.rb
│ │ │ ├── confirmations_controller_spec.rb
│ │ │ ├── custom_emojis_controller_spec.rb
│ │ │ ├── dashboard_controller_spec.rb
│ │ │ ├── domain_blocks_controller_spec.rb
│ │ │ ├── email_domain_blocks_controller_spec.rb
│ │ │ ├── instances_controller_spec.rb
│ │ │ ├── invites_controller_spec.rb
│ │ │ ├── report_notes_controller_spec.rb
│ │ │ ├── reported_statuses_controller_spec.rb
│ │ │ ├── reports_controller_spec.rb
│ │ │ ├── resets_controller_spec.rb
│ │ │ ├── roles_controller_spec.rb
│ │ │ ├── settings_controller_spec.rb
│ │ │ ├── statuses_controller_spec.rb
│ │ │ ├── subscriptions_controller_spec.rb
│ │ │ ├── tags_controller_spec.rb
│ │ │ └── two_factor_authentications_controller_spec.rb
│ │ ├── api/
│ │ │ ├── base_controller_spec.rb
│ │ │ ├── oembed_controller_spec.rb
│ │ │ ├── proofs_controller_spec.rb
│ │ │ ├── push_controller_spec.rb
│ │ │ ├── salmon_controller_spec.rb
│ │ │ ├── subscriptions_controller_spec.rb
│ │ │ ├── v1/
│ │ │ │ ├── accounts/
│ │ │ │ │ ├── credentials_controller_spec.rb
│ │ │ │ │ ├── follower_accounts_controller_spec.rb
│ │ │ │ │ ├── following_accounts_controller_spec.rb
│ │ │ │ │ ├── lists_controller_spec.rb
│ │ │ │ │ ├── pins_controller_spec.rb
│ │ │ │ │ ├── relationships_controller_spec.rb
│ │ │ │ │ ├── search_controller_spec.rb
│ │ │ │ │ └── statuses_controller_spec.rb
│ │ │ │ ├── accounts_controller_spec.rb
│ │ │ │ ├── apps/
│ │ │ │ │ └── credentials_controller_spec.rb
│ │ │ │ ├── apps_controller_spec.rb
│ │ │ │ ├── blocks_controller_spec.rb
│ │ │ │ ├── conversations_controller_spec.rb
│ │ │ │ ├── custom_emojis_controller_spec.rb
│ │ │ │ ├── domain_blocks_controller_spec.rb
│ │ │ │ ├── endorsements_controller_spec.rb
│ │ │ │ ├── favourites_controller_spec.rb
│ │ │ │ ├── filters_controller_spec.rb
│ │ │ │ ├── follow_requests_controller_spec.rb
│ │ │ │ ├── follows_controller_spec.rb
│ │ │ │ ├── instances/
│ │ │ │ │ ├── activity_controller_spec.rb
│ │ │ │ │ └── peers_controller_spec.rb
│ │ │ │ ├── instances_controller_spec.rb
│ │ │ │ ├── lists/
│ │ │ │ │ └── accounts_controller_spec.rb
│ │ │ │ ├── lists_controller_spec.rb
│ │ │ │ ├── media_controller_spec.rb
│ │ │ │ ├── mutes_controller_spec.rb
│ │ │ │ ├── notifications_controller_spec.rb
│ │ │ │ ├── polls/
│ │ │ │ │ └── votes_controller_spec.rb
│ │ │ │ ├── polls_controller_spec.rb
│ │ │ │ ├── push/
│ │ │ │ │ └── subscriptions_controller_spec.rb
│ │ │ │ ├── reports_controller_spec.rb
│ │ │ │ ├── search_controller_spec.rb
│ │ │ │ ├── statuses/
│ │ │ │ │ ├── favourited_by_accounts_controller_spec.rb
│ │ │ │ │ ├── favourites_controller_spec.rb
│ │ │ │ │ ├── mutes_controller_spec.rb
│ │ │ │ │ ├── pins_controller_spec.rb
│ │ │ │ │ ├── reblogged_by_accounts_controller_spec.rb
│ │ │ │ │ └── reblogs_controller_spec.rb
│ │ │ │ ├── statuses_controller_spec.rb
│ │ │ │ ├── streaming_controller_spec.rb
│ │ │ │ ├── suggestions_controller_spec.rb
│ │ │ │ └── timelines/
│ │ │ │ ├── direct_controller_spec.rb
│ │ │ │ ├── home_controller_spec.rb
│ │ │ │ ├── list_controller_spec.rb
│ │ │ │ ├── public_controller_spec.rb
│ │ │ │ └── tag_controller_spec.rb
│ │ │ ├── v2/
│ │ │ │ └── search_controller_spec.rb
│ │ │ └── web/
│ │ │ ├── embeds_controller_spec.rb
│ │ │ ├── push_subscriptions_controller_spec.rb
│ │ │ └── settings_controller_spec.rb
│ │ ├── application_controller_spec.rb
│ │ ├── auth/
│ │ │ ├── confirmations_controller_spec.rb
│ │ │ ├── passwords_controller_spec.rb
│ │ │ ├── registrations_controller_spec.rb
│ │ │ └── sessions_controller_spec.rb
│ │ ├── authorize_interactions_controller_spec.rb
│ │ ├── concerns/
│ │ │ ├── account_controller_concern_spec.rb
│ │ │ ├── accountable_concern_spec.rb
│ │ │ ├── export_controller_concern_spec.rb
│ │ │ ├── localized_spec.rb
│ │ │ ├── obfuscate_filename_spec.rb
│ │ │ ├── rate_limit_headers_spec.rb
│ │ │ ├── signature_verification_spec.rb
│ │ │ └── user_tracking_concern_spec.rb
│ │ ├── emojis_controller_spec.rb
│ │ ├── follower_accounts_controller_spec.rb
│ │ ├── following_accounts_controller_spec.rb
│ │ ├── home_controller_spec.rb
│ │ ├── intents_controller_spec.rb
│ │ ├── invites_controller_spec.rb
│ │ ├── manifests_controller_spec.rb
│ │ ├── media_controller_spec.rb
│ │ ├── oauth/
│ │ │ ├── authorizations_controller_spec.rb
│ │ │ ├── authorized_applications_controller_spec.rb
│ │ │ └── tokens_controller_spec.rb
│ │ ├── relationships_controller_spec.rb
│ │ ├── remote_follow_controller_spec.rb
│ │ ├── remote_interaction_controller_spec.rb
│ │ ├── remote_unfollows_controller_spec.rb
│ │ ├── settings/
│ │ │ ├── applications_controller_spec.rb
│ │ │ ├── deletes_controller_spec.rb
│ │ │ ├── exports/
│ │ │ │ ├── blocked_accounts_controller_spec.rb
│ │ │ │ ├── following_accounts_controller_spec.rb
│ │ │ │ └── muted_accounts_controller_spec.rb
│ │ │ ├── exports_controller_spec.rb
│ │ │ ├── identity_proofs_controller_spec.rb
│ │ │ ├── imports_controller_spec.rb
│ │ │ ├── migrations_controller_spec.rb
│ │ │ ├── preferences/
│ │ │ │ ├── notifications_controller_spec.rb
│ │ │ │ └── other_controller_spec.rb
│ │ │ ├── profiles_controller_spec.rb
│ │ │ ├── sessions_controller_spec.rb
│ │ │ ├── two_factor_authentication/
│ │ │ │ ├── confirmations_controller_spec.rb
│ │ │ │ └── recovery_codes_controller_spec.rb
│ │ │ └── two_factor_authentications_controller_spec.rb
│ │ ├── shares_controller_spec.rb
│ │ ├── statuses_controller_spec.rb
│ │ ├── stream_entries_controller_spec.rb
│ │ ├── tags_controller_spec.rb
│ │ └── well_known/
│ │ ├── host_meta_controller_spec.rb
│ │ ├── keybase_proof_config_controller_spec.rb
│ │ └── webfinger_controller_spec.rb
│ ├── fabricators/
│ │ ├── access_token_fabricator.rb
│ │ ├── accessible_access_token_fabricator.rb
│ │ ├── account_domain_block_fabricator.rb
│ │ ├── account_fabricator.rb
│ │ ├── account_identity_proof_fabricator.rb
│ │ ├── account_moderation_note_fabricator.rb
│ │ ├── account_pin_fabricator.rb
│ │ ├── account_stat_fabricator.rb
│ │ ├── account_tag_stat_fabricator.rb
│ │ ├── account_warning_fabricator.rb
│ │ ├── account_warning_preset_fabricator.rb
│ │ ├── admin_action_log_fabricator.rb
│ │ ├── application_fabricator.rb
│ │ ├── assets/
│ │ │ └── TEAPOT
│ │ ├── backup_fabricator.rb
│ │ ├── block_fabricator.rb
│ │ ├── conversation_account_fabricator.rb
│ │ ├── conversation_fabricator.rb
│ │ ├── conversation_mute_fabricator.rb
│ │ ├── custom_emoji_fabricator.rb
│ │ ├── custom_filter_fabricator.rb
│ │ ├── domain_block_fabricator.rb
│ │ ├── email_domain_block_fabricator.rb
│ │ ├── favourite_fabricator.rb
│ │ ├── featured_tag_fabricator.rb
│ │ ├── follow_fabricator.rb
│ │ ├── follow_request_fabricator.rb
│ │ ├── identity_fabricator.rb
│ │ ├── import_fabricator.rb
│ │ ├── invite_fabricator.rb
│ │ ├── list_account_fabricator.rb
│ │ ├── list_fabricator.rb
│ │ ├── media_attachment_fabricator.rb
│ │ ├── mention_fabricator.rb
│ │ ├── mute_fabricator.rb
│ │ ├── notification_fabricator.rb
│ │ ├── poll_fabricator.rb
│ │ ├── poll_vote_fabricator.rb
│ │ ├── relay_fabricator.rb
│ │ ├── report_fabricator.rb
│ │ ├── report_note_fabricator.rb
│ │ ├── scheduled_status_fabricator.rb
│ │ ├── session_activation_fabricator.rb
│ │ ├── setting_fabricator.rb
│ │ ├── site_upload_fabricator.rb
│ │ ├── status_fabricator.rb
│ │ ├── status_pin_fabricator.rb
│ │ ├── status_stat_fabricator.rb
│ │ ├── stream_entry_fabricator.rb
│ │ ├── subscription_fabricator.rb
│ │ ├── tag_fabricator.rb
│ │ ├── user_fabricator.rb
│ │ ├── user_invite_request_fabricator.rb
│ │ ├── web_push_subscription_fabricator.rb
│ │ └── web_setting_fabricator.rb
│ ├── features/
│ │ └── log_in_spec.rb
│ ├── fixtures/
│ │ ├── files/
│ │ │ ├── attachment.webm
│ │ │ ├── imports.txt
│ │ │ ├── mute-imports.txt
│ │ │ ├── new-following-imports.txt
│ │ │ └── new-mute-imports.txt
│ │ ├── push/
│ │ │ ├── feed.atom
│ │ │ └── reblog.atom
│ │ ├── requests/
│ │ │ ├── .host-meta.txt
│ │ │ ├── activitypub-actor-individual.txt
│ │ │ ├── activitypub-actor-noinbox.txt
│ │ │ ├── activitypub-actor.txt
│ │ │ ├── activitypub-feed.txt
│ │ │ ├── activitypub-webfinger.txt
│ │ │ ├── attachment1.txt
│ │ │ ├── attachment2.txt
│ │ │ ├── avatar.txt
│ │ │ ├── feed.txt
│ │ │ ├── idn.txt
│ │ │ ├── json-ld.activitystreams.txt
│ │ │ ├── json-ld.identity.txt
│ │ │ ├── json-ld.security.txt
│ │ │ ├── koi8-r.txt
│ │ │ ├── localdomain-feed.txt
│ │ │ ├── localdomain-hostmeta.txt
│ │ │ ├── localdomain-webfinger.txt
│ │ │ ├── oembed_invalid_xml.html
│ │ │ ├── oembed_json.html
│ │ │ ├── oembed_json_empty.html
│ │ │ ├── oembed_json_xml.html
│ │ │ ├── oembed_undiscoverable.html
│ │ │ ├── oembed_xml.html
│ │ │ ├── redirected.host-meta.txt
│ │ │ ├── sjis.txt
│ │ │ ├── sjis_with_wrong_charset.txt
│ │ │ ├── webfinger-hacker1.txt
│ │ │ ├── webfinger-hacker2.txt
│ │ │ ├── webfinger-hacker3.txt
│ │ │ ├── webfinger.txt
│ │ │ └── windows-1251.txt
│ │ ├── salmon/
│ │ │ └── mention.xml
│ │ └── xml/
│ │ └── mastodon.atom
│ ├── helpers/
│ │ ├── admin/
│ │ │ ├── account_moderation_notes_helper_spec.rb
│ │ │ ├── action_log_helper_spec.rb
│ │ │ └── filter_helper_spec.rb
│ │ ├── application_helper_spec.rb
│ │ ├── flashes_helper_spec.rb
│ │ ├── home_helper_spec.rb
│ │ ├── instance_helper_spec.rb
│ │ ├── jsonld_helper_spec.rb
│ │ ├── routing_helper_spec.rb
│ │ ├── settings_helper_spec.rb
│ │ └── stream_entries_helper_spec.rb
│ ├── lib/
│ │ ├── activitypub/
│ │ │ ├── activity/
│ │ │ │ ├── accept_spec.rb
│ │ │ │ ├── add_spec.rb
│ │ │ │ ├── announce_spec.rb
│ │ │ │ ├── block_spec.rb
│ │ │ │ ├── create_spec.rb
│ │ │ │ ├── delete_spec.rb
│ │ │ │ ├── flag_spec.rb
│ │ │ │ ├── follow_spec.rb
│ │ │ │ ├── like_spec.rb
│ │ │ │ ├── move_spec.rb
│ │ │ │ ├── reject_spec.rb
│ │ │ │ ├── remove_spec.rb
│ │ │ │ ├── undo_spec.rb
│ │ │ │ └── update_spec.rb
│ │ │ ├── adapter_spec.rb
│ │ │ ├── linked_data_signature_spec.rb
│ │ │ └── tag_manager_spec.rb
│ │ ├── delivery_failure_tracker_spec.rb
│ │ ├── extractor_spec.rb
│ │ ├── feed_manager_spec.rb
│ │ ├── formatter_spec.rb
│ │ ├── hash_object_spec.rb
│ │ ├── language_detector_spec.rb
│ │ ├── ostatus/
│ │ │ ├── atom_serializer_spec.rb
│ │ │ └── tag_manager_spec.rb
│ │ ├── proof_provider/
│ │ │ └── keybase/
│ │ │ └── verifier_spec.rb
│ │ ├── request_spec.rb
│ │ ├── settings/
│ │ │ ├── extend_spec.rb
│ │ │ └── scoped_settings_spec.rb
│ │ ├── status_filter_spec.rb
│ │ ├── status_finder_spec.rb
│ │ ├── tag_manager_spec.rb
│ │ ├── user_settings_decorator_spec.rb
│ │ └── webfinger_resource_spec.rb
│ ├── mailers/
│ │ ├── admin_mailer_spec.rb
│ │ ├── notification_mailer_spec.rb
│ │ ├── previews/
│ │ │ ├── admin_mailer_preview.rb
│ │ │ ├── notification_mailer_preview.rb
│ │ │ └── user_mailer_preview.rb
│ │ └── user_mailer_spec.rb
│ ├── models/
│ │ ├── account_conversation_spec.rb
│ │ ├── account_domain_block_spec.rb
│ │ ├── account_filter_spec.rb
│ │ ├── account_moderation_note_spec.rb
│ │ ├── account_spec.rb
│ │ ├── account_stat_spec.rb
│ │ ├── account_tag_stat_spec.rb
│ │ ├── admin/
│ │ │ ├── account_action_spec.rb
│ │ │ └── action_log_spec.rb
│ │ ├── backup_spec.rb
│ │ ├── block_spec.rb
│ │ ├── concerns/
│ │ │ ├── account_finder_concern_spec.rb
│ │ │ ├── account_interactions_spec.rb
│ │ │ ├── remotable_spec.rb
│ │ │ ├── status_threading_concern_spec.rb
│ │ │ └── streamable_spec.rb
│ │ ├── conversation_mute_spec.rb
│ │ ├── conversation_spec.rb
│ │ ├── custom_emoji_filter_spec.rb
│ │ ├── custom_emoji_spec.rb
│ │ ├── custom_filter_spec.rb
│ │ ├── domain_block_spec.rb
│ │ ├── email_domain_block_spec.rb
│ │ ├── export_spec.rb
│ │ ├── favourite_spec.rb
│ │ ├── featured_tag_spec.rb
│ │ ├── follow_request_spec.rb
│ │ ├── follow_spec.rb
│ │ ├── form/
│ │ │ └── status_batch_spec.rb
│ │ ├── home_feed_spec.rb
│ │ ├── identity_spec.rb
│ │ ├── import_spec.rb
│ │ ├── invite_spec.rb
│ │ ├── list_account_spec.rb
│ │ ├── list_spec.rb
│ │ ├── media_attachment_spec.rb
│ │ ├── mention_spec.rb
│ │ ├── mute_spec.rb
│ │ ├── notification_spec.rb
│ │ ├── poll_spec.rb
│ │ ├── poll_vote_spec.rb
│ │ ├── preview_card_spec.rb
│ │ ├── relay_spec.rb
│ │ ├── remote_follow_spec.rb
│ │ ├── remote_profile_spec.rb
│ │ ├── report_filter_spec.rb
│ │ ├── report_spec.rb
│ │ ├── scheduled_status_spec.rb
│ │ ├── session_activation_spec.rb
│ │ ├── setting_spec.rb
│ │ ├── site_upload_spec.rb
│ │ ├── status_pin_spec.rb
│ │ ├── status_spec.rb
│ │ ├── status_stat_spec.rb
│ │ ├── stream_entry_spec.rb
│ │ ├── subscription_spec.rb
│ │ ├── tag_spec.rb
│ │ ├── user_invite_request_spec.rb
│ │ ├── user_spec.rb
│ │ └── web/
│ │ ├── push_subscription_spec.rb
│ │ └── setting_spec.rb
│ ├── policies/
│ │ ├── account_moderation_note_policy_spec.rb
│ │ ├── account_policy_spec.rb
│ │ ├── backup_policy_spec.rb
│ │ ├── custom_emoji_policy_spec.rb
│ │ ├── domain_block_policy_spec.rb
│ │ ├── email_domain_block_policy_spec.rb
│ │ ├── instance_policy_spec.rb
│ │ ├── invite_policy_spec.rb
│ │ ├── relay_policy_spec.rb
│ │ ├── report_note_policy_spec.rb
│ │ ├── report_policy_spec.rb
│ │ ├── settings_policy_spec.rb
│ │ ├── status_policy_spec.rb
│ │ ├── subscription_policy_spec.rb
│ │ ├── tag_policy_spec.rb
│ │ └── user_policy_spec.rb
│ ├── presenters/
│ │ ├── account_relationships_presenter_spec.rb
│ │ └── instance_presenter_spec.rb
│ ├── rails_helper.rb
│ ├── requests/
│ │ ├── account_show_page_spec.rb
│ │ ├── catch_all_route_request_spec.rb
│ │ ├── host_meta_request_spec.rb
│ │ ├── link_headers_spec.rb
│ │ ├── localization_spec.rb
│ │ └── webfinger_request_spec.rb
│ ├── routing/
│ │ ├── accounts_routing_spec.rb
│ │ ├── api_routing_spec.rb
│ │ └── well_known_routes_spec.rb
│ ├── serializers/
│ │ └── activitypub/
│ │ └── note_spec.rb
│ ├── services/
│ │ ├── account_search_service_spec.rb
│ │ ├── activitypub/
│ │ │ ├── fetch_remote_account_service_spec.rb
│ │ │ ├── fetch_remote_status_service_spec.rb
│ │ │ ├── fetch_replies_service_spec.rb
│ │ │ ├── process_account_service_spec.rb
│ │ │ └── process_collection_service_spec.rb
│ │ ├── after_block_domain_from_account_service_spec.rb
│ │ ├── after_block_service_spec.rb
│ │ ├── app_sign_up_service_spec.rb
│ │ ├── authorize_follow_service_spec.rb
│ │ ├── batched_remove_status_service_spec.rb
│ │ ├── block_domain_service_spec.rb
│ │ ├── block_service_spec.rb
│ │ ├── bootstrap_timeline_service_spec.rb
│ │ ├── fan_out_on_write_service_spec.rb
│ │ ├── favourite_service_spec.rb
│ │ ├── fetch_atom_service_spec.rb
│ │ ├── fetch_link_card_service_spec.rb
│ │ ├── fetch_oembed_service_spec.rb
│ │ ├── fetch_remote_account_service_spec.rb
│ │ ├── fetch_remote_status_service_spec.rb
│ │ ├── follow_service_spec.rb
│ │ ├── hashtag_query_service_spec.rb
│ │ ├── import_service_spec.rb
│ │ ├── mute_service_spec.rb
│ │ ├── notify_service_spec.rb
│ │ ├── post_status_service_spec.rb
│ │ ├── precompute_feed_service_spec.rb
│ │ ├── process_feed_service_spec.rb
│ │ ├── process_interaction_service_spec.rb
│ │ ├── process_mentions_service_spec.rb
│ │ ├── pubsubhubbub/
│ │ │ ├── subscribe_service_spec.rb
│ │ │ └── unsubscribe_service_spec.rb
│ │ ├── reblog_service_spec.rb
│ │ ├── reject_follow_service_spec.rb
│ │ ├── remove_status_service_spec.rb
│ │ ├── report_service_spec.rb
│ │ ├── resolve_account_service_spec.rb
│ │ ├── resolve_url_service_spec.rb
│ │ ├── search_service_spec.rb
│ │ ├── send_interaction_service_spec.rb
│ │ ├── subscribe_service_spec.rb
│ │ ├── suspend_account_service_spec.rb
│ │ ├── unblock_domain_service_spec.rb
│ │ ├── unblock_service_spec.rb
│ │ ├── unfollow_service_spec.rb
│ │ ├── unmute_service_spec.rb
│ │ ├── unsubscribe_service_spec.rb
│ │ ├── update_remote_profile_service_spec.rb
│ │ └── verify_link_service_spec.rb
│ ├── spec_helper.rb
│ ├── support/
│ │ ├── examples/
│ │ │ ├── lib/
│ │ │ │ └── settings/
│ │ │ │ ├── scoped_settings.rb
│ │ │ │ └── settings_extended.rb
│ │ │ └── models/
│ │ │ └── concerns/
│ │ │ └── account_avatar.rb
│ │ └── matchers/
│ │ └── model/
│ │ └── model_have_error_on_field.rb
│ ├── validators/
│ │ ├── blacklisted_email_validator_spec.rb
│ │ ├── disallowed_hashtags_validator_spec.rb
│ │ ├── email_mx_validator_spec.rb
│ │ ├── follow_limit_validator_spec.rb
│ │ ├── poll_validator_spec.rb
│ │ ├── status_length_validator_spec.rb
│ │ ├── status_pin_validator_spec.rb
│ │ ├── unique_username_validator_spec.rb
│ │ ├── unreserved_username_validator_spec.rb
│ │ └── url_validator_spec.rb
│ ├── views/
│ │ ├── about/
│ │ │ └── show.html.haml_spec.rb
│ │ └── stream_entries/
│ │ └── show.html.haml_spec.rb
│ └── workers/
│ ├── activitypub/
│ │ ├── delivery_worker_spec.rb
│ │ ├── distribution_worker_spec.rb
│ │ ├── fetch_replies_worker_spec.rb
│ │ ├── processing_worker_spec.rb
│ │ └── update_distribution_worker_spec.rb
│ ├── after_remote_follow_request_worker_spec.rb
│ ├── after_remote_follow_worker_spec.rb
│ ├── digest_mailer_worker_spec.rb
│ ├── domain_block_worker_spec.rb
│ ├── feed_insert_worker_spec.rb
│ ├── publish_scheduled_status_worker_spec.rb
│ ├── pubsubhubbub/
│ │ ├── confirmation_worker_spec.rb
│ │ ├── delivery_worker_spec.rb
│ │ └── distribution_worker_spec.rb
│ ├── regeneration_worker_spec.rb
│ └── scheduler/
│ ├── feed_cleanup_scheduler_spec.rb
│ ├── media_cleanup_scheduler_spec.rb
│ └── subscriptions_scheduler_spec.rb
├── streaming/
│ └── index.js
└── vendor/
└── .keep
================================================
FILE CONTENTS
================================================
================================================
FILE: .buildpacks
================================================
https://github.com/heroku/heroku-buildpack-apt
https://github.com/Scalingo/ffmpeg-buildpack
https://github.com/Scalingo/nodejs-buildpack
https://github.com/Scalingo/ruby-buildpack
================================================
FILE: .circleci/config.yml
================================================
version: 2
aliases:
- &defaults
docker:
- image: circleci/ruby:2.6.0-stretch-node
environment: &ruby_environment
BUNDLE_APP_CONFIG: ./.bundle/
DB_HOST: localhost
DB_USER: root
RAILS_ENV: test
PARALLEL_TEST_PROCESSORS: 4
ALLOW_NOPAM: true
CONTINUOUS_INTEGRATION: true
DISABLE_SIMPLECOV: true
PAM_ENABLED: true
PAM_DEFAULT_SERVICE: pam_test
PAM_CONTROLLED_SERVICE: pam_test_controlled
working_directory: ~/projects/mastodon/
- &attach_workspace
attach_workspace:
at: ~/projects/
- &persist_to_workspace
persist_to_workspace:
root: ~/projects/
paths:
- ./mastodon/
- &restore_ruby_dependencies
restore_cache:
keys:
- v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }}
- v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-
- v2-ruby-dependencies-
- &install_steps
steps:
- checkout
- *attach_workspace
- restore_cache:
keys:
- v1-node-dependencies-{{ checksum "yarn.lock" }}
- v1-node-dependencies-
- run: yarn install --frozen-lockfile
- save_cache:
key: v1-node-dependencies-{{ checksum "yarn.lock" }}
paths:
- ./node_modules/
- *persist_to_workspace
- &install_system_dependencies
run:
name: Install system dependencies
command: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
- &install_ruby_dependencies
steps:
- *attach_workspace
- *install_system_dependencies
- run: ruby -e 'puts RUBY_VERSION' | tee /tmp/.ruby-version
- *restore_ruby_dependencies
- run: bundle install --clean --jobs 16 --path ./vendor/bundle/ --retry 3 --with pam_authentication --without development production && bundle clean
- save_cache:
key: v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }}
paths:
- ./.bundle/
- ./vendor/bundle/
- persist_to_workspace:
root: ~/projects/
paths:
- ./mastodon/.bundle/
- ./mastodon/vendor/bundle/
- &test_steps
steps:
- *attach_workspace
- *install_system_dependencies
- run: sudo apt-get install -y ffmpeg
- run:
name: Prepare Tests
command: ./bin/rails parallel:create parallel:load_schema parallel:prepare
- run:
name: Run Tests
command: ./bin/retry bundle exec parallel_test ./spec/ --group-by filesize --type rspec
jobs:
install:
<<: *defaults
<<: *install_steps
install-ruby2.6:
<<: *defaults
<<: *install_ruby_dependencies
install-ruby2.5:
<<: *defaults
docker:
- image: circleci/ruby:2.5.3-stretch-node
environment: *ruby_environment
<<: *install_ruby_dependencies
install-ruby2.4:
<<: *defaults
docker:
- image: circleci/ruby:2.4.5-stretch-node
environment: *ruby_environment
<<: *install_ruby_dependencies
build:
<<: *defaults
steps:
- *attach_workspace
- *install_system_dependencies
- run: ./bin/rails assets:precompile
- persist_to_workspace:
root: ~/projects/
paths:
- ./mastodon/public/assets
- ./mastodon/public/packs-test/
test-ruby2.6:
<<: *defaults
docker:
- image: circleci/ruby:2.6.0-stretch-node
environment: *ruby_environment
- image: circleci/postgres:10.6-alpine
environment:
POSTGRES_USER: root
- image: circleci/redis:5.0.3-alpine3.8
<<: *test_steps
test-ruby2.5:
<<: *defaults
docker:
- image: circleci/ruby:2.5.3-stretch-node
environment: *ruby_environment
- image: circleci/postgres:10.6-alpine
environment:
POSTGRES_USER: root
- image: circleci/redis:4.0.12-alpine
<<: *test_steps
test-ruby2.4:
<<: *defaults
docker:
- image: circleci/ruby:2.4.5-stretch-node
environment: *ruby_environment
- image: circleci/postgres:10.6-alpine
environment:
POSTGRES_USER: root
- image: circleci/redis:4.0.12-alpine
<<: *test_steps
test-webui:
<<: *defaults
docker:
- image: circleci/node:8.15.0-stretch
steps:
- *attach_workspace
- run: ./bin/retry yarn test:jest
check-i18n:
<<: *defaults
steps:
- *attach_workspace
- run: bundle exec i18n-tasks check-normalized
- run: bundle exec i18n-tasks unused -l en
- run: bundle exec i18n-tasks check-consistent-interpolations
workflows:
version: 2
build-and-test:
jobs:
- install
- install-ruby2.6:
requires:
- install
- install-ruby2.5:
requires:
- install
- install-ruby2.6
- install-ruby2.4:
requires:
- install
- install-ruby2.6
- build:
requires:
- install-ruby2.6
- test-ruby2.6:
requires:
- install-ruby2.6
- build
- test-ruby2.5:
requires:
- install-ruby2.5
- build
- test-ruby2.4:
requires:
- install-ruby2.4
- build
- test-webui:
requires:
- install
- check-i18n:
requires:
- install-ruby2.6
================================================
FILE: .codeclimate.yml
================================================
version: "2"
checks:
argument-count:
enabled: false
complex-logic:
enabled: false
file-lines:
enabled: false
method-complexity:
enabled: false
method-count:
enabled: false
method-lines:
enabled: false
nested-control-flow:
enabled: false
return-statements:
enabled: false
similar-code:
enabled: false
identical-code:
enabled: false
plugins:
brakeman:
enabled: true
bundler-audit:
enabled: true
eslint:
enabled: true
channel: eslint-5
rubocop:
enabled: true
channel: rubocop-0-71
sass-lint:
enabled: true
exclude_patterns:
- spec/
- vendor/asset
================================================
FILE: .dependabot/config.yml
================================================
version: 1
update_configs:
- package_manager: "ruby:bundler"
directory: "/"
update_schedule: "weekly"
- package_manager: "javascript"
directory: "/"
update_schedule: "weekly"
================================================
FILE: .dockerignore
================================================
.bundle
.env
.env.*
public/system
public/assets
public/packs
node_modules
neo4j
vendor/bundle
.DS_Store
*.swp
*~
postgres
redis
elasticsearch
================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_style = space
indent_size = 2
================================================
FILE: .eslintignore
================================================
/build/**
/coverage/**
/db/**
/lib/**
/log/**
/node_modules/**
/nonobox/**
/public/**
!/public/embed.js
/spec/**
/tmp/**
/vendor/**
!.eslintrc.js
================================================
FILE: .eslintrc.js
================================================
module.exports = {
root: true,
env: {
browser: true,
node: true,
es6: true,
jest: true,
},
globals: {
ATTACHMENT_HOST: false,
},
parser: 'babel-eslint',
plugins: [
'react',
'jsx-a11y',
'import',
'promise',
],
parserOptions: {
sourceType: 'module',
ecmaFeatures: {
experimentalObjectRestSpread: true,
jsx: true,
},
ecmaVersion: 2018,
},
settings: {
react: {
version: 'detect',
},
'import/extensions': [
'.js',
],
'import/ignore': [
'node_modules',
'\\.(css|scss|json)$',
],
'import/resolver': {
node: {
paths: ['app/javascript'],
},
},
},
rules: {
'brace-style': 'warn',
'comma-dangle': ['error', 'always-multiline'],
'comma-spacing': [
'warn',
{
before: false,
after: true,
},
],
'comma-style': ['warn', 'last'],
'consistent-return': 'error',
'dot-notation': 'error',
eqeqeq: 'error',
indent: ['warn', 2],
'jsx-quotes': ['error', 'prefer-single'],
'no-catch-shadow': 'error',
'no-cond-assign': 'error',
'no-console': [
'warn',
{
allow: [
'error',
'warn',
],
},
],
'no-fallthrough': 'error',
'no-irregular-whitespace': 'error',
'no-mixed-spaces-and-tabs': 'warn',
'no-nested-ternary': 'warn',
'no-trailing-spaces': 'warn',
'no-undef': 'error',
'no-unreachable': 'error',
'no-unused-expressions': 'error',
'no-unused-vars': [
'error',
{
vars: 'all',
args: 'after-used',
ignoreRestSiblings: true,
},
],
'object-curly-spacing': ['error', 'always'],
'padded-blocks': [
'error',
{
classes: 'always',
},
],
quotes: ['error', 'single'],
semi: 'error',
strict: 'off',
'valid-typeof': 'error',
'react/jsx-boolean-value': 'error',
'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
'react/jsx-curly-spacing': 'error',
'react/jsx-equals-spacing': 'error',
'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
'react/jsx-indent': ['error', 2],
'react/jsx-no-bind': 'error',
'react/jsx-no-duplicate-props': 'error',
'react/jsx-no-undef': 'error',
'react/jsx-tag-spacing': 'error',
'react/jsx-uses-react': 'error',
'react/jsx-uses-vars': 'error',
'react/jsx-wrap-multilines': 'error',
'react/no-multi-comp': 'off',
'react/no-string-refs': 'error',
'react/prop-types': 'error',
'react/self-closing-comp': 'error',
'jsx-a11y/accessible-emoji': 'warn',
'jsx-a11y/alt-text': 'warn',
'jsx-a11y/anchor-has-content': 'warn',
'jsx-a11y/anchor-is-valid': [
'warn',
{
components: [
'Link',
'NavLink',
],
specialLink: [
'to',
],
aspect: [
'noHref',
'invalidHref',
'preferButton',
],
},
],
'jsx-a11y/aria-activedescendant-has-tabindex': 'warn',
'jsx-a11y/aria-props': 'warn',
'jsx-a11y/aria-proptypes': 'warn',
'jsx-a11y/aria-role': 'warn',
'jsx-a11y/aria-unsupported-elements': 'warn',
'jsx-a11y/heading-has-content': 'warn',
'jsx-a11y/html-has-lang': 'warn',
'jsx-a11y/iframe-has-title': 'warn',
'jsx-a11y/img-redundant-alt': 'warn',
'jsx-a11y/interactive-supports-focus': 'warn',
'jsx-a11y/label-has-for': 'off',
'jsx-a11y/mouse-events-have-key-events': 'warn',
'jsx-a11y/no-access-key': 'warn',
'jsx-a11y/no-distracting-elements': 'warn',
'jsx-a11y/no-noninteractive-element-interactions': [
'warn',
{
handlers: [
'onClick',
],
},
],
'jsx-a11y/no-onchange': 'warn',
'jsx-a11y/no-redundant-roles': 'warn',
'jsx-a11y/no-static-element-interactions': [
'warn',
{
handlers: [
'onClick',
],
},
],
'jsx-a11y/role-has-required-aria-props': 'warn',
'jsx-a11y/role-supports-aria-props': 'off',
'jsx-a11y/scope': 'warn',
'jsx-a11y/tabindex-no-positive': 'warn',
'import/extensions': [
'error',
'always',
{
js: 'never',
},
],
'import/newline-after-import': 'error',
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: [
'config/webpack/**',
'app/javascript/mastodon/test_setup.js',
'app/javascript/**/__tests__/**',
],
},
],
'import/no-unresolved': 'error',
'import/no-webpack-loader-syntax': 'error',
'promise/catch-or-return': 'error',
},
};
================================================
FILE: .foreman
================================================
procfile: Procfile.dev
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
*.eot -text
*.gif -text
*.gz -text
*.ico -text
*.jpg -text
*.mp3 -text
*.ogg -text
*.png -text
*.ttf -text
*.webm -text
*.woff -text
*.woff2 -text
spec/fixtures/requests/** -text !eol
================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
#
# If you find yourself ignoring temporary files generated by your text editor
# or operating system, you probably want to add a global ignore instead:
# git config --global core.excludesfile '~/.gitignore_global'
# Ignore bundler config and downloaded libraries.
/.bundle
/vendor/bundle
# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal
# Ignore all logfiles and tempfiles.
/log/*
!/log/.keep
/tmp
coverage
public/system
public/assets
public/packs
public/packs-test
.env
.env.production
node_modules/
build/
# Ignore Vagrant files
.vagrant/
# Ignore Capistrano customizations
config/deploy/*
# Ignore IDE files
.vscode/
.idea/
# Ignore postgres + redis + elasticsearch volume optionally created by docker-compose
postgres
redis
elasticsearch
# Ignore Apple files
.DS_Store
# Ignore vim files
*~
*.swp
# Ignore npm debug log
npm-debug.log
# Ignore yarn log files
yarn-error.log
yarn-debug.log
# Ignore Docker option files
docker-compose.override.yml
================================================
FILE: .haml-lint.yml
================================================
# Whether to ignore frontmatter at the beginning of HAML documents for
# frameworks such as Jekyll/Middleman
skip_frontmatter: false
exclude:
- 'vendor/**/*'
- 'spec/**/*'
- 'lib/templates/**/*'
- 'app/views/kaminari/**/*'
linters:
AltText:
enabled: false
ClassAttributeWithStaticValue:
enabled: true
ClassesBeforeIds:
enabled: true
ConsecutiveComments:
enabled: true
ConsecutiveSilentScripts:
enabled: true
max_consecutive: 2
EmptyObjectReference:
enabled: true
EmptyScript:
enabled: true
FinalNewline:
enabled: true
present: true
HtmlAttributes:
enabled: true
ImplicitDiv:
enabled: true
LeadingCommentSpace:
enabled: true
LineLength:
enabled: false
max: 80
MultilinePipe:
enabled: true
MultilineScript:
enabled: true
ObjectReferenceAttributes:
enabled: true
RuboCop:
enabled: true
# These cops are incredibly noisy when it comes to HAML templates, so we
# ignore them.
ignored_cops:
- Lint/BlockAlignment
- Lint/EndAlignment
- Lint/Void
- Metrics/BlockLength
- Metrics/LineLength
- Style/AlignParameters
- Style/BlockNesting
- Style/ElseAlignment
- Style/EndOfLine
- Style/FileName
- Style/FinalNewline
- Style/FrozenStringLiteralComment
- Style/IfUnlessModifier
- Style/IndentationWidth
- Style/Next
- Style/TrailingBlankLines
- Style/TrailingWhitespace
- Style/WhileUntilModifier
RubyComments:
enabled: true
SpaceBeforeScript:
enabled: true
SpaceInsideHashAttributes:
enabled: true
style: space
Indentation:
enabled: true
character: space # or tab
TagName:
enabled: true
TrailingWhitespace:
enabled: true
UnnecessaryInterpolation:
enabled: true
UnnecessaryStringOutput:
enabled: true
================================================
FILE: .nanoignore
================================================
.DS_Store
.git/
.gitignore
.bundle/
.cache/
config/deploy/*
coverage
docs/
.env
log/*.log
neo4j/
node_modules/
public/assets/
public/system/
spec/
tmp/
.vagrant/
vendor/bundle/
================================================
FILE: .nvmrc
================================================
8
================================================
FILE: .profile
================================================
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/.apt/lib/x86_64-linux-gnu:/app/.apt/usr/lib/x86_64-linux-gnu/mesa:/app/.apt/usr/lib/x86_64-linux-gnu/pulseaudio
================================================
FILE: .rspec
================================================
--color
--require spec_helper
--format Fuubar
================================================
FILE: .rubocop.yml
================================================
require:
- rubocop-rails
AllCops:
TargetRubyVersion: 2.3
Exclude:
- 'spec/**/*'
- 'db/**/*'
- 'app/views/**/*'
- 'config/**/*'
- 'bin/*'
- 'Rakefile'
- 'node_modules/**/*'
- 'Vagrantfile'
- 'vendor/**/*'
- 'lib/json_ld/*'
- 'lib/templates/**/*'
Bundler/OrderedGems:
Enabled: false
Layout/AccessModifierIndentation:
EnforcedStyle: indent
Layout/EmptyLineAfterMagicComment:
Enabled: false
Layout/SpaceInsideHashLiteralBraces:
EnforcedStyle: space
Metrics/AbcSize:
Max: 100
Metrics/BlockLength:
Max: 35
Exclude:
- 'lib/tasks/**/*'
Metrics/BlockNesting:
Max: 3
Metrics/ClassLength:
CountComments: false
Max: 300
Metrics/CyclomaticComplexity:
Max: 25
Metrics/LineLength:
AllowURI: true
Enabled: false
Metrics/MethodLength:
CountComments: false
Max: 55
Metrics/ModuleLength:
CountComments: false
Max: 200
Metrics/ParameterLists:
Max: 5
CountKeywordArgs: true
Metrics/PerceivedComplexity:
Max: 20
Naming/MemoizedInstanceVariableName:
Enabled: false
Rails:
Enabled: true
Rails/HasAndBelongsToMany:
Enabled: false
Rails/SkipsModelValidations:
Enabled: false
Rails/HttpStatus:
Enabled: false
Rails/Exit:
Exclude:
- 'lib/mastodon/*'
- 'lib/cli.rb'
Rails/HelperInstanceVariable:
Enabled: false
Style/ClassAndModuleChildren:
Enabled: false
Style/CollectionMethods:
Enabled: true
PreferredMethods:
find_all: 'select'
Style/Documentation:
Enabled: false
Style/DoubleNegation:
Enabled: true
Style/FrozenStringLiteralComment:
Enabled: true
Style/GuardClause:
Enabled: false
Style/Lambda:
Enabled: false
Style/PercentLiteralDelimiters:
PreferredDelimiters:
'%i': '()'
'%w': '()'
Style/PerlBackrefs:
AutoCorrect: false
Style/RegexpLiteral:
Enabled: false
Style/SymbolArray:
Enabled: false
Style/TrailingCommaInArrayLiteral:
EnforcedStyleForMultiline: 'comma'
Style/TrailingCommaInHashLiteral:
EnforcedStyleForMultiline: 'comma'
================================================
FILE: .ruby-version
================================================
2.6.1
================================================
FILE: .sass-lint.yml
================================================
# Linter Documentation:
# https://github.com/sasstools/sass-lint/tree/v1.13.1/docs/options
files:
include: app/javascript/styles/**/*.scss
ignore:
- app/javascript/styles/mastodon/reset.scss
rules:
# Disallows
no-color-literals: 0
no-css-comments: 0
no-duplicate-properties: 0
no-ids: 0
no-important: 0
no-mergeable-selectors: 0
no-misspelled-properties: 0
no-qualifying-elements: 0
no-transition-all: 0
no-vendor-prefixes: 0
# Nesting
force-element-nesting: 0
force-attribute-nesting: 0
force-pseudo-nesting: 0
# Name Formats
class-name-format: 0
leading-zero: 0
# Style Guide
attribute-quotes: 0
hex-length: 0
indentation: 0
nesting-depth: 0
property-sort-order: 0
quotes: 0
================================================
FILE: .slugignore
================================================
node_modules/
.cache/
docs/
spec/
================================================
FILE: .yarnclean
================================================
# test directories
__tests__
test
tests
powered-test
# asset directories
docs
doc
website
images
# assets
# examples
example
examples
# code coverage directories
coverage
.nyc_output
# build scripts
Makefile
Gulpfile.js
Gruntfile.js
# configs
.tern-project
.gitattributes
.editorconfig
.*ignore
.eslintrc
.jshintrc
.flowconfig
.documentup.json
.yarn-metadata.json
.*.yml
*.yml
# misc
*.gz
*.md
# for specific ignore
!.svgo.yml
!sass-lint/**/*.yml
================================================
FILE: AUTHORS.md
================================================
Authors
=======
Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon)
and provided thanks to the work of the following contributors:
* [Gargron](https://github.com/Gargron)
* [ykzts](https://github.com/ykzts)
* [ThibG](https://github.com/ThibG)
* [akihikodaki](https://github.com/akihikodaki)
* [mjankowski](https://github.com/mjankowski)
* [dependabot[bot]](https://github.com/apps/dependabot)
* [unarist](https://github.com/unarist)
* [m4sk1n](https://github.com/m4sk1n)
* [yiskah](https://github.com/yiskah)
* [nolanlawson](https://github.com/nolanlawson)
* [ysksn](https://github.com/ysksn)
* [sorin-davidoi](https://github.com/sorin-davidoi)
* [abcang](https://github.com/abcang)
* [lynlynlynx](https://github.com/lynlynlynx)
* [mayaeh](https://github.com/mayaeh)
* [renatolond](https://github.com/renatolond)
* [alpaca-tc](https://github.com/alpaca-tc)
* [nclm](https://github.com/nclm)
* [ineffyble](https://github.com/ineffyble)
* [jeroenpraat](https://github.com/jeroenpraat)
* [blackle](https://github.com/blackle)
* [Quent-in](https://github.com/Quent-in)
* [JantsoP](https://github.com/JantsoP)
* [Kjwon15](https://github.com/Kjwon15)
* [mabkenar](https://github.com/mabkenar)
* [nullkal](https://github.com/nullkal)
* [yookoala](https://github.com/yookoala)
* [shuheiktgw](https://github.com/shuheiktgw)
* [ashfurrow](https://github.com/ashfurrow)
* [zunda](https://github.com/zunda)
* [Quenty31](https://github.com/Quenty31)
* [eramdam](https://github.com/eramdam)
* [takayamaki](https://github.com/takayamaki)
* [masarakki](https://github.com/masarakki)
* [ticky](https://github.com/ticky)
* [danhunsaker](https://github.com/danhunsaker)
* [ThisIsMissEm](https://github.com/ThisIsMissEm)
* [hcmiya](https://github.com/hcmiya)
* [stephenburgess8](https://github.com/stephenburgess8)
* [Wonderfall](https://github.com/Wonderfall)
* [matteoaquila](https://github.com/matteoaquila)
* [yukimochi](https://github.com/yukimochi)
* [rkarabut](https://github.com/rkarabut)
* [Artoria2e5](https://github.com/Artoria2e5)
* [nightpool](https://github.com/nightpool)
* [marrus-sh](https://github.com/marrus-sh)
* [krainboltgreene](https://github.com/krainboltgreene)
* [pfigel](https://github.com/pfigel)
* [Aldarone](https://github.com/Aldarone)
* [BoFFire](https://github.com/BoFFire)
* [clworld](https://github.com/clworld)
* [dracos](https://github.com/dracos)
* [SerCom_KC](mailto:sercom-kc@users.noreply.github.com)
* [Sylvhem](https://github.com/Sylvhem)
* [MasterGroosha](https://github.com/MasterGroosha)
* [JeanGauthier](https://github.com/JeanGauthier)
* [kschaper](https://github.com/kschaper)
* [MaciekBaron](https://github.com/MaciekBaron)
* [MitarashiDango](mailto:mitarashidango@users.noreply.github.com)
* [beatrix-bitrot](https://github.com/beatrix-bitrot)
* [Aditoo17](https://github.com/Aditoo17)
* [adbelle](https://github.com/adbelle)
* [evanminto](https://github.com/evanminto)
* [MightyPork](https://github.com/MightyPork)
* [yhirano55](https://github.com/yhirano55)
* [rinsuki](https://github.com/rinsuki)
* [camponez](https://github.com/camponez)
* [hinaloe](https://github.com/hinaloe)
* [SerCom-KC](https://github.com/SerCom-KC)
* [aschmitz](https://github.com/aschmitz)
* [devkral](https://github.com/devkral)
* [fpiesche](https://github.com/fpiesche)
* [gandaro](https://github.com/gandaro)
* [johnsudaar](https://github.com/johnsudaar)
* [trebmuh](https://github.com/trebmuh)
* [Rakib Hasan](mailto:rmhasan@gmail.com)
* [ashleyhull-versent](https://github.com/ashleyhull-versent)
* [lindwurm](https://github.com/lindwurm)
* [victorhck](mailto:victorhck@geeko.site)
* [voidsatisfaction](https://github.com/voidsatisfaction)
* [hikari-no-yume](https://github.com/hikari-no-yume)
* [angristan](https://github.com/angristan)
* [seefood](https://github.com/seefood)
* [jackjennings](https://github.com/jackjennings)
* [spla](mailto:spla@mastodont.cat)
* [expenses](https://github.com/expenses)
* [walf443](https://github.com/walf443)
* [JoelQ](https://github.com/JoelQ)
* [mistydemeo](https://github.com/mistydemeo)
* [dunn](https://github.com/dunn)
* [xqus](https://github.com/xqus)
* [hugogameiro](https://github.com/hugogameiro)
* [ariasuni](https://github.com/ariasuni)
* [pfm-eyesightjp](https://github.com/pfm-eyesightjp)
* [fakenine](https://github.com/fakenine)
* [tsuwatch](https://github.com/tsuwatch)
* [victorhck](https://github.com/victorhck)
* [kedamaDQ](https://github.com/kedamaDQ)
* [puckipedia](https://github.com/puckipedia)
* [trwnh](https://github.com/trwnh)
* [fvh-P](https://github.com/fvh-P)
* [Anna e só](mailto:contraexemplos@gmail.com)
* [BenLubar](https://github.com/BenLubar)
* [kazu9su](https://github.com/kazu9su)
* [Komic](https://github.com/Komic)
* [lmorchard](https://github.com/lmorchard)
* [diomed](https://github.com/diomed)
* [Neetshin](mailto:neetshin@neetsh.in)
* [rainyday](https://github.com/rainyday)
* [ProgVal](https://github.com/ProgVal)
* [valentin2105](https://github.com/valentin2105)
* [yuntan](https://github.com/yuntan)
* [goofy-bz](mailto:goofy@babelzilla.org)
* [kadiix](https://github.com/kadiix)
* [kodacs](https://github.com/kodacs)
* [JMendyk](https://github.com/JMendyk)
* [KScl](https://github.com/KScl)
* [sterdev](https://github.com/sterdev)
* [TheKinrar](https://github.com/TheKinrar)
* [AA4ch1](https://github.com/AA4ch1)
* [alexgleason](https://github.com/alexgleason)
* [cpytel](https://github.com/cpytel)
* [northerner](https://github.com/northerner)
* [fhemberger](https://github.com/fhemberger)
* [greysteil](https://github.com/greysteil)
* [hensmith](https://github.com/hensmith)
* [d6rkaiz](https://github.com/d6rkaiz)
* [Reverite](https://github.com/Reverite)
* [JohnD28](https://github.com/JohnD28)
* [znz](https://github.com/znz)
* [marek-lach](https://github.com/marek-lach)
* [Naouak](https://github.com/Naouak)
* [pawelngei](https://github.com/pawelngei)
* [rtucker](https://github.com/rtucker)
* [reneklacan](https://github.com/reneklacan)
* [ekiru](https://github.com/ekiru)
* [noellabo](https://github.com/noellabo)
* [tcitworld](https://github.com/tcitworld)
* [geta6](https://github.com/geta6)
* [happycoloredbanana](https://github.com/happycoloredbanana)
* [leopku](https://github.com/leopku)
* [SansPseudoFix](https://github.com/SansPseudoFix)
* [tomfhowe](https://github.com/tomfhowe)
* [noraworld](https://github.com/noraworld)
* [theboss](https://github.com/theboss)
* [178inaba](https://github.com/178inaba)
* [alyssais](https://github.com/alyssais)
* [hiphref](https://github.com/hiphref)
* [stalker314314](https://github.com/stalker314314)
* [huertanix](https://github.com/huertanix)
* [genesixx](https://github.com/genesixx)
* [halkeye](https://github.com/halkeye)
* [treby](https://github.com/treby)
* [jpdevries](https://github.com/jpdevries)
* [gdpelican](https://github.com/gdpelican)
* [kmichl](https://github.com/kmichl)
* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
* [saper](https://github.com/saper)
* [nevillepark](https://github.com/nevillepark)
* [ornithocoder](https://github.com/ornithocoder)
* [pierreozoux](https://github.com/pierreozoux)
* [qguv](https://github.com/qguv)
* [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
* [sascha-sl](https://github.com/sascha-sl)
* [harukasan](https://github.com/harukasan)
* [stamak](https://github.com/stamak)
* [Technowix](mailto:technowix@users.noreply.github.com)
* [Zoeille](https://github.com/Zoeille)
* [Thor Harald Johansen](mailto:thj@thj.no)
* [0x70b1a5](https://github.com/0x70b1a5)
* [gled-rs](https://github.com/gled-rs)
* [Valentin_NC](mailto:valentin.ouvrard@nautile.sarl)
* [R0ckweb](https://github.com/R0ckweb)
* [caasi](https://github.com/caasi)
* [chr-1x](https://github.com/chr-1x)
* [esetomo](https://github.com/esetomo)
* [foxiehkins](https://github.com/foxiehkins)
* [hoodie](mailto:hoodiekitten@outlook.com)
* [luzi82](https://github.com/luzi82)
* [duxovni](https://github.com/duxovni)
* [tmm576](https://github.com/tmm576)
* [unsmell](https://github.com/unsmell)
* [valerauko](https://github.com/valerauko)
* [chriswmartin](https://github.com/chriswmartin)
* [vahnj](https://github.com/vahnj)
* [ikuradon](https://github.com/ikuradon)
* [AndreLewin](https://github.com/AndreLewin)
* [0xflotus](https://github.com/0xflotus)
* [redtachyons](https://github.com/redtachyons)
* [thurloat](https://github.com/thurloat)
* [aaribaud](https://github.com/aaribaud)
* [pointlessone](https://github.com/pointlessone)
* [Andrew](mailto:andrewlchronister@gmail.com)
* [estuans](https://github.com/estuans)
* [dissolve](https://github.com/dissolve)
* [PurpleBooth](https://github.com/PurpleBooth)
* [bradurani](https://github.com/bradurani)
* [wavebeem](https://github.com/wavebeem)
* [bruwalfas](https://github.com/bruwalfas)
* [foxsan48](https://github.com/foxsan48)
* [wchristian](https://github.com/wchristian)
* [muffinista](https://github.com/muffinista)
* [cdutson](https://github.com/cdutson)
* [farlistener](https://github.com/farlistener)
* [DavidLibeau](https://github.com/DavidLibeau)
* [ddevault](https://github.com/ddevault)
* [Fjoerfoks](https://github.com/Fjoerfoks)
* [fmauNeko](https://github.com/fmauNeko)
* [gloaec](https://github.com/gloaec)
* [Gomasy](https://github.com/Gomasy)
* [unstabler](https://github.com/unstabler)
* [potato4d](https://github.com/potato4d)
* [h-izumi](https://github.com/h-izumi)
* [ErikXXon](https://github.com/ErikXXon)
* [ian-kelling](https://github.com/ian-kelling)
* [immae](https://github.com/immae)
* [J0WI](https://github.com/J0WI)
* [foozmeat](https://github.com/foozmeat)
* [jasonrhodes](https://github.com/jasonrhodes)
* [Jason Snell](mailto:jason@newrelic.com)
* [jviide](https://github.com/jviide)
* [YuleZ](https://github.com/YuleZ)
* [crakaC](https://github.com/crakaC)
* [tkbky](https://github.com/tkbky)
* [Kaylee](mailto:kaylee@codethat.sucks)
* [Kazhnuz](https://github.com/Kazhnuz)
* [connyduck](https://github.com/connyduck)
* [Lindsey Bieda](mailto:lindseyb@users.noreply.github.com)
* [Lorenz Diener](mailto:halcyon@icosahedron.website)
* [alimony](https://github.com/alimony)
* [mig5](https://github.com/mig5)
* [moritzheiber](https://github.com/moritzheiber)
* [ndarville](https://github.com/ndarville)
* [Abzol](https://github.com/Abzol)
* [pwoolcoc](https://github.com/pwoolcoc)
* [xPaw](https://github.com/xPaw)
* [petzah](https://github.com/petzah)
* [ignisf](https://github.com/ignisf)
* [raymestalez](https://github.com/raymestalez)
* [remram44](https://github.com/remram44)
* [sts10](https://github.com/sts10)
* [u1-liquid](https://github.com/u1-liquid)
* [sim6](https://github.com/sim6)
* [Sir-Boops](https://github.com/Sir-Boops)
* [stemid](https://github.com/stemid)
* [sumdog](https://github.com/sumdog)
* [ThomasLeister](https://github.com/ThomasLeister)
* [mcat-ee](https://github.com/mcat-ee)
* [tototoshi](https://github.com/tototoshi)
* [TrashMacNugget](https://github.com/TrashMacNugget)
* [VirtuBox](https://github.com/VirtuBox)
* [Vladyslav](mailto:vaden@tuta.io)
* [kaniini](https://github.com/kaniini)
* [vayan](https://github.com/vayan)
* [yannicka](https://github.com/yannicka)
* [ikasoumen](https://github.com/ikasoumen)
* [zacanger](https://github.com/zacanger)
* [amazedkoumei](https://github.com/amazedkoumei)
* [anon5r](https://github.com/anon5r)
* [aus-social](https://github.com/aus-social)
* [imbsky](https://github.com/imbsky)
* [bsky](mailto:me@imbsky.net)
* [codl](https://github.com/codl)
* [cpsdqs](https://github.com/cpsdqs)
* [barzamin](https://github.com/barzamin)
* [fhalna](https://github.com/fhalna)
* [haoyayoi](https://github.com/haoyayoi)
* [ik11235](https://github.com/ik11235)
* [kawax](https://github.com/kawax)
* [007lva](https://github.com/007lva)
* [mbajur](https://github.com/mbajur)
* [matsurai25](https://github.com/matsurai25)
* [mecab](https://github.com/mecab)
* [nicobz25](https://github.com/nicobz25)
* [oliverkeeble](https://github.com/oliverkeeble)
* [pinfort](https://github.com/pinfort)
* [rbaumert](https://github.com/rbaumert)
* [rhoio](https://github.com/rhoio)
* [usagi-f](https://github.com/usagi-f)
* [vidarlee](https://github.com/vidarlee)
* [vjackson725](https://github.com/vjackson725)
* [wxcafe](https://github.com/wxcafe)
* [新都心(Neet Shin)](mailto:nucx@dio-vox.com)
* [cygnan](https://github.com/cygnan)
* [Awea](https://github.com/Awea)
* [halcy](https://github.com/halcy)
* [naaaaaaaaaaaf](https://github.com/naaaaaaaaaaaf)
* [8398a7](https://github.com/8398a7)
* [857b](https://github.com/857b)
* [insom](https://github.com/insom)
* [tachyons](https://github.com/tachyons)
* [acid-chicken](https://github.com/acid-chicken)
* [Esteth](https://github.com/Esteth)
* [unascribed](https://github.com/unascribed)
* [Aguay-val](https://github.com/Aguay-val)
* [Akihiko Odaki](mailto:nekomanma@pixiv.co.jp)
* [knu](https://github.com/knu)
* [h3poteto](https://github.com/h3poteto)
* [unleashed](https://github.com/unleashed)
* [alxrcs](https://github.com/alxrcs)
* [console-cowboy](https://github.com/console-cowboy)
* [Alkarex](https://github.com/Alkarex)
* [a2](https://github.com/a2)
* [0xa](https://github.com/0xa)
* [palindromordnilap](https://github.com/palindromordnilap)
* [virtualpain](https://github.com/virtualpain)
* [sapphirus](https://github.com/sapphirus)
* [amandavisconti](https://github.com/amandavisconti)
* [ameliavoncat](https://github.com/ameliavoncat)
* [ilpianista](https://github.com/ilpianista)
* [Andreas Drop](mailto:andy@remline.de)
* [andi1984](https://github.com/andi1984)
* [schas002](https://github.com/schas002)
* [contraexemplo](https://github.com/contraexemplo)
* [abackstrom](https://github.com/abackstrom)
* [armandfardeau](https://github.com/armandfardeau)
* [jumbosushi](https://github.com/jumbosushi)
* [aurelien-reeves](https://github.com/aurelien-reeves)
* [ayumin](https://github.com/ayumin)
* [BaptisteGelez](https://github.com/BaptisteGelez)
* [bzg](https://github.com/bzg)
* [benediktg](https://github.com/benediktg)
* [blakebarnett](https://github.com/blakebarnett)
* [bradj](https://github.com/bradj)
* [brycied00d](https://github.com/brycied00d)
* [carlosjs23](https://github.com/carlosjs23)
* [cgxxx](https://github.com/cgxxx)
* [kibitan](https://github.com/kibitan)
* [chrisheninger](https://github.com/chrisheninger)
* [chris-martin](https://github.com/chris-martin)
* [DoubleMalt](https://github.com/DoubleMalt)
* [Moosh-be](https://github.com/Moosh-be)
* [Motoma](https://github.com/Motoma)
* [chriswk](https://github.com/chriswk)
* [csu](https://github.com/csu)
* [clarfon](https://github.com/clarfon)
* [kklleemm](https://github.com/kklleemm)
* [colindean](https://github.com/colindean)
* [dachinat](https://github.com/dachinat)
* [multiple-creatures](https://github.com/multiple-creatures)
* [watilde](https://github.com/watilde)
* [daprice](https://github.com/daprice)
* [dar5hak](https://github.com/dar5hak)
* [kant](https://github.com/kant)
* [maxolasersquad](https://github.com/maxolasersquad)
* [singingwolfboy](https://github.com/singingwolfboy)
* [davidcelis](https://github.com/davidcelis)
* [davefp](https://github.com/davefp)
* [yipdw](https://github.com/yipdw)
* [debanshuk](https://github.com/debanshuk)
* [Derek Lewis](mailto:derekcecillewis@gmail.com)
* [dblandin](https://github.com/dblandin)
* [Drew Gates](mailto:aranaur@users.noreply.github.com)
* [dtschust](https://github.com/dtschust)
* [Dryusdan](https://github.com/Dryusdan)
* [eai04191](https://github.com/eai04191)
* [d3vgru](https://github.com/d3vgru)
* [Elizafox](https://github.com/Elizafox)
* [enewhuis](https://github.com/enewhuis)
* [ericblade](https://github.com/ericblade)
* [mikoim](https://github.com/mikoim)
* [espenronnevik](https://github.com/espenronnevik)
* [Finariel](https://github.com/Finariel)
* [siuying](https://github.com/siuying)
* [zoc](https://github.com/zoc)
* [fwenzel](https://github.com/fwenzel)
* [GenbuHase](https://github.com/GenbuHase)
* [hattori6789](https://github.com/hattori6789)
* [algernon](https://github.com/algernon)
* [Fastbyte01](https://github.com/Fastbyte01)
* [myfreeweb](https://github.com/myfreeweb)
* [gfaivre](https://github.com/gfaivre)
* [Fiaxhs](https://github.com/Fiaxhs)
* [reedcourty](https://github.com/reedcourty)
* [anneau](https://github.com/anneau)
* [lanodan](https://github.com/lanodan)
* [Harmon758](https://github.com/Harmon758)
* [HellPie](https://github.com/HellPie)
* [Habu-Kagumba](https://github.com/Habu-Kagumba)
* [suzukaze](https://github.com/suzukaze)
* [Hiromi-Kai](https://github.com/Hiromi-Kai)
* [hishamhm](https://github.com/hishamhm)
* [musashino205](https://github.com/musashino205)
* [iwaim](https://github.com/iwaim)
* [valrus](https://github.com/valrus)
* [IMcD23](https://github.com/IMcD23)
* [yi0713](https://github.com/yi0713)
* [iblech](https://github.com/iblech)
* [usbsnowcrash](https://github.com/usbsnowcrash)
* [jack-michaud](https://github.com/jack-michaud)
* [Floppy](https://github.com/Floppy)
* [loomchild](https://github.com/loomchild)
* [jenkr55](https://github.com/jenkr55)
* [press5](https://github.com/press5)
* [TrollDecker](https://github.com/TrollDecker)
* [jmontane](https://github.com/jmontane)
* [jonathanklee](https://github.com/jonathanklee)
* [jguerder](https://github.com/jguerder)
* [Jehops](https://github.com/Jehops)
* [joshuap](https://github.com/joshuap)
* [Tiwy57](https://github.com/Tiwy57)
* [xuv](https://github.com/xuv)
* [June Sallou](mailto:jnsll@users.noreply.github.com)
* [j0k3r](https://github.com/j0k3r)
* [KEINOS](https://github.com/KEINOS)
* [futoase](https://github.com/futoase)
* [Pneumaticat](https://github.com/Pneumaticat)
* [Kit Redgrave](mailto:qwertyitis@gmail.com)
* [Knut Erik](mailto:abjectio@users.noreply.github.com)
* [mkody](https://github.com/mkody)
* [k0ta0uchi](https://github.com/k0ta0uchi)
* [KrzysiekJ](https://github.com/KrzysiekJ)
* [leowzukw](https://github.com/leowzukw)
* [Tak](https://github.com/Tak)
* [cacheflow](https://github.com/cacheflow)
* [ldidry](https://github.com/ldidry)
* [jemus42](https://github.com/jemus42)
* [lfuelling](https://github.com/lfuelling)
* [Grabacr07](https://github.com/Grabacr07)
* [mistermantas](https://github.com/mistermantas)
* [mareklach](https://github.com/mareklach)
* [wirehack7](https://github.com/wirehack7)
* [martymcguire](https://github.com/martymcguire)
* [marvinkopf](https://github.com/marvinkopf)
* [otsune](https://github.com/otsune)
* [mbugowski](https://github.com/mbugowski)
* [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com)
* [matt-auckland](https://github.com/matt-auckland)
* [webroo](https://github.com/webroo)
* [matthiasbeyer](https://github.com/matthiasbeyer)
* [mattjmattj](https://github.com/mattjmattj)
* [mtparet](https://github.com/mtparet)
* [maximeborges](https://github.com/maximeborges)
* [minacle](https://github.com/minacle)
* [michaeljdeeb](https://github.com/michaeljdeeb)
* [Themimitoof](https://github.com/Themimitoof)
* [cyweo](https://github.com/cyweo)
* [Midgard](mailto:m1dgard@users.noreply.github.com)
* [mike-burns](https://github.com/mike-burns)
* [verymilan](https://github.com/verymilan)
* [milmazz](https://github.com/milmazz)
* [premist](https://github.com/premist)
* [Mnkai](https://github.com/Mnkai)
* [mitchhentges](https://github.com/mitchhentges)
* [mouse-reeve](https://github.com/mouse-reeve)
* [Mozinet-fr](https://github.com/Mozinet-fr)
* [lae](https://github.com/lae)
* [nosada](https://github.com/nosada)
* [Nanamachi](https://github.com/Nanamachi)
* [orinthe](https://github.com/orinthe)
* [NecroTechno](https://github.com/NecroTechno)
* [Dar13](https://github.com/Dar13)
* [ngerakines](https://github.com/ngerakines)
* [vonneudeck](https://github.com/vonneudeck)
* [Ninetailed](https://github.com/Ninetailed)
* [k24](https://github.com/k24)
* [noiob](https://github.com/noiob)
* [kwaio](https://github.com/kwaio)
* [norayr](https://github.com/norayr)
* [joyeusenoelle](https://github.com/joyeusenoelle)
* [OlivierNicole](https://github.com/OlivierNicole)
* [noppa](https://github.com/noppa)
* [Otakan951](https://github.com/Otakan951)
* [fahy](https://github.com/fahy)
* [PatrickRWells](mailto:32802366+patrickrwells@users.noreply.github.com)
* [Paul](mailto:naydex.mc+github@gmail.com)
* [Pete Keen](mailto:pete@petekeen.net)
* [Pierre-Morgan Gate](mailto:pgate@users.noreply.github.com)
* [Ratmir Karabut](mailto:rkarabut@sfmodern.ru)
* [Reto Kromer](mailto:retokromer@users.noreply.github.com)
* [Rey Tucker](mailto:git@reytucker.us)
* [Rob Watson](mailto:rfwatson@users.noreply.github.com)
* [Ryan Freebern](mailto:ryan@freebern.org)
* [Ryan Wade](mailto:ryan.wade@protonmail.com)
* [Ryo Kajiwara](mailto:kfe-fecn6.prussian@s01.info)
* [S.H](mailto:gamelinks007@gmail.com)
* [Sadiq Saif](mailto:staticsafe@users.noreply.github.com)
* [Sam Hewitt](mailto:hewittsamuel@gmail.com)
* [Satoshi KOJIMA](mailto:skoji@mac.com)
* [ScienJus](mailto:i@scienjus.com)
* [Scott Larkin](mailto:scott@codeclimate.com)
* [Sebastian Hübner](mailto:imolein@users.noreply.github.com)
* [Sebastian Morr](mailto:sebastian@morr.cc)
* [Sergei Č](mailto:noiwex1911@gmail.com)
* [Setuu](mailto:yuki764setuu@gmail.com)
* [Shaun Gillies](mailto:me@shaungillies.net)
* [Shin Adachi](mailto:shn@glucose.jp)
* [Shin Kojima](mailto:shin@kojima.org)
* [Sho Kusano](mailto:rosylilly@aduca.org)
* [Shouko Yu](mailto:imshouko@gmail.com)
* [Sina Mashek](mailto:sina@mashek.xyz)
* [Soshi Kato](mailto:mail@sossii.com)
* [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
* [Stanislas](mailto:angristan@pm.me)
* [StefOfficiel](mailto:pichard.stephane@free.fr)
* [Steven Tappert](mailto:admin@dark-it.net)
* [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com)
* [Sébastien Santoro](mailto:dereckson@espace-win.org)
* [Tad Thorley](mailto:phaedryx@users.noreply.github.com)
* [Takayoshi Nishida](mailto:takayoshi.nishida@gmail.com)
* [Takayuki KUSANO](mailto:github@tkusano.jp)
* [TakesxiSximada](mailto:takesxi.sximada@gmail.com)
* [TheInventrix](mailto:theinventrix@users.noreply.github.com)
* [Thomas Alberola](mailto:thomas@needacoffee.fr)
* [Toby Deshane](mailto:fortyseven@users.noreply.github.com)
* [Toby Pinder](mailto:gigitrix@gmail.com)
* [Tomonori Murakami](mailto:crosslife777@gmail.com)
* [TomoyaShibata](mailto:wind.of.hometown@gmail.com)
* [Treyssat-Vincent Nino](mailto:treyssatvincent@users.noreply.github.com)
* [Udo Kramer](mailto:optik@fluffel.io)
* [Una](mailto:una@unascribed.com)
* [Ushitora Anqou](mailto:ushitora_anqou@yahoo.co.jp)
* [Valentin Lorentz](mailto:progval+git@progval.net)
* [Vladimir Mincev](mailto:vladimir@canicinteractive.com)
* [Waldir Pimenta](mailto:waldyrious@gmail.com)
* [Wesley Ellis](mailto:tahnok@gmail.com)
* [Wiktor](mailto:wiktor@metacode.biz)
* [Wonderfall](mailto:wonderfall@schrodinger.io)
* [YDrogen](mailto:ydrogen45@gmail.com)
* [YMHuang](mailto:ymhuang@fmbase.tw)
* [YOSHIOKA Eiichiro](mailto:yoshioka.eiichiro@gmail.com)
* [YOU](mailto:stackexchange.you@gmail.com)
* [YaQ](mailto:i_k_o_m_a_7@yahoo.co.jp)
* [Yanaken](mailto:yanakend@gmail.com)
* [Yann Klis](mailto:yann.klis@gmail.com)
* [Yeechan Lu](mailto:wz.bluesnow@gmail.com)
* [Yusuke Abe](mailto:moonset20@gmail.com)
* [Zachary Spector](mailto:logicaldash@gmail.com)
* [ZiiX](mailto:ziix@users.noreply.github.com)
* [asria-jp](mailto:is@alicematic.com)
* [ava](mailto:vladooku@users.noreply.github.com)
* [benklop](mailto:benklop@gmail.com)
* [bsky](mailto:git@imbsky.net)
* [caesarologia](mailto:lopesgemelli.1@gmail.com)
* [cbayerlein](mailto:c.bayerlein@gmail.com)
* [chrolis](mailto:chrolis@users.noreply.github.com)
* [cormo](mailto:cormorant2+github@gmail.com)
* [d0p1](mailto:dopi-sama@hush.com)
* [evilny0](mailto:evilny0@moomoocamp.net)
* [febrezo](mailto:felixbrezo@gmail.com)
* [fsubal](mailto:fsubal@users.noreply.github.com)
* [fusshi-](mailto:dikky1218@users.noreply.github.com)
* [gentaro](mailto:gentaroooo@gmail.com)
* [gol-cha](mailto:info@mevo.xyz)
* [hakoai](mailto:hk--76@qa2.so-net.ne.jp)
* [haosbvnker](mailto:github@chaosbunker.com)
* [isati](mailto:phil@juchnowi.cz)
* [jacob](mailto:jacobherringtondeveloper@gmail.com)
* [jenn kaplan](mailto:me@jkap.io)
* [jirayudech](mailto:jirayudech@gmail.com)
* [jomo](mailto:github@jomo.tv)
* [jooops](mailto:joops@autistici.org)
* [jukper](mailto:jukkaperanto@gmail.com)
* [jumoru](mailto:jumoru@mailbox.org)
* [karlyeurl](mailto:karl.yeurl@gmail.com)
* [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
* [kodai](mailto:shirafuta.kodai@gmail.com)
* [koyu](mailto:me@koyu.space)
* [kuro5hin](mailto:rusty@kuro5hin.org)
* [luzpaz](mailto:luzpaz@users.noreply.github.com)
* [maxypy](mailto:maxime@mpigou.fr)
* [mhe](mailto:mail@marcus-herrmann.com)
* [mike castleman](mailto:m@mlcastle.net)
* [mimikun](mailto:dzdzble_effort_311@outlook.jp)
* [mohemohe](mailto:mohemohe@users.noreply.github.com)
* [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
* [muan](mailto:muan@github.com)
* [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
* [neetshin](mailto:neetshin@neetsh.in)
* [rch850](mailto:rich850@gmail.com)
* [roikale](mailto:roikale@users.noreply.github.com)
* [rysiekpl](mailto:rysiek@hackerspace.pl)
* [saturday06](mailto:dyob@lunaport.net)
* [scriptjunkie](mailto:scriptjunkie@scriptjunkie.us)
* [seekr](mailto:mario.drs@gmail.com)
* [sundevour](mailto:31990469+sundevour@users.noreply.github.com)
* [syui](mailto:syui@users.noreply.github.com)
* [tackeyy](mailto:mailto.takita.yusuke@gmail.com)
* [tateisu](mailto:tateisu@gmail.com)
* [tmyt](mailto:shigure@refy.net)
* [trevDev()](mailto:trev@trevdev.ca)
* [utam0k](mailto:k0ma@utam0k.jp)
* [vpzomtrrfrt](mailto:vpzomtrrfrt@gmail.com)
* [walfie](mailto:walfington@gmail.com)
* [y-temp4](mailto:y.temp4@gmail.com)
* [ymmtmdk](mailto:ymmtmdk@gmail.com)
* [yoshipc](mailto:yoooo@yoshipc.net)
* [Özcan Zafer AYAN](mailto:ozcanzaferayan@gmail.com)
* [ばん](mailto:detteiu0321@gmail.com)
* [みたらしだんご](mailto:mitarashidango@users.noreply.github.com)
* [りんすき](mailto:6533808+rinsuki@users.noreply.github.com)
* [ヨイツの賢狼ホロ | 3rd style](mailto:horo@yoitsu.moe)
* [猫吸血鬼ディフリス / 猫ロキP](mailto:deflis@gmail.com)
* [艮 鮟鱇](mailto:ushitora_anqou@yahoo.co.jp)
* [西小倉宏信](mailto:nishiko@mindia.jp)
* [雨宮美羽](mailto:k737566@gmail.com)
This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead.
## Translators
Following people have contributed to translation of Mastodon:
- **Albanian**
- Besnik Bleta
- Aditoo
- **Arabic**
- ButterflyOfFire
- Aditoo
- Amrz0
- **Asturian**
- ButterflyOfFire
- Enol P.
- Aditoo
- **Basque**
- Osoitz
- Aditoo
- Aitzol
- ButterflyOfFire
- Peru Iparragirre
- Gorka Azkarate
- **Bengali**
- dxwc
- **Bulgarian**
- ButterflyOfFire
- Aditoo
- **Catalan**
- spla
- Aditoo
- ButterflyOfFire
- Joan Montané
- Jose Luis
- **Chinese (Hong Kong)**
- ButterflyOfFire
- Luzi Leung
- Aditoo
- **Chinese (Simplified)**
- Allen Zhong
- ButterflyOfFire
- SerCom_KC
- martialarts
- Kaitian Xie
- Aditoo
- pan93412
- **Chinese (Traditional)**
- Aditoo
- ButterflyOfFire
- James58899
- pan93412
- S1ttidoe477
- SHA265
- Jeff Huang
- **Corsican**
- Alix D. R.
- Aditoo
- ButterflyOfFire
- **Croatian**
- ButterflyOfFire
- Aditoo
- **Czech**
- Aditoo
- Marek Ľach
- ButterflyOfFire
- **Danish**
- Einhjeriar
- Rasmus Sæderup
- Aditoo
- ButterflyOfFire
- **Dutch**
- Albakham
- ButterflyOfFire
- jeroenpraat
- rscmbbng
- Aditoo
- Jelv
- **English**
- ButterflyOfFire
- Renato "Lond" Cerqueira
- **English (United Kingdom)**
- Albakham
- **Esperanto**
- Aditoo
- ButterflyOfFire
- Becci Cat
- Jeong Arm
- Mélanie Chauvel
- Vanege
- Martin Bodin
- tuxayo/Victor Grousset
- **Finnish**
- ButterflyOfFire
- Mikko Poussu
- Taru Luojola
- S Heija
- Aditoo
- Jonne Arjoranta
- **French**
- Albakham
- Alix D. R.
- ButterflyOfFire
- codl
- Leia
- Alda Marteau-Hardi
- Mélanie Chauvel
- Paul Marques Mota
- azenet
- Olivier Humbert
- Aditoo
- Jonathan Chan
- Letiteuf55
- Baptiste Jonglez
- goofy-mdn
- Jean-Baptiste Holcroft
- Technowix
- Martin Bodin
- Théodore
- Thibaut Girka
- Franck Paul
- Sylvhem
- **Galician**
- ButterflyOfFire
- Xose M.
- Aditoo
- manequim
- **Georgian**
- ButterflyOfFire
- Aditoo
- **German**
- Aditoo
- ButterflyOfFire
- Daniel
- averageunicorn
- Koyu Berteon
- larsreineke
- koyu
- Austin Jones
- lilo
- Benedikt Geißler
- ePirat
- Eugen Rochko
- Weblate Admin
- Patrick Figel
- **Greek**
- Dimitris Maroulidis
- Antonis
- Aditoo
- ButterflyOfFire
- Konstantinos Grevenitis
- **Hebrew**
- ButterflyOfFire
- Aditoo
- Ira
- Yaron Shahrabani
- **Hungarian**
- ButterflyOfFire
- Adam Paszternak
- Aditoo
- Tibike Miklós
- **Ido**
- ButterflyOfFire
- Aditoo
- **Indonesian**
- afachri
- ButterflyOfFire
- Dito Kurnia Pratama
- Eirworks
- Aditoo
- Alfiana Sibuea
- se7entime
- **Irish**
- Albakham
- Kevin Houlihan
- **Italian**
- Alessandro Levati
- Albakham
- ButterflyOfFire
- Marcin Mikołajczak
- Aditoo
- Giuseppe Pignataro
- Stefano
- **Japanese**
- Hinaloe
- 小鳥遊まりあ
- mayaeh
- osapon
- 森の子リスのミーコの大冒険
- Kumasun Morino
- Yamagishi Kazutoshi
- Aditoo
- ButterflyOfFire
- Jeong Arm
- unarist
- **Kazakh**
- arshat
- Aditoo
- **Korean**
- Aditoo
- Jeong Arm
- ButterflyOfFire
- Minori Hiraoka
- Yamagishi Kazutoshi
- **Lithuanian**
- Sarunas Medeikis
- **Malay**
- Muhammad Nur Hidayat (MNH48)
- Aditoo
- ButterflyOfFire
- **Norwegian (old code)**
- ButterflyOfFire
- Espen Rønnevik
- Aditoo
- Tale
- **Occitan**
- Aditoo
- ButterflyOfFire
- Quenti2
- Quentí
- Maxenç
- **Persian**
- Masoud Abkenar
- Aditoo
- ButterflyOfFire
- **Polish**
- Aditoo
- Albakham
- ButterflyOfFire
- Stasiek Michalski
- Marcin Mikołajczak
- Jakub Mendyk
- Marek Ľach
- krkk
- **Portuguese**
- Albakham
- João Pinheiro
- manequim
- Aditoo
- ButterflyOfFire
- Hugo Gameiro
- **Portuguese (Brazil)**
- Aditoo
- Albakham
- Anna e só
- Renato "Lond" Cerqueira
- André Andrade
- ButterflyOfFire
- **Romanian**
- adrianbblk
- ButterflyOfFire
- Aditoo
- **Russian**
- Albakham
- ButterflyOfFire
- Evgeny Petrov
- Aditoo
- Павел Гастелло
- Andrew Zyabin
- Yaron Shahrabani
- **Serbian**
- Branko Kokanovic
- Burekz Finezt
- Aditoo
- ButterflyOfFire
- **Serbian (latin)**
- ButterflyOfFire
- Aditoo
- **Slovak**
- Aditoo
- ButterflyOfFire
- Ivan Pleva
- Marek Ľach
- Peter
- **Slovenian**
- Kristijan Tkalec
- Aditoo
- ButterflyOfFire
- **Spanish**
- Albakham
- ButterflyOfFire
- Carlos Mondragon
- Antón López
- Max Winkler
- Pablo de la Concepción Sanz
- Sergio Soriano
- Angeles Broullón
- Lothar Wolf
- Aditoo
- David Charte
- Emmanuel
- **Swedish**
- ButterflyOfFire
- Isak Holmström
- Shellkr
- Aditoo
- Elias Mårtenson
- Stefan Midjich
- Tim Stahel
- Jonas Hultén
- **Telugu**
- avndp
- Ranjith Tellakula
- Aditoo
- ButterflyOfFire
- Joseph Nuthalapati
- **Thai**
- ButterflyOfFire
- parnikkapore
- Thai Localization
- Aditoo
- **Turkish**
- Ali Demirtas
- ButterflyOfFire
- Aditoo
- **Ukrainian**
- alexcleac
- ButterflyOfFire
- Aditoo
- Ivan Verchenko
- **Welsh**
- carl morris
- Jaz-Michael King
- Owain Rhys Lewis
- Rhoslyn Prys
- Aditoo
- ButterflyOfFire
- Renato "Lond" Cerqueira
- Albakham
- Kevin Beynon
- **Armenian**
- Aditoo
- ButterflyOfFire
- **Latvian**
- Aditoo
- ButterflyOfFire
- Maigonis
- **Tamil**
- Aditoo
- ButterflyOfFire
- Prasanna Venkadesh
================================================
FILE: Aptfile
================================================
ffmpeg
libicu[0-9][0-9]
libicu-dev
libidn11
libidn11-dev
libpq-dev
libprotobuf-dev
libssl-dev
libxdamage1
libxfixes3
protobuf-compiler
zlib1g-dev
libcairo2
libcroco3
libdatrie1
libgdk-pixbuf2.0-0
libgraphite2-3
libharfbuzz0b
libpango-1.0-0
libpangocairo-1.0-0
libpangoft2-1.0-0
libpixman-1-0
librsvg2-2
libthai-data
libthai0
libvpx5
libxcb-render0
libxcb-shm0
libxrender1
================================================
FILE: CHANGELOG.md
================================================
# Changelog
This changelog will only include differences from upstream Mastodon. [You can find the upstream
changelog here.](https://github.com/tootsuite/mastodon/blob/master/CHANGELOG.md)
Please note that this project doesn't follow semantic versioning— for details please have a look at
our [README file].
[README file]: ./README.md
## Pre-Release 0.1.2 [2019-08-18 / v0.0.1.2]
This release fixes a bug from 0.1.1 before the 0.2.0 release.
It doesn't add any upstream changes, and is still based off of [Mastodon 2.9.0] plus the commits
up to [65efe892cf].
### Fixed
* Toot and biography lengths are offered as integers in the API instead of strings
* Thanks to [mthld] and [DagAgren] for finding the bug
* Thanks to [1011X] for the fix
[mthld]: https://github.com/mthld
[DagAgren]: https://github.com/DagAgren
## Pre-Release 0.1.1 [2019-07-28 / v0.0.1.1]
This release fixes a few bugs from 0.1.0 before the 0.2.0 release.
It doesn't add any upstream changes, and is still based off of [Mastodon 2.9.0] plus the commits
up to [65efe892cf].
### Fixed
* Toot and biography lengths are now on /api/v1/instance API, for better app integration
* Thanks to [ElliotBerriot] for testing 0.1.0 and finding the bug
* Thanks to [1011X] for the fix
* Toot and biography lengths can actually be saved in the admin UI
* Thanks to [ElliotBerriot] for testing 0.1.0 and finding the bug
* Thanks to [clarfon] for the fix
* All of the code has been fixed to include the proper project URL and docker image
* Thanks to [ElliotBerriot] for debugging 0.1.0 and finding the errors with the Docker files
* Thanks to [clarfon] for the fix
* Broadcasted version has been reverted to the Mastodon version, so that mastodon.py and other
libraries work until we find a better solution
* Thanks to [Frinkel] for testing 0.1.0 and finding the bug
* Thanks to [halcy] for providing insight into how mastodon.py works
* Thanks to [1011X] for the fix
* Blocking entire instance domains now gives a less judgmental message in the English locale
* Thanks to [TrechNex] for the fix
* Thanks to [mal0ki] and [clarfon] for reviewing the wording
* Florence-specific settings have been translated into Dutch
* Thanks to [rscmbbng] for the translations
* The [lastest typo] in the README was corrected
* Thanks to [ciderpunx] for the fix
* A few dependencies were updated to fix various security issues
* Prototype pollution vulnerabilities were fixed for handlebars and lodash
* Thanks to [1011X] for future-proofing CVE-2015-9284 (OAuth vulnerability)
[lastest typo]: https://github.com/florence-social/mastodon-fork/pull/106/files
[ciderpunx]: https://github.com/ciderpunx
[ElliotBerriot]: https://github.com/ElliotBerriot
[Frinkel]: https://github.com/Frinkel
[halcy]: https://github.com/halcy
[mal0ki]: https://github.com/mal0ki
[rscmbbng]: https://github.com/rscmbbng
[TrechNex]: https://github.com/TrechNex
### Special Thanks
* Thank you to everyone who jumped on the Florence train and set up their own instances! We'll try
and compile a list of Florence Mastodon instances some time before the next release.
* Thank you to @TrechNex for helping set up [installation instructions] on his website!
[installation instructions]: https://bobbymoss.com/index.html#install-florence-prerelease
## Pre-Release 0.1.0 [2019-06-18 / v0.0.1.0]
This release is based off of [Mastodon 2.9.0] plus the commits up to [65efe892cf].
[Mastodon 2.9.0]: https://github.com/tootsuite/mastodon/blob/v2.9.0/CHANGELOG.md
[65efe892cf]: https://github.com/tootsuite/mastodon/compare/c9eeb2e832b5b36a86028bbec7a353c32be510a7..65efe892cf56cd4f998de885bccc36e9231d8144
### Added
* Toot length can now be configured by an admin; default is 500
* Thanks to glitch.social and many other forks for the original code
* Thanks to [usbsnowcrash] for the Florence-specific code
* Thanks to [m4sk1n] for the Polish translation
* Thanks to [clarfon] and [Feufochmar] for the French translation
* Thanks to [1011X] and [skrlet13] for the Spanish translation
* Biography length can now be configured by an admin; default is 500
* Thanks to glitch.social and many other forks for the original code
* Thanks to [usbsnowcrash] for the Florence-specific code
* Thanks to [clarfon] and [Feufochmar] for the French translation
* Thanks to [1011X] and [skrlet13] for the Spanish translation
* Users can choose whether to receive DMs on the home timeline in their settings
* Thanks to glitch.social and many other forks for the original code
* Thanks to [usbsnowcrash] for the Florence-specific code
* Thanks to [clarfon] and [Feufochmar] for the French translation
* Thanks to [1011X] and [skrlet13] for the Spanish translation
* Spanish translations were updated to be more formal
* Thanks to [1011X] for the inital changes
* Thanks to [skrlet13] for offering feedback and further changes
[1011X]: https://github.com/1011X
[clarfon]: https://github.com/clarfon
[Feufochmar]: https://github.com/Feufochmar
[m4sk1n]: https://github.com/m4sk1n
[skrlet13]: https://github.com/skrlet13
[usbsnowcrash]: https://github.com/usbsnowcrash
### Special Thanks
* Thank you to @1011x, @jhaye, @lightdark, @maloki, @skrlet13, @melody, @stolas, @hak, @mecaka:
those who've been helping with governance, offering advice, and/or been working on this for the
past few months.
* Thank you to @woozle for hosting both the Wiki and Mattermost for us on their servers.
* Thank you to all the forkers out there who are providing us both with inspiration, actual code,
and conversation about how we can make the Fediverse a little bit better.
* Thank you to everyone that has been cheerleading us for the past year, helped us have the courage
to "Fork Off" from Mastodon, and also understood that we are working towards different
objectives. That is after all why you all joined us in the first place!
* Thank you to @mecaka who joined the team while @maloki was getting diagnosed, who helped push
through that time and bring us to where we are now.
* An additional thank you to those that joined the Mattermost server to keep the conversation alive
with us after we moved on from Discord!
================================================
FILE: CODE_OF_CONDUCT.md
================================================
### Table of Contents
- [Code of Conduct](#code-of-conduct)
- [Positive participation and communication](#positive-participation-and-communication)
- [Prohibited Behavior](#prohibited-behavior)
- [Discrimination](#discrimination)
- [Harassment and privacy violation](#harassment-and-privacy-violation)
- [Harmful and/or adult content](#harmful-andor-adult-content)
- [Where does this CoC apply and who does this CoC apply to?](#where-does-this-coc-apply-and-who-does-this-coc-apply-to)
- [What if someone violates this Code of Conduct while outside of Florence instances, or in a space or medium to which the Code does not apply?](#what-if-someone-violates-this-code-of-conduct-while-outside-of-florence-instances-or-in-a-space-or-medium-to-which-the-code-does-not-apply)
- [When Something Happens](#when-something-happens)
- [Example](#example)
- [How to make a Code Of Conduct Report](#how-to-make-a-code-of-conduct-report)
- [Information to include in your report](#information-to-include-in-your-report)
- [Code of Conduct Reporting Guide](#code-of-conduct-reporting-guide)
- [What happens after you file a report?](#what-happens-after-you-file-a-report)
- [Example](#example-1)
- [What if your report concerns a possible violation by a moderator?](#what-if-your-report-concerns-a-possible-violation-by-a-moderator)
- [How CoC Reports are handled by moderators](#how-coc-reports-are-handled-by-moderators)
- [Accountability for board members and moderators](#accountability-for-board-members-and-moderators)
- [Definition of Terms](#definition-of-terms)
- [Reference Codes of Conduct](#reference-codes-of-conduct)
# Code of Conduct
We strive to reduce barriers to access of our organization, our software and our community, as well as to dismantle any ableist assumptions and practices in our process. We recognize that there is no one solution for universal accessibility, and strive to provide alternatives and choices whenever possible.
The stakeholders of this project pledge to institute and abide by a consistent, transparent and accountable human-centered resolution process with a low bar to entry that allows every stakeholder a voice on decisions to do with structural changes and features of both the project's organization and software protocol.
If you support an idea, we would like you to help implement it. If you reject an idea, we ask you to help find alternatives.
## Positive participation and communication
Florence wants to encourage positive participation and communication, in order to make people feel welcome. Positive communication doesn't mean tone policing or that everyone always has to be positive about everything. It means that we want people to feel safe when bringing up their concerns, and create a space where people can have the difficult conversations. To attain this together, we want to:
* Maintain respectful and effective communication.
* Use welcoming and inclusive language.
* Show kindness and respect towards others.
* Encourage and promote the ideas of others.
* Be respectful of differing viewpoints and experiences.
* Assume good faith.
* Understand the challenges in online discussion.
* Give others the chance to improve.
* Keep criticism constructive.
* Take criticism constructively.
* Respect others’ privacy.
* Avoid sexualized language without consent of all parties involved.
* Don’t resort to personal attacks or condescension.
* No hate speech or similar.
* Promote and teach respectful, effective communication.
* Welcome contributions to the project in all the forms they take.
## Prohibited Behavior
There is also going to be behaviour that will be more strictly prohibited.
### Discrimination
* Do not participate in discrimination or comments promoting or reinforcing the existing systems of oppression of any groups or people based on gender, gender expression, race, ethnicity, nationality, sexuality, religion, disability, mental illness, neurodivergence, personal appearance, physical appearance, body size, age, or class.
* Do not claim “reverse-isms,” e.g. “reverse racism”
* Do not participate in xenophobia or violent nationalism.
### Harassment and privacy violation
* Do not contribute to behaviour intended to stalk, harass, or intimidate other users.
* Do not continue to engage with a user that has specifically asked you to stop, regardless of whether they have blocked or muted you. Do not ask others to engage with them on your behalf.
* Do not participate in aggregating, posting, and/or disseminating a person’s demographic, personal, or private data without their express permission.
* Do not post or circulate disseminate a person’s posts, including screen captures or any other content, without their express permission, unless to protect others from the bad behaviour displayed.
* Do not post or circulate libel, slander, or other known disinformation.
### Harmful and/or adult content
* Do not distribute sexual or violent imagery without a Content Warning.
* Do not distribute any sexualized depictions of minors, in any way. (This includes drawings and 3D renders.)
## Where does this CoC apply and who does this CoC apply to?
This code of conduct applies to all official public discussion forums related to this project, including but not limited to public chat, forums, and comments on code.
This code applies to any member of the community participating in discussions, contributing to the project, or otherwise discussing the project publicly.
It also would apply in the future main Florence instance. Members of the instance must agree to the CoC.
## What if someone violates this Code of Conduct while outside of Florence instances, or in a space or medium to which the Code does not apply?
Use your judgement, but always feel free to let us know -- we’d rather know more than less. If the person who violates the Code of Conduct intersects with the Florence community in any way, we encourage you to make a report, even if the offending behavior itself was outside of our space.
## When Something Happens
If you see behavior that is not aligned with this Code of Conduct, here's how you can handle it.
Consider the situation and if it might be useful to screenshot messages in case the messages in question are deleted.
The person may not be completely aware of the Code of Conduct or specific items within it. **If you consider it safe** and you are comfortable in doing so you can start by letting them know that their actions weren't appropriate and point them to specific parts of the Code of Conduct. One suggestion is to send a private message first, because this can avoid potentially embarrassing someone. Politely and patiently let the person know that their behavior isn’t in line with the Code of Conduct. Share the code of conduct with them and refer to specific parts which you think their behavior is not in line with. You may ask them to adjust their behavior or possibly edit or delete a message.
**If you don’t feel safe or comfortable** telling that person, or they refuse to change their behavior or delete text which is not in line with the CoC, it may be time to report the incident. See how to report an incident in the following section. You may also directly contact admins or moderators, especially if the behavior requires immediate attention
### Example
Mary calls John an ableist slur in a discussion chat because he made a mistake. Ana tells Mary via DM that she shouldn't do that because it reinforces the oppression of disabled or neurodivergent people, but Mary calls Ana the same slur, and says that she shouldn't take this so seriously. Then, Ana proceeds to report Mary to a moderator.
## How to make a Code Of Conduct Report
If you would like to report a Code of Conduct violation contact our moderators via email at report@florencesoc.org. Regardless of outcome, they (or committee) will respond in private to first acknowledge your report within three days and later with an explanation of the actions taken within a time frame of 14 days.
Please include any relevant details, links, screenshots, context, or other information that may be used to better understand and resolve the situation.
### Information to include in your report
* Contact information for the reporter including name, email and username.
* You may report incidents anonymously if you are uncomfortable providing your contact information. However, this may hamper the investigation.
* The names of all people directly involved in the incident, including relevant nicknames or pseudonyms.
* Include witness names if possible.
* Time and forum/location where the incident occurred. Be specific.
* Details about what happened. Note any supporting materials, such as message screencaps, IRC logs, or emails.
* Additional context for the situation, if appropriate.
* Whether or not the incident is ongoing.
* Any additional information that is relevant to investigating and resolving the incident.
## Code of Conduct Reporting Guide
Most people will feel more comfortable reporting the code of conduct violation rather than directly confronting it, and we encourage those people to email report@florencesoc.org. **All reports will be kept confidential.** In some cases we may determine that a public statement will need to be made in order to inform the broader community. If this need arises, the identities of all parties involved will remain confidential unless those individuals instruct us otherwise.
**If you believe anyone is in physical danger, please notify appropriate law enforcement first.** If you are unsure what law enforcement agency is appropriate, please include this in your report and we will attempt to notify them.
We encourage you to report incidents, even if you are unsure whether the incident is a violation, or whether the space where it happened is covered by this Code of Conduct. We would much rather have a few extra reports where we decide to take no action, than miss a report of an actual violation. We do not look negatively on you if we find the incident is not a violation. Knowing about incidents that are not violations, or happen outside our spaces, can help us to improve the Code of Conduct and the processes surrounding it.
## What happens after you file a report?
You will receive an email from the moderators acknowledging receipt. The current Working Group members are [@1011X@mastodon.social](https://mastodon.social/@1011X), [@jhaye@social.libre.fi](https://social.libre.fi/jhaye), and [@skrlet13@chile.masto.host](https://chile.masto.host/@skrlet13).
The moderators will meet to review the incident and determine:
* What happened based on the perspective of all involved.
* Whether this event constitutes a code of conduct violation.
* Who the bad actor was.
* Whether this is an ongoing situation, or if there is a threat to anyone's physical safety.
We promise to acknowledge receipt within 72 hours (and will aim for a faster response). If this is determined to be an ongoing incident or a threat to physical safety, the working groups' immediate priority will be to protect everyone involved. This means we may delay an "official" response until we believe that the situation has ended and that everyone is physically safe.
Once the moderators have a complete account of the events, they will make a decision as to how to respond. Responses may include:
* Nothing (if we determine no violation occurred).
* A private gentle reminder of the code of conduct.
* A public gentle reminder of the code of conduct.
* A private reprimand from the working group to the individual(s) involved.
* A public reprimand.
* An imposed vacation (i.e. asking someone to "take a week off" from a space).
* A temporary (for a specified time) or indefinite ban from some or all Florence Work Spaces.
We'll respond within one week to the person who filed the report with either a resolution or an explanation of why the situation is not yet resolved.
Once we've determined our final action, we'll contact the original reporter to let them know what action (if any) we'll be taking. We'll take into account feedback from the reporter on the appropriateness of our response, but we don't guarantee we'll act on it.
### Example
Ana reports Mary. She explains the situation and gives the links and screenshots as proof to the moderator. The moderator examines the case and decides to give Mary a warning. Mary is told this and she will no longer be able to participate if she does that again. Ana is notified of the actions taken by the moderator.
## What if your report concerns a possible violation by a moderator?
The entire code of conduct working group will see all incident reports sent to report@florencesoc.org. Anyone directly involved in the incident will be immediately recused and will not participate in any discussions of the incident or its resolution.
* If you are uncomfortable submitting a report that will be seen by a person involved in the incident, you can instead send the report directly to the other moderators for resolution.
## How CoC Reports are handled by moderators
When a Code of Conduct report is made, moderators should take the issue seriously. If it’s not possible to deal with the report immediately, moderators should send a response saying that the report was received and is being looked into.
Moderators will take all reports seriously and prioritize the well-being and comfort of the person making the report recipients of the violation over the comfort of the violator.
As soon as available, a moderator will join, identify themselves, and take further action.
You should offer people the kind of support they ask for. If you aren't sure what you're offering will be helpful, ask if that type of thing would be useful.
## Accountability for board members and moderators
Board members, moderators, and other community members who contributed to running this project will be held to the same code of conduct. Reports against those in positions of power will be taken seriously and handled with respect, prioritizing the safety and well-being of anyone who makes such a report.
## Definition of Terms
We acknowledge that systemic (structural) oppression works on a society-wide level, enacted by laws and policies, institutions, and culture. It is reflected in and reinforced by individuals’ discriminatory beliefs and actions. As such, we expect people’s commitment to ending oppression to extend to their own behaviour.
* **Ableism**: Discrimination against disabled, ill, and/or neurodivergent people.
* **Disability**: A physical or mental condition that limits a person's abilities to interact with their environment.
* **Gender**: Social construct tied to the perception of social and cultural roles. The most common are male and female.
* **Gender expression**: Includes personal behavior, mannerisms, interests, and appearance associated with gender in a particular cultural context.
* **Harassment**: Behaviour towards a person that causes mental or emotional suffering, which includes repeated unwanted contacts without a reasonable purpose, insults, threats, touching, or offensive language.
* **Hate speech (includes Holocaust denial or Nazi symbolism)**: Speech that oppresses, dehumanizes, and endangers marginalized people or anyone perceived to have a particular marginalization.
* **Homophobia**: Discrimination against gay people and people who are thought to be gay, incl. the use of homophobic terms where they cause harm.
* **Inclusivity**: Attitude that recognises and considers people's differences in order to create a welcoming environment without requiring minority assimilation to the majority.
* **Marginalization**: A social phenomenon by which a minority or sub-group is excluded, and their needs or desires ignored.
* **Mental illness**: Behavioral or mental pattern that causes significant distress or impairment of personal functioning.
* **Microaggressions**: brief and commonplace daily verbal, behavioural, or environmental indignities, whether intentional or unintentional, that communicate hostile, derogatory, or negative prejudicial slights and insults toward any group, particularly culturally marginalized groups.
* **Neurodivergence**: Behavioral or mental pattern that doesn't cause distress but affects the way the person interacts with the environment.
* **Race**: Social construct tied to phenotypical and social characteristics of a group of people.
* **Racism**: Discrimination against people of color, including but not limited to microaggressions, tone policing and slurs.
* **Reverse-isms** (like “reverse racism”): Claims by people privileged on an axis that they are somehow oppressed by people marginalized on the same axis.
* **Sexism**: Discrimination against women and non-binary people. Including derogatory language about women or people perceived as women.
* **Sexual orientation**: The pattern of attraction to 0 or more genders.
* **Transphobia**: Discrimination against trans people. This includes arguing someone’s gender, policing their presentation, and malicious misgendering.
* **Tone Policing**: Attempts to dismiss marginalized people's perspectives by claiming their tone, rather than the content, is unappealing.
## Reference Codes of Conduct
* http://open-zfs.org/wiki/Reporting_Guide
* https://wiki.snowdrift.coop/community/conduct
* https://wealljs.org/code-of-conduct
* https://us.pycon.org/2018/about/code-of-conduct/
* https://www.coc-handbook.com/
* https://github.com/ayojs/ayo/blob/latest/CODE_OF_CONDUCT.md
* https://www.freebsd.org/internal/code-of-conduct.html
* http://geekfeminism.wikia.com/wiki/Code_of_conduct_evaluations
* https://www.rust-lang.org/en-US/conduct.html
* https://docs.google.com/document/d/1V2-YNCRW-Ya2tFzapwLMPMbqWAJZNw4qE40cIWqZti8/edit# (NOVA DSA Socialist Meetings: Participation Guide) This ones nice because it's specifically designed for meetings run with a similar format to ours, though theirs take place offline.
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/80x15.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.
================================================
FILE: CONTRIBUTING.md
================================================
Contributing
============
Thank you for considering contributing to Florence Mastodon
You can contribute in the following ways:
- Finding and reporting bugs
- Translating the Mastodon interface into various languages
- Contributing code to Mastodon by fixing bugs or implementing features
- Improving the documentation
- Joining the conversation on our [Chat]
- Participate in OutReach or other activities
- Proof-read
- And much more
If you want to contribute with monetary support you can do so via our [Open Collective](https://opencollective.com/florence-social) (which isn't publicly launched yet)
## Adding an Issue for Bug Report or Feature Request
Bug reports and feature suggestions can be submitted to [GitHub Issues](https://github.com/florence-social/mastodon-fork/issues). Do not worry about submitting duplicates, but please make a cursory search to see if any similar reports or request have already been resolved or rejected in the past using the search function. If you find a bug or feature request which matches yours you can join the conversation by adding your commentary to that issue.
Try to describe your issue, the use-case, and additional considerations when submitting a feature request.
## Translations
We will be using Weblate for translations in the near future, but we're waiting for a free account for Open Source Projects via Weblate themselves, in the meanwhile you can submit PRs with translations, or wait. We will update this document as soon as Weblate is available for translations, and will make public announcements elsewhere.
## Documentation
Documentation work will be added soon, and in the meanwhile you can join us in our [Chat] for documentation.
[Chat]: https://chat.florencesoc.org/signup_user_complete/?id=2a7237f68937b2c4a99ca25c156e6915
================================================
FILE: Capfile
================================================
# frozen_string_literal: true
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/scm/git'
install_plugin Capistrano::SCM::Git
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/yarn'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
================================================
FILE: Dockerfile
================================================
FROM ubuntu:18.04 as build-dep
# Use bash for the shell
SHELL ["bash", "-c"]
# Install Node
ENV NODE_VER="8.15.0"
RUN echo "Etc/UTC" > /etc/localtime && \
apt update && \
apt -y install wget make gcc g++ python && \
cd ~ && \
wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER.tar.gz && \
tar xf node-v$NODE_VER.tar.gz && \
cd node-v$NODE_VER && \
./configure --prefix=/opt/node && \
make -j$(nproc) > /dev/null && \
make install
# Install jemalloc
ENV JE_VER="5.1.0"
RUN apt update && \
apt -y install autoconf && \
cd ~ && \
wget https://github.com/jemalloc/jemalloc/archive/$JE_VER.tar.gz && \
tar xf $JE_VER.tar.gz && \
cd jemalloc-$JE_VER && \
./autogen.sh && \
./configure --prefix=/opt/jemalloc && \
make -j$(nproc) > /dev/null && \
make install_bin install_include install_lib
# Install ruby
ENV RUBY_VER="2.6.1"
ENV CPPFLAGS="-I/opt/jemalloc/include"
ENV LDFLAGS="-L/opt/jemalloc/lib/"
RUN apt update && \
apt -y install build-essential \
bison libyaml-dev libgdbm-dev libreadline-dev \
libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \
cd ~ && \
wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \
tar xf ruby-$RUBY_VER.tar.gz && \
cd ruby-$RUBY_VER && \
./configure --prefix=/opt/ruby \
--with-jemalloc \
--with-shared \
--disable-install-doc && \
ln -s /opt/jemalloc/lib/* /usr/lib/ && \
make -j$(nproc) > /dev/null && \
make install
ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin"
RUN npm install -g yarn && \
gem install bundler && \
apt update && \
apt -y install git libicu-dev libidn11-dev \
libpq-dev libprotobuf-dev protobuf-compiler
COPY Gemfile* package.json yarn.lock /opt/mastodon/
RUN cd /opt/mastodon && \
bundle install -j$(nproc) --deployment --without development test && \
yarn install --pure-lockfile
FROM ubuntu:18.04
# Copy over all the langs needed for runtime
COPY --from=build-dep /opt/node /opt/node
COPY --from=build-dep /opt/ruby /opt/ruby
COPY --from=build-dep /opt/jemalloc /opt/jemalloc
# Add more PATHs to the PATH
ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin"
# Create the mastodon user
ARG UID=991
ARG GID=991
RUN apt update && \
echo "Etc/UTC" > /etc/localtime && \
ln -s /opt/jemalloc/lib/* /usr/lib/ && \
apt install -y whois wget && \
addgroup --gid $GID mastodon && \
useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd
# Install mastodon runtime deps
RUN apt -y --no-install-recommends install \
libssl1.1 libpq5 imagemagick ffmpeg \
libicu60 libprotobuf10 libidn11 libyaml-0-2 \
file ca-certificates tzdata libreadline7 && \
apt -y install gcc && \
ln -s /opt/mastodon /mastodon && \
gem install bundler && \
rm -rf /var/cache && \
rm -rf /var/lib/apt/lists/*
# Add tini
ENV TINI_VERSION="0.18.0"
ENV TINI_SUM="12d20136605531b09a2c2dac02ccee85e1b874eb322ef6baf7561cd93f93c855"
ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini /tini
RUN echo "$TINI_SUM tini" | sha256sum -c -
RUN chmod +x /tini
# Copy over mastodon source, and dependencies from building, and set permissions
COPY --chown=mastodon:mastodon . /opt/mastodon
COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon
# Run mastodon services in prod mode
ENV RAILS_ENV="production"
ENV NODE_ENV="production"
# Tell rails to serve static files
ENV RAILS_SERVE_STATIC_FILES="true"
# Set the run user
USER mastodon
# Precompile assets
RUN cd ~ && \
OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
yarn cache clean
# Set the work dir and the container entry point
WORKDIR /opt/mastodon
ENTRYPOINT ["/tini", "--"]
================================================
FILE: Gemfile
================================================
# frozen_string_literal: true
source 'https://rubygems.org'
ruby '>= 2.4.0', '< 2.7.0'
gem 'pkg-config', '~> 1.3'
gem 'puma', '~> 3.12'
gem 'rails', '~> 5.2.3'
gem 'thor', '~> 0.20'
gem 'hamlit-rails', '~> 0.2'
gem 'pg', '~> 1.1'
gem 'makara', '~> 0.4'
gem 'pghero', '~> 2.2'
gem 'dotenv-rails', '~> 2.7'
gem 'aws-sdk-s3', '~> 1.41', require: false
gem 'fog-core', '<= 2.1.0'
gem 'fog-openstack', '~> 0.3', require: false
gem 'paperclip', '~> 6.0'
gem 'paperclip-av-transcoder', '~> 0.6'
gem 'streamio-ffmpeg', '~> 3.0'
gem 'blurhash', '~> 0.1'
gem 'active_model_serializers', '~> 0.10'
gem 'addressable', '~> 2.6'
gem 'bootsnap', '~> 1.4', require: false
gem 'browser'
gem 'charlock_holmes', '~> 0.7.6'
gem 'iso-639'
gem 'chewy', '~> 5.0'
gem 'cld3', '~> 3.2.4'
gem 'devise', '~> 4.7'
gem 'devise-two-factor', '~> 3.0'
group :pam_authentication, optional: true do
gem 'devise_pam_authenticatable2', '~> 9.2'
end
gem 'net-ldap', '~> 0.10'
gem 'omniauth-cas', '~> 1.1'
gem 'omniauth-rails_csrf_protection', '~> 0.1'
gem 'omniauth-saml', '~> 1.10'
gem 'omniauth', '~> 1.9'
gem 'doorkeeper', '~> 5.1'
gem 'fast_blank', '~> 1.0'
gem 'fastimage'
gem 'goldfinger', '~> 2.1'
gem 'hiredis', '~> 0.6'
gem 'redis-namespace', '~> 1.5'
gem 'htmlentities', '~> 4.3'
gem 'http', '~> 3.3'
gem 'http_accept_language', '~> 2.1'
gem 'http_parser.rb', '~> 0.6', git: 'https://github.com/tmm1/http_parser.rb', ref: '54b17ba8c7d8d20a16dfc65d1775241833219cf2'
gem 'httplog', '~> 1.3'
gem 'idn-ruby', require: 'idn'
gem 'kaminari', '~> 1.1'
gem 'link_header', '~> 0.0'
gem 'mime-types', '~> 3.2', require: 'mime/types/columnar'
gem 'nokogiri', '~> 1.10'
gem 'nsa', '~> 0.2'
gem 'oj', '~> 3.7'
gem 'ostatus2', '~> 2.0'
gem 'ox', '~> 2.10'
gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c'
gem 'pundit', '~> 2.0'
gem 'premailer-rails'
gem 'rack-attack', '~> 6.0'
gem 'rack-cors', '~> 1.0', require: 'rack/cors'
gem 'rails-i18n', '~> 5.1'
gem 'rails-settings-cached', '~> 0.6'
gem 'redis', '~> 4.1', require: ['redis', 'redis/connection/hiredis']
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'rqrcode', '~> 0.10'
gem 'sanitize', '~> 5.0'
gem 'sidekiq', '~> 5.2'
gem 'sidekiq-scheduler', '~> 3.0'
gem 'sidekiq-unique-jobs', '~> 6.0'
gem 'sidekiq-bulk', '~>0.2.0'
gem 'simple-navigation', '~> 4.0'
gem 'simple_form', '~> 4.1'
gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
gem 'stoplight', '~> 2.1.3'
gem 'strong_migrations', '~> 0.4'
gem 'tty-command', '~> 0.8', require: false
gem 'tty-prompt', '~> 0.19', require: false
gem 'twitter-text', '~> 1.14'
gem 'tzinfo-data', '~> 1.2019'
gem 'webpacker', '~> 4.0'
gem 'webpush'
gem 'json-ld', '~> 3.0'
gem 'json-ld-preloaded', '~> 3.0'
gem 'rdf-normalize', '~> 0.3'
group :development, :test do
gem 'fabrication', '~> 2.20'
gem 'fuubar', '~> 2.4'
gem 'i18n-tasks', '~> 0.9', require: false
gem 'pry-byebug', '~> 3.7'
gem 'pry-rails', '~> 0.3'
gem 'rspec-rails', '~> 3.8'
end
group :production, :test do
gem 'private_address_check', '~> 0.5'
end
group :test do
gem 'capybara', '~> 3.22'
gem 'climate_control', '~> 0.2'
gem 'faker', '~> 1.9'
gem 'microformats', '~> 4.1'
gem 'rails-controller-testing', '~> 1.0'
gem 'rspec-sidekiq', '~> 3.0'
gem 'simplecov', '~> 0.16', require: false
gem 'webmock', '~> 3.5'
gem 'parallel_tests', '~> 2.29'
end
group :development do
gem 'active_record_query_trace', '~> 1.6'
gem 'annotate', '~> 2.7'
gem 'better_errors', '~> 2.5'
gem 'binding_of_caller', '~> 0.7'
gem 'bullet', '~> 6.0'
gem 'letter_opener', '~> 1.7'
gem 'letter_opener_web', '~> 1.3'
gem 'memory_profiler'
gem 'rubocop', '~> 0.71', require: false
gem 'rubocop-rails', '~> 2.0', require: false
gem 'brakeman', '~> 4.5', require: false
gem 'bundler-audit', '~> 0.6', require: false
gem 'capistrano', '~> 3.11'
gem 'capistrano-rails', '~> 1.4'
gem 'capistrano-rbenv', '~> 2.1'
gem 'capistrano-yarn', '~> 2.0'
gem 'derailed_benchmarks'
gem 'stackprof'
end
group :production do
gem 'lograge', '~> 0.11'
gem 'redis-rails', '~> 5.0'
end
gem 'concurrent-ruby', require: false
================================================
FILE: LICENSE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.
================================================
FILE: Procfile
================================================
web: bundle exec puma -C config/puma.rb
worker: bundle exec sidekiq
================================================
FILE: Procfile.dev
================================================
web: env PORT=3000 bundle exec puma -C config/puma.rb
sidekiq: env PORT=3000 bundle exec sidekiq
stream: env PORT=4000 yarn run start
webpack: ./bin/webpack-dev-server --listen-host 0.0.0.0
================================================
FILE: README.md
================================================
Florence Mastodon
=================
Mastodon is a **free, open-source social network server** based on ActivityPub. This is *not* the
official version of Mastodon; this is a separate version (i.e. a fork) maintained by Florence. For
more information on Mastodon, you can see the [official website] and the [upstream repo].
[official website]: https://joinmastodon.org
[upstream repo]: https://github.com/tootsuite/mastodon
This version of Mastodon will include much-wanted changes by the community that are not included
in the upstream version of Mastodon. Migrating from the latest stable release of Mastodon to
Florence's Mastodon will always be possible, to ensure that everyone can benefit from these
changes.
## Versioning
Florence Mastodon uses a four-numbered versioning system, loosely based upon [semantic
versioning]. The four numbers are:
* **Compatibility**: Increased when federation, app compatibility, etc. are changed in a
non-compatibile way.
* **Feel**: Increased when user experience is changed strongly enough to feel different, i.e. more
than just small new features.
* **Features**: Increased when new features are added. Reset to zero when **feel** version is
bumped.
* **Hotfixes**: Increased when fixes are substantial enough to release a new version without any new
features. Reset to zero when **feature** version is bumped.
For now, because this versioning system hasn't been strongly adopted, releases will be annotated as
**Pre-Release x.y.z**, which is equivalent to version 0.x.y.z.
[semantic versioning]: https://semver.org
## Release timeline
Pre-release 0.1.0 is mostly equivalent to Mastodon 2.9.0, with some extra changes added in.
Right now, the goal before pre-release 1.0.0 is to incorporate existing, already-developed changes
into the fork so that people have a central version to upgrade to. Once we've finally gotten the
software to the point where we like it, we will release the first official release, which will be
named something special. Stay tuned!
## License
Copyright (C) 2016-2019 Florence, Eugen Rochko, and many other Mastodon contributors; see [AUTHORS.md](AUTHORS.md).
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
================================================
FILE: Rakefile
================================================
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
Rails.application.load_tasks
================================================
FILE: Vagrantfile
================================================
# -*- mode: ruby -*-
# vi: set ft=ruby :
ENV["PORT"] ||= "3000"
$provision = <<SCRIPT
cd /vagrant # This is where the host folder/repo is mounted
# Add the yarn repo + yarn repo keys
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
# Add repo for NodeJS
curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
# Add firewall rule to redirect 80 to PORT and save
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
echo iptables-persistent iptables-persistent/autosave_v4 boolean true | sudo debconf-set-selections
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | sudo debconf-set-selections
sudo apt-get install iptables-persistent -y
# Add packages to build and run Mastodon
sudo apt-get install \
git-core \
g++ \
libpq-dev \
libxml2-dev \
libxslt1-dev \
imagemagick \
nodejs \
redis-server \
redis-tools \
postgresql \
postgresql-contrib \
protobuf-compiler \
yarn \
libicu-dev \
libidn11-dev \
libprotobuf-dev \
libreadline-dev \
libpam0g-dev \
-y
# Install rvm
read RUBY_VERSION < .ruby-version
gpg_command="gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB"
$($gpg_command)
if [ $? -ne 0 ];then
echo "GPG command failed, This prevented RVM from installing."
echo "Retrying once..." && $($gpg_command)
if [ $? -ne 0 ];then
echo "GPG failed for the second time, please ensure network connectivity."
echo "Exiting..." && exit 1
fi
fi
curl -sSL https://raw.githubusercontent.com/rvm/rvm/stable/binscripts/rvm-installer | bash -s stable --ruby=$RUBY_VERSION
source /home/vagrant/.rvm/scripts/rvm
# Install Ruby
rvm reinstall ruby-$RUBY_VERSION --disable-binary
# Configure database
sudo -u postgres createuser -U postgres vagrant -s
sudo -u postgres createdb -U postgres mastodon_development
# Install gems and node modules
gem install bundler foreman
bundle install
yarn install
# Build Mastodon
export $(cat ".env.vagrant" | xargs)
bundle exec rails db:setup
# Configure automatic loading of environment variable
echo 'export $(cat "/vagrant/.env.vagrant" | xargs)' >> ~/.bash_profile
SCRIPT
$start = <<SCRIPT
echo 'To start server'
echo ' $ vagrant ssh -c "cd /vagrant && foreman start"'
SCRIPT
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.provider :virtualbox do |vb|
vb.name = "mastodon"
vb.customize ["modifyvm", :id, "--memory", "2048"]
# Increase the number of CPUs. Uncomment and adjust to
# increase performance
# vb.customize ["modifyvm", :id, "--cpus", "3"]
# Disable VirtualBox DNS proxy to skip long-delay IPv6 resolutions.
# https://github.com/mitchellh/vagrant/issues/1172
vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
# Use "virtio" network interfaces for better performance.
vb.customize ["modifyvm", :id, "--nictype1", "virtio"]
vb.customize ["modifyvm", :id, "--nictype2", "virtio"]
end
# This uses the vagrant-hostsupdater plugin, and lets you
# access the development site at http://mastodon.local.
# If you change it, also change it in .env.vagrant before provisioning
# the vagrant server to update the development build.
#
# To install:
# $ vagrant plugin install vagrant-hostsupdater
config.vm.hostname = "mastodon.local"
if defined?(VagrantPlugins::HostsUpdater)
config.vm.network :private_network, ip: "192.168.42.42", nictype: "virtio"
config.hostsupdater.remove_on_suspend = false
end
if config.vm.networks.any? { |type, options| type == :private_network }
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'vers=3', 'tcp', 'actimeo=1']
else
config.vm.synced_folder ".", "/vagrant"
end
# Otherwise, you can access the site at http://localhost:3000 and http://localhost:4000 , http://localhost:8080
config.vm.network :forwarded_port, guest: 3000, host: 3000
config.vm.network :forwarded_port, guest: 4000, host: 4000
config.vm.network :forwarded_port, guest: 8080, host: 8080
# Full provisioning script, only runs on first 'vagrant up' or with 'vagrant provision'
config.vm.provision :shell, inline: $provision, privileged: false
# Start up script, runs on every 'vagrant up'
config.vm.provision :shell, inline: $start, run: 'always', privileged: false
end
================================================
FILE: app/chewy/statuses_index.rb
================================================
# frozen_string_literal: true
class StatusesIndex < Chewy::Index
settings index: { refresh_interval: '15m' }, analysis: {
filter: {
english_stop: {
type: 'stop',
stopwords: '_english_',
},
english_stemmer: {
type: 'stemmer',
language: 'english',
},
english_possessive_stemmer: {
type: 'stemmer',
language: 'possessive_english',
},
},
analyzer: {
content: {
tokenizer: 'uax_url_email',
filter: %w(
english_possessive_stemmer
lowercase
asciifolding
cjk_width
english_stop
english_stemmer
),
},
},
}
define_type ::Status.unscoped.without_reblogs.includes(:media_attachments) do
crutch :mentions do |collection|
data = ::Mention.where(status_id: collection.map(&:id)).pluck(:status_id, :account_id)
data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
end
crutch :favourites do |collection|
data = ::Favourite.where(status_id: collection.map(&:id)).pluck(:status_id, :account_id)
data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
end
crutch :reblogs do |collection|
data = ::Status.where(reblog_of_id: collection.map(&:id)).pluck(:reblog_of_id, :account_id)
data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
end
root date_detection: false do
field :id, type: 'long'
field :account_id, type: 'long'
field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).join("\n\n") } do
field :stemmed, type: 'text', analyzer: 'content'
end
field :searchable_by, type: 'long', value: ->(status, crutches) { status.searchable_by(crutches) }
end
end
end
================================================
FILE: app/controllers/about_controller.rb
================================================
# frozen_string_literal: true
class AboutController < ApplicationController
layout 'public'
before_action :set_instance_presenter, only: [:show, :more, :terms]
def show
@hide_navbar = true
end
def more; end
def terms; end
private
def new_user
User.new.tap do |user|
user.build_account
user.build_invite_request
end
end
helper_method :new_user
def set_instance_presenter
@instance_presenter = InstancePresenter.new
end
end
================================================
FILE: app/controllers/account_follow_controller.rb
================================================
# frozen_string_literal: true
class AccountFollowController < ApplicationController
include AccountControllerConcern
before_action :authenticate_user!
def create
FollowService.new.call(current_user.account, @account.acct)
redirect_to account_path(@account)
end
end
================================================
FILE: app/controllers/account_unfollow_controller.rb
================================================
# frozen_string_literal: true
class AccountUnfollowController < ApplicationController
include AccountControllerConcern
before_action :authenticate_user!
def create
UnfollowService.new.call(current_user.account, @account)
redirect_to account_path(@account)
end
end
================================================
FILE: app/controllers/accounts_controller.rb
================================================
# frozen_string_literal: true
class AccountsController < ApplicationController
PAGE_SIZE = 20
include AccountControllerConcern
before_action :set_cache_headers
def show
respond_to do |format|
format.html do
mark_cacheable! unless user_signed_in?
@body_classes = 'with-modals'
@pinned_statuses = []
@endorsed_accounts = @account.endorsed_accounts.to_a.sample(4)
if current_account && @account.blocking?(current_account)
@statuses = []
return
end
@pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses?
@statuses = filtered_status_page(params)
@statuses = cache_collection(@statuses, Status)
unless @statuses.empty?
@older_url = older_url if @statuses.last.id > filtered_statuses.last.id
@newer_url = newer_url if @statuses.first.id < filtered_statuses.first.id
end
end
format.atom do
mark_cacheable!
@entries = @account.stream_entries.where(hidden: false).with_includes.paginate_by_max_id(PAGE_SIZE, params[:max_id], params[:since_id])
render xml: OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, @entries.reject { |entry| entry.status.nil? }))
end
format.rss do
mark_cacheable!
@statuses = cache_collection(default_statuses.without_reblogs.without_replies.limit(PAGE_SIZE), Status)
render xml: RSS::AccountSerializer.render(@account, @statuses)
end
format.json do
render_cached_json(['activitypub', 'actor', @account], content_type: 'application/activity+json') do
ActiveModelSerializers::SerializableResource.new(@account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter)
end
end
end
end
private
def show_pinned_statuses?
[replies_requested?, media_requested?, tag_requested?, params[:max_id].present?, params[:min_id].present?].none?
end
def filtered_statuses
default_statuses.tap do |statuses|
statuses.merge!(hashtag_scope) if tag_requested?
statuses.merge!(only_media_scope) if media_requested?
statuses.merge!(no_replies_scope) unless replies_requested?
end
end
def default_statuses
@account.statuses.where(visibility: [:public, :unlisted])
end
def only_media_scope
Status.where(id: account_media_status_ids)
end
def account_media_status_ids
@account.media_attachments.attached.reorder(nil).select(:status_id).distinct
end
def no_replies_scope
Status.without_replies
end
def hashtag_scope
tag = Tag.find_normalized(params[:tag])
if tag
Status.tagged_with(tag.id)
else
Status.none
end
end
def username_param
params[:username]
end
def older_url
pagination_url(max_id: @statuses.last.id)
end
def newer_url
pagination_url(min_id: @statuses.first.id)
end
def pagination_url(max_id: nil, min_id: nil)
if tag_requested?
short_account_tag_url(@account, params[:tag], max_id: max_id, min_id: min_id)
elsif media_requested?
short_account_media_url(@account, max_id: max_id, min_id: min_id)
elsif replies_requested?
short_account_with_replies_url(@account, max_id: max_id, min_id: min_id)
else
short_account_url(@account, max_id: max_id, min_id: min_id)
end
end
def media_requested?
request.path.ends_with?('/media')
end
def replies_requested?
request.path.ends_with?('/with_replies')
end
def tag_requested?
request.path.ends_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize)
end
def filtered_status_page(params)
if params[:min_id].present?
filtered_statuses.paginate_by_min_id(PAGE_SIZE, params[:min_id]).reverse
else
filtered_statuses.paginate_by_max_id(PAGE_SIZE, params[:max_id], params[:since_id]).to_a
end
end
end
================================================
FILE: app/controllers/activitypub/collections_controller.rb
================================================
# frozen_string_literal: true
class ActivityPub::CollectionsController < Api::BaseController
include SignatureVerification
before_action :set_account
before_action :set_size
before_action :set_statuses
before_action :set_cache_headers
def show
render_cached_json(['activitypub', 'collection', @account, params[:id]], content_type: 'application/activity+json') do
ActiveModelSerializers::SerializableResource.new(
collection_presenter,
serializer: ActivityPub::CollectionSerializer,
adapter: ActivityPub::Adapter,
skip_activities: true
)
end
end
private
def set_account
@account = Account.find_local!(params[:account_username])
end
def set_statuses
@statuses = scope_for_collection
@statuses = cache_collection(@statuses, Status)
end
def set_size
case params[:id]
when 'featured'
@account.pinned_statuses.count
else
raise ActiveRecord::RecordNotFound
end
end
def scope_for_collection
case params[:id]
when 'featured'
@account.statuses.permitted_for(@account, signed_request_account).tap do |scope|
scope.merge!(@account.pinned_statuses)
end
else
raise ActiveRecord::RecordNotFound
end
end
def collection_presenter
ActivityPub::CollectionPresenter.new(
id: account_collection_url(@account, params[:id]),
type: :ordered,
size: @size,
items: @statuses
)
end
end
================================================
FILE: app/controllers/activitypub/inboxes_controller.rb
================================================
# frozen_string_literal: true
class ActivityPub::InboxesController < Api::BaseController
include SignatureVerification
include JsonLdHelper
before_action :set_account
def create
if unknown_deleted_account?
head 202
elsif signed_request_account
upgrade_account
process_payload
head 202
else
render plain: signature_verification_failure_reason, status: 401
end
end
private
def unknown_deleted_account?
json = Oj.load(body, mode: :strict)
json['type'] == 'Delete' && json['actor'].present? && json['actor'] == value_or_id(json['object']) && !Account.where(uri: json['actor']).exists?
rescue Oj::ParseError
false
end
def set_account
@account = Account.find_local!(params[:account_username]) if params[:account_username]
end
def body
return @body if defined?(@body)
@body = request.body.read.force_encoding('UTF-8')
request.body.rewind if request.body.respond_to?(:rewind)
@body
end
def upgrade_account
if signed_request_account.ostatus?
signed_request_account.update(last_webfingered_at: nil)
ResolveAccountWorker.perform_async(signed_request_account.acct)
end
Pubsubhubbub::UnsubscribeWorker.perform_async(signed_request_account.id) if signed_request_account.subscribed?
DeliveryFailureTracker.track_inverse_success!(signed_request_account)
end
def process_payload
ActivityPub::ProcessingWorker.perform_async(signed_request_account.id, body, @account&.id)
end
end
================================================
FILE: app/controllers/activitypub/outboxes_controller.rb
================================================
# frozen_string_literal: true
class ActivityPub::OutboxesController < Api::BaseController
LIMIT = 20
include SignatureVerification
before_action :set_account
before_action :set_statuses
before_action :set_cache_headers
def show
expires_in 1.minute, public: true unless page_requested?
render json: outbox_presenter, serializer: ActivityPub::OutboxSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
end
private
def set_account
@account = Account.find_local!(params[:account_username])
end
def outbox_presenter
if page_requested?
ActivityPub::CollectionPresenter.new(
id: account_outbox_url(@account, page_params),
type: :ordered,
part_of: account_outbox_url(@account),
prev: prev_page,
next: next_page,
items: @statuses
)
else
ActivityPub::CollectionPresenter.new(
id: account_outbox_url(@account),
type: :ordered,
size: @account.statuses_count,
first: account_outbox_url(@account, page: true),
last: account_outbox_url(@account, page: true, min_id: 0)
)
end
end
def next_page
account_outbox_url(@account, page: true, max_id: @statuses.last.id) if @statuses.size == LIMIT
end
def prev_page
account_outbox_url(@account, page: true, min_id: @statuses.first.id) unless @statuses.empty?
end
def set_statuses
return unless page_requested?
@statuses = @account.statuses.permitted_for(@account, signed_request_account)
@statuses = params[:min_id].present? ? @statuses.paginate_by_min_id(LIMIT, params[:min_id]).reverse : @statuses.paginate_by_max_id(LIMIT, params[:max_id])
@statuses = cache_collection(@statuses, Status)
end
def page_requested?
params[:page] == 'true'
end
def page_params
{ page: true, max_id: params[:max_id], min_id: params[:min_id] }.compact
end
end
================================================
FILE: app/controllers/admin/account_actions_controller.rb
================================================
# frozen_string_literal: true
module Admin
class AccountActionsController < BaseController
before_action :set_account
def new
@account_action = Admin::AccountAction.new(type: params[:type], report_id: params[:report_id], send_email_notification: true)
@warning_presets = AccountWarningPreset.all
end
def create
account_action = Admin::AccountAction.new(resource_params)
account_action.target_account = @account
account_action.current_account = current_account
account_action.save!
if account_action.with_report?
redirect_to admin_reports_path
else
redirect_to admin_account_path(@account.id)
end
end
private
def set_account
@account = Account.find(params[:account_id])
end
def resource_params
params.require(:admin_account_action).permit(:type, :report_id, :warning_preset_id, :text, :send_email_notification)
end
end
end
================================================
FILE: app/controllers/admin/account_moderation_notes_controller.rb
================================================
# frozen_string_literal: true
module Admin
class AccountModerationNotesController < BaseController
before_action :set_account_moderation_note, only: [:destroy]
def create
authorize AccountModerationNote, :create?
@account_moderation_note = current_account.account_moderation_notes.new(resource_params)
if @account_moderation_note.save
redirect_to admin_account_path(@account_moderation_note.target_account_id), notice: I18n.t('admin.account_moderation_notes.created_msg')
else
@account = @account_moderation_note.target_account
@moderation_notes = @account.targeted_moderation_notes.latest
@warnings = @account.targeted_account_warnings.latest.custom
render template: 'admin/accounts/show'
end
end
def destroy
authorize @account_moderation_note, :destroy?
@account_moderation_note.destroy!
redirect_to admin_account_path(@account_moderation_note.target_account_id), notice: I18n.t('admin.account_moderation_notes.destroyed_msg')
end
private
def resource_params
params.require(:account_moderation_note).permit(
:content,
:target_account_id
)
end
def set_account_moderation_note
@account_moderation_note = AccountModerationNote.find(params[:id])
end
end
end
================================================
FILE: app/controllers/admin/accounts_controller.rb
================================================
# frozen_string_literal: true
module Admin
class AccountsController < BaseController
before_action :set_account, only: [:show, :subscribe, :unsubscribe, :redownload, :remove_avatar, :remove_header, :enable, :unsilence, :unsuspend, :memorialize, :approve, :reject]
before_action :require_remote_account!, only: [:subscribe, :unsubscribe, :redownload]
before_action :require_local_account!, only: [:enable, :memorialize, :approve, :reject]
def index
authorize :account, :index?
@accounts = filtered_accounts.page(params[:page])
end
def show
authorize @account, :show?
@account_moderation_note = current_account.account_moderation_notes.new(target_account: @account)
@moderation_notes = @account.targeted_moderation_notes.latest
@warnings = @account.targeted_account_warnings.latest.custom
end
def subscribe
authorize @account, :subscribe?
Pubsubhubbub::SubscribeWorker.perform_async(@account.id)
redirect_to admin_account_path(@account.id)
end
def unsubscribe
authorize @account, :unsubscribe?
Pubsubhubbub::UnsubscribeWorker.perform_async(@account.id)
redirect_to admin_account_path(@account.id)
end
def memorialize
authorize @account, :memorialize?
@account.memorialize!
log_action :memorialize, @account
redirect_to admin_account_path(@account.id)
end
def enable
authorize @account.user, :enable?
@account.user.enable!
log_action :enable, @account.user
redirect_to admin_account_path(@account.id)
end
def approve
authorize @account.user, :approve?
@account.user.approve!
redirect_to admin_pending_accounts_path
end
def reject
authorize @account.user, :reject?
SuspendAccountService.new.call(@account, including_user: true, destroy: true, skip_distribution: true)
redirect_to admin_pending_accounts_path
end
def unsilence
authorize @account, :unsilence?
@account.unsilence!
log_action :unsilence, @account
redirect_to admin_account_path(@account.id)
end
def unsuspend
authorize @account, :unsuspend?
@account.unsuspend!
log_action :unsuspend, @account
redirect_to admin_account_path(@account.id)
end
def redownload
authorize @account, :redownload?
@account.update!(last_webfingered_at: nil)
ResolveAccountService.new.call(@account)
redirect_to admin_account_path(@account.id)
end
def remove_avatar
authorize @account, :remove_avatar?
@account.avatar = nil
@account.save!
log_action :remove_avatar, @account.user
redirect_to admin_account_path(@account.id)
end
def remove_header
authorize @account, :remove_header?
@account.header = nil
@account.save!
log_action :remove_header, @account.user
redirect_to admin_account_path(@account.id)
end
private
def set_account
@account = Account.find(params[:id])
end
def require_remote_account!
redirect_to admin_account_path(@account.id) if @account.local?
end
def require_local_account!
redirect_to admin_account_path(@account.id) unless @account.local? && @account.user.present?
end
def filtered_accounts
AccountFilter.new(filter_params).results
end
def filter_params
params.permit(
:local,
:remote,
:by_domain,
:active,
:pending,
:silenced,
:suspended,
:username,
:display_name,
:email,
:ip,
:staff
)
end
end
end
================================================
FILE: app/controllers/admin/action_logs_controller.rb
================================================
# frozen_string_literal: true
module Admin
class ActionLogsController < BaseController
def index
@action_logs = Admin::ActionLog.page(params[:page])
end
end
end
================================================
FILE: app/controllers/admin/base_controller.rb
================================================
# frozen_string_literal: true
module Admin
class BaseController < ApplicationController
include Authorization
include AccountableConcern
layout 'admin'
before_action :require_staff!
before_action :set_body_classes
private
def set_body_classes
@body_classes = 'admin'
end
def set_user
@user = Account.find(params[:account_id]).user || raise(ActiveRecord::RecordNotFound)
end
end
end
================================================
FILE: app/controllers/admin/change_emails_controller.rb
================================================
# frozen_string_literal: true
module Admin
class ChangeEmailsController < BaseController
before_action :set_account
before_action :require_local_account!
def show
authorize @user, :change_email?
end
def update
authorize @user, :change_email?
new_email = resource_params.fetch(:unconfirmed_email)
if new_email != @user.email
@user.update!(
unconfirmed_email: new_email,
# Regenerate the confirmation token:
confirmation_token: nil
)
log_action :change_email, @user
@user.send_confirmation_instructions
end
redirect_to admin_account_path(@account.id), notice: I18n.t('admin.accounts.change_email.changed_msg')
end
private
def set_account
@account = Account.find(params[:account_id])
@user = @account.user
end
def require_local_account!
redirect_to admin_account_path(@account.id) unless @account.local? && @account.user.present?
end
def resource_params
params.require(:user).permit(
:unconfirmed_email
)
end
end
end
================================================
FILE: app/controllers/admin/confirmations_controller.rb
================================================
# frozen_string_literal: true
module Admin
class ConfirmationsController < BaseController
before_action :set_user
before_action :check_confirmation, only: [:resend]
def create
authorize @user, :confirm?
@user.confirm!
log_action :confirm, @user
redirect_to admin_accounts_path
end
def resend
authorize @user, :confirm?
@user.resend_confirmation_instructions
log_action :confirm, @user
flash[:notice] = I18n.t('admin.accounts.resend_confirmation.success')
redirect_to admin_accounts_path
end
private
def check_confirmation
if @user.confirmed?
flash[:error] = I18n.t('admin.accounts.resend_confirmation.already_confirmed')
redirect_to admin_accounts_path
end
end
end
end
================================================
FILE: app/controllers/admin/custom_emojis_controller.rb
================================================
# frozen_string_literal: true
module Admin
class CustomEmojisController < BaseController
before_action :set_custom_emoji, except: [:index, :new, :create]
before_action :set_filter_params
include ObfuscateFilename
obfuscate_filename [:custom_emoji, :image]
def index
authorize :custom_emoji, :index?
@custom_emojis = filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page])
end
def new
authorize :custom_emoji, :create?
@custom_emoji = CustomEmoji.new
end
def create
authorize :custom_emoji, :create?
@custom_emoji = CustomEmoji.new(resource_params)
if @custom_emoji.save
log_action :create, @custom_emoji
redirect_to admin_custom_emojis_path, notice: I18n.t('admin.custom_emojis.created_msg')
else
render :new
end
end
def update
authorize @custom_emoji, :update?
if @custom_emoji.update(resource_params)
log_action :update, @custom_emoji
flash[:notice] = I18n.t('admin.custom_emojis.updated_msg')
else
flash[:alert] = I18n.t('admin.custom_emojis.update_failed_msg')
end
redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
end
def destroy
authorize @custom_emoji, :destroy?
@custom_emoji.destroy!
log_action :destroy, @custom_emoji
flash[:notice] = I18n.t('admin.custom_emojis.destroyed_msg')
redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
end
def copy
authorize @custom_emoji, :copy?
emoji = CustomEmoji.find_or_initialize_by(domain: nil,
shortcode: @custom_emoji.shortcode)
emoji.image = @custom_emoji.image
if emoji.save
log_action :create, emoji
flash[:notice] = I18n.t('admin.custom_emojis.copied_msg')
else
flash[:alert] = I18n.t('admin.custom_emojis.copy_failed_msg')
end
redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
end
def enable
authorize @custom_emoji, :enable?
@custom_emoji.update!(disabled: false)
log_action :enable, @custom_emoji
flash[:notice] = I18n.t('admin.custom_emojis.enabled_msg')
redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
end
def disable
authorize @custom_emoji, :disable?
@custom_emoji.update!(disabled: true)
log_action :disable, @custom_emoji
flash[:notice] = I18n.t('admin.custom_emojis.disabled_msg')
redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params)
end
private
def set_custom_emoji
@custom_emoji = CustomEmoji.find(params[:id])
end
def set_filter_params
@filter_params = filter_params.to_hash.symbolize_keys
end
def resource_params
params.require(:custom_emoji).permit(:shortcode, :image, :visible_in_picker)
end
def filtered_custom_emojis
CustomEmojiFilter.new(filter_params).results
end
def filter_params
params.permit(
:local,
:remote,
:by_domain,
:shortcode
)
end
end
end
================================================
FILE: app/controllers/admin/dashboard_controller.rb
================================================
# frozen_string_literal: true
require 'sidekiq/api'
module Admin
class DashboardController < BaseController
def index
@users_count = User.count
@registrations_week = Redis.current.get("activity:accounts:local:#{current_week}") || 0
@logins_week = Redis.current.pfcount("activity:logins:#{current_week}")
@interactions_week = Redis.current.get("activity:interactions:#{current_week}") || 0
@relay_enabled = Relay.enabled.exists?
@single_user_mode = Rails.configuration.x.single_user_mode
@registrations_enabled = Setting.registrations_mode != 'none'
@max_bio_chars = Setting.max_bio_chars
@max_toot_chars = Setting.max_toot_chars
@deletions_enabled = Setting.open_deletion
@invites_enabled = Setting.min_invite_role == 'user'
@search_enabled = Chewy.enabled?
@version = Florence::Version.to_s
@masto_version = Mastodon::Version.to_s
@database_version = ActiveRecord::Base.connection.execute('SELECT VERSION()').first['version'].match(/\A(?:PostgreSQL |)([^\s]+).*\z/)[1]
@redis_version = redis_info['redis_version']
@reports_count = Report.unresolved.count
@queue_backlog = Sidekiq::Stats.new.enqueued
@recent_users = User.confirmed.recent.includes(:account).limit(4)
@database_size = ActiveRecord::Base.connection.execute('SELECT pg_database_size(current_database())').first['pg_database_size']
@redis_size = redis_info['used_memory']
@ldap_enabled = ENV['LDAP_ENABLED'] == 'true'
@cas_enabled = ENV['CAS_ENABLED'] == 'true'
@saml_enabled = ENV['SAML_ENABLED'] == 'true'
@pam_enabled = ENV['PAM_ENABLED'] == 'true'
@hidden_service = ENV['ALLOW_ACCESS_TO_HIDDEN_SERVICE'] == 'true'
@trending_hashtags = TrendingTags.get(7)
@profile_directory = Setting.profile_directory
@timeline_preview = Setting.timeline_preview
end
private
def current_week
@current_week ||= Time.now.utc.to_date.cweek
end
def redis_info
@redis_info ||= Redis.current.info
end
end
end
================================================
FILE: app/controllers/admin/domain_blocks_controller.rb
================================================
# frozen_string_literal: true
module Admin
class DomainBlocksController < BaseController
before_action :set_domain_block, only: [:show, :destroy]
def new
authorize :domain_block, :create?
@domain_block = DomainBlock.new(domain: params[:_domain])
end
def create
authorize :domain_block, :create?
@domain_block = DomainBlock.new(resource_params)
existing_domain_block = resource_params[:domain].present? ? DomainBlock.find_by(domain: resource_params[:domain]) : nil
if existing_domain_block.present? && !@domain_block.stricter_than?(existing_domain_block)
@domain_block.save
flash[:alert] = I18n.t('admin.domain_blocks.existing_domain_block_html', name: existing_domain_block.domain, unblock_url: admin_domain_block_path(existing_domain_block)).html_safe # rubocop:disable Rails/OutputSafety
@domain_block.errors[:domain].clear
render :new
else
if existing_domain_block.present?
@domain_block = existing_domain_block
@domain_block.update(resource_params)
end
if @domain_block.save
DomainBlockWorker.perform_async(@domain_block.id)
log_action :create, @domain_block
redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
else
render :new
end
end
end
def show
authorize @domain_block, :show?
end
def destroy
authorize @domain_block, :destroy?
UnblockDomainService.new.call(@domain_block)
log_action :destroy, @domain_block
redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.destroyed_msg')
end
private
def set_domain_block
@domain_block = DomainBlock.find(params[:id])
end
def resource_params
params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports)
end
end
end
================================================
FILE: app/controllers/admin/email_domain_blocks_controller.rb
================================================
# frozen_string_literal: true
module Admin
class EmailDomainBlocksController < BaseController
before_action :set_email_domain_block, only: [:show, :destroy]
def index
authorize :email_domain_block, :index?
@email_domain_blocks = EmailDomainBlock.page(params[:page])
end
def new
authorize :email_domain_block, :create?
@email_domain_block = EmailDomainBlock.new
end
def create
authorize :email_domain_block, :create?
@email_domain_block = EmailDomainBlock.new(resource_params)
if @email_domain_block.save
log_action :create, @email_domain_block
redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.created_msg')
else
render :new
end
end
def destroy
authorize @email_domain_block, :destroy?
@email_domain_block.destroy!
log_action :destroy, @email_domain_block
redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.destroyed_msg')
end
private
def set_email_domain_block
@email_domain_block = EmailDomainBlock.find(params[:id])
end
def resource_params
params.require(:email_domain_block).permit(:domain)
end
end
end
================================================
FILE: app/controllers/admin/followers_controller.rb
================================================
# frozen_string_literal: true
module Admin
class FollowersController < BaseController
before_action :set_account
PER_PAGE = 40
def index
authorize :account, :index?
@followers = @account.followers.local.recent.page(params[:page]).per(PER_PAGE)
end
def set_account
@account = Account.find(params[:account_id])
end
end
end
================================================
FILE: app/controllers/admin/instances_controller.rb
================================================
# frozen_string_literal: true
module Admin
class InstancesController < BaseController
def index
authorize :instance, :index?
@instances = ordered_instances
end
def show
authorize :instance, :show?
@instance = Instance.new(Account.by_domain_accounts.find_by(domain: params[:id]) || DomainBlock.find_by!(domain: params[:id]))
@following_count = Follow.where(account: Account.where(domain: params[:id])).count
@followers_count = Follow.where(target_account: Account.where(domain: params[:id])).count
@reports_count = Report.where(target_account: Account.where(domain: params[:id])).count
@blocks_count = Block.where(target_account: Account.where(domain: params[:id])).count
@available = DeliveryFailureTracker.available?(Account.select(:shared_inbox_url).where(domain: params[:id]).first&.shared_inbox_url)
@media_storage = MediaAttachment.where(account: Account.where(domain: params[:id])).sum(:file_file_size)
@domain_block = DomainBlock.find_by(domain: params[:id])
end
private
def filtered_instances
InstanceFilter.new(filter_params).results
end
def paginated_instances
filtered_instances.page(params[:page])
end
helper_method :paginated_instances
def ordered_instances
paginated_instances.map { |resource| Instance.new(resource) }
end
def filter_params
params.permit(:limited, :by_domain)
end
end
end
================================================
FILE: app/controllers/admin/invites_controller.rb
================================================
# frozen_string_literal: true
module Admin
class InvitesController < BaseController
def index
authorize :invite, :index?
@invites = filtered_invites.includes(user: :account).page(params[:page])
@invite = Invite.new
end
def create
authorize :invite, :create?
@invite = Invite.new(resource_params)
@invite.user = current_user
if @invite.save
redirect_to admin_invites_path
else
@invites = Invite.page(params[:page])
render :index
end
end
def destroy
@invite = Invite.find(params[:id])
authorize @invite, :destroy?
@invite.expire!
redirect_to admin_invites_path
end
def deactivate_all
authorize :invite, :deactivate_all?
Invite.available.in_batches.update_all(expires_at: Time.now.utc)
redirect_to admin_invites_path
end
private
def resource_params
params.require(:invite).permit(:max_uses, :expires_in)
end
def filtered_invites
InviteFilter.new(filter_params).results
end
def filter_params
params.permit(:available, :expired)
end
end
end
================================================
FILE: app/controllers/admin/pending_accounts_controller.rb
================================================
# frozen_string_literal: true
module Admin
class PendingAccountsController < BaseController
before_action :set_accounts, only: :index
def index
@form = Form::AccountBatch.new
end
def batch
@form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button))
@form.save
rescue ActionController::ParameterMissing
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
ensure
redirect_to admin_pending_accounts_path(current_params)
end
def approve_all
Form::AccountBatch.new(current_account: current_account, account_ids: User.pending.pluck(:account_id), action: 'approve').save
redirect_to admin_pending_accounts_path(current_params)
end
def reject_all
Form::AccountBatch.new(current_account: current_account, account_ids: User.pending.pluck(:account_id), action: 'reject').save
redirect_to admin_pending_accounts_path(current_params)
end
private
def set_accounts
@accounts = Account.joins(:user).merge(User.pending.recent).includes(user: :invite_request).page(params[:page])
end
def form_account_batch_params
params.require(:form_account_batch).permit(:action, account_ids: [])
end
def action_from_button
if params[:approve]
'approve'
elsif params[:reject]
'reject'
end
end
def current_params
params.slice(:page).permit(:page)
end
end
end
================================================
FILE: app/controllers/admin/relays_controller.rb
================================================
# frozen_string_literal: true
module Admin
class RelaysController < BaseController
before_action :set_relay, except: [:index, :new, :create]
def index
authorize :relay, :update?
@relays = Relay.all
end
def new
authorize :relay, :update?
@relay = Relay.new(inbox_url: Relay::PRESET_RELAY)
end
def create
authorize :relay, :update?
@relay = Relay.new(resource_params)
if @relay.save
@relay.enable!
redirect_to admin_relays_path
else
render action: :new
end
end
def destroy
authorize :relay, :update?
@relay.destroy
redirect_to admin_relays_path
end
def enable
authorize :relay, :update?
@relay.enable!
redirect_to admin_relays_path
end
def disable
authorize :relay, :update?
@relay.disable!
redirect_to admin_relays_path
end
private
def set_relay
@relay = Relay.find(params[:id])
end
def resource_params
params.require(:relay).permit(:inbox_url)
end
end
end
================================================
FILE: app/controllers/admin/report_notes_controller.rb
================================================
# frozen_string_literal: true
module Admin
class ReportNotesController < BaseController
before_action :set_report_note, only: [:destroy]
def create
authorize ReportNote, :create?
@report_note = current_account.report_notes.new(resource_params)
@report = @report_note.report
if @report_note.save
if params[:create_and_resolve]
@report.resolve!(current_account)
log_action :resolve, @report
redirect_to admin_reports_path, notice: I18n.t('admin.reports.resolved_msg')
return
end
if params[:create_and_unresolve]
@report.unresolve!
log_action :reopen, @report
end
redirect_to admin_report_path(@report), notice: I18n.t('admin.report_notes.created_msg')
else
@report_notes = @report.notes.latest
@report_history = @report.history
@form = Form::StatusBatch.new
render template: 'admin/reports/show'
end
end
def destroy
authorize @report_note, :destroy?
@report_note.destroy!
redirect_to admin_report_path(@report_note.report_id), notice: I18n.t('admin.report_notes.destroyed_msg')
end
private
def resource_params
params.require(:report_note).permit(
:content,
:report_id
)
end
def set_report_note
@report_note = ReportNote.find(params[:id])
end
end
end
================================================
FILE: app/controllers/admin/reported_statuses_controller.rb
================================================
# frozen_string_literal: true
module Admin
class ReportedStatusesController < BaseController
before_action :set_report
def create
authorize :status, :update?
@form = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button))
flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save
redirect_to admin_report_path(@report)
rescue ActionController::ParameterMissing
flash[:alert] = I18n.t('admin.statuses.no_status_selected')
redirect_to admin_report_path(@report)
end
private
def status_params
params.require(:status).permit(:sensitive)
end
def form_status_batch_params
params.require(:form_status_batch).permit(status_ids: [])
end
def action_from_button
if params[:nsfw_on]
'nsfw_on'
elsif params[:nsfw_off]
'nsfw_off'
elsif params[:delete]
'delete'
end
end
def set_report
@report = Report.find(params[:report_id])
end
end
end
================================================
FILE: app/controllers/admin/reports_controller.rb
================================================
# frozen_string_literal: true
module Admin
class ReportsController < BaseController
before_action :set_report, except: [:index]
def index
authorize :report, :index?
@reports = filtered_reports.page(params[:page])
end
def show
authorize @report, :show?
@report_note = @report.notes.new
@report_notes = (@report.notes.latest + @report.history + @report.target_account.targeted_account_warnings.latest.custom).sort_by(&:created_at)
@form = Form::StatusBatch.new
end
def assign_to_self
authorize @report, :update?
@report.update!(assigned_account_id: current_account.id)
log_action :assigned_to_self, @report
redirect_to admin_report_path(@report)
end
def unassign
authorize @report, :update?
@report.update!(assigned_account_id: nil)
log_action :unassigned, @report
redirect_to admin_report_path(@report)
end
def reopen
authorize @report, :update?
@report.unresolve!
log_action :reopen, @report
redirect_to admin_report_path(@report)
end
def resolve
authorize @report, :update?
@report.resolve!(current_account)
log_action :resolve, @report
redirect_to admin_reports_path, notice: I18n.t('admin.reports.resolved_msg')
end
private
def filtered_reports
ReportFilter.new(filter_params).results.order(id: :desc).includes(:account, :target_account)
end
def filter_params
params.permit(
:account_id,
:resolved,
:target_account_id
)
end
def set_report
@report = Report.find(params[:id])
end
end
end
================================================
FILE: app/controllers/admin/resets_controller.rb
================================================
# frozen_string_literal: true
module Admin
class ResetsController < BaseController
before_action :set_user
def create
authorize @user, :reset_password?
@user.send_reset_password_instructions
log_action :reset_password, @user
redirect_to admin_accounts_path
end
end
end
================================================
FILE: app/controllers/admin/roles_controller.rb
================================================
# frozen_string_literal: true
module Admin
class RolesController < BaseController
before_action :set_user
def promote
authorize @user, :promote?
@user.promote!
log_action :promote, @user
redirect_to admin_account_path(@user.account_id)
end
def demote
authorize @user, :demote?
@user.demote!
log_action :demote, @user
redirect_to admin_account_path(@user.account_id)
end
end
end
================================================
FILE: app/controllers/admin/settings_controller.rb
================================================
# frozen_string_literal: true
module Admin
class SettingsController < BaseController
ADMIN_SETTINGS = %w(
site_contact_username
site_contact_email
site_title
site_short_description
site_description
site_extended_description
site_terms
open_registrations
max_bio_chars
max_toot_chars
closed_registrations_message
open_deletion
timeline_preview
show_staff_badge
bootstrap_timeline_accounts
theme
thumbnail
hero
mascot
min_invite_role
activity_api_enabled
peers_api_enabled
show_known_fediverse_at_about_page
preview_sensitive_media
custom_css
profile_directory
).freeze
BOOLEAN_SETTINGS = %w(
open_registrations
open_deletion
timeline_preview
show_staff_badge
activity_api_enabled
peers_api_enabled
show_known_fediverse_at_about_page
preview_sensitive_media
profile_directory
).freeze
INTEGER_SETTINGS = %w(
max_bio_chars
max_toot_chars
).freeze
UPLOAD_SETTINGS = %w(
thumbnail
hero
mascot
).freeze
def edit
authorize :settings, :show?
@admin_settings = Form::AdminSettings.new
end
def update
authorize :settings, :update?
@admin_settings = Form::AdminSettings.new(settings_params)
if @admin_settings.save
flash[:notice] = I18n.t('generic.changes_saved_msg')
redirect_to edit_admin_settings_path
else
render :edit
end
end
private
def settings_params
params.require(:form_admin_settings).permit(*Form::AdminSettings::KEYS)
end
end
end
================================================
FILE: app/controllers/admin/statuses_controller.rb
================================================
# frozen_string_literal: true
module Admin
class StatusesController < BaseController
helper_method :current_params
before_action :set_account
PER_PAGE = 20
def index
authorize :status, :index?
@statuses = @account.statuses.where(visibility: [:public, :unlisted])
if params[:media]
account_media_status_ids = @account.media_attachments.attached.reorder(nil).select(:status_id).distinct
@statuses.merge!(Status.where(id: account_media_status_ids))
end
@statuses = @statuses.preload(:media_attachments, :mentions).page(params[:page]).per(PER_PAGE)
@form = Form::StatusBatch.new
end
def show
authorize :status, :index?
@statuses = @account.statuses.where(id: params[:id])
authorize @statuses.first, :show?
@form = Form::StatusBatch.new
end
def create
authorize :status, :update?
@form = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button))
flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save
redirect_to admin_account_statuses_path(@account.id, current_params)
rescue ActionController::ParameterMissing
flash[:alert] = I18n.t('admin.statuses.no_status_selected')
redirect_to admin_account_statuses_path(@account.id, current_params)
end
private
def form_status_batch_params
params.require(:form_status_batch).permit(:action, status_ids: [])
end
def set_account
@account = Account.find(params[:account_id])
end
def current_params
page = (params[:page] || 1).to_i
{
media: params[:media],
page: page > 1 && page,
}.select { |_, value| value.present? }
end
def action_from_button
if params[:nsfw_on]
'nsfw_on'
elsif params[:nsfw_off]
'nsfw_off'
elsif params[:delete]
'delete'
end
end
end
end
================================================
FILE: app/controllers/admin/subscriptions_controller.rb
================================================
# frozen_string_literal: true
module Admin
class SubscriptionsController < BaseController
def index
authorize :subscription, :index?
@subscriptions = ordered_subscriptions.page(requested_page)
end
private
def ordered_subscriptions
Subscription.order(id: :desc).includes(:account)
end
def requested_page
params[:page].to_i
end
end
end
================================================
FILE: app/controllers/admin/tags_controller.rb
================================================
# 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: false)
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
================================================
FILE: app/controllers/admin/two_factor_authentications_controller.rb
================================================
# frozen_string_literal: true
module Admin
class TwoFactorAuthenticationsController < BaseController
before_action :set_target_user
def destroy
authorize @user, :disable_2fa?
@user.disable_two_factor!
log_action :disable_2fa, @user
redirect_to admin_accounts_path
end
private
def set_target_user
@user = User.find(params[:user_id])
end
end
end
================================================
FILE: app/controllers/admin/warning_presets_controller.rb
================================================
# frozen_string_literal: true
module Admin
class WarningPresetsController < BaseController
before_action :set_warning_preset, except: [:index, :create]
def index
authorize :account_warning_preset, :index?
@warning_presets = AccountWarningPreset.all
@warning_preset = AccountWarningPreset.new
end
def create
authorize :account_warning_preset, :create?
@warning_preset = AccountWarningPreset.new(warning_preset_params)
if @warning_preset.save
redirect_to admin_warning_presets_path
else
@warning_presets = AccountWarningPreset.all
render :index
end
end
def edit
authorize @warning_preset, :update?
end
def update
authorize @warning_preset, :update?
if @warning_preset.update(warning_preset_params)
redirect_to admin_warning_presets_path
else
render :edit
end
end
def destroy
authorize @warning_preset, :destroy?
@warning_preset.destroy!
redirect_to admin_warning_presets_path
end
private
def set_warning_preset
@warning_preset = AccountWarningPreset.find(params[:id])
end
def warning_preset_params
params.require(:account_warning_preset).permit(:text)
end
end
end
================================================
FILE: app/controllers/api/base_controller.rb
================================================
# frozen_string_literal: true
class Api::BaseController < ApplicationController
DEFAULT_STATUSES_LIMIT = 20
DEFAULT_ACCOUNTS_LIMIT = 40
include RateLimitHeaders
skip_before_action :store_current_location
skip_before_action :check_user_permissions
before_action :set_cache_headers
protect_from_forgery with: :null_session
rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
render json: { error: e.to_s }, status: 422
end
rescue_from ActiveRecord::RecordNotFound do
render json: { error: 'Record not found' }, status: 404
end
rescue_from HTTP::Error, Mastodon::UnexpectedResponseError do
render json: { error: 'Remote data could not be fetched' }, status: 503
end
rescue_from OpenSSL::SSL::SSLError do
render json: { error: 'Remote SSL certificate could not be verified' }, status: 503
end
rescue_from Mastodon::NotPermittedError do
render json: { error: 'This action is not allowed' }, status: 403
end
def doorkeeper_unauthorized_render_options(error: nil)
{ json: { error: (error.try(:description) || 'Not authorized') } }
end
def doorkeeper_forbidden_render_options(*)
{ json: { error: 'This action is outside the authorized scopes' } }
end
protected
def set_pagination_headers(next_path = nil, prev_path = nil)
links = []
links << [next_path, [%w(rel next)]] if next_path
links << [prev_path, [%w(rel prev)]] if prev_path
response.headers['Link'] = LinkHeader.new(links) unless links.empty?
end
def limit_param(default_limit)
return default_limit unless params[:limit]
[params[:limit].to_i.abs, default_limit * 2].min
end
def params_slice(*keys)
params.slice(*keys).permit(*keys)
end
def current_resource_owner
@current_user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
end
def current_user
current_resource_owner || super
rescue ActiveRecord::RecordNotFound
nil
end
def require_user!
if !current_user
render json: { error: 'This method requires an authenticated user' }, status: 422
elsif current_user.disabled?
render json: { error: 'Your login is currently disabled' }, status: 403
elsif !current_user.confirmed?
render json: { error: 'Your login is missing a confirmed e-mail address' }, status: 403
elsif !current_user.approved?
render json: { error: 'Your login is currently pending approval' }, status: 403
else
set_user_activity
end
end
def render_empty
render json: {}, status: 200
end
def authorize_if_got_token!(*scopes)
doorkeeper_authorize!(*scopes) if doorkeeper_token
end
def set_cache_headers
response.headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
end
end
================================================
FILE: app/controllers/api/oembed_controller.rb
================================================
# frozen_string_literal: true
class Api::OEmbedController < Api::BaseController
respond_to :json
def show
@status = status_finder.status
render json: @status, serializer: OEmbedSerializer, width: maxwidth_or_default, height: maxheight_or_default
end
private
def status_finder
StatusFinder.new(params[:url])
end
def maxwidth_or_default
(params[:maxwidth].presence || 400).to_i
end
def maxheight_or_default
params[:maxheight].present? ? params[:maxheight].to_i : nil
end
end
================================================
FILE: app/controllers/api/proofs_controller.rb
================================================
# frozen_string_literal: true
class Api::ProofsController < Api::BaseController
before_action :set_account
before_action :set_provider
before_action :check_account_approval
before_action :check_account_suspension
def index
render json: @account, serializer: @provider.serializer_class
end
private
def set_provider
@provider = ProofProvider.find(params[:provider]) || raise(ActiveRecord::RecordNotFound)
end
def set_account
@account = Account.find_local!(params[:username])
end
def check_account_approval
not_found if @account.user_pending?
end
def check_account_suspension
gone if @account.suspended?
end
end
================================================
FILE: app/controllers/api/push_controller.rb
================================================
# frozen_string_literal: true
class Api::PushController < Api::BaseController
include SignatureVerification
def update
response, status = process_push_request
render plain: response, status: status
end
private
def process_push_request
case hub_mode
when 'subscribe'
Pubsubhubbub::SubscribeService.new.call(account_from_topic, hub_callback, hub_secret, hub_lease_seconds, verified_domain)
when 'unsubscribe'
Pubsubhubbub::UnsubscribeService.new.call(account_from_topic, hub_callback)
else
["Unknown mode: #{hub_mode}", 422]
end
end
def hub_mode
params['hub.mode']
end
def hub_topic
params['hub.topic']
end
def hub_callback
params['hub.callback']
end
def hub_lease_seconds
params['hub.lease_seconds']
end
def hub_secret
params['hub.secret']
end
def account_from_topic
if hub_topic.present? && local_domain? && account_feed_path?
Account.find_local(hub_topic_params[:username])
end
end
def hub_topic_params
@_hub_topic_params ||= Rails.application.routes.recognize_path(hub_topic_uri.path)
end
def hub_topic_uri
@_hub_topic_uri ||= Addressable::URI.parse(hub_topic).normalize
end
def local_domain?
TagManager.instance.web_domain?(hub_topic_domain)
end
def verified_domain
return signed_request_account.domain if signed_request_account
end
def hub_topic_domain
hub_topic_uri.host + (hub_topic_uri.port ? ":#{hub_topic_uri.port}" : '')
end
def account_feed_path?
hub_topic_params[:controller] == 'accounts' && hub_topic_params[:action] == 'show' && hub_topic_params[:format] == 'atom'
end
end
================================================
FILE: app/controllers/api/salmon_controller.rb
================================================
# frozen_string_literal: true
class Api::SalmonController < Api::BaseController
include SignatureVerification
before_action :set_account
respond_to :txt
def update
if verify_payload?
process_salmon
head 202
elsif payload.present?
render plain: signature_verification_failure_reason, status: 401
else
head 400
end
end
private
def set_account
@account = Account.find(params[:id])
end
def payload
@_payload ||= request.body.read
end
def verify_payload?
payload.present? && VerifySalmonService.new.call(payload)
end
def process_salmon
SalmonWorker.perform_async(@account.id, payload.force_encoding('UTF-8'))
end
end
================================================
FILE: app/controllers/api/subscriptions_controller.rb
================================================
# frozen_string_literal: true
class Api::SubscriptionsController < Api::BaseController
before_action :set_account
respond_to :txt
def show
if subscription.valid?(params['hub.topic'])
@account.update(subscription_expires_at: future_expires)
render plain: encoded_challenge, status: 200
else
head 404
end
end
def update
if subscription.verify(body, request.headers['HTTP_X_HUB_SIGNATURE'])
ProcessingWorker.perform_async(@account.id, body.force_encoding('UTF-8'))
end
head 200
end
private
def subscription
@_subscription ||= @account.subscription(
api_subscription_url(@account.id)
)
end
def body
@_body ||= request.body.read
end
def encoded_challenge
HTMLEntities.new.encode(params['hub.challenge'])
end
def future_expires
Time.now.utc + lease_seconds_or_default
end
def lease_seconds_or_default
(params['hub.lease_seconds'] || 1.day).to_i.seconds
end
def set_account
@account = Account.find(params[:id])
end
end
================================================
FILE: app/controllers/api/v1/accounts/credentials_controller.rb
================================================
# frozen_string_literal: true
class Api::V1::Accounts::CredentialsController < Api::BaseController
before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, except: [:update]
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:update]
before_action :require_user!
def show
@account = current_account
render json: @account, serializer: REST::CredentialAccountSerializer
end
def update
@account = current_account
UpdateAccountService.new.call(@account, account_params, raise_error: true)
UserSettingsDecorator.new(current_user).update(user_settings_params) if user_settings_params
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
render json: @account, serializer: REST::CredentialAccountSerializer
end
private
def account_params
params.permit(:display_name, :note, :avatar, :header, :locked, :bot, :discoverable, fields_attributes: [:name, :value])
end
def user_settings_params
return nil unless params.key?(:source)
source_params = params.require(:source)
{
'setting_default_privacy' => source_params.fetch(:privacy, @account.user.setting_default_privacy),
'setting_default_sensitive' => source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
'setting_default_language' => source_params.fetch(:language, @account.user.setting_default_language),
}
end
end
================================================
FILE: app/controllers/api/v1/accounts/follower_accounts_controller.rb
================================================
# frozen_string_literal: true
class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
before_action -> { doorkeeper_authorize! :read, :'read:accounts' }
before_action :set_account
after_action :insert_pagination_headers
respond_to :json
def index
@accounts = load_accounts
render json: @accounts, each_serializer: REST::AccountSerializer
end
private
def set_account
@account = Account.find(params[:account_id])
end
def load_accounts
return [] if hide_results?
default_accounts.merge(paginated_follows).to_a
end
def hide_results?
(@account.user_hides_network? && current_account.id != @account.id) || (current_account && @account.blocking?(current_account))
end
def default_accounts
Account.includes(:active_relationships, :account_stat).references(:active_relationships)
end
def paginated_follows
Follow.where(target_account: @account).paginate_by_max_id(
limit_param(DEFAULT_ACCOUNTS_LIMIT),
params[:max_id],
params[:since_id]
)
end
def insert_pagination_headers
set_pagination_headers(next_path, prev_path)
end
def next_path
if records_continue?
api_v1_account_followers_url pagination_params(max_id: pagination_max_id)
end
end
def prev_path
unless @accounts.empty?
api_v1_account_followers_url pagination_params(since_id: pagination_since_id)
end
end
def pagination_max_id
@accounts.last.active_relationships.first.id
end
def pagination_since_id
@accounts.first.active_relationships.first.id
end
def records_continue?
@accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
end
def pagination_params(core_params)
params.slice(:limit).permit(:limit).merge(core_params)
end
end
================================================
FILE: app/controllers/api/v1/accounts/following_accounts_controller.rb
================================================
# frozen_string_literal: true
class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
before_action -> { doorkeeper_authorize! :read, :'read:accounts' }
before_action :set_account
after_action :insert_pagination_headers
respond_to :json
def index
@accounts = load_accounts
render json: @accounts, each_serializer: REST::AccountSerializer
end
private
def set_account
@account = Account.find(params[:account_id])
end
def load_accounts
return [] if hide_results?
default_accounts.merge(paginated_follows).to_a
end
def hide_results?
(@account.user_hides_network? && current_account.id != @account.id) || (current_account && @account.blocking?(current_account))
end
def default_accounts
Account.includes(:passive_relationships, :account_stat).references(:passive_relationships)
end
def paginated_follows
Follow.where(account: @account).paginate_by_max_id(
limit_param(DEFAULT_ACCOUNTS_LIMIT),
params[:max_id],
params[:since_id]
)
end
def insert_pagination_headers
set_pagination_headers(next_path, prev_path)
end
def next_path
if records_continue?
api_v1_account_following_index_url pagination_params(max_id: pagination_max_id)
end
end
def prev_path
unless @accounts.empty?
api_v1_account_following_index_url pagination_params(since_id: pagination_since_id)
end
end
def pagination_max_id
@accounts.last.passive_relationships.first.id
end
def pagination_since_id
@accounts.first.passive_relationships.first.id
end
def records_continue?
@accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
end
def pagination_params(core_params)
params.slice(:limit).permit(:limit).merge(core_params)
end
end
================================================
FILE: app/controllers/api/v1/accounts/identity_proofs_controller.rb
================================================
# frozen_string_literal: true
class Api::V1::Accounts::IdentityProofsController < Api::BaseController
before_action :require_user!
before_action :set_account
respond_to :json
def index
@proofs = @account.identity_proofs.active
render json: @proofs, each_serializer: REST::IdentityProofSerializer
end
private
def set_account
@account = Account.find(params[:account_id])
end
end
================================================
FILE: app/controllers/api/v1/accounts/lists_controller.rb
================================================
# frozen_string_literal: true
class Api::V1::Accounts::ListsController < Api::BaseController
before_action -> { doorkeeper_authorize! :read, :'read:lists' }
before_action :require_user!
before_action :set_account
respond_to :json
def index
@lists = @account.lists.where(account: current_account)
render json: @lists, each_serializer: REST::ListSerializer
end
private
def set_account
@account = Account.find(params[:account_id])
end
end
================================================
FILE: app/controllers/api/v1/accounts/pins_controller.rb
================================================
# frozen_string_literal: true
class Api::V1::Accounts::PinsController < Api::BaseController
include Authorization
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }
before_action :require_user!
before_action :set_account
respond_to :json
def create
AccountPin.create!(account: current_account, target_account: @account)
render json: @account, serializer
gitextract_pog1r_hd/
├── .buildpacks
├── .circleci/
│ └── config.yml
├── .codeclimate.yml
├── .dependabot/
│ └── config.yml
├── .dockerignore
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .foreman
├── .gitattributes
├── .gitignore
├── .haml-lint.yml
├── .nanoignore
├── .nvmrc
├── .profile
├── .rspec
├── .rubocop.yml
├── .ruby-version
├── .sass-lint.yml
├── .slugignore
├── .yarnclean
├── AUTHORS.md
├── Aptfile
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Capfile
├── Dockerfile
├── Gemfile
├── LICENSE
├── Procfile
├── Procfile.dev
├── README.md
├── Rakefile
├── Vagrantfile
├── app/
│ ├── chewy/
│ │ └── statuses_index.rb
│ ├── controllers/
│ │ ├── about_controller.rb
│ │ ├── account_follow_controller.rb
│ │ ├── account_unfollow_controller.rb
│ │ ├── accounts_controller.rb
│ │ ├── activitypub/
│ │ │ ├── collections_controller.rb
│ │ │ ├── inboxes_controller.rb
│ │ │ └── outboxes_controller.rb
│ │ ├── admin/
│ │ │ ├── account_actions_controller.rb
│ │ │ ├── account_moderation_notes_controller.rb
│ │ │ ├── accounts_controller.rb
│ │ │ ├── action_logs_controller.rb
│ │ │ ├── base_controller.rb
│ │ │ ├── change_emails_controller.rb
│ │ │ ├── confirmations_controller.rb
│ │ │ ├── custom_emojis_controller.rb
│ │ │ ├── dashboard_controller.rb
│ │ │ ├── domain_blocks_controller.rb
│ │ │ ├── email_domain_blocks_controller.rb
│ │ │ ├── followers_controller.rb
│ │ │ ├── instances_controller.rb
│ │ │ ├── invites_controller.rb
│ │ │ ├── pending_accounts_controller.rb
│ │ │ ├── relays_controller.rb
│ │ │ ├── report_notes_controller.rb
│ │ │ ├── reported_statuses_controller.rb
│ │ │ ├── reports_controller.rb
│ │ │ ├── resets_controller.rb
│ │ │ ├── roles_controller.rb
│ │ │ ├── settings_controller.rb
│ │ │ ├── statuses_controller.rb
│ │ │ ├── subscriptions_controller.rb
│ │ │ ├── tags_controller.rb
│ │ │ ├── two_factor_authentications_controller.rb
│ │ │ └── warning_presets_controller.rb
│ │ ├── api/
│ │ │ ├── base_controller.rb
│ │ │ ├── oembed_controller.rb
│ │ │ ├── proofs_controller.rb
│ │ │ ├── push_controller.rb
│ │ │ ├── salmon_controller.rb
│ │ │ ├── subscriptions_controller.rb
│ │ │ ├── v1/
│ │ │ │ ├── accounts/
│ │ │ │ │ ├── credentials_controller.rb
│ │ │ │ │ ├── follower_accounts_controller.rb
│ │ │ │ │ ├── following_accounts_controller.rb
│ │ │ │ │ ├── identity_proofs_controller.rb
│ │ │ │ │ ├── lists_controller.rb
│ │ │ │ │ ├── pins_controller.rb
│ │ │ │ │ ├── relationships_controller.rb
│ │ │ │ │ ├── search_controller.rb
│ │ │ │ │ └── statuses_controller.rb
│ │ │ │ ├── accounts_controller.rb
│ │ │ │ ├── apps/
│ │ │ │ │ └── credentials_controller.rb
│ │ │ │ ├── apps_controller.rb
│ │ │ │ ├── blocks_controller.rb
│ │ │ │ ├── conversations_controller.rb
│ │ │ │ ├── custom_emojis_controller.rb
│ │ │ │ ├── domain_blocks_controller.rb
│ │ │ │ ├── endorsements_controller.rb
│ │ │ │ ├── favourites_controller.rb
│ │ │ │ ├── filters_controller.rb
│ │ │ │ ├── follow_requests_controller.rb
│ │ │ │ ├── follows_controller.rb
│ │ │ │ ├── instances/
│ │ │ │ │ ├── activity_controller.rb
│ │ │ │ │ └── peers_controller.rb
│ │ │ │ ├── instances_controller.rb
│ │ │ │ ├── lists/
│ │ │ │ │ └── accounts_controller.rb
│ │ │ │ ├── lists_controller.rb
│ │ │ │ ├── media_controller.rb
│ │ │ │ ├── mutes_controller.rb
│ │ │ │ ├── notifications_controller.rb
│ │ │ │ ├── polls/
│ │ │ │ │ └── votes_controller.rb
│ │ │ │ ├── polls_controller.rb
│ │ │ │ ├── preferences_controller.rb
│ │ │ │ ├── push/
│ │ │ │ │ └── subscriptions_controller.rb
│ │ │ │ ├── reports_controller.rb
│ │ │ │ ├── scheduled_statuses_controller.rb
│ │ │ │ ├── search_controller.rb
│ │ │ │ ├── statuses/
│ │ │ │ │ ├── favourited_by_accounts_controller.rb
│ │ │ │ │ ├── favourites_controller.rb
│ │ │ │ │ ├── mutes_controller.rb
│ │ │ │ │ ├── pins_controller.rb
│ │ │ │ │ ├── reblogged_by_accounts_controller.rb
│ │ │ │ │ └── reblogs_controller.rb
│ │ │ │ ├── statuses_controller.rb
│ │ │ │ ├── streaming_controller.rb
│ │ │ │ ├── suggestions_controller.rb
│ │ │ │ └── timelines/
│ │ │ │ ├── direct_controller.rb
│ │ │ │ ├── home_controller.rb
│ │ │ │ ├── list_controller.rb
│ │ │ │ ├── public_controller.rb
│ │ │ │ └── tag_controller.rb
│ │ │ ├── v2/
│ │ │ │ └── search_controller.rb
│ │ │ └── web/
│ │ │ ├── base_controller.rb
│ │ │ ├── embeds_controller.rb
│ │ │ ├── push_subscriptions_controller.rb
│ │ │ └── settings_controller.rb
│ │ ├── application_controller.rb
│ │ ├── auth/
│ │ │ ├── confirmations_controller.rb
│ │ │ ├── omniauth_callbacks_controller.rb
│ │ │ ├── passwords_controller.rb
│ │ │ ├── registrations_controller.rb
│ │ │ └── sessions_controller.rb
│ │ ├── authorize_interactions_controller.rb
│ │ ├── concerns/
│ │ │ ├── account_controller_concern.rb
│ │ │ ├── accountable_concern.rb
│ │ │ ├── authorization.rb
│ │ │ ├── export_controller_concern.rb
│ │ │ ├── localized.rb
│ │ │ ├── obfuscate_filename.rb
│ │ │ ├── rate_limit_headers.rb
│ │ │ ├── session_tracking_concern.rb
│ │ │ ├── signature_authentication.rb
│ │ │ ├── signature_verification.rb
│ │ │ └── user_tracking_concern.rb
│ │ ├── custom_css_controller.rb
│ │ ├── directories_controller.rb
│ │ ├── emojis_controller.rb
│ │ ├── filters_controller.rb
│ │ ├── follower_accounts_controller.rb
│ │ ├── following_accounts_controller.rb
│ │ ├── home_controller.rb
│ │ ├── intents_controller.rb
│ │ ├── invites_controller.rb
│ │ ├── manifests_controller.rb
│ │ ├── media_controller.rb
│ │ ├── media_proxy_controller.rb
│ │ ├── oauth/
│ │ │ ├── authorizations_controller.rb
│ │ │ ├── authorized_applications_controller.rb
│ │ │ └── tokens_controller.rb
│ │ ├── public_timelines_controller.rb
│ │ ├── relationships_controller.rb
│ │ ├── remote_follow_controller.rb
│ │ ├── remote_interaction_controller.rb
│ │ ├── remote_unfollows_controller.rb
│ │ ├── settings/
│ │ │ ├── applications_controller.rb
│ │ │ ├── base_controller.rb
│ │ │ ├── deletes_controller.rb
│ │ │ ├── exports/
│ │ │ │ ├── blocked_accounts_controller.rb
│ │ │ │ ├── blocked_domains_controller.rb
│ │ │ │ ├── following_accounts_controller.rb
│ │ │ │ ├── lists_controller.rb
│ │ │ │ └── muted_accounts_controller.rb
│ │ │ ├── exports_controller.rb
│ │ │ ├── featured_tags_controller.rb
│ │ │ ├── identity_proofs_controller.rb
│ │ │ ├── imports_controller.rb
│ │ │ ├── migrations_controller.rb
│ │ │ ├── preferences/
│ │ │ │ ├── appearance_controller.rb
│ │ │ │ ├── notifications_controller.rb
│ │ │ │ └── other_controller.rb
│ │ │ ├── preferences_controller.rb
│ │ │ ├── profiles_controller.rb
│ │ │ ├── sessions_controller.rb
│ │ │ ├── two_factor_authentication/
│ │ │ │ ├── confirmations_controller.rb
│ │ │ │ └── recovery_codes_controller.rb
│ │ │ └── two_factor_authentications_controller.rb
│ │ ├── shares_controller.rb
│ │ ├── statuses_controller.rb
│ │ ├── stream_entries_controller.rb
│ │ ├── tags_controller.rb
│ │ └── well_known/
│ │ ├── host_meta_controller.rb
│ │ ├── keybase_proof_config_controller.rb
│ │ └── webfinger_controller.rb
│ ├── helpers/
│ │ ├── admin/
│ │ │ ├── account_moderation_notes_helper.rb
│ │ │ ├── action_logs_helper.rb
│ │ │ ├── dashboard_helper.rb
│ │ │ └── filter_helper.rb
│ │ ├── application_helper.rb
│ │ ├── flashes_helper.rb
│ │ ├── home_helper.rb
│ │ ├── instance_helper.rb
│ │ ├── jsonld_helper.rb
│ │ ├── routing_helper.rb
│ │ ├── settings_helper.rb
│ │ └── stream_entries_helper.rb
│ ├── javascript/
│ │ ├── mastodon/
│ │ │ ├── actions/
│ │ │ │ ├── accounts.js
│ │ │ │ ├── alerts.js
│ │ │ │ ├── blocks.js
│ │ │ │ ├── bundles.js
│ │ │ │ ├── columns.js
│ │ │ │ ├── compose.js
│ │ │ │ ├── conversations.js
│ │ │ │ ├── custom_emojis.js
│ │ │ │ ├── domain_blocks.js
│ │ │ │ ├── dropdown_menu.js
│ │ │ │ ├── emojis.js
│ │ │ │ ├── favourites.js
│ │ │ │ ├── filters.js
│ │ │ │ ├── height_cache.js
│ │ │ │ ├── identity_proofs.js
│ │ │ │ ├── importer/
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── normalizer.js
│ │ │ │ ├── interactions.js
│ │ │ │ ├── lists.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── mutes.js
│ │ │ │ ├── notifications.js
│ │ │ │ ├── onboarding.js
│ │ │ │ ├── pin_statuses.js
│ │ │ │ ├── polls.js
│ │ │ │ ├── push_notifications/
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── registerer.js
│ │ │ │ │ └── setter.js
│ │ │ │ ├── reports.js
│ │ │ │ ├── search.js
│ │ │ │ ├── settings.js
│ │ │ │ ├── statuses.js
│ │ │ │ ├── store.js
│ │ │ │ ├── streaming.js
│ │ │ │ ├── suggestions.js
│ │ │ │ └── timelines.js
│ │ │ ├── api.js
│ │ │ ├── base_polyfills.js
│ │ │ ├── common.js
│ │ │ ├── compare_id.js
│ │ │ ├── components/
│ │ │ │ ├── __tests__/
│ │ │ │ │ ├── __snapshots__/
│ │ │ │ │ │ ├── autosuggest_emoji-test.js.snap
│ │ │ │ │ │ ├── avatar-test.js.snap
│ │ │ │ │ │ ├── avatar_overlay-test.js.snap
│ │ │ │ │ │ ├── button-test.js.snap
│ │ │ │ │ │ └── display_name-test.js.snap
│ │ │ │ │ ├── autosuggest_emoji-test.js
│ │ │ │ │ ├── avatar-test.js
│ │ │ │ │ ├── avatar_overlay-test.js
│ │ │ │ │ ├── button-test.js
│ │ │ │ │ └── display_name-test.js
│ │ │ │ ├── account.js
│ │ │ │ ├── attachment_list.js
│ │ │ │ ├── autosuggest_emoji.js
│ │ │ │ ├── autosuggest_input.js
│ │ │ │ ├── autosuggest_textarea.js
│ │ │ │ ├── avatar.js
│ │ │ │ ├── avatar_composite.js
│ │ │ │ ├── avatar_overlay.js
│ │ │ │ ├── button.js
│ │ │ │ ├── column.js
│ │ │ │ ├── column_back_button.js
│ │ │ │ ├── column_back_button_slim.js
│ │ │ │ ├── column_header.js
│ │ │ │ ├── display_name.js
│ │ │ │ ├── domain.js
│ │ │ │ ├── dropdown_menu.js
│ │ │ │ ├── error_boundary.js
│ │ │ │ ├── extended_video_player.js
│ │ │ │ ├── hashtag.js
│ │ │ │ ├── icon.js
│ │ │ │ ├── icon_button.js
│ │ │ │ ├── icon_with_badge.js
│ │ │ │ ├── intersection_observer_article.js
│ │ │ │ ├── load_gap.js
│ │ │ │ ├── load_more.js
│ │ │ │ ├── loading_indicator.js
│ │ │ │ ├── media_gallery.js
│ │ │ │ ├── missing_indicator.js
│ │ │ │ ├── modal_root.js
│ │ │ │ ├── permalink.js
│ │ │ │ ├── poll.js
│ │ │ │ ├── relative_timestamp.js
│ │ │ │ ├── scrollable_list.js
│ │ │ │ ├── setting_text.js
│ │ │ │ ├── status.js
│ │ │ │ ├── status_action_bar.js
│ │ │ │ ├── status_content.js
│ │ │ │ └── status_list.js
│ │ │ ├── containers/
│ │ │ │ ├── account_container.js
│ │ │ │ ├── compose_container.js
│ │ │ │ ├── domain_container.js
│ │ │ │ ├── dropdown_menu_container.js
│ │ │ │ ├── intersection_observer_article_container.js
│ │ │ │ ├── mastodon.js
│ │ │ │ ├── media_container.js
│ │ │ │ ├── poll_container.js
│ │ │ │ ├── status_container.js
│ │ │ │ └── timeline_container.js
│ │ │ ├── extra_polyfills.js
│ │ │ ├── features/
│ │ │ │ ├── account/
│ │ │ │ │ └── components/
│ │ │ │ │ └── header.js
│ │ │ │ ├── account_gallery/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── media_item.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── account_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── header.js
│ │ │ │ │ │ └── moved_note.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── header_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── blocks/
│ │ │ │ │ └── index.js
│ │ │ │ ├── community_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── column_settings.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── column_settings_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── compose/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── action_bar.js
│ │ │ │ │ │ ├── autosuggest_account.js
│ │ │ │ │ │ ├── character_counter.js
│ │ │ │ │ │ ├── compose_form.js
│ │ │ │ │ │ ├── emoji_picker_dropdown.js
│ │ │ │ │ │ ├── navigation_bar.js
│ │ │ │ │ │ ├── poll_button.js
│ │ │ │ │ │ ├── poll_form.js
│ │ │ │ │ │ ├── privacy_dropdown.js
│ │ │ │ │ │ ├── reply_indicator.js
│ │ │ │ │ │ ├── search.js
│ │ │ │ │ │ ├── search_results.js
│ │ │ │ │ │ ├── text_icon_button.js
│ │ │ │ │ │ ├── upload.js
│ │ │ │ │ │ ├── upload_button.js
│ │ │ │ │ │ ├── upload_form.js
│ │ │ │ │ │ ├── upload_progress.js
│ │ │ │ │ │ └── warning.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ ├── autosuggest_account_container.js
│ │ │ │ │ │ ├── compose_form_container.js
│ │ │ │ │ │ ├── emoji_picker_dropdown_container.js
│ │ │ │ │ │ ├── navigation_container.js
│ │ │ │ │ │ ├── poll_button_container.js
│ │ │ │ │ │ ├── poll_form_container.js
│ │ │ │ │ │ ├── privacy_dropdown_container.js
│ │ │ │ │ │ ├── reply_indicator_container.js
│ │ │ │ │ │ ├── search_container.js
│ │ │ │ │ │ ├── search_results_container.js
│ │ │ │ │ │ ├── sensitive_button_container.js
│ │ │ │ │ │ ├── spoiler_button_container.js
│ │ │ │ │ │ ├── upload_button_container.js
│ │ │ │ │ │ ├── upload_container.js
│ │ │ │ │ │ ├── upload_form_container.js
│ │ │ │ │ │ ├── upload_progress_container.js
│ │ │ │ │ │ └── warning_container.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── util/
│ │ │ │ │ ├── counter.js
│ │ │ │ │ └── url_regex.js
│ │ │ │ ├── direct_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── conversation.js
│ │ │ │ │ │ └── conversations_list.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ ├── conversation_container.js
│ │ │ │ │ │ └── conversations_list_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── domain_blocks/
│ │ │ │ │ └── index.js
│ │ │ │ ├── emoji/
│ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ ├── emoji-test.js
│ │ │ │ │ │ └── emoji_index-test.js
│ │ │ │ │ ├── emoji.js
│ │ │ │ │ ├── emoji_compressed.js
│ │ │ │ │ ├── emoji_map.json
│ │ │ │ │ ├── emoji_mart_data_light.js
│ │ │ │ │ ├── emoji_mart_search_light.js
│ │ │ │ │ ├── emoji_picker.js
│ │ │ │ │ ├── emoji_unicode_mapping_light.js
│ │ │ │ │ ├── emoji_utils.js
│ │ │ │ │ ├── unicode_to_filename.js
│ │ │ │ │ └── unicode_to_unified_name.js
│ │ │ │ ├── favourited_statuses/
│ │ │ │ │ └── index.js
│ │ │ │ ├── favourites/
│ │ │ │ │ └── index.js
│ │ │ │ ├── follow_requests/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── account_authorize.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── account_authorize_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── followers/
│ │ │ │ │ └── index.js
│ │ │ │ ├── following/
│ │ │ │ │ └── index.js
│ │ │ │ ├── generic_not_found/
│ │ │ │ │ └── index.js
│ │ │ │ ├── getting_started/
│ │ │ │ │ └── index.js
│ │ │ │ ├── hashtag_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── column_settings.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── column_settings_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── home_timeline/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── column_settings.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── column_settings_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── introduction/
│ │ │ │ │ └── index.js
│ │ │ │ ├── keyboard_shortcuts/
│ │ │ │ │ └── index.js
│ │ │ │ ├── list_adder/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── account.js
│ │ │ │ │ │ └── list.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── list_editor/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── account.js
│ │ │ │ │ │ ├── edit_list_form.js
│ │ │ │ │ │ └── search.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── list_timeline/
│ │ │ │ │ └── index.js
│ │ │ │ ├── lists/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── new_list_form.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── mutes/
│ │ │ │ │ └── index.js
│ │ │ │ ├── notifications/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── clear_column_button.js
│ │ │ │ │ │ ├── column_settings.js
│ │ │ │ │ │ ├── filter_bar.js
│ │ │ │ │ │ ├── notification.js
│ │ │ │ │ │ └── setting_toggle.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ ├── column_settings_container.js
│ │ │ │ │ │ ├── filter_bar_container.js
│ │ │ │ │ │ └── notification_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── pinned_statuses/
│ │ │ │ │ └── index.js
│ │ │ │ ├── public_timeline/
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── column_settings_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── reblogs/
│ │ │ │ │ └── index.js
│ │ │ │ ├── report/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ └── status_check_box.js
│ │ │ │ │ └── containers/
│ │ │ │ │ └── status_check_box_container.js
│ │ │ │ ├── search/
│ │ │ │ │ └── index.js
│ │ │ │ ├── standalone/
│ │ │ │ │ ├── compose/
│ │ │ │ │ │ └── index.js
│ │ │ │ │ ├── hashtag_timeline/
│ │ │ │ │ │ └── index.js
│ │ │ │ │ └── public_timeline/
│ │ │ │ │ └── index.js
│ │ │ │ ├── status/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── action_bar.js
│ │ │ │ │ │ ├── card.js
│ │ │ │ │ │ └── detailed_status.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ └── detailed_status_container.js
│ │ │ │ │ └── index.js
│ │ │ │ ├── ui/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── __tests__/
│ │ │ │ │ │ │ └── column-test.js
│ │ │ │ │ │ ├── actions_modal.js
│ │ │ │ │ │ ├── boost_modal.js
│ │ │ │ │ │ ├── bundle.js
│ │ │ │ │ │ ├── bundle_column_error.js
│ │ │ │ │ │ ├── bundle_modal_error.js
│ │ │ │ │ │ ├── column.js
│ │ │ │ │ │ ├── column_header.js
│ │ │ │ │ │ ├── column_link.js
│ │ │ │ │ │ ├── column_loading.js
│ │ │ │ │ │ ├── column_subheading.js
│ │ │ │ │ │ ├── columns_area.js
│ │ │ │ │ │ ├── compose_panel.js
│ │ │ │ │ │ ├── confirmation_modal.js
│ │ │ │ │ │ ├── drawer_loading.js
│ │ │ │ │ │ ├── embed_modal.js
│ │ │ │ │ │ ├── focal_point_modal.js
│ │ │ │ │ │ ├── follow_requests_nav_link.js
│ │ │ │ │ │ ├── image_loader.js
│ │ │ │ │ │ ├── link_footer.js
│ │ │ │ │ │ ├── list_panel.js
│ │ │ │ │ │ ├── media_modal.js
│ │ │ │ │ │ ├── modal_loading.js
│ │ │ │ │ │ ├── modal_root.js
│ │ │ │ │ │ ├── mute_modal.js
│ │ │ │ │ │ ├── navigation_panel.js
│ │ │ │ │ │ ├── notifications_counter_icon.js
│ │ │ │ │ │ ├── report_modal.js
│ │ │ │ │ │ ├── tabs_bar.js
│ │ │ │ │ │ ├── upload_area.js
│ │ │ │ │ │ ├── video_modal.js
│ │ │ │ │ │ └── zoomable_image.js
│ │ │ │ │ ├── containers/
│ │ │ │ │ │ ├── bundle_container.js
│ │ │ │ │ │ ├── columns_area_container.js
│ │ │ │ │ │ ├── loading_bar_container.js
│ │ │ │ │ │ ├── modal_container.js
│ │ │ │ │ │ ├── notifications_container.js
│ │ │ │ │ │ └── status_list_container.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── util/
│ │ │ │ │ ├── async-components.js
│ │ │ │ │ ├── fullscreen.js
│ │ │ │ │ ├── get_rect_from_entry.js
│ │ │ │ │ ├── intersection_observer_wrapper.js
│ │ │ │ │ ├── optional_motion.js
│ │ │ │ │ ├── react_router_helpers.js
│ │ │ │ │ ├── reduced_motion.js
│ │ │ │ │ └── schedule_idle_task.js
│ │ │ │ └── video/
│ │ │ │ └── index.js
│ │ │ ├── initial_state.js
│ │ │ ├── is_mobile.js
│ │ │ ├── load_polyfills.js
│ │ │ ├── locales/
│ │ │ │ ├── ar.json
│ │ │ │ ├── ast.json
│ │ │ │ ├── bg.json
│ │ │ │ ├── bn.json
│ │ │ │ ├── ca.json
│ │ │ │ ├── co.json
│ │ │ │ ├── cs.json
│ │ │ │ ├── cy.json
│ │ │ │ ├── da.json
│ │ │ │ ├── de.json
│ │ │ │ ├── defaultMessages.json
│ │ │ │ ├── el.json
│ │ │ │ ├── en.json
│ │ │ │ ├── eo.json
│ │ │ │ ├── es.json
│ │ │ │ ├── eu.json
│ │ │ │ ├── fa.json
│ │ │ │ ├── fi.json
│ │ │ │ ├── fr.json
│ │ │ │ ├── gl.json
│ │ │ │ ├── he.json
│ │ │ │ ├── hi.json
│ │ │ │ ├── hr.json
│ │ │ │ ├── hu.json
│ │ │ │ ├── hy.json
│ │ │ │ ├── id.json
│ │ │ │ ├── index.js
│ │ │ │ ├── io.json
│ │ │ │ ├── it.json
│ │ │ │ ├── ja.json
│ │ │ │ ├── ka.json
│ │ │ │ ├── kk.json
│ │ │ │ ├── ko.json
│ │ │ │ ├── locale-data/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── co.js
│ │ │ │ │ └── oc.js
│ │ │ │ ├── lt.json
│ │ │ │ ├── lv.json
│ │ │ │ ├── ms.json
│ │ │ │ ├── nl.json
│ │ │ │ ├── no.json
│ │ │ │ ├── oc.json
│ │ │ │ ├── pl.json
│ │ │ │ ├── pt-BR.json
│ │ │ │ ├── pt.json
│ │ │ │ ├── ro.json
│ │ │ │ ├── ru.json
│ │ │ │ ├── sk.json
│ │ │ │ ├── sl.json
│ │ │ │ ├── sq.json
│ │ │ │ ├── sr-Latn.json
│ │ │ │ ├── sr.json
│ │ │ │ ├── sv.json
│ │ │ │ ├── ta.json
│ │ │ │ ├── te.json
│ │ │ │ ├── th.json
│ │ │ │ ├── tr.json
│ │ │ │ ├── uk.json
│ │ │ │ ├── whitelist_ar.json
│ │ │ │ ├── whitelist_ast.json
│ │ │ │ ├── whitelist_bg.json
│ │ │ │ ├── whitelist_bn.json
│ │ │ │ ├── whitelist_ca.json
│ │ │ │ ├── whitelist_co.json
│ │ │ │ ├── whitelist_cs.json
│ │ │ │ ├── whitelist_cy.json
│ │ │ │ ├── whitelist_da.json
│ │ │ │ ├── whitelist_de.json
│ │ │ │ ├── whitelist_el.json
│ │ │ │ ├── whitelist_en.json
│ │ │ │ ├── whitelist_eo.json
│ │ │ │ ├── whitelist_es.json
│ │ │ │ ├── whitelist_eu.json
│ │ │ │ ├── whitelist_fa.json
│ │ │ │ ├── whitelist_fi.json
│ │ │ │ ├── whitelist_fr.json
│ │ │ │ ├── whitelist_gl.json
│ │ │ │ ├── whitelist_he.json
│ │ │ │ ├── whitelist_hi.json
│ │ │ │ ├── whitelist_hr.json
│ │ │ │ ├── whitelist_hu.json
│ │ │ │ ├── whitelist_hy.json
│ │ │ │ ├── whitelist_id.json
│ │ │ │ ├── whitelist_io.json
│ │ │ │ ├── whitelist_it.json
│ │ │ │ ├── whitelist_ja.json
│ │ │ │ ├── whitelist_ka.json
│ │ │ │ ├── whitelist_kk.json
│ │ │ │ ├── whitelist_ko.json
│ │ │ │ ├── whitelist_lt.json
│ │ │ │ ├── whitelist_lv.json
│ │ │ │ ├── whitelist_ms.json
│ │ │ │ ├── whitelist_nl.json
│ │ │ │ ├── whitelist_no.json
│ │ │ │ ├── whitelist_oc.json
│ │ │ │ ├── whitelist_pl.json
│ │ │ │ ├── whitelist_pt-BR.json
│ │ │ │ ├── whitelist_pt.json
│ │ │ │ ├── whitelist_ro.json
│ │ │ │ ├── whitelist_ru.json
│ │ │ │ ├── whitelist_sk.json
│ │ │ │ ├── whitelist_sl.json
│ │ │ │ ├── whitelist_sq.json
│ │ │ │ ├── whitelist_sr-Latn.json
│ │ │ │ ├── whitelist_sr.json
│ │ │ │ ├── whitelist_sv.json
│ │ │ │ ├── whitelist_ta.json
│ │ │ │ ├── whitelist_te.json
│ │ │ │ ├── whitelist_th.json
│ │ │ │ ├── whitelist_tr.json
│ │ │ │ ├── whitelist_uk.json
│ │ │ │ ├── whitelist_zh-CN.json
│ │ │ │ ├── whitelist_zh-HK.json
│ │ │ │ ├── whitelist_zh-TW.json
│ │ │ │ ├── zh-CN.json
│ │ │ │ ├── zh-HK.json
│ │ │ │ └── zh-TW.json
│ │ │ ├── main.js
│ │ │ ├── middleware/
│ │ │ │ ├── errors.js
│ │ │ │ ├── loading_bar.js
│ │ │ │ └── sounds.js
│ │ │ ├── performance.js
│ │ │ ├── ready.js
│ │ │ ├── reducers/
│ │ │ │ ├── accounts.js
│ │ │ │ ├── accounts_counters.js
│ │ │ │ ├── alerts.js
│ │ │ │ ├── compose.js
│ │ │ │ ├── contexts.js
│ │ │ │ ├── conversations.js
│ │ │ │ ├── custom_emojis.js
│ │ │ │ ├── domain_lists.js
│ │ │ │ ├── dropdown_menu.js
│ │ │ │ ├── filters.js
│ │ │ │ ├── height_cache.js
│ │ │ │ ├── identity_proofs.js
│ │ │ │ ├── index.js
│ │ │ │ ├── list_adder.js
│ │ │ │ ├── list_editor.js
│ │ │ │ ├── lists.js
│ │ │ │ ├── media_attachments.js
│ │ │ │ ├── meta.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── mutes.js
│ │ │ │ ├── notifications.js
│ │ │ │ ├── polls.js
│ │ │ │ ├── push_notifications.js
│ │ │ │ ├── relationships.js
│ │ │ │ ├── reports.js
│ │ │ │ ├── search.js
│ │ │ │ ├── settings.js
│ │ │ │ ├── status_lists.js
│ │ │ │ ├── statuses.js
│ │ │ │ ├── suggestions.js
│ │ │ │ ├── timelines.js
│ │ │ │ └── user_lists.js
│ │ │ ├── rtl.js
│ │ │ ├── scroll.js
│ │ │ ├── selectors/
│ │ │ │ └── index.js
│ │ │ ├── service_worker/
│ │ │ │ ├── entry.js
│ │ │ │ ├── web_push_locales.js
│ │ │ │ └── web_push_notifications.js
│ │ │ ├── settings.js
│ │ │ ├── storage/
│ │ │ │ ├── db.js
│ │ │ │ └── modifier.js
│ │ │ ├── store/
│ │ │ │ └── configureStore.js
│ │ │ ├── stream.js
│ │ │ ├── test_setup.js
│ │ │ ├── utils/
│ │ │ │ ├── __tests__/
│ │ │ │ │ ├── base64-test.js
│ │ │ │ │ └── html-test.js
│ │ │ │ ├── base64.js
│ │ │ │ ├── html.js
│ │ │ │ ├── numbers.js
│ │ │ │ └── resize_image.js
│ │ │ └── uuid.js
│ │ ├── packs/
│ │ │ ├── about.js
│ │ │ ├── admin.js
│ │ │ ├── application.js
│ │ │ ├── error.js
│ │ │ ├── mailer.js
│ │ │ ├── public.js
│ │ │ └── share.js
│ │ └── styles/
│ │ ├── application.scss
│ │ ├── contrast/
│ │ │ ├── diff.scss
│ │ │ └── variables.scss
│ │ ├── contrast.scss
│ │ ├── fonts/
│ │ │ ├── montserrat.scss
│ │ │ ├── roboto-mono.scss
│ │ │ └── roboto.scss
│ │ ├── mailer.scss
│ │ ├── mastodon/
│ │ │ ├── _mixins.scss
│ │ │ ├── about.scss
│ │ │ ├── accessibility.scss
│ │ │ ├── accounts.scss
│ │ │ ├── admin.scss
│ │ │ ├── basics.scss
│ │ │ ├── boost.scss
│ │ │ ├── compact_header.scss
│ │ │ ├── components.scss
│ │ │ ├── containers.scss
│ │ │ ├── dashboard.scss
│ │ │ ├── emoji_picker.scss
│ │ │ ├── footer.scss
│ │ │ ├── forms.scss
│ │ │ ├── introduction.scss
│ │ │ ├── lists.scss
│ │ │ ├── modal.scss
│ │ │ ├── polls.scss
│ │ │ ├── reset.scss
│ │ │ ├── rtl.scss
│ │ │ ├── stream_entries.scss
│ │ │ ├── tables.scss
│ │ │ ├── variables.scss
│ │ │ └── widgets.scss
│ │ ├── mastodon-light/
│ │ │ ├── diff.scss
│ │ │ └── variables.scss
│ │ └── mastodon-light.scss
│ ├── lib/
│ │ ├── activity_tracker.rb
│ │ ├── activitypub/
│ │ │ ├── activity/
│ │ │ │ ├── accept.rb
│ │ │ │ ├── add.rb
│ │ │ │ ├── announce.rb
│ │ │ │ ├── block.rb
│ │ │ │ ├── create.rb
│ │ │ │ ├── delete.rb
│ │ │ │ ├── flag.rb
│ │ │ │ ├── follow.rb
│ │ │ │ ├── like.rb
│ │ │ │ ├── move.rb
│ │ │ │ ├── reject.rb
│ │ │ │ ├── remove.rb
│ │ │ │ ├── undo.rb
│ │ │ │ └── update.rb
│ │ │ ├── activity.rb
│ │ │ ├── adapter.rb
│ │ │ ├── case_transform.rb
│ │ │ ├── linked_data_signature.rb
│ │ │ ├── serializer.rb
│ │ │ └── tag_manager.rb
│ │ ├── application_extension.rb
│ │ ├── delivery_failure_tracker.rb
│ │ ├── entity_cache.rb
│ │ ├── exceptions.rb
│ │ ├── extractor.rb
│ │ ├── fast_geometry_parser.rb
│ │ ├── feed_manager.rb
│ │ ├── formatter.rb
│ │ ├── hash_object.rb
│ │ ├── inline_renderer.rb
│ │ ├── language_detector.rb
│ │ ├── ostatus/
│ │ │ ├── activity/
│ │ │ │ ├── base.rb
│ │ │ │ ├── creation.rb
│ │ │ │ ├── deletion.rb
│ │ │ │ ├── general.rb
│ │ │ │ ├── post.rb
│ │ │ │ ├── remote.rb
│ │ │ │ └── share.rb
│ │ │ ├── atom_serializer.rb
│ │ │ └── tag_manager.rb
│ │ ├── potential_friendship_tracker.rb
│ │ ├── proof_provider/
│ │ │ ├── keybase/
│ │ │ │ ├── badge.rb
│ │ │ │ ├── config_serializer.rb
│ │ │ │ ├── serializer.rb
│ │ │ │ ├── verifier.rb
│ │ │ │ └── worker.rb
│ │ │ └── keybase.rb
│ │ ├── proof_provider.rb
│ │ ├── request.rb
│ │ ├── rss_builder.rb
│ │ ├── sanitize_config.rb
│ │ ├── settings/
│ │ │ ├── extend.rb
│ │ │ └── scoped_settings.rb
│ │ ├── sidekiq_error_handler.rb
│ │ ├── status_filter.rb
│ │ ├── status_finder.rb
│ │ ├── tag_manager.rb
│ │ ├── themes.rb
│ │ ├── user_settings_decorator.rb
│ │ └── webfinger_resource.rb
│ ├── mailers/
│ │ ├── admin_mailer.rb
│ │ ├── application_mailer.rb
│ │ ├── notification_mailer.rb
│ │ └── user_mailer.rb
│ ├── models/
│ │ ├── account.rb
│ │ ├── account_conversation.rb
│ │ ├── account_domain_block.rb
│ │ ├── account_filter.rb
│ │ ├── account_identity_proof.rb
│ │ ├── account_moderation_note.rb
│ │ ├── account_pin.rb
│ │ ├── account_stat.rb
│ │ ├── account_tag_stat.rb
│ │ ├── account_warning.rb
│ │ ├── account_warning_preset.rb
│ │ ├── admin/
│ │ │ ├── account_action.rb
│ │ │ └── action_log.rb
│ │ ├── admin.rb
│ │ ├── application_record.rb
│ │ ├── backup.rb
│ │ ├── block.rb
│ │ ├── concerns/
│ │ │ ├── account_associations.rb
│ │ │ ├── account_avatar.rb
│ │ │ ├── account_counters.rb
│ │ │ ├── account_finder_concern.rb
│ │ │ ├── account_header.rb
│ │ │ ├── account_interactions.rb
│ │ │ ├── attachmentable.rb
│ │ │ ├── cacheable.rb
│ │ │ ├── domain_normalizable.rb
│ │ │ ├── expireable.rb
│ │ │ ├── ldap_authenticable.rb
│ │ │ ├── omniauthable.rb
│ │ │ ├── paginable.rb
│ │ │ ├── pam_authenticable.rb
│ │ │ ├── redisable.rb
│ │ │ ├── relationship_cacheable.rb
│ │ │ ├── remotable.rb
│ │ │ ├── status_threading_concern.rb
│ │ │ ├── streamable.rb
│ │ │ └── user_roles.rb
│ │ ├── context.rb
│ │ ├── conversation.rb
│ │ ├── conversation_mute.rb
│ │ ├── custom_emoji.rb
│ │ ├── custom_emoji_filter.rb
│ │ ├── custom_filter.rb
│ │ ├── domain_block.rb
│ │ ├── email_domain_block.rb
│ │ ├── export.rb
│ │ ├── favourite.rb
│ │ ├── featured_tag.rb
│ │ ├── feed.rb
│ │ ├── follow.rb
│ │ ├── follow_request.rb
│ │ ├── form/
│ │ │ ├── account_batch.rb
│ │ │ ├── admin_settings.rb
│ │ │ ├── delete_confirmation.rb
│ │ │ ├── migration.rb
│ │ │ ├── status_batch.rb
│ │ │ └── two_factor_confirmation.rb
│ │ ├── home_feed.rb
│ │ ├── identity.rb
│ │ ├── import.rb
│ │ ├── instance.rb
│ │ ├── instance_filter.rb
│ │ ├── invite.rb
│ │ ├── invite_filter.rb
│ │ ├── list.rb
│ │ ├── list_account.rb
│ │ ├── list_feed.rb
│ │ ├── media_attachment.rb
│ │ ├── mention.rb
│ │ ├── mute.rb
│ │ ├── notification.rb
│ │ ├── poll.rb
│ │ ├── poll_vote.rb
│ │ ├── preview_card.rb
│ │ ├── relay.rb
│ │ ├── remote_follow.rb
│ │ ├── remote_profile.rb
│ │ ├── report.rb
│ │ ├── report_filter.rb
│ │ ├── report_note.rb
│ │ ├── scheduled_status.rb
│ │ ├── search.rb
│ │ ├── session_activation.rb
│ │ ├── setting.rb
│ │ ├── site_upload.rb
│ │ ├── status.rb
│ │ ├── status_pin.rb
│ │ ├── status_stat.rb
│ │ ├── stream_entry.rb
│ │ ├── subscription.rb
│ │ ├── tag.rb
│ │ ├── tombstone.rb
│ │ ├── trending_tags.rb
│ │ ├── user.rb
│ │ ├── user_invite_request.rb
│ │ ├── web/
│ │ │ ├── push_subscription.rb
│ │ │ └── setting.rb
│ │ └── web.rb
│ ├── policies/
│ │ ├── account_moderation_note_policy.rb
│ │ ├── account_policy.rb
│ │ ├── account_warning_preset_policy.rb
│ │ ├── application_policy.rb
│ │ ├── backup_policy.rb
│ │ ├── custom_emoji_policy.rb
│ │ ├── domain_block_policy.rb
│ │ ├── email_domain_block_policy.rb
│ │ ├── instance_policy.rb
│ │ ├── invite_policy.rb
│ │ ├── poll_policy.rb
│ │ ├── relay_policy.rb
│ │ ├── report_note_policy.rb
│ │ ├── report_policy.rb
│ │ ├── settings_policy.rb
│ │ ├── status_policy.rb
│ │ ├── subscription_policy.rb
│ │ ├── tag_policy.rb
│ │ └── user_policy.rb
│ ├── presenters/
│ │ ├── account_relationships_presenter.rb
│ │ ├── activitypub/
│ │ │ └── collection_presenter.rb
│ │ ├── initial_state_presenter.rb
│ │ ├── instance_presenter.rb
│ │ └── status_relationships_presenter.rb
│ ├── serializers/
│ │ ├── activitypub/
│ │ │ ├── accept_follow_serializer.rb
│ │ │ ├── activity_serializer.rb
│ │ │ ├── actor_serializer.rb
│ │ │ ├── add_serializer.rb
│ │ │ ├── block_serializer.rb
│ │ │ ├── collection_serializer.rb
│ │ │ ├── delete_actor_serializer.rb
│ │ │ ├── delete_serializer.rb
│ │ │ ├── emoji_serializer.rb
│ │ │ ├── flag_serializer.rb
│ │ │ ├── follow_serializer.rb
│ │ │ ├── image_serializer.rb
│ │ │ ├── like_serializer.rb
│ │ │ ├── note_serializer.rb
│ │ │ ├── outbox_serializer.rb
│ │ │ ├── public_key_serializer.rb
│ │ │ ├── reject_follow_serializer.rb
│ │ │ ├── remove_serializer.rb
│ │ │ ├── undo_announce_serializer.rb
│ │ │ ├── undo_block_serializer.rb
│ │ │ ├── undo_follow_serializer.rb
│ │ │ ├── undo_like_serializer.rb
│ │ │ ├── update_poll_serializer.rb
│ │ │ ├── update_serializer.rb
│ │ │ └── vote_serializer.rb
│ │ ├── initial_state_serializer.rb
│ │ ├── manifest_serializer.rb
│ │ ├── oembed_serializer.rb
│ │ ├── rest/
│ │ │ ├── account_serializer.rb
│ │ │ ├── application_serializer.rb
│ │ │ ├── context_serializer.rb
│ │ │ ├── conversation_serializer.rb
│ │ │ ├── credential_account_serializer.rb
│ │ │ ├── custom_emoji_serializer.rb
│ │ │ ├── filter_serializer.rb
│ │ │ ├── identity_proof_serializer.rb
│ │ │ ├── instance_serializer.rb
│ │ │ ├── list_serializer.rb
│ │ │ ├── media_attachment_serializer.rb
│ │ │ ├── notification_serializer.rb
│ │ │ ├── poll_serializer.rb
│ │ │ ├── preferences_serializer.rb
│ │ │ ├── preview_card_serializer.rb
│ │ │ ├── relationship_serializer.rb
│ │ │ ├── report_serializer.rb
│ │ │ ├── scheduled_status_serializer.rb
│ │ │ ├── search_serializer.rb
│ │ │ ├── status_serializer.rb
│ │ │ ├── tag_serializer.rb
│ │ │ ├── v2/
│ │ │ │ └── search_serializer.rb
│ │ │ └── web_push_subscription_serializer.rb
│ │ ├── rss/
│ │ │ ├── account_serializer.rb
│ │ │ └── tag_serializer.rb
│ │ ├── web/
│ │ │ └── notification_serializer.rb
│ │ └── webfinger_serializer.rb
│ ├── services/
│ │ ├── account_search_service.rb
│ │ ├── activitypub/
│ │ │ ├── fetch_featured_collection_service.rb
│ │ │ ├── fetch_remote_account_service.rb
│ │ │ ├── fetch_remote_key_service.rb
│ │ │ ├── fetch_remote_poll_service.rb
│ │ │ ├── fetch_remote_status_service.rb
│ │ │ ├── fetch_replies_service.rb
│ │ │ ├── process_account_service.rb
│ │ │ ├── process_collection_service.rb
│ │ │ └── process_poll_service.rb
│ │ ├── after_block_domain_from_account_service.rb
│ │ ├── after_block_service.rb
│ │ ├── app_sign_up_service.rb
│ │ ├── authorize_follow_service.rb
│ │ ├── backup_service.rb
│ │ ├── base_service.rb
│ │ ├── batched_remove_status_service.rb
│ │ ├── block_domain_service.rb
│ │ ├── block_service.rb
│ │ ├── bootstrap_timeline_service.rb
│ │ ├── concerns/
│ │ │ ├── author_extractor.rb
│ │ │ ├── payloadable.rb
│ │ │ └── stream_entry_renderer.rb
│ │ ├── fan_out_on_write_service.rb
│ │ ├── favourite_service.rb
│ │ ├── fetch_atom_service.rb
│ │ ├── fetch_link_card_service.rb
│ │ ├── fetch_oembed_service.rb
│ │ ├── fetch_remote_account_service.rb
│ │ ├── fetch_remote_status_service.rb
│ │ ├── follow_service.rb
│ │ ├── hashtag_query_service.rb
│ │ ├── import_service.rb
│ │ ├── mute_service.rb
│ │ ├── notify_service.rb
│ │ ├── post_status_service.rb
│ │ ├── precompute_feed_service.rb
│ │ ├── process_feed_service.rb
│ │ ├── process_hashtags_service.rb
│ │ ├── process_interaction_service.rb
│ │ ├── process_mentions_service.rb
│ │ ├── pubsubhubbub/
│ │ │ ├── subscribe_service.rb
│ │ │ └── unsubscribe_service.rb
│ │ ├── reblog_service.rb
│ │ ├── reject_follow_service.rb
│ │ ├── remove_status_service.rb
│ │ ├── report_service.rb
│ │ ├── resolve_account_service.rb
│ │ ├── resolve_url_service.rb
│ │ ├── search_service.rb
│ │ ├── send_interaction_service.rb
│ │ ├── subscribe_service.rb
│ │ ├── suspend_account_service.rb
│ │ ├── unblock_domain_service.rb
│ │ ├── unblock_service.rb
│ │ ├── unfavourite_service.rb
│ │ ├── unfollow_service.rb
│ │ ├── unmute_service.rb
│ │ ├── unsubscribe_service.rb
│ │ ├── update_account_service.rb
│ │ ├── update_remote_profile_service.rb
│ │ ├── verify_link_service.rb
│ │ ├── verify_salmon_service.rb
│ │ └── vote_service.rb
│ ├── validators/
│ │ ├── blacklisted_email_validator.rb
│ │ ├── disallowed_hashtags_validator.rb
│ │ ├── email_mx_validator.rb
│ │ ├── existing_username_validator.rb
│ │ ├── follow_limit_validator.rb
│ │ ├── html_validator.rb
│ │ ├── note_length_validator.rb
│ │ ├── poll_validator.rb
│ │ ├── status_length_validator.rb
│ │ ├── status_pin_validator.rb
│ │ ├── unique_username_validator.rb
│ │ ├── unreserved_username_validator.rb
│ │ ├── url_validator.rb
│ │ └── vote_validator.rb
│ ├── views/
│ │ ├── about/
│ │ │ ├── _login.html.haml
│ │ │ ├── _registration.html.haml
│ │ │ ├── more.html.haml
│ │ │ ├── show.html.haml
│ │ │ └── terms.html.haml
│ │ ├── accounts/
│ │ │ ├── _bio.html.haml
│ │ │ ├── _header.html.haml
│ │ │ ├── _moved.html.haml
│ │ │ ├── _og.html.haml
│ │ │ └── show.html.haml
│ │ ├── admin/
│ │ │ ├── account_actions/
│ │ │ │ └── new.html.haml
│ │ │ ├── account_moderation_notes/
│ │ │ │ └── _account_moderation_note.html.haml
│ │ │ ├── account_warnings/
│ │ │ │ └── _account_warning.html.haml
│ │ │ ├── accounts/
│ │ │ │ ├── _account.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── action_logs/
│ │ │ │ ├── _action_log.html.haml
│ │ │ │ └── index.html.haml
│ │ │ ├── change_emails/
│ │ │ │ └── show.html.haml
│ │ │ ├── custom_emojis/
│ │ │ │ ├── _custom_emoji.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── dashboard/
│ │ │ │ └── index.html.haml
│ │ │ ├── domain_blocks/
│ │ │ │ ├── new.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── email_domain_blocks/
│ │ │ │ ├── _email_domain_block.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── followers/
│ │ │ │ └── index.html.haml
│ │ │ ├── instances/
│ │ │ │ ├── index.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── invites/
│ │ │ │ ├── _invite.html.haml
│ │ │ │ └── index.html.haml
│ │ │ ├── pending_accounts/
│ │ │ │ ├── _account.html.haml
│ │ │ │ └── index.html.haml
│ │ │ ├── relays/
│ │ │ │ ├── _relay.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── report_notes/
│ │ │ │ └── _report_note.html.haml
│ │ │ ├── reports/
│ │ │ │ ├── _action_log.html.haml
│ │ │ │ ├── _status.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── settings/
│ │ │ │ └── edit.html.haml
│ │ │ ├── statuses/
│ │ │ │ ├── index.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── subscriptions/
│ │ │ │ ├── _subscription.html.haml
│ │ │ │ └── index.html.haml
│ │ │ ├── tags/
│ │ │ │ ├── _tag.html.haml
│ │ │ │ └── index.html.haml
│ │ │ └── warning_presets/
│ │ │ ├── edit.html.haml
│ │ │ └── index.html.haml
│ │ ├── admin_mailer/
│ │ │ ├── new_pending_account.text.erb
│ │ │ └── new_report.text.erb
│ │ ├── application/
│ │ │ ├── _card.html.haml
│ │ │ ├── _flashes.html.haml
│ │ │ └── _sidebar.html.haml
│ │ ├── auth/
│ │ │ ├── confirmations/
│ │ │ │ ├── finish_signup.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── passwords/
│ │ │ │ ├── edit.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── registrations/
│ │ │ │ ├── _sessions.html.haml
│ │ │ │ ├── edit.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── sessions/
│ │ │ │ ├── new.html.haml
│ │ │ │ └── two_factor.html.haml
│ │ │ └── shared/
│ │ │ └── _links.html.haml
│ │ ├── authorize_interactions/
│ │ │ ├── _post_follow_actions.html.haml
│ │ │ ├── error.html.haml
│ │ │ ├── show.html.haml
│ │ │ └── success.html.haml
│ │ ├── directories/
│ │ │ └── index.html.haml
│ │ ├── errors/
│ │ │ ├── 403.html.haml
│ │ │ ├── 404.html.haml
│ │ │ ├── 410.html.haml
│ │ │ ├── 422.html.haml
│ │ │ └── 500.html.haml
│ │ ├── filters/
│ │ │ ├── _fields.html.haml
│ │ │ ├── edit.html.haml
│ │ │ ├── index.html.haml
│ │ │ └── new.html.haml
│ │ ├── follower_accounts/
│ │ │ └── index.html.haml
│ │ ├── following_accounts/
│ │ │ └── index.html.haml
│ │ ├── home/
│ │ │ └── index.html.haml
│ │ ├── invites/
│ │ │ ├── _form.html.haml
│ │ │ ├── _invite.html.haml
│ │ │ └── index.html.haml
│ │ ├── kaminari/
│ │ │ ├── _next_page.html.haml
│ │ │ ├── _paginator.html.haml
│ │ │ └── _prev_page.html.haml
│ │ ├── layouts/
│ │ │ ├── admin.html.haml
│ │ │ ├── application.html.haml
│ │ │ ├── auth.html.haml
│ │ │ ├── embedded.html.haml
│ │ │ ├── error.html.haml
│ │ │ ├── mailer.html.haml
│ │ │ ├── mailer.text.erb
│ │ │ ├── modal.html.haml
│ │ │ ├── plain_mailer.html.haml
│ │ │ └── public.html.haml
│ │ ├── media/
│ │ │ └── player.html.haml
│ │ ├── notification_mailer/
│ │ │ ├── _status.html.haml
│ │ │ ├── _status.text.erb
│ │ │ ├── digest.html.haml
│ │ │ ├── digest.text.erb
│ │ │ ├── favourite.html.haml
│ │ │ ├── favourite.text.erb
│ │ │ ├── follow.html.haml
│ │ │ ├── follow.text.erb
│ │ │ ├── follow_request.html.haml
│ │ │ ├── follow_request.text.erb
│ │ │ ├── mention.html.haml
│ │ │ ├── mention.text.erb
│ │ │ ├── reblog.html.haml
│ │ │ └── reblog.text.erb
│ │ ├── oauth/
│ │ │ ├── authorizations/
│ │ │ │ ├── error.html.haml
│ │ │ │ ├── new.html.haml
│ │ │ │ └── show.html.haml
│ │ │ └── authorized_applications/
│ │ │ └── index.html.haml
│ │ ├── public_timelines/
│ │ │ └── show.html.haml
│ │ ├── relationships/
│ │ │ ├── _account.html.haml
│ │ │ └── show.html.haml
│ │ ├── remote_follow/
│ │ │ └── new.html.haml
│ │ ├── remote_interaction/
│ │ │ └── new.html.haml
│ │ ├── remote_unfollows/
│ │ │ ├── _card.html.haml
│ │ │ ├── _post_follow_actions.html.haml
│ │ │ ├── error.html.haml
│ │ │ └── success.html.haml
│ │ ├── settings/
│ │ │ ├── applications/
│ │ │ │ ├── _fields.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ ├── new.html.haml
│ │ │ │ └── show.html.haml
│ │ │ ├── deletes/
│ │ │ │ └── show.html.haml
│ │ │ ├── exports/
│ │ │ │ └── show.html.haml
│ │ │ ├── featured_tags/
│ │ │ │ └── index.html.haml
│ │ │ ├── identity_proofs/
│ │ │ │ ├── _proof.html.haml
│ │ │ │ ├── index.html.haml
│ │ │ │ └── new.html.haml
│ │ │ ├── imports/
│ │ │ │ └── show.html.haml
│ │ │ ├── migrations/
│ │ │ │ └── show.html.haml
│ │ │ ├── preferences/
│ │ │ │ ├── appearance/
│ │ │ │ │ └── show.html.haml
│ │ │ │ ├── notifications/
│ │ │ │ │ └── show.html.haml
│ │ │ │ └── other/
│ │ │ │ └── show.html.haml
│ │ │ ├── profiles/
│ │ │ │ └── show.html.haml
│ │ │ ├── shared/
│ │ │ │ └── _links.html.haml
│ │ │ ├── two_factor_authentication/
│ │ │ │ ├── confirmations/
│ │ │ │ │ └── new.html.haml
│ │ │ │ └── recovery_codes/
│ │ │ │ └── index.html.haml
│ │ │ └── two_factor_authentications/
│ │ │ └── show.html.haml
│ │ ├── shared/
│ │ │ ├── _error_messages.html.haml
│ │ │ └── _og.html.haml
│ │ ├── shares/
│ │ │ └── show.html.haml
│ │ ├── stream_entries/
│ │ │ ├── _attachment_list.html.haml
│ │ │ ├── _detailed_status.html.haml
│ │ │ ├── _og_description.html.haml
│ │ │ ├── _og_image.html.haml
│ │ │ ├── _poll.html.haml
│ │ │ ├── _simple_status.html.haml
│ │ │ ├── _status.html.haml
│ │ │ ├── embed.html.haml
│ │ │ └── show.html.haml
│ │ ├── tags/
│ │ │ ├── _og.html.haml
│ │ │ └── show.html.haml
│ │ ├── user_mailer/
│ │ │ ├── backup_ready.html.haml
│ │ │ ├── backup_ready.text.erb
│ │ │ ├── confirmation_instructions.html.haml
│ │ │ ├── confirmation_instructions.text.erb
│ │ │ ├── email_changed.html.haml
│ │ │ ├── email_changed.text.erb
│ │ │ ├── password_change.html.haml
│ │ │ ├── password_change.text.erb
│ │ │ ├── reconfirmation_instructions.html.haml
│ │ │ ├── reconfirmation_instructions.text.erb
│ │ │ ├── reset_password_instructions.html.haml
│ │ │ ├── reset_password_instructions.text.erb
│ │ │ ├── warning.html.haml
│ │ │ ├── warning.text.erb
│ │ │ ├── welcome.html.haml
│ │ │ └── welcome.text.erb
│ │ └── well_known/
│ │ ├── host_meta/
│ │ │ └── show.xml.ruby
│ │ └── webfinger/
│ │ └── show.xml.ruby
│ └── workers/
│ ├── activitypub/
│ │ ├── delivery_worker.rb
│ │ ├── distribute_poll_update_worker.rb
│ │ ├── distribution_worker.rb
│ │ ├── fetch_replies_worker.rb
│ │ ├── low_priority_delivery_worker.rb
│ │ ├── post_upgrade_worker.rb
│ │ ├── processing_worker.rb
│ │ ├── raw_distribution_worker.rb
│ │ ├── reply_distribution_worker.rb
│ │ ├── synchronize_featured_collection_worker.rb
│ │ └── update_distribution_worker.rb
│ ├── admin/
│ │ └── suspension_worker.rb
│ ├── after_account_domain_block_worker.rb
│ ├── after_remote_follow_request_worker.rb
│ ├── after_remote_follow_worker.rb
│ ├── authorize_follow_worker.rb
│ ├── backup_worker.rb
│ ├── block_worker.rb
│ ├── bootstrap_timeline_worker.rb
│ ├── concerns/
│ │ └── exponential_backoff.rb
│ ├── digest_mailer_worker.rb
│ ├── distribution_worker.rb
│ ├── domain_block_worker.rb
│ ├── feed_insert_worker.rb
│ ├── fetch_reply_worker.rb
│ ├── import/
│ │ └── relationship_worker.rb
│ ├── import_worker.rb
│ ├── link_crawl_worker.rb
│ ├── local_notification_worker.rb
│ ├── maintenance/
│ │ ├── destroy_media_worker.rb
│ │ ├── redownload_account_media_worker.rb
│ │ └── uncache_media_worker.rb
│ ├── merge_worker.rb
│ ├── mute_worker.rb
│ ├── notification_worker.rb
│ ├── poll_expiration_notify_worker.rb
│ ├── processing_worker.rb
│ ├── publish_scheduled_status_worker.rb
│ ├── pubsubhubbub/
│ │ ├── confirmation_worker.rb
│ │ ├── delivery_worker.rb
│ │ ├── distribution_worker.rb
│ │ ├── raw_distribution_worker.rb
│ │ ├── subscribe_worker.rb
│ │ └── unsubscribe_worker.rb
│ ├── push_conversation_worker.rb
│ ├── push_update_worker.rb
│ ├── refollow_worker.rb
│ ├── regeneration_worker.rb
│ ├── remote_profile_update_worker.rb
│ ├── removal_worker.rb
│ ├── resolve_account_worker.rb
│ ├── salmon_worker.rb
│ ├── scheduler/
│ │ ├── backup_cleanup_scheduler.rb
│ │ ├── doorkeeper_cleanup_scheduler.rb
│ │ ├── email_scheduler.rb
│ │ ├── feed_cleanup_scheduler.rb
│ │ ├── ip_cleanup_scheduler.rb
│ │ ├── media_cleanup_scheduler.rb
│ │ ├── pghero_scheduler.rb
│ │ ├── scheduled_statuses_scheduler.rb
│ │ ├── subscriptions_cleanup_scheduler.rb
│ │ ├── subscriptions_scheduler.rb
│ │ └── user_cleanup_scheduler.rb
│ ├── thread_resolve_worker.rb
│ ├── unfavourite_worker.rb
│ ├── unfollow_follow_worker.rb
│ ├── unmerge_worker.rb
│ ├── verify_account_links_worker.rb
│ └── web/
│ └── push_notification_worker.rb
├── app.json
├── babel.config.js
├── bin/
│ ├── bundle
│ ├── rails
│ ├── rake
│ ├── retry
│ ├── rspec
│ ├── setup
│ ├── tootctl
│ ├── update
│ ├── webpack
│ ├── webpack-dev-server
│ └── yarn
├── boxfile.yml
├── config/
│ ├── application.rb
│ ├── boot.rb
│ ├── brakeman.ignore
│ ├── database.yml
│ ├── deploy.rb
│ ├── environment.rb
│ ├── environments/
│ │ ├── development.rb
│ │ ├── production.rb
│ │ └── test.rb
│ ├── i18n-tasks.yml
│ ├── initializers/
│ │ ├── 0_post_deployment_migrations.rb
│ │ ├── 1_hosts.rb
│ │ ├── active_model_serializers.rb
│ │ ├── application_controller_renderer.rb
│ │ ├── assets.rb
│ │ ├── backtrace_silencers.rb
│ │ ├── blacklists.rb
│ │ ├── chewy.rb
│ │ ├── content_security_policy.rb
│ │ ├── cookies_serializer.rb
│ │ ├── cors.rb
│ │ ├── delivery_job.rb
│ │ ├── devise.rb
│ │ ├── doorkeeper.rb
│ │ ├── fast_blank.rb
│ │ ├── ffmpeg.rb
│ │ ├── filter_parameter_logging.rb
│ │ ├── http_client_proxy.rb
│ │ ├── httplog.rb
│ │ ├── inflections.rb
│ │ ├── instrumentation.rb
│ │ ├── json_ld.rb
│ │ ├── kaminari_config.rb
│ │ ├── mime_types.rb
│ │ ├── oj.rb
│ │ ├── omniauth.rb
│ │ ├── open_uri_redirection.rb
│ │ ├── pagination.rb
│ │ ├── paperclip.rb
│ │ ├── premailer_rails.rb
│ │ ├── rack_attack.rb
│ │ ├── rack_attack_logging.rb
│ │ ├── redis.rb
│ │ ├── session_activations.rb
│ │ ├── session_store.rb
│ │ ├── sidekiq.rb
│ │ ├── simple_form.rb
│ │ ├── single_user_mode.rb
│ │ ├── statsd.rb
│ │ ├── stoplight.rb
│ │ ├── strong_migrations.rb
│ │ ├── suppress_csrf_warnings.rb
│ │ ├── trusted_proxies.rb
│ │ ├── twitter_regex.rb
│ │ ├── vapid.rb
│ │ └── wrap_parameters.rb
│ ├── locales/
│ │ ├── activerecord.ar.yml
│ │ ├── activerecord.ast.yml
│ │ ├── activerecord.bg.yml
│ │ ├── activerecord.bn.yml
│ │ ├── activerecord.ca.yml
│ │ ├── activerecord.co.yml
│ │ ├── activerecord.cs.yml
│ │ ├── activerecord.cy.yml
│ │ ├── activerecord.da.yml
│ │ ├── activerecord.de.yml
│ │ ├── activerecord.el.yml
│ │ ├── activerecord.en.yml
│ │ ├── activerecord.eo.yml
│ │ ├── activerecord.es.yml
│ │ ├── activerecord.eu.yml
│ │ ├── activerecord.fa.yml
│ │ ├── activerecord.fi.yml
│ │ ├── activerecord.fr.yml
│ │ ├── activerecord.gl.yml
│ │ ├── activerecord.he.yml
│ │ ├── activerecord.hr.yml
│ │ ├── activerecord.hu.yml
│ │ ├── activerecord.hy.yml
│ │ ├── activerecord.id.yml
│ │ ├── activerecord.io.yml
│ │ ├── activerecord.it.yml
│ │ ├── activerecord.ja.yml
│ │ ├── activerecord.ka.yml
│ │ ├── activerecord.kk.yml
│ │ ├── activerecord.ko.yml
│ │ ├── activerecord.lt.yml
│ │ ├── activerecord.lv.yml
│ │ ├── activerecord.ms.yml
│ │ ├── activerecord.nl.yml
│ │ ├── activerecord.no.yml
│ │ ├── activerecord.oc.yml
│ │ ├── activerecord.pl.yml
│ │ ├── activerecord.pt-BR.yml
│ │ ├── activerecord.pt.yml
│ │ ├── activerecord.ro.yml
│ │ ├── activerecord.ru.yml
│ │ ├── activerecord.sk.yml
│ │ ├── activerecord.sl.yml
│ │ ├── activerecord.sq.yml
│ │ ├── activerecord.sr-Latn.yml
│ │ ├── activerecord.sr.yml
│ │ ├── activerecord.sv.yml
│ │ ├── activerecord.ta.yml
│ │ ├── activerecord.te.yml
│ │ ├── activerecord.th.yml
│ │ ├── activerecord.tr.yml
│ │ ├── activerecord.uk.yml
│ │ ├── activerecord.zh-CN.yml
│ │ ├── activerecord.zh-HK.yml
│ │ ├── activerecord.zh-TW.yml
│ │ ├── activerecord.zh_Hant.yml
│ │ ├── ar.yml
│ │ ├── ast.yml
│ │ ├── bg.yml
│ │ ├── bn.yml
│ │ ├── ca.yml
│ │ ├── co.yml
│ │ ├── cs.yml
│ │ ├── cy.yml
│ │ ├── da.yml
│ │ ├── de.yml
│ │ ├── devise.ar.yml
│ │ ├── devise.ast.yml
│ │ ├── devise.bg.yml
│ │ ├── devise.bn.yml
│ │ ├── devise.ca.yml
│ │ ├── devise.co.yml
│ │ ├── devise.cs.yml
│ │ ├── devise.cy.yml
│ │ ├── devise.da.yml
│ │ ├── devise.de.yml
│ │ ├── devise.el.yml
│ │ ├── devise.en.yml
│ │ ├── devise.eo.yml
│ │ ├── devise.es.yml
│ │ ├── devise.eu.yml
│ │ ├── devise.fa.yml
│ │ ├── devise.fi.yml
│ │ ├── devise.fr.yml
│ │ ├── devise.gl.yml
│ │ ├── devise.he.yml
│ │ ├── devise.hr.yml
│ │ ├── devise.hu.yml
│ │ ├── devise.hy.yml
│ │ ├── devise.id.yml
│ │ ├── devise.io.yml
│ │ ├── devise.it.yml
│ │ ├── devise.ja.yml
│ │ ├── devise.ka.yml
│ │ ├── devise.kk.yml
│ │ ├── devise.ko.yml
│ │ ├── devise.lt.yml
│ │ ├── devise.lv.yml
│ │ ├── devise.ms.yml
│ │ ├── devise.nl.yml
│ │ ├── devise.no.yml
│ │ ├── devise.oc.yml
│ │ ├── devise.pl.yml
│ │ ├── devise.pt-BR.yml
│ │ ├── devise.pt.yml
│ │ ├── devise.ro.yml
│ │ ├── devise.ru.yml
│ │ ├── devise.sk.yml
│ │ ├── devise.sl.yml
│ │ ├── devise.sq.yml
│ │ ├── devise.sr-Latn.yml
│ │ ├── devise.sr.yml
│ │ ├── devise.sv.yml
│ │ ├── devise.ta.yml
│ │ ├── devise.te.yml
│ │ ├── devise.th.yml
│ │ ├── devise.tr.yml
│ │ ├── devise.uk.yml
│ │ ├── devise.zh-CN.yml
│ │ ├── devise.zh-HK.yml
│ │ ├── devise.zh-TW.yml
│ │ ├── doorkeeper.ar.yml
│ │ ├── doorkeeper.ast.yml
│ │ ├── doorkeeper.bg.yml
│ │ ├── doorkeeper.bn.yml
│ │ ├── doorkeeper.ca.yml
│ │ ├── doorkeeper.co.yml
│ │ ├── doorkeeper.cs.yml
│ │ ├── doorkeeper.cy.yml
│ │ ├── doorkeeper.da.yml
│ │ ├── doorkeeper.de.yml
│ │ ├── doorkeeper.el.yml
│ │ ├── doorkeeper.en.yml
│ │ ├── doorkeeper.eo.yml
│ │ ├── doorkeeper.es.yml
│ │ ├── doorkeeper.eu.yml
│ │ ├── doorkeeper.fa.yml
│ │ ├── doorkeeper.fi.yml
│ │ ├── doorkeeper.fr.yml
│ │ ├── doorkeeper.gl.yml
│ │ ├── doorkeeper.he.yml
│ │ ├── doorkeeper.hr.yml
│ │ ├── doorkeeper.hu.yml
│ │ ├── doorkeeper.hy.yml
│ │ ├── doorkeeper.id.yml
│ │ ├── doorkeeper.io.yml
│ │ ├── doorkeeper.it.yml
│ │ ├── doorkeeper.ja.yml
│ │ ├── doorkeeper.ka.yml
│ │ ├── doorkeeper.kk.yml
│ │ ├── doorkeeper.ko.yml
│ │ ├── doorkeeper.lt.yml
│ │ ├── doorkeeper.lv.yml
│ │ ├── doorkeeper.ms.yml
│ │ ├── doorkeeper.nl.yml
│ │ ├── doorkeeper.no.yml
│ │ ├── doorkeeper.oc.yml
│ │ ├── doorkeeper.pl.yml
│ │ ├── doorkeeper.pt-BR.yml
│ │ ├── doorkeeper.pt.yml
│ │ ├── doorkeeper.ro.yml
│ │ ├── doorkeeper.ru.yml
│ │ ├── doorkeeper.sk.yml
│ │ ├── doorkeeper.sl.yml
│ │ ├── doorkeeper.sq.yml
│ │ ├── doorkeeper.sr-Latn.yml
│ │ ├── doorkeeper.sr.yml
│ │ ├── doorkeeper.sv.yml
│ │ ├── doorkeeper.ta.yml
│ │ ├── doorkeeper.te.yml
│ │ ├── doorkeeper.th.yml
│ │ ├── doorkeeper.tr.yml
│ │ ├── doorkeeper.uk.yml
│ │ ├── doorkeeper.zh-CN.yml
│ │ ├── doorkeeper.zh-HK.yml
│ │ ├── doorkeeper.zh-TW.yml
│ │ ├── el.yml
│ │ ├── en.yml
│ │ ├── en_GB.yml
│ │ ├── eo.yml
│ │ ├── es.yml
│ │ ├── eu.yml
│ │ ├── fa.yml
│ │ ├── fi.yml
│ │ ├── fr.yml
│ │ ├── ga.yml
│ │ ├── gl.yml
│ │ ├── he.yml
│ │ ├── hi.yml
│ │ ├── hr.yml
│ │ ├── hu.yml
│ │ ├── hy.yml
│ │ ├── id.yml
│ │ ├── io.yml
│ │ ├── it.yml
│ │ ├── ja.yml
│ │ ├── ka.yml
│ │ ├── kk.yml
│ │ ├── ko.yml
│ │ ├── lt.yml
│ │ ├── lv.yml
│ │ ├── ms.yml
│ │ ├── nl.yml
│ │ ├── no.yml
│ │ ├── oc.yml
│ │ ├── pl.yml
│ │ ├── pt-BR.yml
│ │ ├── pt.yml
│ │ ├── ro.yml
│ │ ├── ru.yml
│ │ ├── simple_form.ar.yml
│ │ ├── simple_form.ast.yml
│ │ ├── simple_form.bg.yml
│ │ ├── simple_form.bn.yml
│ │ ├── simple_form.ca.yml
│ │ ├── simple_form.co.yml
│ │ ├── simple_form.cs.yml
│ │ ├── simple_form.cy.yml
│ │ ├── simple_form.da.yml
│ │ ├── simple_form.de.yml
│ │ ├── simple_form.el.yml
│ │ ├── simple_form.en.yml
│ │ ├── simple_form.en_GB.yml
│ │ ├── simple_form.eo.yml
│ │ ├── simple_form.es.yml
│ │ ├── simple_form.eu.yml
│ │ ├── simple_form.fa.yml
│ │ ├── simple_form.fi.yml
│ │ ├── simple_form.fr.yml
│ │ ├── simple_form.gl.yml
│ │ ├── simple_form.he.yml
│ │ ├── simple_form.hr.yml
│ │ ├── simple_form.hu.yml
│ │ ├── simple_form.hy.yml
│ │ ├── simple_form.id.yml
│ │ ├── simple_form.io.yml
│ │ ├── simple_form.it.yml
│ │ ├── simple_form.ja.yml
│ │ ├── simple_form.ka.yml
│ │ ├── simple_form.kk.yml
│ │ ├── simple_form.ko.yml
│ │ ├── simple_form.lt.yml
│ │ ├── simple_form.lv.yml
│ │ ├── simple_form.ms.yml
│ │ ├── simple_form.nl.yml
│ │ ├── simple_form.no.yml
│ │ ├── simple_form.oc.yml
│ │ ├── simple_form.pl.yml
│ │ ├── simple_form.pt-BR.yml
│ │ ├── simple_form.pt.yml
│ │ ├── simple_form.ro.yml
│ │ ├── simple_form.ru.yml
│ │ ├── simple_form.sk.yml
│ │ ├── simple_form.sl.yml
│ │ ├── simple_form.sq.yml
│ │ ├── simple_form.sr-Latn.yml
│ │ ├── simple_form.sr.yml
│ │ ├── simple_form.sv.yml
│ │ ├── simple_form.ta.yml
│ │ ├── simple_form.te.yml
│ │ ├── simple_form.th.yml
│ │ ├── simple_form.tr.yml
│ │ ├── simple_form.uk.yml
│ │ ├── simple_form.zh-CN.yml
│ │ ├── simple_form.zh-HK.yml
│ │ ├── simple_form.zh-TW.yml
│ │ ├── sk.yml
│ │ ├── sl.yml
│ │ ├── sq.yml
│ │ ├── sr-Latn.rb
│ │ ├── sr-Latn.yml
│ │ ├── sr.rb
│ │ ├── sr.yml
│ │ ├── sv.yml
│ │ ├── ta.yml
│ │ ├── te.yml
│ │ ├── th.yml
│ │ ├── tr.yml
│ │ ├── uk.yml
│ │ ├── zh-CN.yml
│ │ ├── zh-HK.yml
│ │ └── zh-TW.yml
│ ├── navigation.rb
│ ├── puma.rb
│ ├── routes.rb
│ ├── secrets.yml
│ ├── settings.yml
│ ├── sidekiq.yml
│ ├── themes.yml
│ ├── webpack/
│ │ ├── configuration.js
│ │ ├── development.js
│ │ ├── generateLocalePacks.js
│ │ ├── production.js
│ │ ├── rules/
│ │ │ ├── babel.js
│ │ │ ├── css.js
│ │ │ ├── file.js
│ │ │ ├── index.js
│ │ │ ├── mark.js
│ │ │ └── node_modules.js
│ │ ├── shared.js
│ │ ├── test.js
│ │ └── translationRunner.js
│ └── webpacker.yml
├── config.ru
├── db/
│ ├── migrate/
│ │ ├── 20160220174730_create_accounts.rb
│ │ ├── 20160220211917_create_statuses.rb
│ │ ├── 20160221003140_create_users.rb
│ │ ├── 20160221003621_create_follows.rb
│ │ ├── 20160222122600_create_stream_entries.rb
│ │ ├── 20160222143943_add_profile_fields_to_accounts.rb
│ │ ├── 20160223162837_add_metadata_to_statuses.rb
│ │ ├── 20160223164502_make_uris_nullable_in_statuses.rb
│ │ ├── 20160223165723_add_url_to_statuses.rb
│ │ ├── 20160223165855_add_url_to_accounts.rb
│ │ ├── 20160223171800_create_favourites.rb
│ │ ├── 20160224223247_create_mentions.rb
│ │ ├── 20160227230233_add_attachment_avatar_to_accounts.rb
│ │ ├── 20160305115639_add_devise_to_users.rb
│ │ ├── 20160306172223_create_doorkeeper_tables.rb
│ │ ├── 20160312193225_add_attachment_header_to_accounts.rb
│ │ ├── 20160314164231_add_owner_to_application.rb
│ │ ├── 20160316103650_add_missing_indices.rb
│ │ ├── 20160322193748_add_avatar_remote_url_to_accounts.rb
│ │ ├── 20160325130944_add_admin_to_users.rb
│ │ ├── 20160826155805_add_superapp_to_oauth_applications.rb
│ │ ├── 20160905150353_create_media_attachments.rb
│ │ ├── 20160919221059_add_subscription_expires_at_to_accounts.rb
│ │ ├── 20160920003904_remove_verify_token_from_accounts.rb
│ │ ├── 20160926213048_remove_owner_from_application.rb
│ │ ├── 20161003142332_add_confirmable_to_users.rb
│ │ ├── 20161003145426_create_blocks.rb
│ │ ├── 20161006213403_rails_settings_migration.rb
│ │ ├── 20161009120834_create_domain_blocks.rb
│ │ ├── 20161027172456_add_silenced_to_accounts.rb
│ │ ├── 20161104173623_create_tags.rb
│ │ ├── 20161105130633_create_statuses_tags_join_table.rb
│ │ ├── 20161116162355_add_locale_to_users.rb
│ │ ├── 20161119211120_create_notifications.rb
│ │ ├── 20161122163057_remove_unneeded_indexes.rb
│ │ ├── 20161123093447_add_sensitive_to_statuses.rb
│ │ ├── 20161128103007_create_subscriptions.rb
│ │ ├── 20161130142058_add_last_successful_delivery_at_to_subscriptions.rb
│ │ ├── 20161130185319_add_visibility_to_statuses.rb
│ │ ├── 20161202132159_add_in_reply_to_account_id_to_statuses.rb
│ │ ├── 20161203164520_add_from_account_id_to_notifications.rb
│ │ ├── 20161205214545_add_suspended_to_accounts.rb
│ │ ├── 20161221152630_add_hidden_to_stream_entries.rb
│ │ ├── 20161222201034_add_locked_to_accounts.rb
│ │ ├── 20161222204147_create_follow_requests.rb
│ │ ├── 20170105224407_add_shortcode_to_media_attachments.rb
│ │ ├── 20170109120109_create_web_settings.rb
│ │ ├── 20170112154826_migrate_settings.rb
│ │ ├── 20170114194937_add_application_to_statuses.rb
│ │ ├── 20170114203041_add_website_to_oauth_application.rb
│ │ ├── 20170119214911_create_preview_cards.rb
│ │ ├── 20170123162658_add_severity_to_domain_blocks.rb
│ │ ├── 20170123203248_add_reject_media_to_domain_blocks.rb
│ │ ├── 20170125145934_add_spoiler_text_to_statuses.rb
│ │ ├── 20170127165745_add_devise_two_factor_to_users.rb
│ │ ├── 20170129000348_create_devices.rb
│ │ ├── 20170205175257_remove_devices.rb
│ │ ├── 20170209184350_add_reply_to_statuses.rb
│ │ ├── 20170214110202_create_reports.rb
│ │ ├── 20170217012631_add_reblog_of_id_foreign_key_to_statuses.rb
│ │ ├── 20170301222600_create_mutes.rb
│ │ ├── 20170303212857_add_last_emailed_at_to_users.rb
│ │ ├── 20170304202101_add_type_to_media_attachments.rb
│ │ ├── 20170317193015_add_search_index_to_accounts.rb
│ │ ├── 20170318214217_add_header_remote_url_to_accounts.rb
│ │ ├── 20170322021028_add_lowercase_index_to_accounts.rb
│ │ ├── 20170322143850_change_primary_key_to_bigint_on_statuses.rb
│ │ ├── 20170322162804_add_search_index_to_tags.rb
│ │ ├── 20170330021336_add_counter_caches.rb
│ │ ├── 20170330163835_create_imports.rb
│ │ ├── 20170330164118_add_attachment_data_to_imports.rb
│ │ ├── 20170403172249_add_action_taken_by_account_id_to_reports.rb
│ │ ├── 20170405112956_add_index_on_mentions_status_id.rb
│ │ ├── 20170406215816_add_notifications_and_favourites_indices.rb
│ │ ├── 20170409170753_add_last_webfingered_at_to_accounts.rb
│ │ ├── 20170414080609_add_devise_two_factor_backupable_to_users.rb
│ │ ├── 20170414132105_add_language_to_statuses.rb
│ │ ├── 20170418160728_add_indexes_to_reports_for_accounts.rb
│ │ ├── 20170423005413_add_allowed_languages_to_user.rb
│ │ ├── 20170424003227_create_account_domain_blocks.rb
│ │ ├── 20170424112722_add_status_id_index_to_statuses_tags.rb
│ │ ├── 20170425131920_add_media_attachment_meta.rb
│ │ ├── 20170425202925_add_oembed_to_preview_cards.rb
│ │ ├── 20170427011934_re_add_owner_to_application.rb
│ │ ├── 20170506235850_create_conversations.rb
│ │ ├── 20170507000211_add_conversation_id_to_statuses.rb
│ │ ├── 20170507141759_optimize_index_subscriptions.rb
│ │ ├── 20170508230434_create_conversation_mutes.rb
│ │ ├── 20170516072309_add_index_accounts_on_uri.rb
│ │ ├── 20170520145338_change_language_filter_to_opt_out.rb
│ │ ├── 20170601210557_add_index_on_media_attachments_account_id.rb
│ │ ├── 20170604144747_add_foreign_keys_for_accounts.rb
│ │ ├── 20170606113804_change_tag_search_index_to_btree.rb
│ │ ├── 20170609145826_remove_default_language_from_statuses.rb
│ │ ├── 20170610000000_add_statuses_index_on_account_id_id.rb
│ │ ├── 20170623152212_create_session_activations.rb
│ │ ├── 20170624134742_add_description_to_session_activations.rb
│ │ ├── 20170625140443_add_access_token_id_to_session_activations.rb
│ │ ├── 20170711225116_fix_null_booleans.rb
│ │ ├── 20170713112503_make_tag_search_case_insensitive.rb
│ │ ├── 20170713175513_create_web_push_subscriptions.rb
│ │ ├── 20170713190709_add_web_push_subscription_to_session_activations.rb
│ │ ├── 20170714184731_add_domain_to_subscriptions.rb
│ │ ├── 20170716191202_add_hide_notifications_to_mute.rb
│ │ ├── 20170718211102_add_activitypub_to_accounts.rb
│ │ ├── 20170720000000_add_index_favourites_on_account_id_and_id.rb
│ │ ├── 20170823162448_create_status_pins.rb
│ │ ├── 20170824103029_add_timestamps_to_status_pins.rb
│ │ ├── 20170829215220_remove_status_pins_account_index.rb
│ │ ├── 20170901141119_truncate_preview_cards.rb
│ │ ├── 20170901142658_create_join_table_preview_cards_statuses.rb
│ │ ├── 20170905044538_add_index_id_account_id_activity_type_on_notifications.rb
│ │ ├── 20170905165803_add_local_to_statuses.rb
│ │ ├── 20170913000752_create_site_uploads.rb
│ │ ├── 20170917153509_create_custom_emojis.rb
│ │ ├── 20170918125918_ids_to_bigints.rb
│ │ ├── 20170920024819_status_ids_to_timestamp_ids.rb
│ │ ├── 20170920032311_fix_reblogs_in_feeds.rb
│ │ ├── 20170924022025_ids_to_bigints2.rb
│ │ ├── 20170927215609_add_description_to_media_attachments.rb
│ │ ├── 20170928082043_create_email_domain_blocks.rb
│ │ ├── 20171005102658_create_account_moderation_notes.rb
│ │ ├── 20171005171936_add_disabled_to_custom_emojis.rb
│ │ ├── 20171006142024_add_uri_to_custom_emojis.rb
│ │ ├── 20171010023049_add_foreign_key_to_account_moderation_notes.rb
│ │ ├── 20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
│ │ ├── 20171020084748_add_visible_in_picker_to_custom_emoji.rb
│ │ ├── 20171028221157_add_reblogs_to_follows.rb
│ │ ├── 20171107143332_add_memorial_to_accounts.rb
│ │ ├── 20171107143624_add_disabled_to_users.rb
│ │ ├── 20171109012327_add_moderator_to_accounts.rb
│ │ ├── 20171114080328_add_index_domain_to_email_domain_blocks.rb
│ │ ├── 20171114231651_create_lists.rb
│ │ ├── 20171116161857_create_list_accounts.rb
│ │ ├── 20171118012443_add_moved_to_account_id_to_accounts.rb
│ │ ├── 20171119172437_create_admin_action_logs.rb
│ │ ├── 20171122120436_add_index_account_and_reblog_of_id_to_statuses.rb
│ │ ├── 20171125024930_create_invites.rb
│ │ ├── 20171125031751_add_invite_id_to_users.rb
│ │ ├── 20171125185353_add_index_reblog_of_id_and_account_to_statuses.rb
│ │ ├── 20171125190735_remove_old_reblog_index_on_statuses.rb
│ │ ├── 20171129172043_add_index_on_stream_entries.rb
│ │ ├── 20171130000000_add_embed_url_to_preview_cards.rb
│ │ ├── 20171201000000_change_account_id_nonnullable_in_lists.rb
│ │ ├── 20171212195226_remove_duplicate_indexes_in_lists.rb
│ │ ├── 20171226094803_more_faster_index_on_notifications.rb
│ │ ├── 20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│ │ ├── 20180109143959_add_remember_token_to_users.rb
│ │ ├── 20180204034416_create_identities.rb
│ │ ├── 20180206000000_change_user_id_nonnullable.rb
│ │ ├── 20180211015820_create_backups.rb
│ │ ├── 20180304013859_add_featured_collection_url_to_accounts.rb
│ │ ├── 20180310000000_change_columns_in_notifications_nonnullable.rb
│ │ ├── 20180402031200_add_assigned_account_id_to_reports.rb
│ │ ├── 20180402040909_create_report_notes.rb
│ │ ├── 20180410204633_add_fields_to_accounts.rb
│ │ ├── 20180416210259_add_uri_to_relationships.rb
│ │ ├── 20180506221944_add_actor_type_to_accounts.rb
│ │ ├── 20180510214435_add_access_token_id_to_web_push_subscriptions.rb
│ │ ├── 20180510230049_migrate_web_push_subscriptions.rb
│ │ ├── 20180514130000_improve_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│ │ ├── 20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb
│ │ ├── 20180528141303_fix_accounts_unique_index.rb
│ │ ├── 20180608213548_reject_following_blocked_users.rb
│ │ ├── 20180609104432_migrate_web_push_subscriptions2.rb
│ │ ├── 20180615122121_add_autofollow_to_invites.rb
│ │ ├── 20180616192031_add_chosen_languages_to_users.rb
│ │ ├── 20180617162849_remove_unused_indexes.rb
│ │ ├── 20180628181026_create_custom_filters.rb
│ │ ├── 20180707154237_add_whole_word_to_custom_filter.rb
│ │ ├── 20180711152640_create_relays.rb
│ │ ├── 20180808175627_create_account_pins.rb
│ │ ├── 20180812123222_change_relays_enabled.rb
│ │ ├── 20180812162710_create_status_stats.rb
│ │ ├── 20180812173710_copy_status_stats.rb
│ │ ├── 20180814171349_add_confidential_to_doorkeeper_application.rb
│ │ ├── 20180820232245_add_foreign_key_indices.rb
│ │ ├── 20180929222014_create_account_conversations.rb
│ │ ├── 20181007025445_create_pghero_space_stats.rb
│ │ ├── 20181010141500_add_silent_to_mentions.rb
│ │ ├── 20181017170937_add_reject_reports_to_domain_blocks.rb
│ │ ├── 20181018205649_add_unread_to_account_conversations.rb
│ │ ├── 20181024224956_migrate_account_conversations.rb
│ │ ├── 20181026034033_remove_faux_remote_account_duplicates.rb
│ │ ├── 20181116165755_create_account_stats.rb
│ │ ├── 20181116173541_copy_account_stats.rb
│ │ ├── 20181127130500_identity_id_to_bigint.rb
│ │ ├── 20181203003808_create_accounts_tags_join_table.rb
│ │ ├── 20181203021853_add_discoverable_to_accounts.rb
│ │ ├── 20181204193439_add_last_status_at_to_account_stats.rb
│ │ ├── 20181204215309_create_account_tag_stats.rb
│ │ ├── 20181207011115_downcase_custom_emoji_domains.rb
│ │ ├── 20181213184704_create_account_warnings.rb
│ │ ├── 20181213185533_create_account_warning_presets.rb
│ │ ├── 20181219235220_add_created_by_application_id_to_users.rb
│ │ ├── 20181226021420_add_also_known_as_to_accounts.rb
│ │ ├── 20190103124649_create_scheduled_statuses.rb
│ │ ├── 20190103124754_add_scheduled_status_id_to_media_attachments.rb
│ │ ├── 20190117114553_create_tombstones.rb
│ │ ├── 20190201012802_add_overwrite_to_imports.rb
│ │ ├── 20190203180359_create_featured_tags.rb
│ │ ├── 20190225031541_create_polls.rb
│ │ ├── 20190225031625_create_poll_votes.rb
│ │ ├── 20190226003449_add_poll_id_to_statuses.rb
│ │ ├── 20190304152020_add_uri_to_poll_votes.rb
│ │ ├── 20190306145741_add_lock_version_to_polls.rb
│ │ ├── 20190307234537_add_approved_to_users.rb
│ │ ├── 20190314181829_migrate_open_registrations_setting.rb
│ │ ├── 20190316190352_create_account_identity_proofs.rb
│ │ ├── 20190317135723_add_uri_to_reports.rb
│ │ ├── 20190409054914_create_user_invite_requests.rb
│ │ ├── 20190420025523_add_blurhash_to_media_attachments.rb
│ │ ├── 20190509164208_add_by_moderator_to_tombstone.rb
│ │ ├── 20190511134027_add_silenced_at_suspended_at_to_accounts.rb
│ │ └── 20190529143559_preserve_old_layout_for_existing_users.rb
│ ├── post_migrate/
│ │ ├── .gitkeep
│ │ ├── 20180813113448_copy_status_stats_cleanup.rb
│ │ ├── 20181116184611_copy_account_stats_cleanup.rb
│ │ ├── 20190511152737_remove_suspended_silenced_account_fields.rb
│ │ └── 20190519130537_remove_boosts_widening_audience.rb
│ ├── schema.rb
│ └── seeds.rb
├── dist/
│ ├── mastodon-sidekiq.service
│ ├── mastodon-streaming.service
│ ├── mastodon-web.service
│ └── nginx.conf
├── docker-compose.yml
├── lib/
│ ├── assets/
│ │ └── .keep
│ ├── cli.rb
│ ├── devise/
│ │ └── ldap_authenticatable.rb
│ ├── florence/
│ │ └── version.rb
│ ├── generators/
│ │ └── post_deployment_migration_generator.rb
│ ├── json_ld/
│ │ └── security.rb
│ ├── mastodon/
│ │ ├── accounts_cli.rb
│ │ ├── cache_cli.rb
│ │ ├── cli_helper.rb
│ │ ├── domains_cli.rb
│ │ ├── emoji_cli.rb
│ │ ├── feeds_cli.rb
│ │ ├── media_cli.rb
│ │ ├── migration_helpers.rb
│ │ ├── premailer_webpack_strategy.rb
│ │ ├── redis_config.rb
│ │ ├── search_cli.rb
│ │ ├── settings_cli.rb
│ │ ├── snowflake.rb
│ │ ├── statuses_cli.rb
│ │ └── version.rb
│ ├── paperclip/
│ │ ├── blurhash_transcoder.rb
│ │ ├── gif_transcoder.rb
│ │ ├── lazy_thumbnail.rb
│ │ └── video_transcoder.rb
│ ├── tasks/
│ │ ├── assets.rake
│ │ ├── auto_annotate_models.rake
│ │ ├── db.rake
│ │ ├── emojis.rake
│ │ ├── mastodon.rake
│ │ ├── repo.rake
│ │ └── statistics.rake
│ └── templates/
│ ├── haml/
│ │ └── scaffold/
│ │ └── _form.html.haml
│ └── rails/
│ └── post_deployment_migration/
│ └── migration.rb
├── log/
│ └── .keep
├── nanobox/
│ ├── nginx-local.conf
│ ├── nginx-stream.conf.erb
│ └── nginx-web.conf.erb
├── package.json
├── postcss.config.js
├── priv-config
├── public/
│ ├── browserconfig.xml
│ ├── embed.js
│ ├── robots.txt
│ └── sounds/
│ └── boop.ogg
├── scalingo.json
├── spec/
│ ├── controllers/
│ │ ├── about_controller_spec.rb
│ │ ├── account_follow_controller_spec.rb
│ │ ├── account_unfollow_controller_spec.rb
│ │ ├── accounts_controller_spec.rb
│ │ ├── activitypub/
│ │ │ ├── collections_controller_spec.rb
│ │ │ ├── inboxes_controller_spec.rb
│ │ │ └── outboxes_controller_spec.rb
│ │ ├── admin/
│ │ │ ├── account_moderation_notes_controller_spec.rb
│ │ │ ├── accounts_controller_spec.rb
│ │ │ ├── action_logs_controller_spec.rb
│ │ │ ├── base_controller_spec.rb
│ │ │ ├── change_email_controller_spec.rb
│ │ │ ├── confirmations_controller_spec.rb
│ │ │ ├── custom_emojis_controller_spec.rb
│ │ │ ├── dashboard_controller_spec.rb
│ │ │ ├── domain_blocks_controller_spec.rb
│ │ │ ├── email_domain_blocks_controller_spec.rb
│ │ │ ├── instances_controller_spec.rb
│ │ │ ├── invites_controller_spec.rb
│ │ │ ├── report_notes_controller_spec.rb
│ │ │ ├── reported_statuses_controller_spec.rb
│ │ │ ├── reports_controller_spec.rb
│ │ │ ├── resets_controller_spec.rb
│ │ │ ├── roles_controller_spec.rb
│ │ │ ├── settings_controller_spec.rb
│ │ │ ├── statuses_controller_spec.rb
│ │ │ ├── subscriptions_controller_spec.rb
│ │ │ ├── tags_controller_spec.rb
│ │ │ └── two_factor_authentications_controller_spec.rb
│ │ ├── api/
│ │ │ ├── base_controller_spec.rb
│ │ │ ├── oembed_controller_spec.rb
│ │ │ ├── proofs_controller_spec.rb
│ │ │ ├── push_controller_spec.rb
│ │ │ ├── salmon_controller_spec.rb
│ │ │ ├── subscriptions_controller_spec.rb
│ │ │ ├── v1/
│ │ │ │ ├── accounts/
│ │ │ │ │ ├── credentials_controller_spec.rb
│ │ │ │ │ ├── follower_accounts_controller_spec.rb
│ │ │ │ │ ├── following_accounts_controller_spec.rb
│ │ │ │ │ ├── lists_controller_spec.rb
│ │ │ │ │ ├── pins_controller_spec.rb
│ │ │ │ │ ├── relationships_controller_spec.rb
│ │ │ │ │ ├── search_controller_spec.rb
│ │ │ │ │ └── statuses_controller_spec.rb
│ │ │ │ ├── accounts_controller_spec.rb
│ │ │ │ ├── apps/
│ │ │ │ │ └── credentials_controller_spec.rb
│ │ │ │ ├── apps_controller_spec.rb
│ │ │ │ ├── blocks_controller_spec.rb
│ │ │ │ ├── conversations_controller_spec.rb
│ │ │ │ ├── custom_emojis_controller_spec.rb
│ │ │ │ ├── domain_blocks_controller_spec.rb
│ │ │ │ ├── endorsements_controller_spec.rb
│ │ │ │ ├── favourites_controller_spec.rb
│ │ │ │ ├── filters_controller_spec.rb
│ │ │ │ ├── follow_requests_controller_spec.rb
│ │ │ │ ├── follows_controller_spec.rb
│ │ │ │ ├── instances/
│ │ │ │ │ ├── activity_controller_spec.rb
│ │ │ │ │ └── peers_controller_spec.rb
│ │ │ │ ├── instances_controller_spec.rb
│ │ │ │ ├── lists/
│ │ │ │ │ └── accounts_controller_spec.rb
│ │ │ │ ├── lists_controller_spec.rb
│ │ │ │ ├── media_controller_spec.rb
│ │ │ │ ├── mutes_controller_spec.rb
│ │ │ │ ├── notifications_controller_spec.rb
│ │ │ │ ├── polls/
│ │ │ │ │ └── votes_controller_spec.rb
│ │ │ │ ├── polls_controller_spec.rb
│ │ │ │ ├── push/
│ │ │ │ │ └── subscriptions_controller_spec.rb
│ │ │ │ ├── reports_controller_spec.rb
│ │ │ │ ├── search_controller_spec.rb
│ │ │ │ ├── statuses/
│ │ │ │ │ ├── favourited_by_accounts_controller_spec.rb
│ │ │ │ │ ├── favourites_controller_spec.rb
│ │ │ │ │ ├── mutes_controller_spec.rb
│ │ │ │ │ ├── pins_controller_spec.rb
│ │ │ │ │ ├── reblogged_by_accounts_controller_spec.rb
│ │ │ │ │ └── reblogs_controller_spec.rb
│ │ │ │ ├── statuses_controller_spec.rb
│ │ │ │ ├── streaming_controller_spec.rb
│ │ │ │ ├── suggestions_controller_spec.rb
│ │ │ │ └── timelines/
│ │ │ │ ├── direct_controller_spec.rb
│ │ │ │ ├── home_controller_spec.rb
│ │ │ │ ├── list_controller_spec.rb
│ │ │ │ ├── public_controller_spec.rb
│ │ │ │ └── tag_controller_spec.rb
│ │ │ ├── v2/
│ │ │ │ └── search_controller_spec.rb
│ │ │ └── web/
│ │ │ ├── embeds_controller_spec.rb
│ │ │ ├── push_subscriptions_controller_spec.rb
│ │ │ └── settings_controller_spec.rb
│ │ ├── application_controller_spec.rb
│ │ ├── auth/
│ │ │ ├── confirmations_controller_spec.rb
│ │ │ ├── passwords_controller_spec.rb
│ │ │ ├── registrations_controller_spec.rb
│ │ │ └── sessions_controller_spec.rb
│ │ ├── authorize_interactions_controller_spec.rb
│ │ ├── concerns/
│ │ │ ├── account_controller_concern_spec.rb
│ │ │ ├── accountable_concern_spec.rb
│ │ │ ├── export_controller_concern_spec.rb
│ │ │ ├── localized_spec.rb
│ │ │ ├── obfuscate_filename_spec.rb
│ │ │ ├── rate_limit_headers_spec.rb
│ │ │ ├── signature_verification_spec.rb
│ │ │ └── user_tracking_concern_spec.rb
│ │ ├── emojis_controller_spec.rb
│ │ ├── follower_accounts_controller_spec.rb
│ │ ├── following_accounts_controller_spec.rb
│ │ ├── home_controller_spec.rb
│ │ ├── intents_controller_spec.rb
│ │ ├── invites_controller_spec.rb
│ │ ├── manifests_controller_spec.rb
│ │ ├── media_controller_spec.rb
│ │ ├── oauth/
│ │ │ ├── authorizations_controller_spec.rb
│ │ │ ├── authorized_applications_controller_spec.rb
│ │ │ └── tokens_controller_spec.rb
│ │ ├── relationships_controller_spec.rb
│ │ ├── remote_follow_controller_spec.rb
│ │ ├── remote_interaction_controller_spec.rb
│ │ ├── remote_unfollows_controller_spec.rb
│ │ ├── settings/
│ │ │ ├── applications_controller_spec.rb
│ │ │ ├── deletes_controller_spec.rb
│ │ │ ├── exports/
│ │ │ │ ├── blocked_accounts_controller_spec.rb
│ │ │ │ ├── following_accounts_controller_spec.rb
│ │ │ │ └── muted_accounts_controller_spec.rb
│ │ │ ├── exports_controller_spec.rb
│ │ │ ├── identity_proofs_controller_spec.rb
│ │ │ ├── imports_controller_spec.rb
│ │ │ ├── migrations_controller_spec.rb
│ │ │ ├── preferences/
│ │ │ │ ├── notifications_controller_spec.rb
│ │ │ │ └── other_controller_spec.rb
│ │ │ ├── profiles_controller_spec.rb
│ │ │ ├── sessions_controller_spec.rb
│ │ │ ├── two_factor_authentication/
│ │ │ │ ├── confirmations_controller_spec.rb
│ │ │ │ └── recovery_codes_controller_spec.rb
│ │ │ └── two_factor_authentications_controller_spec.rb
│ │ ├── shares_controller_spec.rb
│ │ ├── statuses_controller_spec.rb
│ │ ├── stream_entries_controller_spec.rb
│ │ ├── tags_controller_spec.rb
│ │ └── well_known/
│ │ ├── host_meta_controller_spec.rb
│ │ ├── keybase_proof_config_controller_spec.rb
│ │ └── webfinger_controller_spec.rb
│ ├── fabricators/
│ │ ├── access_token_fabricator.rb
│ │ ├── accessible_access_token_fabricator.rb
│ │ ├── account_domain_block_fabricator.rb
│ │ ├── account_fabricator.rb
│ │ ├── account_identity_proof_fabricator.rb
│ │ ├── account_moderation_note_fabricator.rb
│ │ ├── account_pin_fabricator.rb
│ │ ├── account_stat_fabricator.rb
│ │ ├── account_tag_stat_fabricator.rb
│ │ ├── account_warning_fabricator.rb
│ │ ├── account_warning_preset_fabricator.rb
│ │ ├── admin_action_log_fabricator.rb
│ │ ├── application_fabricator.rb
│ │ ├── assets/
│ │ │ └── TEAPOT
│ │ ├── backup_fabricator.rb
│ │ ├── block_fabricator.rb
│ │ ├── conversation_account_fabricator.rb
│ │ ├── conversation_fabricator.rb
│ │ ├── conversation_mute_fabricator.rb
│ │ ├── custom_emoji_fabricator.rb
│ │ ├── custom_filter_fabricator.rb
│ │ ├── domain_block_fabricator.rb
│ │ ├── email_domain_block_fabricator.rb
│ │ ├── favourite_fabricator.rb
│ │ ├── featured_tag_fabricator.rb
│ │ ├── follow_fabricator.rb
│ │ ├── follow_request_fabricator.rb
│ │ ├── identity_fabricator.rb
│ │ ├── import_fabricator.rb
│ │ ├── invite_fabricator.rb
│ │ ├── list_account_fabricator.rb
│ │ ├── list_fabricator.rb
│ │ ├── media_attachment_fabricator.rb
│ │ ├── mention_fabricator.rb
│ │ ├── mute_fabricator.rb
│ │ ├── notification_fabricator.rb
│ │ ├── poll_fabricator.rb
│ │ ├── poll_vote_fabricator.rb
│ │ ├── relay_fabricator.rb
│ │ ├── report_fabricator.rb
│ │ ├── report_note_fabricator.rb
│ │ ├── scheduled_status_fabricator.rb
│ │ ├── session_activation_fabricator.rb
│ │ ├── setting_fabricator.rb
│ │ ├── site_upload_fabricator.rb
│ │ ├── status_fabricator.rb
│ │ ├── status_pin_fabricator.rb
│ │ ├── status_stat_fabricator.rb
│ │ ├── stream_entry_fabricator.rb
│ │ ├── subscription_fabricator.rb
│ │ ├── tag_fabricator.rb
│ │ ├── user_fabricator.rb
│ │ ├── user_invite_request_fabricator.rb
│ │ ├── web_push_subscription_fabricator.rb
│ │ └── web_setting_fabricator.rb
│ ├── features/
│ │ └── log_in_spec.rb
│ ├── fixtures/
│ │ ├── files/
│ │ │ ├── attachment.webm
│ │ │ ├── imports.txt
│ │ │ ├── mute-imports.txt
│ │ │ ├── new-following-imports.txt
│ │ │ └── new-mute-imports.txt
│ │ ├── push/
│ │ │ ├── feed.atom
│ │ │ └── reblog.atom
│ │ ├── requests/
│ │ │ ├── .host-meta.txt
│ │ │ ├── activitypub-actor-individual.txt
│ │ │ ├── activitypub-actor-noinbox.txt
│ │ │ ├── activitypub-actor.txt
│ │ │ ├── activitypub-feed.txt
│ │ │ ├── activitypub-webfinger.txt
│ │ │ ├── attachment1.txt
│ │ │ ├── attachment2.txt
│ │ │ ├── avatar.txt
│ │ │ ├── feed.txt
│ │ │ ├── idn.txt
│ │ │ ├── json-ld.activitystreams.txt
│ │ │ ├── json-ld.identity.txt
│ │ │ ├── json-ld.security.txt
│ │ │ ├── koi8-r.txt
│ │ │ ├── localdomain-feed.txt
│ │ │ ├── localdomain-hostmeta.txt
│ │ │ ├── localdomain-webfinger.txt
│ │ │ ├── oembed_invalid_xml.html
│ │ │ ├── oembed_json.html
│ │ │ ├── oembed_json_empty.html
│ │ │ ├── oembed_json_xml.html
│ │ │ ├── oembed_undiscoverable.html
│ │ │ ├── oembed_xml.html
│ │ │ ├── redirected.host-meta.txt
│ │ │ ├── sjis.txt
│ │ │ ├── sjis_with_wrong_charset.txt
│ │ │ ├── webfinger-hacker1.txt
│ │ │ ├── webfinger-hacker2.txt
│ │ │ ├── webfinger-hacker3.txt
│ │ │ ├── webfinger.txt
│ │ │ └── windows-1251.txt
│ │ ├── salmon/
│ │ │ └── mention.xml
│ │ └── xml/
│ │ └── mastodon.atom
│ ├── helpers/
│ │ ├── admin/
│ │ │ ├── account_moderation_notes_helper_spec.rb
│ │ │ ├── action_log_helper_spec.rb
│ │ │ └── filter_helper_spec.rb
│ │ ├── application_helper_spec.rb
│ │ ├── flashes_helper_spec.rb
│ │ ├── home_helper_spec.rb
│ │ ├── instance_helper_spec.rb
│ │ ├── jsonld_helper_spec.rb
│ │ ├── routing_helper_spec.rb
│ │ ├── settings_helper_spec.rb
│ │ └── stream_entries_helper_spec.rb
│ ├── lib/
│ │ ├── activitypub/
│ │ │ ├── activity/
│ │ │ │ ├── accept_spec.rb
│ │ │ │ ├── add_spec.rb
│ │ │ │ ├── announce_spec.rb
│ │ │ │ ├── block_spec.rb
│ │ │ │ ├── create_spec.rb
│ │ │ │ ├── delete_spec.rb
│ │ │ │ ├── flag_spec.rb
│ │ │ │ ├── follow_spec.rb
│ │ │ │ ├── like_spec.rb
│ │ │ │ ├── move_spec.rb
│ │ │ │ ├── reject_spec.rb
│ │ │ │ ├── remove_spec.rb
│ │ │ │ ├── undo_spec.rb
│ │ │ │ └── update_spec.rb
│ │ │ ├── adapter_spec.rb
│ │ │ ├── linked_data_signature_spec.rb
│ │ │ └── tag_manager_spec.rb
│ │ ├── delivery_failure_tracker_spec.rb
│ │ ├── extractor_spec.rb
│ │ ├── feed_manager_spec.rb
│ │ ├── formatter_spec.rb
│ │ ├── hash_object_spec.rb
│ │ ├── language_detector_spec.rb
│ │ ├── ostatus/
│ │ │ ├── atom_serializer_spec.rb
│ │ │ └── tag_manager_spec.rb
│ │ ├── proof_provider/
│ │ │ └── keybase/
│ │ │ └── verifier_spec.rb
│ │ ├── request_spec.rb
│ │ ├── settings/
│ │ │ ├── extend_spec.rb
│ │ │ └── scoped_settings_spec.rb
│ │ ├── status_filter_spec.rb
│ │ ├── status_finder_spec.rb
│ │ ├── tag_manager_spec.rb
│ │ ├── user_settings_decorator_spec.rb
│ │ └── webfinger_resource_spec.rb
│ ├── mailers/
│ │ ├── admin_mailer_spec.rb
│ │ ├── notification_mailer_spec.rb
│ │ ├── previews/
│ │ │ ├── admin_mailer_preview.rb
│ │ │ ├── notification_mailer_preview.rb
│ │ │ └── user_mailer_preview.rb
│ │ └── user_mailer_spec.rb
│ ├── models/
│ │ ├── account_conversation_spec.rb
│ │ ├── account_domain_block_spec.rb
│ │ ├── account_filter_spec.rb
│ │ ├── account_moderation_note_spec.rb
│ │ ├── account_spec.rb
│ │ ├── account_stat_spec.rb
│ │ ├── account_tag_stat_spec.rb
│ │ ├── admin/
│ │ │ ├── account_action_spec.rb
│ │ │ └── action_log_spec.rb
│ │ ├── backup_spec.rb
│ │ ├── block_spec.rb
│ │ ├── concerns/
│ │ │ ├── account_finder_concern_spec.rb
│ │ │ ├── account_interactions_spec.rb
│ │ │ ├── remotable_spec.rb
│ │ │ ├── status_threading_concern_spec.rb
│ │ │ └── streamable_spec.rb
│ │ ├── conversation_mute_spec.rb
│ │ ├── conversation_spec.rb
│ │ ├── custom_emoji_filter_spec.rb
│ │ ├── custom_emoji_spec.rb
│ │ ├── custom_filter_spec.rb
│ │ ├── domain_block_spec.rb
│ │ ├── email_domain_block_spec.rb
│ │ ├── export_spec.rb
│ │ ├── favourite_spec.rb
│ │ ├── featured_tag_spec.rb
│ │ ├── follow_request_spec.rb
│ │ ├── follow_spec.rb
│ │ ├── form/
│ │ │ └── status_batch_spec.rb
│ │ ├── home_feed_spec.rb
│ │ ├── identity_spec.rb
│ │ ├── import_spec.rb
│ │ ├── invite_spec.rb
│ │ ├── list_account_spec.rb
│ │ ├── list_spec.rb
│ │ ├── media_attachment_spec.rb
│ │ ├── mention_spec.rb
│ │ ├── mute_spec.rb
│ │ ├── notification_spec.rb
│ │ ├── poll_spec.rb
│ │ ├── poll_vote_spec.rb
│ │ ├── preview_card_spec.rb
│ │ ├── relay_spec.rb
│ │ ├── remote_follow_spec.rb
│ │ ├── remote_profile_spec.rb
│ │ ├── report_filter_spec.rb
│ │ ├── report_spec.rb
│ │ ├── scheduled_status_spec.rb
│ │ ├── session_activation_spec.rb
│ │ ├── setting_spec.rb
│ │ ├── site_upload_spec.rb
│ │ ├── status_pin_spec.rb
│ │ ├── status_spec.rb
│ │ ├── status_stat_spec.rb
│ │ ├── stream_entry_spec.rb
│ │ ├── subscription_spec.rb
│ │ ├── tag_spec.rb
│ │ ├── user_invite_request_spec.rb
│ │ ├── user_spec.rb
│ │ └── web/
│ │ ├── push_subscription_spec.rb
│ │ └── setting_spec.rb
│ ├── policies/
│ │ ├── account_moderation_note_policy_spec.rb
│ │ ├── account_policy_spec.rb
│ │ ├── backup_policy_spec.rb
│ │ ├── custom_emoji_policy_spec.rb
│ │ ├── domain_block_policy_spec.rb
│ │ ├── email_domain_block_policy_spec.rb
│ │ ├── instance_policy_spec.rb
│ │ ├── invite_policy_spec.rb
│ │ ├── relay_policy_spec.rb
│ │ ├── report_note_policy_spec.rb
│ │ ├── report_policy_spec.rb
│ │ ├── settings_policy_spec.rb
│ │ ├── status_policy_spec.rb
│ │ ├── subscription_policy_spec.rb
│ │ ├── tag_policy_spec.rb
│ │ └── user_policy_spec.rb
│ ├── presenters/
│ │ ├── account_relationships_presenter_spec.rb
│ │ └── instance_presenter_spec.rb
│ ├── rails_helper.rb
│ ├── requests/
│ │ ├── account_show_page_spec.rb
│ │ ├── catch_all_route_request_spec.rb
│ │ ├── host_meta_request_spec.rb
│ │ ├── link_headers_spec.rb
│ │ ├── localization_spec.rb
│ │ └── webfinger_request_spec.rb
│ ├── routing/
│ │ ├── accounts_routing_spec.rb
│ │ ├── api_routing_spec.rb
│ │ └── well_known_routes_spec.rb
│ ├── serializers/
│ │ └── activitypub/
│ │ └── note_spec.rb
│ ├── services/
│ │ ├── account_search_service_spec.rb
│ │ ├── activitypub/
│ │ │ ├── fetch_remote_account_service_spec.rb
│ │ │ ├── fetch_remote_status_service_spec.rb
│ │ │ ├── fetch_replies_service_spec.rb
│ │ │ ├── process_account_service_spec.rb
│ │ │ └── process_collection_service_spec.rb
│ │ ├── after_block_domain_from_account_service_spec.rb
│ │ ├── after_block_service_spec.rb
│ │ ├── app_sign_up_service_spec.rb
│ │ ├── authorize_follow_service_spec.rb
│ │ ├── batched_remove_status_service_spec.rb
│ │ ├── block_domain_service_spec.rb
│ │ ├── block_service_spec.rb
│ │ ├── bootstrap_timeline_service_spec.rb
│ │ ├── fan_out_on_write_service_spec.rb
│ │ ├── favourite_service_spec.rb
│ │ ├── fetch_atom_service_spec.rb
│ │ ├── fetch_link_card_service_spec.rb
│ │ ├── fetch_oembed_service_spec.rb
│ │ ├── fetch_remote_account_service_spec.rb
│ │ ├── fetch_remote_status_service_spec.rb
│ │ ├── follow_service_spec.rb
│ │ ├── hashtag_query_service_spec.rb
│ │ ├── import_service_spec.rb
│ │ ├── mute_service_spec.rb
│ │ ├── notify_service_spec.rb
│ │ ├── post_status_service_spec.rb
│ │ ├── precompute_feed_service_spec.rb
│ │ ├── process_feed_service_spec.rb
│ │ ├── process_interaction_service_spec.rb
│ │ ├── process_mentions_service_spec.rb
│ │ ├── pubsubhubbub/
│ │ │ ├── subscribe_service_spec.rb
│ │ │ └── unsubscribe_service_spec.rb
│ │ ├── reblog_service_spec.rb
│ │ ├── reject_follow_service_spec.rb
│ │ ├── remove_status_service_spec.rb
│ │ ├── report_service_spec.rb
│ │ ├── resolve_account_service_spec.rb
│ │ ├── resolve_url_service_spec.rb
│ │ ├── search_service_spec.rb
│ │ ├── send_interaction_service_spec.rb
│ │ ├── subscribe_service_spec.rb
│ │ ├── suspend_account_service_spec.rb
│ │ ├── unblock_domain_service_spec.rb
│ │ ├── unblock_service_spec.rb
│ │ ├── unfollow_service_spec.rb
│ │ ├── unmute_service_spec.rb
│ │ ├── unsubscribe_service_spec.rb
│ │ ├── update_remote_profile_service_spec.rb
│ │ └── verify_link_service_spec.rb
│ ├── spec_helper.rb
│ ├── support/
│ │ ├── examples/
│ │ │ ├── lib/
│ │ │ │ └── settings/
│ │ │ │ ├── scoped_settings.rb
│ │ │ │ └── settings_extended.rb
│ │ │ └── models/
│ │ │ └── concerns/
│ │ │ └── account_avatar.rb
│ │ └── matchers/
│ │ └── model/
│ │ └── model_have_error_on_field.rb
│ ├── validators/
│ │ ├── blacklisted_email_validator_spec.rb
│ │ ├── disallowed_hashtags_validator_spec.rb
│ │ ├── email_mx_validator_spec.rb
│ │ ├── follow_limit_validator_spec.rb
│ │ ├── poll_validator_spec.rb
│ │ ├── status_length_validator_spec.rb
│ │ ├── status_pin_validator_spec.rb
│ │ ├── unique_username_validator_spec.rb
│ │ ├── unreserved_username_validator_spec.rb
│ │ └── url_validator_spec.rb
│ ├── views/
│ │ ├── about/
│ │ │ └── show.html.haml_spec.rb
│ │ └── stream_entries/
│ │ └── show.html.haml_spec.rb
│ └── workers/
│ ├── activitypub/
│ │ ├── delivery_worker_spec.rb
│ │ ├── distribution_worker_spec.rb
│ │ ├── fetch_replies_worker_spec.rb
│ │ ├── processing_worker_spec.rb
│ │ └── update_distribution_worker_spec.rb
│ ├── after_remote_follow_request_worker_spec.rb
│ ├── after_remote_follow_worker_spec.rb
│ ├── digest_mailer_worker_spec.rb
│ ├── domain_block_worker_spec.rb
│ ├── feed_insert_worker_spec.rb
│ ├── publish_scheduled_status_worker_spec.rb
│ ├── pubsubhubbub/
│ │ ├── confirmation_worker_spec.rb
│ │ ├── delivery_worker_spec.rb
│ │ └── distribution_worker_spec.rb
│ ├── regeneration_worker_spec.rb
│ └── scheduler/
│ ├── feed_cleanup_scheduler_spec.rb
│ ├── media_cleanup_scheduler_spec.rb
│ └── subscriptions_scheduler_spec.rb
├── streaming/
│ └── index.js
└── vendor/
└── .keep
Showing preview only (456K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5947 symbols across 1135 files)
FILE: app/chewy/statuses_index.rb
class StatusesIndex (line 3) | class StatusesIndex < Chewy::Index
FILE: app/controllers/about_controller.rb
class AboutController (line 3) | class AboutController < ApplicationController
method show (line 8) | def show
method more (line 12) | def more; end
method terms (line 14) | def terms; end
method new_user (line 18) | def new_user
method set_instance_presenter (line 27) | def set_instance_presenter
FILE: app/controllers/account_follow_controller.rb
class AccountFollowController (line 3) | class AccountFollowController < ApplicationController
method create (line 8) | def create
FILE: app/controllers/account_unfollow_controller.rb
class AccountUnfollowController (line 3) | class AccountUnfollowController < ApplicationController
method create (line 8) | def create
FILE: app/controllers/accounts_controller.rb
class AccountsController (line 3) | class AccountsController < ApplicationController
method show (line 10) | def show
method show_pinned_statuses? (line 58) | def show_pinned_statuses?
method filtered_statuses (line 62) | def filtered_statuses
method default_statuses (line 70) | def default_statuses
method only_media_scope (line 74) | def only_media_scope
method account_media_status_ids (line 78) | def account_media_status_ids
method no_replies_scope (line 82) | def no_replies_scope
method hashtag_scope (line 86) | def hashtag_scope
method username_param (line 96) | def username_param
method older_url (line 100) | def older_url
method newer_url (line 104) | def newer_url
method pagination_url (line 108) | def pagination_url(max_id: nil, min_id: nil)
method media_requested? (line 120) | def media_requested?
method replies_requested? (line 124) | def replies_requested?
method tag_requested? (line 128) | def tag_requested?
method filtered_status_page (line 132) | def filtered_status_page(params)
FILE: app/controllers/activitypub/collections_controller.rb
class ActivityPub::CollectionsController (line 3) | class ActivityPub::CollectionsController < Api::BaseController
method show (line 11) | def show
method set_account (line 24) | def set_account
method set_statuses (line 28) | def set_statuses
method set_size (line 33) | def set_size
method scope_for_collection (line 42) | def scope_for_collection
method collection_presenter (line 53) | def collection_presenter
FILE: app/controllers/activitypub/inboxes_controller.rb
class ActivityPub::InboxesController (line 3) | class ActivityPub::InboxesController < Api::BaseController
method create (line 9) | def create
method unknown_deleted_account? (line 23) | def unknown_deleted_account?
method set_account (line 30) | def set_account
method body (line 34) | def body
method upgrade_account (line 41) | def upgrade_account
method process_payload (line 51) | def process_payload
FILE: app/controllers/activitypub/outboxes_controller.rb
class ActivityPub::OutboxesController (line 3) | class ActivityPub::OutboxesController < Api::BaseController
method show (line 12) | def show
method set_account (line 20) | def set_account
method outbox_presenter (line 24) | def outbox_presenter
method next_page (line 45) | def next_page
method prev_page (line 49) | def prev_page
method set_statuses (line 53) | def set_statuses
method page_requested? (line 61) | def page_requested?
method page_params (line 65) | def page_params
FILE: app/controllers/admin/account_actions_controller.rb
type Admin (line 3) | module Admin
class AccountActionsController (line 4) | class AccountActionsController < BaseController
method new (line 7) | def new
method create (line 12) | def create
method set_account (line 28) | def set_account
method resource_params (line 32) | def resource_params
FILE: app/controllers/admin/account_moderation_notes_controller.rb
type Admin (line 3) | module Admin
class AccountModerationNotesController (line 4) | class AccountModerationNotesController < BaseController
method create (line 7) | def create
method destroy (line 23) | def destroy
method resource_params (line 31) | def resource_params
method set_account_moderation_note (line 38) | def set_account_moderation_note
FILE: app/controllers/admin/accounts_controller.rb
type Admin (line 3) | module Admin
class AccountsController (line 4) | class AccountsController < BaseController
method index (line 9) | def index
method show (line 14) | def show
method subscribe (line 22) | def subscribe
method unsubscribe (line 28) | def unsubscribe
method memorialize (line 34) | def memorialize
method enable (line 41) | def enable
method approve (line 48) | def approve
method reject (line 54) | def reject
method unsilence (line 60) | def unsilence
method unsuspend (line 67) | def unsuspend
method redownload (line 74) | def redownload
method remove_avatar (line 83) | def remove_avatar
method remove_header (line 94) | def remove_header
method set_account (line 107) | def set_account
method require_remote_account! (line 111) | def require_remote_account!
method require_local_account! (line 115) | def require_local_account!
method filtered_accounts (line 119) | def filtered_accounts
method filter_params (line 123) | def filter_params
FILE: app/controllers/admin/action_logs_controller.rb
type Admin (line 3) | module Admin
class ActionLogsController (line 4) | class ActionLogsController < BaseController
method index (line 5) | def index
FILE: app/controllers/admin/base_controller.rb
type Admin (line 3) | module Admin
class BaseController (line 4) | class BaseController < ApplicationController
method set_body_classes (line 15) | def set_body_classes
method set_user (line 19) | def set_user
FILE: app/controllers/admin/change_emails_controller.rb
type Admin (line 3) | module Admin
class ChangeEmailsController (line 4) | class ChangeEmailsController < BaseController
method show (line 8) | def show
method update (line 12) | def update
method set_account (line 34) | def set_account
method require_local_account! (line 39) | def require_local_account!
method resource_params (line 43) | def resource_params
FILE: app/controllers/admin/confirmations_controller.rb
type Admin (line 3) | module Admin
class ConfirmationsController (line 4) | class ConfirmationsController < BaseController
method create (line 8) | def create
method resend (line 15) | def resend
method check_confirmation (line 28) | def check_confirmation
FILE: app/controllers/admin/custom_emojis_controller.rb
type Admin (line 3) | module Admin
class CustomEmojisController (line 4) | class CustomEmojisController < BaseController
method index (line 11) | def index
method new (line 16) | def new
method create (line 21) | def create
method update (line 34) | def update
method destroy (line 46) | def destroy
method copy (line 54) | def copy
method enable (line 71) | def enable
method disable (line 79) | def disable
method set_custom_emoji (line 89) | def set_custom_emoji
method set_filter_params (line 93) | def set_filter_params
method resource_params (line 97) | def resource_params
method filtered_custom_emojis (line 101) | def filtered_custom_emojis
method filter_params (line 105) | def filter_params
FILE: app/controllers/admin/dashboard_controller.rb
type Admin (line 4) | module Admin
class DashboardController (line 5) | class DashboardController < BaseController
method index (line 6) | def index
method current_week (line 40) | def current_week
method redis_info (line 44) | def redis_info
FILE: app/controllers/admin/domain_blocks_controller.rb
type Admin (line 3) | module Admin
class DomainBlocksController (line 4) | class DomainBlocksController < BaseController
method new (line 7) | def new
method create (line 12) | def create
method show (line 38) | def show
method destroy (line 42) | def destroy
method set_domain_block (line 51) | def set_domain_block
method resource_params (line 55) | def resource_params
FILE: app/controllers/admin/email_domain_blocks_controller.rb
type Admin (line 3) | module Admin
class EmailDomainBlocksController (line 4) | class EmailDomainBlocksController < BaseController
method index (line 7) | def index
method new (line 12) | def new
method create (line 17) | def create
method destroy (line 30) | def destroy
method set_email_domain_block (line 39) | def set_email_domain_block
method resource_params (line 43) | def resource_params
FILE: app/controllers/admin/followers_controller.rb
type Admin (line 3) | module Admin
class FollowersController (line 4) | class FollowersController < BaseController
method index (line 9) | def index
method set_account (line 14) | def set_account
FILE: app/controllers/admin/instances_controller.rb
type Admin (line 3) | module Admin
class InstancesController (line 4) | class InstancesController < BaseController
method index (line 5) | def index
method show (line 11) | def show
method filtered_instances (line 26) | def filtered_instances
method paginated_instances (line 30) | def paginated_instances
method ordered_instances (line 36) | def ordered_instances
method filter_params (line 40) | def filter_params
FILE: app/controllers/admin/invites_controller.rb
type Admin (line 3) | module Admin
class InvitesController (line 4) | class InvitesController < BaseController
method index (line 5) | def index
method create (line 12) | def create
method destroy (line 26) | def destroy
method deactivate_all (line 33) | def deactivate_all
method resource_params (line 41) | def resource_params
method filtered_invites (line 45) | def filtered_invites
method filter_params (line 49) | def filter_params
FILE: app/controllers/admin/pending_accounts_controller.rb
type Admin (line 3) | module Admin
class PendingAccountsController (line 4) | class PendingAccountsController < BaseController
method index (line 7) | def index
method batch (line 11) | def batch
method approve_all (line 20) | def approve_all
method reject_all (line 25) | def reject_all
method set_accounts (line 32) | def set_accounts
method form_account_batch_params (line 36) | def form_account_batch_params
method action_from_button (line 40) | def action_from_button
method current_params (line 48) | def current_params
FILE: app/controllers/admin/relays_controller.rb
type Admin (line 3) | module Admin
class RelaysController (line 4) | class RelaysController < BaseController
method index (line 7) | def index
method new (line 12) | def new
method create (line 17) | def create
method destroy (line 30) | def destroy
method enable (line 36) | def enable
method disable (line 42) | def disable
method set_relay (line 50) | def set_relay
method resource_params (line 54) | def resource_params
FILE: app/controllers/admin/report_notes_controller.rb
type Admin (line 3) | module Admin
class ReportNotesController (line 4) | class ReportNotesController < BaseController
method create (line 7) | def create
method destroy (line 37) | def destroy
method resource_params (line 45) | def resource_params
method set_report_note (line 52) | def set_report_note
FILE: app/controllers/admin/reported_statuses_controller.rb
type Admin (line 3) | module Admin
class ReportedStatusesController (line 4) | class ReportedStatusesController < BaseController
method create (line 7) | def create
method status_params (line 22) | def status_params
method form_status_batch_params (line 26) | def form_status_batch_params
method action_from_button (line 30) | def action_from_button
method set_report (line 40) | def set_report
FILE: app/controllers/admin/reports_controller.rb
type Admin (line 3) | module Admin
class ReportsController (line 4) | class ReportsController < BaseController
method index (line 7) | def index
method show (line 12) | def show
method assign_to_self (line 20) | def assign_to_self
method unassign (line 27) | def unassign
method reopen (line 34) | def reopen
method resolve (line 41) | def resolve
method filtered_reports (line 50) | def filtered_reports
method filter_params (line 54) | def filter_params
method set_report (line 62) | def set_report
FILE: app/controllers/admin/resets_controller.rb
type Admin (line 3) | module Admin
class ResetsController (line 4) | class ResetsController < BaseController
method create (line 7) | def create
FILE: app/controllers/admin/roles_controller.rb
type Admin (line 3) | module Admin
class RolesController (line 4) | class RolesController < BaseController
method promote (line 7) | def promote
method demote (line 14) | def demote
FILE: app/controllers/admin/settings_controller.rb
type Admin (line 3) | module Admin
class SettingsController (line 4) | class SettingsController < BaseController
method edit (line 57) | def edit
method update (line 63) | def update
method settings_params (line 78) | def settings_params
FILE: app/controllers/admin/statuses_controller.rb
type Admin (line 3) | module Admin
class StatusesController (line 4) | class StatusesController < BaseController
method index (line 11) | def index
method show (line 25) | def show
method create (line 34) | def create
method form_status_batch_params (line 49) | def form_status_batch_params
method set_account (line 53) | def set_account
method current_params (line 57) | def current_params
method action_from_button (line 66) | def action_from_button
FILE: app/controllers/admin/subscriptions_controller.rb
type Admin (line 3) | module Admin
class SubscriptionsController (line 4) | class SubscriptionsController < BaseController
method index (line 5) | def index
method ordered_subscriptions (line 12) | def ordered_subscriptions
method requested_page (line 16) | def requested_page
FILE: app/controllers/admin/tags_controller.rb
type Admin (line 3) | module Admin
class TagsController (line 4) | class TagsController < BaseController
method index (line 9) | def index
method hide (line 13) | def hide
method unhide (line 19) | def unhide
method set_tags (line 27) | def set_tags
method set_tag (line 32) | def set_tag
method set_filter_params (line 36) | def set_filter_params
method filter_params (line 40) | def filter_params
FILE: app/controllers/admin/two_factor_authentications_controller.rb
type Admin (line 3) | module Admin
class TwoFactorAuthenticationsController (line 4) | class TwoFactorAuthenticationsController < BaseController
method destroy (line 7) | def destroy
method set_target_user (line 16) | def set_target_user
FILE: app/controllers/admin/warning_presets_controller.rb
type Admin (line 3) | module Admin
class WarningPresetsController (line 4) | class WarningPresetsController < BaseController
method index (line 7) | def index
method create (line 14) | def create
method edit (line 27) | def edit
method update (line 31) | def update
method destroy (line 41) | def destroy
method set_warning_preset (line 50) | def set_warning_preset
method warning_preset_params (line 54) | def warning_preset_params
FILE: app/controllers/api/base_controller.rb
class Api::BaseController (line 3) | class Api::BaseController < ApplicationController
method doorkeeper_unauthorized_render_options (line 36) | def doorkeeper_unauthorized_render_options(error: nil)
method doorkeeper_forbidden_render_options (line 40) | def doorkeeper_forbidden_render_options(*)
method set_pagination_headers (line 46) | def set_pagination_headers(next_path = nil, prev_path = nil)
method limit_param (line 53) | def limit_param(default_limit)
method params_slice (line 58) | def params_slice(*keys)
method current_resource_owner (line 62) | def current_resource_owner
method current_user (line 66) | def current_user
method require_user! (line 72) | def require_user!
method render_empty (line 86) | def render_empty
method authorize_if_got_token! (line 90) | def authorize_if_got_token!(*scopes)
method set_cache_headers (line 94) | def set_cache_headers
FILE: app/controllers/api/oembed_controller.rb
class Api::OEmbedController (line 3) | class Api::OEmbedController < Api::BaseController
method show (line 6) | def show
method status_finder (line 13) | def status_finder
method maxwidth_or_default (line 17) | def maxwidth_or_default
method maxheight_or_default (line 21) | def maxheight_or_default
FILE: app/controllers/api/proofs_controller.rb
class Api::ProofsController (line 3) | class Api::ProofsController < Api::BaseController
method index (line 9) | def index
method set_provider (line 15) | def set_provider
method set_account (line 19) | def set_account
method check_account_approval (line 23) | def check_account_approval
method check_account_suspension (line 27) | def check_account_suspension
FILE: app/controllers/api/push_controller.rb
class Api::PushController (line 3) | class Api::PushController < Api::BaseController
method update (line 6) | def update
method process_push_request (line 13) | def process_push_request
method hub_mode (line 24) | def hub_mode
method hub_topic (line 28) | def hub_topic
method hub_callback (line 32) | def hub_callback
method hub_lease_seconds (line 36) | def hub_lease_seconds
method hub_secret (line 40) | def hub_secret
method account_from_topic (line 44) | def account_from_topic
method hub_topic_params (line 50) | def hub_topic_params
method hub_topic_uri (line 54) | def hub_topic_uri
method local_domain? (line 58) | def local_domain?
method verified_domain (line 62) | def verified_domain
method hub_topic_domain (line 66) | def hub_topic_domain
method account_feed_path? (line 70) | def account_feed_path?
FILE: app/controllers/api/salmon_controller.rb
class Api::SalmonController (line 3) | class Api::SalmonController < Api::BaseController
method update (line 9) | def update
method set_account (line 22) | def set_account
method payload (line 26) | def payload
method verify_payload? (line 30) | def verify_payload?
method process_salmon (line 34) | def process_salmon
FILE: app/controllers/api/subscriptions_controller.rb
class Api::SubscriptionsController (line 3) | class Api::SubscriptionsController < Api::BaseController
method show (line 7) | def show
method update (line 16) | def update
method subscription (line 26) | def subscription
method body (line 32) | def body
method encoded_challenge (line 36) | def encoded_challenge
method future_expires (line 40) | def future_expires
method lease_seconds_or_default (line 44) | def lease_seconds_or_default
method set_account (line 48) | def set_account
FILE: app/controllers/api/v1/accounts/credentials_controller.rb
class Api::V1::Accounts::CredentialsController (line 3) | class Api::V1::Accounts::CredentialsController < Api::BaseController
method show (line 8) | def show
method update (line 13) | def update
method account_params (line 23) | def account_params
method user_settings_params (line 27) | def user_settings_params
FILE: app/controllers/api/v1/accounts/follower_accounts_controller.rb
class Api::V1::Accounts::FollowerAccountsController (line 3) | class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
method index (line 10) | def index
method set_account (line 17) | def set_account
method load_accounts (line 21) | def load_accounts
method hide_results? (line 27) | def hide_results?
method default_accounts (line 31) | def default_accounts
method paginated_follows (line 35) | def paginated_follows
method insert_pagination_headers (line 43) | def insert_pagination_headers
method next_path (line 47) | def next_path
method prev_path (line 53) | def prev_path
method pagination_max_id (line 59) | def pagination_max_id
method pagination_since_id (line 63) | def pagination_since_id
method records_continue? (line 67) | def records_continue?
method pagination_params (line 71) | def pagination_params(core_params)
FILE: app/controllers/api/v1/accounts/following_accounts_controller.rb
class Api::V1::Accounts::FollowingAccountsController (line 3) | class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
method index (line 10) | def index
method set_account (line 17) | def set_account
method load_accounts (line 21) | def load_accounts
method hide_results? (line 27) | def hide_results?
method default_accounts (line 31) | def default_accounts
method paginated_follows (line 35) | def paginated_follows
method insert_pagination_headers (line 43) | def insert_pagination_headers
method next_path (line 47) | def next_path
method prev_path (line 53) | def prev_path
method pagination_max_id (line 59) | def pagination_max_id
method pagination_since_id (line 63) | def pagination_since_id
method records_continue? (line 67) | def records_continue?
method pagination_params (line 71) | def pagination_params(core_params)
FILE: app/controllers/api/v1/accounts/identity_proofs_controller.rb
class Api::V1::Accounts::IdentityProofsController (line 3) | class Api::V1::Accounts::IdentityProofsController < Api::BaseController
method index (line 9) | def index
method set_account (line 16) | def set_account
FILE: app/controllers/api/v1/accounts/lists_controller.rb
class Api::V1::Accounts::ListsController (line 3) | class Api::V1::Accounts::ListsController < Api::BaseController
method index (line 10) | def index
method set_account (line 17) | def set_account
FILE: app/controllers/api/v1/accounts/pins_controller.rb
class Api::V1::Accounts::PinsController (line 3) | class Api::V1::Accounts::PinsController < Api::BaseController
method create (line 12) | def create
method destroy (line 17) | def destroy
method set_account (line 25) | def set_account
method relationships_presenter (line 29) | def relationships_presenter
FILE: app/controllers/api/v1/accounts/relationships_controller.rb
class Api::V1::Accounts::RelationshipsController (line 3) | class Api::V1::Accounts::RelationshipsController < Api::BaseController
method index (line 9) | def index
method relationships (line 19) | def relationships
method account_ids (line 23) | def account_ids
FILE: app/controllers/api/v1/accounts/search_controller.rb
class Api::V1::Accounts::SearchController (line 3) | class Api::V1::Accounts::SearchController < Api::BaseController
method show (line 9) | def show
method account_search (line 16) | def account_search
FILE: app/controllers/api/v1/accounts/statuses_controller.rb
class Api::V1::Accounts::StatusesController (line 3) | class Api::V1::Accounts::StatusesController < Api::BaseController
method index (line 10) | def index
method set_account (line 17) | def set_account
method load_statuses (line 21) | def load_statuses
method cached_account_statuses (line 25) | def cached_account_statuses
method account_statuses (line 29) | def account_statuses
method permitted_account_statuses (line 41) | def permitted_account_statuses
method only_media_scope (line 45) | def only_media_scope
method account_media_status_ids (line 49) | def account_media_status_ids
method pinned_scope (line 59) | def pinned_scope
method no_replies_scope (line 63) | def no_replies_scope
method no_reblogs_scope (line 67) | def no_reblogs_scope
method hashtag_scope (line 71) | def hashtag_scope
method pagination_params (line 81) | def pagination_params(core_params)
method insert_pagination_headers (line 85) | def insert_pagination_headers
method next_path (line 89) | def next_path
method prev_path (line 95) | def prev_path
method records_continue? (line 101) | def records_continue?
method pagination_max_id (line 105) | def pagination_max_id
method pagination_since_id (line 109) | def pagination_since_id
FILE: app/controllers/api/v1/accounts_controller.rb
class Api::V1::AccountsController (line 3) | class Api::V1::AccountsController < Api::BaseController
method show (line 17) | def show
method create (line 21) | def create
method follow (line 31) | def follow
method block (line 39) | def block
method mute (line 44) | def mute
method unfollow (line 49) | def unfollow
method unblock (line 54) | def unblock
method unmute (line 59) | def unmute
method set_account (line 66) | def set_account
method relationships (line 70) | def relationships(**options)
method check_account_suspension (line 74) | def check_account_suspension
method account_params (line 78) | def account_params
method check_enabled_registrations (line 82) | def check_enabled_registrations
method allowed_registrations? (line 86) | def allowed_registrations?
FILE: app/controllers/api/v1/apps/credentials_controller.rb
class Api::V1::Apps::CredentialsController (line 3) | class Api::V1::Apps::CredentialsController < Api::BaseController
method show (line 8) | def show
FILE: app/controllers/api/v1/apps_controller.rb
class Api::V1::AppsController (line 3) | class Api::V1::AppsController < Api::BaseController
method create (line 4) | def create
method application_options (line 11) | def application_options
method app_scopes_or_default (line 20) | def app_scopes_or_default
method app_params (line 24) | def app_params
FILE: app/controllers/api/v1/blocks_controller.rb
class Api::V1::BlocksController (line 3) | class Api::V1::BlocksController < Api::BaseController
method index (line 10) | def index
method load_accounts (line 17) | def load_accounts
method paginated_blocks (line 21) | def paginated_blocks
method insert_pagination_headers (line 31) | def insert_pagination_headers
method next_path (line 35) | def next_path
method prev_path (line 41) | def prev_path
method pagination_max_id (line 47) | def pagination_max_id
method pagination_since_id (line 51) | def pagination_since_id
method records_continue? (line 55) | def records_continue?
method pagination_params (line 59) | def pagination_params(core_params)
FILE: app/controllers/api/v1/conversations_controller.rb
class Api::V1::ConversationsController (line 3) | class Api::V1::ConversationsController < Api::BaseController
method index (line 14) | def index
method read (line 19) | def read
method destroy (line 24) | def destroy
method set_conversation (line 31) | def set_conversation
method paginated_conversations (line 35) | def paginated_conversations
method insert_pagination_headers (line 40) | def insert_pagination_headers
method next_path (line 44) | def next_path
method prev_path (line 50) | def prev_path
method pagination_max_id (line 56) | def pagination_max_id
method pagination_since_id (line 60) | def pagination_since_id
method records_continue? (line 64) | def records_continue?
method pagination_params (line 68) | def pagination_params(core_params)
FILE: app/controllers/api/v1/custom_emojis_controller.rb
class Api::V1::CustomEmojisController (line 3) | class Api::V1::CustomEmojisController < Api::BaseController
method index (line 8) | def index
FILE: app/controllers/api/v1/domain_blocks_controller.rb
class Api::V1::DomainBlocksController (line 3) | class Api::V1::DomainBlocksController < Api::BaseController
method show (line 13) | def show
method create (line 18) | def create
method destroy (line 24) | def destroy
method load_domain_blocks (line 31) | def load_domain_blocks
method account_domain_blocks (line 39) | def account_domain_blocks
method insert_pagination_headers (line 43) | def insert_pagination_headers
method next_path (line 47) | def next_path
method prev_path (line 53) | def prev_path
method pagination_max_id (line 59) | def pagination_max_id
method pagination_since_id (line 63) | def pagination_since_id
method records_continue? (line 67) | def records_continue?
method pagination_params (line 71) | def pagination_params(core_params)
method domain_block_params (line 75) | def domain_block_params
FILE: app/controllers/api/v1/endorsements_controller.rb
class Api::V1::EndorsementsController (line 3) | class Api::V1::EndorsementsController < Api::BaseController
method index (line 10) | def index
method load_accounts (line 17) | def load_accounts
method endorsed_accounts (line 29) | def endorsed_accounts
method insert_pagination_headers (line 33) | def insert_pagination_headers
method next_path (line 37) | def next_path
method prev_path (line 45) | def prev_path
method pagination_max_id (line 53) | def pagination_max_id
method pagination_since_id (line 57) | def pagination_since_id
method records_continue? (line 61) | def records_continue?
method pagination_params (line 65) | def pagination_params(core_params)
method unlimited? (line 69) | def unlimited?
FILE: app/controllers/api/v1/favourites_controller.rb
class Api::V1::FavouritesController (line 3) | class Api::V1::FavouritesController < Api::BaseController
method index (line 10) | def index
method load_statuses (line 17) | def load_statuses
method cached_favourites (line 21) | def cached_favourites
method results (line 28) | def results
method account_favourites (line 35) | def account_favourites
method insert_pagination_headers (line 39) | def insert_pagination_headers
method next_path (line 43) | def next_path
method prev_path (line 49) | def prev_path
method pagination_max_id (line 55) | def pagination_max_id
method pagination_since_id (line 59) | def pagination_since_id
method records_continue? (line 63) | def records_continue?
method pagination_params (line 67) | def pagination_params(core_params)
FILE: app/controllers/api/v1/filters_controller.rb
class Api::V1::FiltersController (line 3) | class Api::V1::FiltersController < Api::BaseController
method index (line 12) | def index
method create (line 16) | def create
method show (line 21) | def show
method update (line 25) | def update
method destroy (line 30) | def destroy
method set_filters (line 37) | def set_filters
method set_filter (line 41) | def set_filter
method resource_params (line 45) | def resource_params
FILE: app/controllers/api/v1/follow_requests_controller.rb
class Api::V1::FollowRequestsController (line 3) | class Api::V1::FollowRequestsController < Api::BaseController
method index (line 9) | def index
method authorize (line 14) | def authorize
method reject (line 20) | def reject
method account (line 27) | def account
method load_accounts (line 31) | def load_accounts
method default_accounts (line 35) | def default_accounts
method paginated_follow_requests (line 39) | def paginated_follow_requests
method insert_pagination_headers (line 47) | def insert_pagination_headers
method next_path (line 51) | def next_path
method prev_path (line 57) | def prev_path
method pagination_max_id (line 63) | def pagination_max_id
method pagination_since_id (line 67) | def pagination_since_id
method records_continue? (line 71) | def records_continue?
method pagination_params (line 75) | def pagination_params(core_params)
FILE: app/controllers/api/v1/follows_controller.rb
class Api::V1::FollowsController (line 3) | class Api::V1::FollowsController < Api::BaseController
method create (line 9) | def create
method target_uri (line 24) | def target_uri
method follow_params (line 28) | def follow_params
FILE: app/controllers/api/v1/instances/activity_controller.rb
class Api::V1::Instances::ActivityController (line 3) | class Api::V1::Instances::ActivityController < Api::BaseController
method show (line 9) | def show
method activity (line 15) | def activity
method require_enabled_api! (line 34) | def require_enabled_api!
FILE: app/controllers/api/v1/instances/peers_controller.rb
class Api::V1::Instances::PeersController (line 3) | class Api::V1::Instances::PeersController < Api::BaseController
method index (line 9) | def index
method require_enabled_api! (line 15) | def require_enabled_api!
FILE: app/controllers/api/v1/instances_controller.rb
class Api::V1::InstancesController (line 3) | class Api::V1::InstancesController < Api::BaseController
method show (line 7) | def show
FILE: app/controllers/api/v1/lists/accounts_controller.rb
class Api::V1::Lists::AccountsController (line 3) | class Api::V1::Lists::AccountsController < Api::BaseController
method show (line 12) | def show
method create (line 17) | def create
method destroy (line 27) | def destroy
method set_list (line 34) | def set_list
method load_accounts (line 38) | def load_accounts
method list_accounts (line 46) | def list_accounts
method account_ids (line 50) | def account_ids
method resource_params (line 54) | def resource_params
method insert_pagination_headers (line 58) | def insert_pagination_headers
method next_path (line 62) | def next_path
method prev_path (line 70) | def prev_path
method pagination_max_id (line 78) | def pagination_max_id
method pagination_since_id (line 82) | def pagination_since_id
method records_continue? (line 86) | def records_continue?
method pagination_params (line 90) | def pagination_params(core_params)
method unlimited? (line 94) | def unlimited?
FILE: app/controllers/api/v1/lists_controller.rb
class Api::V1::ListsController (line 3) | class Api::V1::ListsController < Api::BaseController
method index (line 10) | def index
method show (line 15) | def show
method create (line 19) | def create
method update (line 24) | def update
method destroy (line 29) | def destroy
method set_list (line 36) | def set_list
method list_params (line 40) | def list_params
FILE: app/controllers/api/v1/media_controller.rb
class Api::V1::MediaController (line 3) | class Api::V1::MediaController < Api::BaseController
method create (line 12) | def create
method update (line 21) | def update
method media_params (line 29) | def media_params
method file_type_error (line 33) | def file_type_error
method processing_error (line 37) | def processing_error
FILE: app/controllers/api/v1/mutes_controller.rb
class Api::V1::MutesController (line 3) | class Api::V1::MutesController < Api::BaseController
method index (line 10) | def index
method load_accounts (line 17) | def load_accounts
method paginated_mutes (line 21) | def paginated_mutes
method insert_pagination_headers (line 31) | def insert_pagination_headers
method next_path (line 35) | def next_path
method prev_path (line 41) | def prev_path
method pagination_max_id (line 47) | def pagination_max_id
method pagination_since_id (line 51) | def pagination_since_id
method records_continue? (line 55) | def records_continue?
method pagination_params (line 59) | def pagination_params(core_params)
FILE: app/controllers/api/v1/notifications_controller.rb
class Api::V1::NotificationsController (line 3) | class Api::V1::NotificationsController < Api::BaseController
method index (line 13) | def index
method show (line 18) | def show
method clear (line 23) | def clear
method dismiss (line 28) | def dismiss
method load_notifications (line 35) | def load_notifications
method paginated_notifications (line 39) | def paginated_notifications
method browserable_account_notifications (line 46) | def browserable_account_notifications
method target_statuses_from_notifications (line 50) | def target_statuses_from_notifications
method insert_pagination_headers (line 54) | def insert_pagination_headers
method next_path (line 58) | def next_path
method prev_path (line 64) | def prev_path
method pagination_max_id (line 70) | def pagination_max_id
method pagination_since_id (line 74) | def pagination_since_id
method exclude_types (line 78) | def exclude_types
method from_account (line 84) | def from_account
method pagination_params (line 88) | def pagination_params(core_params)
FILE: app/controllers/api/v1/polls/votes_controller.rb
class Api::V1::Polls::VotesController (line 3) | class Api::V1::Polls::VotesController < Api::BaseController
method create (line 12) | def create
method set_poll (line 19) | def set_poll
method vote_params (line 26) | def vote_params
FILE: app/controllers/api/v1/polls_controller.rb
class Api::V1::PollsController (line 3) | class Api::V1::PollsController < Api::BaseController
method show (line 12) | def show
method set_poll (line 18) | def set_poll
method refresh_poll (line 25) | def refresh_poll
FILE: app/controllers/api/v1/preferences_controller.rb
class Api::V1::PreferencesController (line 3) | class Api::V1::PreferencesController < Api::BaseController
method index (line 9) | def index
FILE: app/controllers/api/v1/push/subscriptions_controller.rb
class Api::V1::Push::SubscriptionsController (line 3) | class Api::V1::Push::SubscriptionsController < Api::BaseController
method create (line 8) | def create
method show (line 23) | def show
method update (line 29) | def update
method destroy (line 37) | def destroy
method set_web_push_subscription (line 44) | def set_web_push_subscription
method subscription_params (line 48) | def subscription_params
method data_params (line 52) | def data_params
FILE: app/controllers/api/v1/reports_controller.rb
class Api::V1::ReportsController (line 3) | class Api::V1::ReportsController < Api::BaseController
method create (line 9) | def create
method reported_status_ids (line 23) | def reported_status_ids
method status_ids (line 27) | def status_ids
method reported_account (line 31) | def reported_account
method report_params (line 35) | def report_params
FILE: app/controllers/api/v1/scheduled_statuses_controller.rb
class Api::V1::ScheduledStatusesController (line 3) | class Api::V1::ScheduledStatusesController < Api::BaseController
method index (line 14) | def index
method show (line 18) | def show
method update (line 22) | def update
method destroy (line 27) | def destroy
method set_statuses (line 34) | def set_statuses
method set_status (line 38) | def set_status
method scheduled_status_params (line 42) | def scheduled_status_params
method pagination_params (line 46) | def pagination_params(core_params)
method insert_pagination_headers (line 50) | def insert_pagination_headers
method next_path (line 54) | def next_path
method prev_path (line 60) | def prev_path
method records_continue? (line 66) | def records_continue?
method pagination_max_id (line 70) | def pagination_max_id
method pagination_since_id (line 74) | def pagination_since_id
FILE: app/controllers/api/v1/search_controller.rb
class Api::V1::SearchController (line 3) | class Api::V1::SearchController < Api::BaseController
method index (line 13) | def index
method search_results (line 20) | def search_results
method search_params (line 29) | def search_params
FILE: app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb
class Api::V1::Statuses::FavouritedByAccountsController (line 3) | class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseContr...
method index (line 12) | def index
method load_accounts (line 19) | def load_accounts
method default_accounts (line 23) | def default_accounts
method paginated_favourites (line 30) | def paginated_favourites
method insert_pagination_headers (line 38) | def insert_pagination_headers
method next_path (line 42) | def next_path
method prev_path (line 48) | def prev_path
method pagination_max_id (line 54) | def pagination_max_id
method pagination_since_id (line 58) | def pagination_since_id
method records_continue? (line 62) | def records_continue?
method set_status (line 66) | def set_status
method pagination_params (line 74) | def pagination_params(core_params)
FILE: app/controllers/api/v1/statuses/favourites_controller.rb
class Api::V1::Statuses::FavouritesController (line 3) | class Api::V1::Statuses::FavouritesController < Api::BaseController
method create (line 11) | def create
method destroy (line 16) | def destroy
method favourited_status (line 27) | def favourited_status
method service_result (line 31) | def service_result
method requested_status (line 35) | def requested_status
FILE: app/controllers/api/v1/statuses/mutes_controller.rb
class Api::V1::Statuses::MutesController (line 3) | class Api::V1::Statuses::MutesController < Api::BaseController
method create (line 13) | def create
method destroy (line 20) | def destroy
method set_status (line 29) | def set_status
method set_conversation (line 37) | def set_conversation
FILE: app/controllers/api/v1/statuses/pins_controller.rb
class Api::V1::Statuses::PinsController (line 3) | class Api::V1::Statuses::PinsController < Api::BaseController
method create (line 12) | def create
method destroy (line 18) | def destroy
method set_status (line 31) | def set_status
method distribute_add_activity! (line 35) | def distribute_add_activity!
method distribute_remove_activity! (line 45) | def distribute_remove_activity!
FILE: app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb
class Api::V1::Statuses::RebloggedByAccountsController (line 3) | class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseContro...
method index (line 12) | def index
method load_accounts (line 19) | def load_accounts
method default_accounts (line 23) | def default_accounts
method paginated_statuses (line 27) | def paginated_statuses
method insert_pagination_headers (line 35) | def insert_pagination_headers
method next_path (line 39) | def next_path
method prev_path (line 45) | def prev_path
method pagination_max_id (line 51) | def pagination_max_id
method pagination_since_id (line 55) | def pagination_since_id
method records_continue? (line 59) | def records_continue?
method set_status (line 63) | def set_status
method pagination_params (line 71) | def pagination_params(core_params)
FILE: app/controllers/api/v1/statuses/reblogs_controller.rb
class Api::V1::Statuses::ReblogsController (line 3) | class Api::V1::Statuses::ReblogsController < Api::BaseController
method create (line 11) | def create
method destroy (line 16) | def destroy
method status_for_reblog (line 28) | def status_for_reblog
method status_for_destroy (line 32) | def status_for_destroy
method reblog_params (line 36) | def reblog_params
FILE: app/controllers/api/v1/statuses_controller.rb
class Api::V1::StatusesController (line 3) | class Api::V1::StatusesController < Api::BaseController
method show (line 19) | def show
method context (line 24) | def context
method card (line 36) | def card
method create (line 46) | def create
method destroy (line 62) | def destroy
method set_status (line 73) | def set_status
method status_params (line 80) | def status_params
method pagination_params (line 98) | def pagination_params(core_params)
FILE: app/controllers/api/v1/streaming_controller.rb
class Api::V1::StreamingController (line 3) | class Api::V1::StreamingController < Api::BaseController
method index (line 6) | def index
FILE: app/controllers/api/v1/suggestions_controller.rb
class Api::V1::SuggestionsController (line 3) | class Api::V1::SuggestionsController < Api::BaseController
method index (line 12) | def index
method destroy (line 16) | def destroy
method set_accounts (line 23) | def set_accounts
FILE: app/controllers/api/v1/timelines/direct_controller.rb
class Api::V1::Timelines::DirectController (line 3) | class Api::V1::Timelines::DirectController < Api::BaseController
method show (line 10) | def show
method load_statuses (line 17) | def load_statuses
method cached_direct_statuses (line 21) | def cached_direct_statuses
method direct_statuses (line 25) | def direct_statuses
method direct_timeline_statuses (line 29) | def direct_timeline_statuses
method insert_pagination_headers (line 40) | def insert_pagination_headers
method pagination_params (line 44) | def pagination_params(core_params)
method next_path (line 48) | def next_path
method prev_path (line 52) | def prev_path
method pagination_max_id (line 56) | def pagination_max_id
method pagination_since_id (line 60) | def pagination_since_id
FILE: app/controllers/api/v1/timelines/home_controller.rb
class Api::V1::Timelines::HomeController (line 3) | class Api::V1::Timelines::HomeController < Api::BaseController
method show (line 10) | def show
method load_statuses (line 21) | def load_statuses
method cached_home_statuses (line 25) | def cached_home_statuses
method home_statuses (line 29) | def home_statuses
method account_home_feed (line 38) | def account_home_feed
method insert_pagination_headers (line 42) | def insert_pagination_headers
method pagination_params (line 46) | def pagination_params(core_params)
method next_path (line 50) | def next_path
method prev_path (line 54) | def prev_path
method pagination_max_id (line 58) | def pagination_max_id
method pagination_since_id (line 62) | def pagination_since_id
method regeneration_in_progress? (line 66) | def regeneration_in_progress?
FILE: app/controllers/api/v1/timelines/list_controller.rb
class Api::V1::Timelines::ListController (line 3) | class Api::V1::Timelines::ListController < Api::BaseController
method show (line 11) | def show
method set_list (line 19) | def set_list
method set_statuses (line 23) | def set_statuses
method cached_list_statuses (line 27) | def cached_list_statuses
method list_statuses (line 31) | def list_statuses
method list_feed (line 40) | def list_feed
method insert_pagination_headers (line 44) | def insert_pagination_headers
method pagination_params (line 48) | def pagination_params(core_params)
method next_path (line 52) | def next_path
method prev_path (line 56) | def prev_path
method pagination_max_id (line 60) | def pagination_max_id
method pagination_since_id (line 64) | def pagination_since_id
FILE: app/controllers/api/v1/timelines/public_controller.rb
class Api::V1::Timelines::PublicController (line 3) | class Api::V1::Timelines::PublicController < Api::BaseController
method show (line 8) | def show
method load_statuses (line 15) | def load_statuses
method cached_public_statuses (line 19) | def cached_public_statuses
method public_statuses (line 23) | def public_statuses
method public_timeline_statuses (line 38) | def public_timeline_statuses
method insert_pagination_headers (line 42) | def insert_pagination_headers
method pagination_params (line 46) | def pagination_params(core_params)
method next_path (line 50) | def next_path
method prev_path (line 54) | def prev_path
method pagination_max_id (line 58) | def pagination_max_id
method pagination_since_id (line 62) | def pagination_since_id
FILE: app/controllers/api/v1/timelines/tag_controller.rb
class Api::V1::Timelines::TagController (line 3) | class Api::V1::Timelines::TagController < Api::BaseController
method show (line 9) | def show
method load_tag (line 16) | def load_tag
method load_statuses (line 20) | def load_statuses
method cached_tagged_statuses (line 24) | def cached_tagged_statuses
method tagged_statuses (line 28) | def tagged_statuses
method tag_timeline_statuses (line 47) | def tag_timeline_statuses
method insert_pagination_headers (line 51) | def insert_pagination_headers
method pagination_params (line 55) | def pagination_params(core_params)
method next_path (line 59) | def next_path
method prev_path (line 63) | def prev_path
method pagination_max_id (line 67) | def pagination_max_id
method pagination_since_id (line 71) | def pagination_since_id
FILE: app/controllers/api/v2/search_controller.rb
class Api::V2::SearchController (line 3) | class Api::V2::SearchController < Api::V1::SearchController
method index (line 4) | def index
FILE: app/controllers/api/web/base_controller.rb
class Api::Web::BaseController (line 3) | class Api::Web::BaseController < Api::BaseController
FILE: app/controllers/api/web/embeds_controller.rb
class Api::Web::EmbedsController (line 3) | class Api::Web::EmbedsController < Api::Web::BaseController
method create (line 8) | def create
FILE: app/controllers/api/web/push_subscriptions_controller.rb
class Api::Web::PushSubscriptionsController (line 3) | class Api::Web::PushSubscriptionsController < Api::Web::BaseController
method create (line 8) | def create
method update (line 45) | def update
method subscription_params (line 56) | def subscription_params
method data_params (line 60) | def data_params
FILE: app/controllers/api/web/settings_controller.rb
class Api::Web::SettingsController (line 3) | class Api::Web::SettingsController < Api::Web::BaseController
method update (line 8) | def update
method setting (line 17) | def setting
FILE: app/controllers/application_controller.rb
class ApplicationController (line 3) | class ApplicationController < ActionController::Base
method raise_not_found (line 29) | def raise_not_found
method https_enabled? (line 35) | def https_enabled?
method store_current_location (line 39) | def store_current_location
method require_admin! (line 43) | def require_admin!
method require_staff! (line 47) | def require_staff!
method check_user_permissions (line 51) | def check_user_permissions
method after_sign_out_path_for (line 55) | def after_sign_out_path_for(_resource_or_scope)
method truthy_param? (line 61) | def truthy_param?(key)
method forbidden (line 65) | def forbidden
method not_found (line 69) | def not_found
method gone (line 73) | def gone
method unprocessable_entity (line 77) | def unprocessable_entity
method not_acceptable (line 81) | def not_acceptable
method single_user_mode? (line 85) | def single_user_mode?
method use_seamless_external_login? (line 89) | def use_seamless_external_login?
method current_account (line 93) | def current_account
method current_session (line 97) | def current_session
method current_theme (line 101) | def current_theme
method cache_collection (line 106) | def cache_collection(raw, klass)
method respond_with_error (line 126) | def respond_with_error(code)
method render_cached_json (line 137) | def render_cached_json(cache_key, **options)
method set_cache_headers (line 150) | def set_cache_headers
method mark_cacheable! (line 154) | def mark_cacheable!
FILE: app/controllers/auth/confirmations_controller.rb
class Auth::ConfirmationsController (line 3) | class Auth::ConfirmationsController < Devise::ConfirmationsController
method finish_signup (line 9) | def finish_signup
method set_user (line 23) | def set_user
method set_body_classes (line 27) | def set_body_classes
method user_params (line 31) | def user_params
method after_confirmation_path_for (line 35) | def after_confirmation_path_for(_resource_name, user)
FILE: app/controllers/auth/omniauth_callbacks_controller.rb
class Auth::OmniauthCallbacksController (line 3) | class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksContr...
method provides_callback_for (line 6) | def self.provides_callback_for(provider)
method after_sign_in_path_for (line 26) | def after_sign_in_path_for(resource)
FILE: app/controllers/auth/passwords_controller.rb
class Auth::PasswordsController (line 3) | class Auth::PasswordsController < Devise::PasswordsController
method check_validity_of_reset_password_token (line 11) | def check_validity_of_reset_password_token
method set_body_classes (line 18) | def set_body_classes
method reset_password_token_is_valid? (line 22) | def reset_password_token_is_valid?
FILE: app/controllers/auth/registrations_controller.rb
class Auth::RegistrationsController (line 3) | class Auth::RegistrationsController < Devise::RegistrationsController
method new (line 13) | def new
method destroy (line 17) | def destroy
method update_resource (line 23) | def update_resource(resource, params)
method build_resource (line 28) | def build_resource(hash = nil)
method configure_sign_up_params (line 39) | def configure_sign_up_params
method after_sign_up_path_for (line 45) | def after_sign_up_path_for(_resource)
method after_sign_in_path_for (line 49) | def after_sign_in_path_for(_resource)
method after_inactive_sign_up_path_for (line 59) | def after_inactive_sign_up_path_for(_resource)
method after_update_path_for (line 63) | def after_update_path_for(_resource)
method check_enabled_registrations (line 67) | def check_enabled_registrations
method allowed_registrations? (line 71) | def allowed_registrations?
method invite_code (line 75) | def invite_code
method set_instance_presenter (line 85) | def set_instance_presenter
method set_body_classes (line 89) | def set_body_classes
method set_invite (line 93) | def set_invite
method determine_layout (line 98) | def determine_layout
method set_sessions (line 102) | def set_sessions
FILE: app/controllers/auth/sessions_controller.rb
class Auth::SessionsController (line 3) | class Auth::SessionsController < Devise::SessionsController
method new (line 14) | def new
method create (line 22) | def create
method destroy (line 29) | def destroy
method find_user (line 38) | def find_user
method user_params (line 50) | def user_params
method after_sign_in_path_for (line 54) | def after_sign_in_path_for(resource)
method after_sign_out_path_for (line 64) | def after_sign_out_path_for(_resource_or_scope)
method two_factor_enabled? (line 72) | def two_factor_enabled?
method valid_otp_attempt? (line 76) | def valid_otp_attempt?(user)
method authenticate_with_two_factor (line 83) | def authenticate_with_two_factor
method authenticate_with_two_factor_via_otp (line 93) | def authenticate_with_two_factor_via_otp(user)
method prompt_for_two_factor (line 104) | def prompt_for_two_factor(user)
method set_instance_presenter (line 111) | def set_instance_presenter
method set_body_classes (line 115) | def set_body_classes
method home_paths (line 119) | def home_paths(resource)
method continue_after? (line 127) | def continue_after?
FILE: app/controllers/authorize_interactions_controller.rb
class AuthorizeInteractionsController (line 3) | class AuthorizeInteractionsController < ApplicationController
method show (line 12) | def show
method create (line 22) | def create
method set_resource (line 34) | def set_resource
method located_resource (line 39) | def located_resource
method account_from_remote_follow (line 47) | def account_from_remote_follow
method uri_param_is_url? (line 51) | def uri_param_is_url?
method parsed_uri (line 55) | def parsed_uri
method uri_param (line 59) | def uri_param
method set_body_classes (line 63) | def set_body_classes
FILE: app/controllers/concerns/account_controller_concern.rb
type AccountControllerConcern (line 3) | module AccountControllerConcern
function set_account (line 20) | def set_account
function set_instance_presenter (line 24) | def set_instance_presenter
function set_link_headers (line 28) | def set_link_headers
function username_param (line 38) | def username_param
function webfinger_account_link (line 42) | def webfinger_account_link
function atom_account_url_link (line 49) | def atom_account_url_link
function actor_url_link (line 56) | def actor_url_link
function webfinger_account_url (line 63) | def webfinger_account_url
function check_account_approval (line 67) | def check_account_approval
function check_account_suspension (line 71) | def check_account_suspension
FILE: app/controllers/concerns/accountable_concern.rb
type AccountableConcern (line 3) | module AccountableConcern
function log_action (line 6) | def log_action(action, target)
FILE: app/controllers/concerns/authorization.rb
type Authorization (line 3) | module Authorization
function pundit_user (line 8) | def pundit_user
function authorize (line 12) | def authorize(*)
function authorize_with (line 18) | def authorize_with(user, record, query)
FILE: app/controllers/concerns/export_controller_concern.rb
type ExportControllerConcern (line 3) | module ExportControllerConcern
function load_export (line 13) | def load_export
function send_export_file (line 17) | def send_export_file
function export_data (line 23) | def export_data
function export_filename (line 27) | def export_filename
FILE: app/controllers/concerns/localized.rb
type Localized (line 3) | module Localized
function set_locale (line 12) | def set_locale
function default_locale (line 19) | def default_locale
function request_locale (line 27) | def request_locale
function preferred_locale (line 31) | def preferred_locale
function compatible_locale (line 35) | def compatible_locale
function available_locales (line 39) | def available_locales
FILE: app/controllers/concerns/obfuscate_filename.rb
type ObfuscateFilename (line 3) | module ObfuscateFilename
function obfuscate_filename (line 7) | def obfuscate_filename(path)
FILE: app/controllers/concerns/rate_limit_headers.rb
type RateLimitHeaders (line 3) | module RateLimitHeaders
function set_rate_limit_headers (line 12) | def set_rate_limit_headers
function rate_limited_request? (line 18) | def rate_limited_request?
function apply_header_limit (line 22) | def apply_header_limit
function rate_limit_limit (line 26) | def rate_limit_limit
function apply_header_remaining (line 30) | def apply_header_remaining
function rate_limit_remaining (line 34) | def rate_limit_remaining
function apply_header_reset (line 38) | def apply_header_reset
function rate_limit_reset (line 42) | def rate_limit_reset
function api_throttle_data (line 46) | def api_throttle_data
function request_time (line 51) | def request_time
function reset_period_offset (line 55) | def reset_period_offset
FILE: app/controllers/concerns/session_tracking_concern.rb
type SessionTrackingConcern (line 3) | module SessionTrackingConcern
function set_session_activity (line 14) | def set_session_activity
function session_needs_update? (line 19) | def session_needs_update?
FILE: app/controllers/concerns/signature_authentication.rb
type SignatureAuthentication (line 3) | module SignatureAuthentication
function current_account (line 8) | def current_account
FILE: app/controllers/concerns/signature_verification.rb
type SignatureVerification (line 5) | module SignatureVerification
function signed_request? (line 8) | def signed_request?
function signature_verification_failure_reason (line 12) | def signature_verification_failure_reason
function signed_request_account (line 16) | def signed_request_account
function request_body (line 73) | def request_body
function verify_signature (line 79) | def verify_signature(account, signature, compare_signed_string)
function build_signed_string (line 88) | def build_signed_string(signed_headers)
function matches_time_window? (line 102) | def matches_time_window?
function body_digest (line 112) | def body_digest
function to_header_name (line 116) | def to_header_name(name)
function incompatible_signature? (line 120) | def incompatible_signature?(signature_params)
function account_from_key_id (line 125) | def account_from_key_id(key_id)
function stoplight_wrap_request (line 135) | def stoplight_wrap_request(&block)
function account_refresh_key (line 144) | def account_refresh_key(account)
FILE: app/controllers/concerns/user_tracking_concern.rb
type UserTrackingConcern (line 3) | module UserTrackingConcern
function set_user_activity (line 14) | def set_user_activity
function user_needs_sign_in_update? (line 19) | def user_needs_sign_in_update?
FILE: app/controllers/custom_css_controller.rb
class CustomCssController (line 3) | class CustomCssController < ApplicationController
method show (line 8) | def show
FILE: app/controllers/directories_controller.rb
class DirectoriesController (line 3) | class DirectoriesController < ApplicationController
method index (line 12) | def index
method show (line 16) | def show
method check_enabled (line 22) | def check_enabled
method set_tag (line 26) | def set_tag
method set_tags (line 30) | def set_tags
method set_accounts (line 34) | def set_accounts
method set_instance_presenter (line 40) | def set_instance_presenter
FILE: app/controllers/emojis_controller.rb
class EmojisController (line 3) | class EmojisController < ApplicationController
method show (line 7) | def show
method set_emoji (line 19) | def set_emoji
FILE: app/controllers/filters_controller.rb
class FiltersController (line 3) | class FiltersController < ApplicationController
method index (line 12) | def index
method new (line 16) | def new
method create (line 20) | def create
method edit (line 30) | def edit; end
method update (line 32) | def update
method destroy (line 40) | def destroy
method set_filters (line 47) | def set_filters
method set_filter (line 51) | def set_filter
method resource_params (line 55) | def resource_params
method set_body_classes (line 59) | def set_body_classes
FILE: app/controllers/follower_accounts_controller.rb
class FollowerAccountsController (line 3) | class FollowerAccountsController < ApplicationController
method index (line 8) | def index
method follows (line 34) | def follows
method page_url (line 38) | def page_url(page)
method collection_presenter (line 42) | def collection_presenter
FILE: app/controllers/following_accounts_controller.rb
class FollowingAccountsController (line 3) | class FollowingAccountsController < ApplicationController
method index (line 8) | def index
method follows (line 34) | def follows
method page_url (line 38) | def page_url(page)
method collection_presenter (line 42) | def collection_presenter
FILE: app/controllers/home_controller.rb
class HomeController (line 3) | class HomeController < ApplicationController
method index (line 8) | def index
method authenticate_user! (line 14) | def authenticate_user!
method set_initial_state_json (line 42) | def set_initial_state_json
method initial_state_params (line 47) | def initial_state_params
method default_redirect_path (line 57) | def default_redirect_path
method set_referrer_policy_header (line 67) | def set_referrer_policy_header
FILE: app/controllers/intents_controller.rb
class IntentsController (line 3) | class IntentsController < ApplicationController
method show (line 7) | def show
method check_uri (line 22) | def check_uri
method handle_invalid_uri (line 26) | def handle_invalid_uri
method uri (line 30) | def uri
FILE: app/controllers/invites_controller.rb
class InvitesController (line 3) | class InvitesController < ApplicationController
method index (line 11) | def index
method create (line 18) | def create
method destroy (line 32) | def destroy
method invites (line 41) | def invites
method resource_params (line 45) | def resource_params
method set_body_classes (line 49) | def set_body_classes
FILE: app/controllers/manifests_controller.rb
class ManifestsController (line 3) | class ManifestsController < ApplicationController
method show (line 6) | def show
FILE: app/controllers/media_controller.rb
class MediaController (line 3) | class MediaController < ApplicationController
method show (line 15) | def show
method player (line 19) | def player
method set_media_attachment (line 27) | def set_media_attachment
method verify_permitted_status! (line 31) | def verify_permitted_status!
FILE: app/controllers/media_proxy_controller.rb
class MediaProxyController (line 3) | class MediaProxyController < ApplicationController
method show (line 8) | def show
method redownload! (line 23) | def redownload!
method version (line 29) | def version
method lock_options (line 37) | def lock_options
method reject_media? (line 41) | def reject_media?
FILE: app/controllers/oauth/authorizations_controller.rb
class Oauth::AuthorizationsController (line 3) | class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsContro...
method store_current_location (line 13) | def store_current_location
method render_success (line 17) | def render_success
method truthy_param? (line 27) | def truthy_param?(key)
FILE: app/controllers/oauth/authorized_applications_controller.rb
class Oauth::AuthorizedApplicationsController (line 3) | class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedAp...
method destroy (line 12) | def destroy
method set_body_classes (line 19) | def set_body_classes
method store_current_location (line 23) | def store_current_location
FILE: app/controllers/oauth/tokens_controller.rb
class Oauth::TokensController (line 3) | class Oauth::TokensController < Doorkeeper::TokensController
method revoke (line 4) | def revoke
method unsubscribe_for_token (line 11) | def unsubscribe_for_token
FILE: app/controllers/public_timelines_controller.rb
class PublicTimelinesController (line 3) | class PublicTimelinesController < ApplicationController
method show (line 10) | def show
method check_enabled (line 23) | def check_enabled
method set_body_classes (line 27) | def set_body_classes
method set_instance_presenter (line 31) | def set_instance_presenter
FILE: app/controllers/relationships_controller.rb
class RelationshipsController (line 3) | class RelationshipsController < ApplicationController
method show (line 12) | def show
method update (line 16) | def update
method set_accounts (line 27) | def set_accounts
method relationships_scope (line 31) | def relationships_scope
method mutual_relationship_scope (line 51) | def mutual_relationship_scope
method moved_account_scope (line 55) | def moved_account_scope
method primary_account_scope (line 59) | def primary_account_scope
method dormant_account_scope (line 63) | def dormant_account_scope
method by_domain_scope (line 67) | def by_domain_scope
method form_account_batch_params (line 71) | def form_account_batch_params
method following_relationship? (line 75) | def following_relationship?
method mutual_relationship? (line 79) | def mutual_relationship?
method followed_by_relationship? (line 83) | def followed_by_relationship?
method current_params (line 87) | def current_params
method action_from_button (line 91) | def action_from_button
method set_body_classes (line 101) | def set_body_classes
FILE: app/controllers/remote_follow_controller.rb
class RemoteFollowController (line 3) | class RemoteFollowController < ApplicationController
method new (line 10) | def new
method create (line 14) | def create
method resource_params (line 27) | def resource_params
method session_params (line 31) | def session_params
method set_account (line 35) | def set_account
method suspended_account? (line 39) | def suspended_account?
method set_body_classes (line 43) | def set_body_classes
FILE: app/controllers/remote_interaction_controller.rb
class RemoteInteractionController (line 3) | class RemoteInteractionController < ApplicationController
method new (line 12) | def new
method create (line 16) | def create
method resource_params (line 29) | def resource_params
method session_params (line 33) | def session_params
method set_status (line 37) | def set_status
method set_body_classes (line 45) | def set_body_classes
method set_interaction_type (line 50) | def set_interaction_type
FILE: app/controllers/remote_unfollows_controller.rb
class RemoteUnfollowsController (line 3) | class RemoteUnfollowsController < ApplicationController
method create (line 9) | def create
method unfollow_attempt (line 23) | def unfollow_attempt
method acct_without_prefix (line 28) | def acct_without_prefix
method acct_params (line 32) | def acct_params
method set_body_classes (line 36) | def set_body_classes
FILE: app/controllers/settings/applications_controller.rb
class Settings::ApplicationsController (line 3) | class Settings::ApplicationsController < Settings::BaseController
method index (line 10) | def index
method new (line 14) | def new
method show (line 21) | def show; end
method create (line 23) | def create
method update (line 33) | def update
method destroy (line 41) | def destroy
method regenerate (line 46) | def regenerate
method set_application (line 55) | def set_application
method application_params (line 59) | def application_params
method prepare_scopes (line 68) | def prepare_scopes
FILE: app/controllers/settings/base_controller.rb
class Settings::BaseController (line 3) | class Settings::BaseController < ApplicationController
method set_body_classes (line 8) | def set_body_classes
FILE: app/controllers/settings/deletes_controller.rb
class Settings::DeletesController (line 3) | class Settings::DeletesController < Settings::BaseController
method show (line 9) | def show
method destroy (line 13) | def destroy
method check_enabled_deletion (line 25) | def check_enabled_deletion
method delete_params (line 29) | def delete_params
FILE: app/controllers/settings/exports/blocked_accounts_controller.rb
type Settings (line 3) | module Settings
type Exports (line 4) | module Exports
class BlockedAccountsController (line 5) | class BlockedAccountsController < ApplicationController
method index (line 8) | def index
method export_data (line 14) | def export_data
FILE: app/controllers/settings/exports/blocked_domains_controller.rb
type Settings (line 3) | module Settings
type Exports (line 4) | module Exports
class BlockedDomainsController (line 5) | class BlockedDomainsController < ApplicationController
method index (line 8) | def index
method export_data (line 14) | def export_data
FILE: app/controllers/settings/exports/following_accounts_controller.rb
type Settings (line 3) | module Settings
type Exports (line 4) | module Exports
class FollowingAccountsController (line 5) | class FollowingAccountsController < ApplicationController
method index (line 8) | def index
method export_data (line 14) | def export_data
FILE: app/controllers/settings/exports/lists_controller.rb
type Settings (line 3) | module Settings
type Exports (line 4) | module Exports
class ListsController (line 5) | class ListsController < ApplicationController
method index (line 8) | def index
method export_data (line 14) | def export_data
FILE: app/controllers/settings/exports/muted_accounts_controller.rb
type Settings (line 3) | module Settings
type Exports (line 4) | module Exports
class MutedAccountsController (line 5) | class MutedAccountsController < ApplicationController
method index (line 8) | def index
method export_data (line 14) | def export_data
FILE: app/controllers/settings/exports_controller.rb
class Settings::ExportsController (line 3) | class Settings::ExportsController < Settings::BaseController
method show (line 10) | def show
method create (line 15) | def create
method lock_options (line 34) | def lock_options
FILE: app/controllers/settings/featured_tags_controller.rb
class Settings::FeaturedTagsController (line 3) | class Settings::FeaturedTagsController < Settings::BaseController
method index (line 11) | def index
method create (line 15) | def create
method destroy (line 29) | def destroy
method set_featured_tag (line 36) | def set_featured_tag
method set_featured_tags (line 40) | def set_featured_tags
method set_most_used_tags (line 44) | def set_most_used_tags
method featured_tag_params (line 48) | def featured_tag_params
FILE: app/controllers/settings/identity_proofs_controller.rb
class Settings::IdentityProofsController (line 3) | class Settings::IdentityProofsController < Settings::BaseController
method index (line 9) | def index
method new (line 14) | def new
method create (line 29) | def create
method check_required_params (line 44) | def check_required_params
method resource_params (line 48) | def resource_params
method publish_proof? (line 52) | def publish_proof?
method post_params (line 56) | def post_params
method set_body_classes (line 60) | def set_body_classes
FILE: app/controllers/settings/imports_controller.rb
class Settings::ImportsController (line 3) | class Settings::ImportsController < Settings::BaseController
method show (line 9) | def show
method create (line 13) | def create
method set_account (line 27) | def set_account
method import_params (line 31) | def import_params
FILE: app/controllers/settings/migrations_controller.rb
class Settings::MigrationsController (line 3) | class Settings::MigrationsController < Settings::BaseController
method show (line 8) | def show
method update (line 12) | def update
method resource_params (line 26) | def resource_params
method migration_account_changed? (line 30) | def migration_account_changed?
FILE: app/controllers/settings/preferences/appearance_controller.rb
class Settings::Preferences::AppearanceController (line 3) | class Settings::Preferences::AppearanceController < Settings::Preference...
method after_update_redirect_path (line 6) | def after_update_redirect_path
FILE: app/controllers/settings/preferences/notifications_controller.rb
class Settings::Preferences::NotificationsController (line 3) | class Settings::Preferences::NotificationsController < Settings::Prefere...
method after_update_redirect_path (line 6) | def after_update_redirect_path
FILE: app/controllers/settings/preferences/other_controller.rb
class Settings::Preferences::OtherController (line 3) | class Settings::Preferences::OtherController < Settings::PreferencesCont...
method after_update_redirect_path (line 6) | def after_update_redirect_path
FILE: app/controllers/settings/preferences_controller.rb
class Settings::PreferencesController (line 3) | class Settings::PreferencesController < Settings::BaseController
method show (line 8) | def show; end
method update (line 10) | def update
method after_update_redirect_path (line 23) | def after_update_redirect_path
method user_settings (line 27) | def user_settings
method user_params (line 31) | def user_params
method user_settings_params (line 38) | def user_settings_params
FILE: app/controllers/settings/profiles_controller.rb
class Settings::ProfilesController (line 3) | class Settings::ProfilesController < Settings::BaseController
method show (line 14) | def show
method update (line 18) | def update
method account_params (line 30) | def account_params
method set_account (line 34) | def set_account
FILE: app/controllers/settings/sessions_controller.rb
class Settings::SessionsController (line 3) | class Settings::SessionsController < Settings::BaseController
method destroy (line 7) | def destroy
method set_session (line 15) | def set_session
FILE: app/controllers/settings/two_factor_authentication/confirmations_controller.rb
type Settings (line 3) | module Settings
type TwoFactorAuthentication (line 4) | module TwoFactorAuthentication
class ConfirmationsController (line 5) | class ConfirmationsController < BaseController
method new (line 11) | def new
method create (line 15) | def create
method confirmation_params (line 33) | def confirmation_params
method prepare_two_factor_form (line 37) | def prepare_two_factor_form
method ensure_otp_secret (line 43) | def ensure_otp_secret
FILE: app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb
type Settings (line 3) | module Settings
type TwoFactorAuthentication (line 4) | module TwoFactorAuthentication
class RecoveryCodesController (line 5) | class RecoveryCodesController < BaseController
method create (line 10) | def create
FILE: app/controllers/settings/two_factor_authentications_controller.rb
type Settings (line 3) | module Settings
class TwoFactorAuthenticationsController (line 4) | class TwoFactorAuthenticationsController < BaseController
method show (line 10) | def show
method create (line 14) | def create
method destroy (line 20) | def destroy
method confirmation_params (line 34) | def confirmation_params
method verify_otp_required (line 38) | def verify_otp_required
method acceptable_code? (line 42) | def acceptable_code?
FILE: app/controllers/shares_controller.rb
class SharesController (line 3) | class SharesController < ApplicationController
method show (line 9) | def show
method initial_state_params (line 16) | def initial_state_params
method set_body_classes (line 29) | def set_body_classes
FILE: app/controllers/statuses_controller.rb
class StatusesController (line 3) | class StatusesController < ApplicationController
method show (line 27) | def show
method activity (line 48) | def activity
method embed (line 54) | def embed
method replies (line 64) | def replies
method replies_collection_presenter (line 74) | def replies_collection_presenter
method create_descendant_thread (line 93) | def create_descendant_thread(starting_depth, statuses)
method set_account (line 103) | def set_account
method set_ancestors (line 107) | def set_ancestors
method set_descendants (line 112) | def set_descendants
method set_link_headers (line 166) | def set_link_headers
method set_status (line 175) | def set_status
method set_instance_presenter (line 186) | def set_instance_presenter
method check_account_suspension (line 190) | def check_account_suspension
method redirect_to_original (line 194) | def redirect_to_original
method set_referrer_policy_header (line 198) | def set_referrer_policy_header
method page_requested? (line 203) | def page_requested?
method set_replies (line 207) | def set_replies
method next_page (line 213) | def next_page
method page_params (line 222) | def page_params
FILE: app/controllers/stream_entries_controller.rb
class StreamEntriesController (line 3) | class StreamEntriesController < ApplicationController
method show (line 15) | def show
method embed (line 31) | def embed
method set_account (line 37) | def set_account
method set_link_headers (line 41) | def set_link_headers
method set_stream_entry (line 50) | def set_stream_entry
method check_account_suspension (line 61) | def check_account_suspension
FILE: app/controllers/tags_controller.rb
class TagsController (line 3) | class TagsController < ApplicationController
method show (line 11) | def show
method set_body_classes (line 43) | def set_body_classes
method set_instance_presenter (line 47) | def set_instance_presenter
method collection_presenter (line 51) | def collection_presenter
FILE: app/controllers/well_known/host_meta_controller.rb
type WellKnown (line 3) | module WellKnown
class HostMetaController (line 4) | class HostMetaController < ActionController::Base
method show (line 9) | def show
FILE: app/controllers/well_known/keybase_proof_config_controller.rb
type WellKnown (line 3) | module WellKnown
class KeybaseProofConfigController (line 4) | class KeybaseProofConfigController < ActionController::Base
method show (line 5) | def show
FILE: app/controllers/well_known/webfinger_controller.rb
type WellKnown (line 3) | module WellKnown
class WebfingerController (line 4) | class WebfingerController < ActionController::Base
method show (line 9) | def show
method username_from_resource (line 29) | def username_from_resource
method resource_param (line 40) | def resource_param
FILE: app/helpers/admin/account_moderation_notes_helper.rb
type Admin::AccountModerationNotesHelper (line 3) | module Admin::AccountModerationNotesHelper
function admin_account_link_to (line 4) | def admin_account_link_to(account)
function admin_account_inline_link_to (line 15) | def admin_account_inline_link_to(account)
function name_tag_classes (line 25) | def name_tag_classes(account, inline = false)
FILE: app/helpers/admin/action_logs_helper.rb
type Admin::ActionLogsHelper (line 3) | module Admin::ActionLogsHelper
function log_target (line 4) | def log_target(log)
function relevant_log_changes (line 12) | def relevant_log_changes(log)
function log_extra_attributes (line 28) | def log_extra_attributes(hash)
function log_change (line 32) | def log_change(val)
function icon_for_log (line 37) | def icon_for_log(log)
function class_for_log_icon (line 56) | def class_for_log_icon(log)
function opposite_verbs? (line 75) | def opposite_verbs?(log)
function linkable_log_target (line 79) | def linkable_log_target(record)
function log_target_from_history (line 98) | def log_target_from_history(type, attributes)
FILE: app/helpers/admin/dashboard_helper.rb
type Admin::DashboardHelper (line 3) | module Admin::DashboardHelper
function feature_hint (line 4) | def feature_hint(feature, enabled)
FILE: app/helpers/admin/filter_helper.rb
type Admin::FilterHelper (line 3) | module Admin::FilterHelper
function filter_link_to (line 14) | def filter_link_to(text, link_to_params, link_class_params = link_to_p...
function table_link_to (line 20) | def table_link_to(icon, text, path, **options)
function selected? (line 24) | def selected?(more_params)
function filter_params (line 31) | def filter_params(more_params)
function filter_link_class (line 35) | def filter_link_class(new_url)
function filtered_url_for (line 39) | def filtered_url_for(url_params)
function controller_request_params (line 43) | def controller_request_params
FILE: app/helpers/application_helper.rb
type ApplicationHelper (line 3) | module ApplicationHelper
function active_nav_class (line 10) | def active_nav_class(*paths)
function active_link_to (line 14) | def active_link_to(label, path, **options)
function show_landing_strip? (line 18) | def show_landing_strip?
function open_registrations? (line 22) | def open_registrations?
function approved_registrations? (line 26) | def approved_registrations?
function closed_registrations? (line 30) | def closed_registrations?
function available_sign_up_path (line 34) | def available_sign_up_path
function max_bio_chars (line 42) | def max_bio_chars
function max_toot_chars (line 46) | def max_toot_chars
function open_deletion? (line 50) | def open_deletion?
function locale_direction (line 54) | def locale_direction
function favicon_path (line 62) | def favicon_path
function title (line 67) | def title
function class_for_scope (line 71) | def class_for_scope(scope)
function can? (line 75) | def can?(action, record)
function fa_icon (line 80) | def fa_icon(icon, attributes = {})
function custom_emoji_tag (line 88) | def custom_emoji_tag(custom_emoji)
function opengraph (line 92) | def opengraph(property, content)
function react_component (line 96) | def react_component(name, props = {}, &block)
function body_classes (line 104) | def body_classes
function cdn_host (line 113) | def cdn_host
function cdn_host? (line 117) | def cdn_host?
function storage_host (line 121) | def storage_host
function storage_host? (line 125) | def storage_host?
function quote_wrap (line 129) | def quote_wrap(text, line_width: 80, break_sequence: "\n")
FILE: app/helpers/flashes_helper.rb
type FlashesHelper (line 3) | module FlashesHelper
function user_facing_flashes (line 4) | def user_facing_flashes
FILE: app/helpers/home_helper.rb
type HomeHelper (line 3) | module HomeHelper
function default_props (line 4) | def default_props
function account_link_to (line 10) | def account_link_to(account, button = '', size: 36, path: nil)
function obscured_counter (line 42) | def obscured_counter(count)
function custom_field_classes (line 52) | def custom_field_classes(field)
function optional_link_to (line 60) | def optional_link_to(condition, path, options = {}, &block)
function sign_up_message (line 68) | def sign_up_message
FILE: app/helpers/instance_helper.rb
type InstanceHelper (line 3) | module InstanceHelper
function site_title (line 4) | def site_title
function site_hostname (line 8) | def site_hostname
FILE: app/helpers/jsonld_helper.rb
type JsonLdHelper (line 3) | module JsonLdHelper
function equals_or_includes? (line 4) | def equals_or_includes?(haystack, needle)
function equals_or_includes_any? (line 8) | def equals_or_includes_any?(haystack, needles)
function first_of_value (line 12) | def first_of_value(value)
function url_to_href (line 18) | def url_to_href(value, preferred_type = nil)
function as_array (line 34) | def as_array(value)
function value_or_id (line 38) | def value_or_id(value)
function supported_context? (line 42) | def supported_context?(json)
function unsupported_uri_scheme? (line 46) | def unsupported_uri_scheme?(uri)
function invalid_origin? (line 50) | def invalid_origin?(url)
function canonicalize (line 59) | def canonicalize(json)
function fetch_resource (line 64) | def fetch_resource(uri, id, on_behalf_of = nil)
function fetch_resource_without_id_validation (line 75) | def fetch_resource_without_id_validation(uri, on_behalf_of = nil, rais...
function body_to_json (line 92) | def body_to_json(body, compare_id: nil)
function merge_context (line 100) | def merge_context(context, new_context)
function response_successful? (line 110) | def response_successful?(response)
function response_error_unsalvageable? (line 114) | def response_error_unsalvageable?(response)
function build_request (line 118) | def build_request(uri, on_behalf_of = nil)
function load_jsonld_context (line 125) | def load_jsonld_context(url, _options = {}, &_block)
FILE: app/helpers/routing_helper.rb
type RoutingHelper (line 3) | module RoutingHelper
function default_url_options (line 10) | def default_url_options
function full_asset_url (line 15) | def full_asset_url(source, **options)
function full_pack_url (line 21) | def full_pack_url(source, **options)
function use_storage? (line 27) | def use_storage?
FILE: app/helpers/settings_helper.rb
type SettingsHelper (line 3) | module SettingsHelper
function human_locale (line 66) | def human_locale(locale)
function filterable_languages (line 70) | def filterable_languages
function hash_to_object (line 74) | def hash_to_object(hash)
function session_device_icon (line 78) | def session_device_icon(session)
FILE: app/helpers/stream_entries_helper.rb
type StreamEntriesHelper (line 3) | module StreamEntriesHelper
function display_name (line 7) | def display_name(account, **options)
function account_action_button (line 15) | def account_action_button(account)
function svg_logo (line 37) | def svg_logo
function svg_logo_full (line 41) | def svg_logo_full
function account_badge (line 45) | def account_badge(account, all: false)
function link_to_more (line 61) | def link_to_more(url)
function nothing_here (line 65) | def nothing_here(extra_classes = '')
function account_description (line 71) | def account_description(account)
function media_summary (line 92) | def media_summary(status)
function status_text_summary (line 110) | def status_text_summary(status)
function poll_summary (line 115) | def poll_summary(status)
function status_description (line 120) | def status_description(status)
function stream_link_target (line 131) | def stream_link_target
function acct (line 135) | def acct(account)
function style_classes (line 143) | def style_classes(status, is_predecessor, is_successor, include_threads)
function microformats_classes (line 152) | def microformats_classes(status, is_direct_parent, is_direct_child)
function microformats_h_class (line 160) | def microformats_h_class(status, is_predecessor, is_successor, include...
function rtl_status? (line 170) | def rtl_status?(status)
function rtl? (line 174) | def rtl?(text)
function fa_visibility_icon (line 186) | def fa_visibility_icon(status)
function simplified_text (line 201) | def simplified_text(text)
function rtl_size (line 213) | def rtl_size(words)
function embedded_view? (line 217) | def embedded_view?
FILE: app/javascript/mastodon/actions/accounts.js
constant ACCOUNT_FETCH_REQUEST (line 5) | const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST';
constant ACCOUNT_FETCH_SUCCESS (line 6) | const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS';
constant ACCOUNT_FETCH_FAIL (line 7) | const ACCOUNT_FETCH_FAIL = 'ACCOUNT_FETCH_FAIL';
constant ACCOUNT_FOLLOW_REQUEST (line 9) | const ACCOUNT_FOLLOW_REQUEST = 'ACCOUNT_FOLLOW_REQUEST';
constant ACCOUNT_FOLLOW_SUCCESS (line 10) | const ACCOUNT_FOLLOW_SUCCESS = 'ACCOUNT_FOLLOW_SUCCESS';
constant ACCOUNT_FOLLOW_FAIL (line 11) | const ACCOUNT_FOLLOW_FAIL = 'ACCOUNT_FOLLOW_FAIL';
constant ACCOUNT_UNFOLLOW_REQUEST (line 13) | const ACCOUNT_UNFOLLOW_REQUEST = 'ACCOUNT_UNFOLLOW_REQUEST';
constant ACCOUNT_UNFOLLOW_SUCCESS (line 14) | const ACCOUNT_UNFOLLOW_SUCCESS = 'ACCOUNT_UNFOLLOW_SUCCESS';
constant ACCOUNT_UNFOLLOW_FAIL (line 15) | const ACCOUNT_UNFOLLOW_FAIL = 'ACCOUNT_UNFOLLOW_FAIL';
constant ACCOUNT_BLOCK_REQUEST (line 17) | const ACCOUNT_BLOCK_REQUEST = 'ACCOUNT_BLOCK_REQUEST';
constant ACCOUNT_BLOCK_SUCCESS (line 18) | const ACCOUNT_BLOCK_SUCCESS = 'ACCOUNT_BLOCK_SUCCESS';
constant ACCOUNT_BLOCK_FAIL (line 19) | const ACCOUNT_BLOCK_FAIL = 'ACCOUNT_BLOCK_FAIL';
constant ACCOUNT_UNBLOCK_REQUEST (line 21) | const ACCOUNT_UNBLOCK_REQUEST = 'ACCOUNT_UNBLOCK_REQUEST';
constant ACCOUNT_UNBLOCK_SUCCESS (line 22) | const ACCOUNT_UNBLOCK_SUCCESS = 'ACCOUNT_UNBLOCK_SUCCESS';
constant ACCOUNT_UNBLOCK_FAIL (line 23) | const ACCOUNT_UNBLOCK_FAIL = 'ACCOUNT_UNBLOCK_FAIL';
constant ACCOUNT_MUTE_REQUEST (line 25) | const ACCOUNT_MUTE_REQUEST = 'ACCOUNT_MUTE_REQUEST';
constant ACCOUNT_MUTE_SUCCESS (line 26) | const ACCOUNT_MUTE_SUCCESS = 'ACCOUNT_MUTE_SUCCESS';
constant ACCOUNT_MUTE_FAIL (line 27) | const ACCOUNT_MUTE_FAIL = 'ACCOUNT_MUTE_FAIL';
constant ACCOUNT_UNMUTE_REQUEST (line 29) | const ACCOUNT_UNMUTE_REQUEST = 'ACCOUNT_UNMUTE_REQUEST';
constant ACCOUNT_UNMUTE_SUCCESS (line 30) | const ACCOUNT_UNMUTE_SUCCESS = 'ACCOUNT_UNMUTE_SUCCESS';
constant ACCOUNT_UNMUTE_FAIL (line 31) | const ACCOUNT_UNMUTE_FAIL = 'ACCOUNT_UNMUTE_FAIL';
constant ACCOUNT_PIN_REQUEST (line 33) | const ACCOUNT_PIN_REQUEST = 'ACCOUNT_PIN_REQUEST';
constant ACCOUNT_PIN_SUCCESS (line 34) | const ACCOUNT_PIN_SUCCESS = 'ACCOUNT_PIN_SUCCESS';
constant ACCOUNT_PIN_FAIL (line 35) | const ACCOUNT_PIN_FAIL = 'ACCOUNT_PIN_FAIL';
constant ACCOUNT_UNPIN_REQUEST (line 37) | const ACCOUNT_UNPIN_REQUEST = 'ACCOUNT_UNPIN_REQUEST';
constant ACCOUNT_UNPIN_SUCCESS (line 38) | const ACCOUNT_UNPIN_SUCCESS = 'ACCOUNT_UNPIN_SUCCESS';
constant ACCOUNT_UNPIN_FAIL (line 39) | const ACCOUNT_UNPIN_FAIL = 'ACCOUNT_UNPIN_FAIL';
constant FOLLOWERS_FETCH_REQUEST (line 41) | const FOLLOWERS_FETCH_REQUEST = 'FOLLOWERS_FETCH_REQUEST';
constant FOLLOWERS_FETCH_SUCCESS (line 42) | const FOLLOWERS_FETCH_SUCCESS = 'FOLLOWERS_FETCH_SUCCESS';
constant FOLLOWERS_FETCH_FAIL (line 43) | const FOLLOWERS_FETCH_FAIL = 'FOLLOWERS_FETCH_FAIL';
constant FOLLOWERS_EXPAND_REQUEST (line 45) | const FOLLOWERS_EXPAND_REQUEST = 'FOLLOWERS_EXPAND_REQUEST';
constant FOLLOWERS_EXPAND_SUCCESS (line 46) | const FOLLOWERS_EXPAND_SUCCESS = 'FOLLOWERS_EXPAND_SUCCESS';
constant FOLLOWERS_EXPAND_FAIL (line 47) | const FOLLOWERS_EXPAND_FAIL = 'FOLLOWERS_EXPAND_FAIL';
constant FOLLOWING_FETCH_REQUEST (line 49) | const FOLLOWING_FETCH_REQUEST = 'FOLLOWING_FETCH_REQUEST';
constant FOLLOWING_FETCH_SUCCESS (line 50) | const FOLLOWING_FETCH_SUCCESS = 'FOLLOWING_FETCH_SUCCESS';
constant FOLLOWING_FETCH_FAIL (line 51) | const FOLLOWING_FETCH_FAIL = 'FOLLOWING_FETCH_FAIL';
constant FOLLOWING_EXPAND_REQUEST (line 53) | const FOLLOWING_EXPAND_REQUEST = 'FOLLOWING_EXPAND_REQUEST';
constant FOLLOWING_EXPAND_SUCCESS (line 54) | const FOLLOWING_EXPAND_SUCCESS = 'FOLLOWING_EXPAND_SUCCESS';
constant FOLLOWING_EXPAND_FAIL (line 55) | const FOLLOWING_EXPAND_FAIL = 'FOLLOWING_EXPAND_FAIL';
constant RELATIONSHIPS_FETCH_REQUEST (line 57) | const RELATIONSHIPS_FETCH_REQUEST = 'RELATIONSHIPS_FETCH_REQUEST';
constant RELATIONSHIPS_FETCH_SUCCESS (line 58) | const RELATIONSHIPS_FETCH_SUCCESS = 'RELATIONSHIPS_FETCH_SUCCESS';
constant RELATIONSHIPS_FETCH_FAIL (line 59) | const RELATIONSHIPS_FETCH_FAIL = 'RELATIONSHIPS_FETCH_FAIL';
constant FOLLOW_REQUESTS_FETCH_REQUEST (line 61) | const FOLLOW_REQUESTS_FETCH_REQUEST = 'FOLLOW_REQUESTS_FETCH_REQUEST';
constant FOLLOW_REQUESTS_FETCH_SUCCESS (line 62) | const FOLLOW_REQUESTS_FETCH_SUCCESS = 'FOLLOW_REQUESTS_FETCH_SUCCESS';
constant FOLLOW_REQUESTS_FETCH_FAIL (line 63) | const FOLLOW_REQUESTS_FETCH_FAIL = 'FOLLOW_REQUESTS_FETCH_FAIL';
constant FOLLOW_REQUESTS_EXPAND_REQUEST (line 65) | const FOLLOW_REQUESTS_EXPAND_REQUEST = 'FOLLOW_REQUESTS_EXPAND_REQUEST';
constant FOLLOW_REQUESTS_EXPAND_SUCCESS (line 66) | const FOLLOW_REQUESTS_EXPAND_SUCCESS = 'FOLLOW_REQUESTS_EXPAND_SUCCESS';
constant FOLLOW_REQUESTS_EXPAND_FAIL (line 67) | const FOLLOW_REQUESTS_EXPAND_FAIL = 'FOLLOW_REQUESTS_EXPAND_FAIL';
constant FOLLOW_REQUEST_AUTHORIZE_REQUEST (line 69) | const FOLLOW_REQUEST_AUTHORIZE_REQUEST = 'FOLLOW_REQUEST_AUTHORIZE_REQUE...
constant FOLLOW_REQUEST_AUTHORIZE_SUCCESS (line 70) | const FOLLOW_REQUEST_AUTHORIZE_SUCCESS = 'FOLLOW_REQUEST_AUTHORIZE_SUCCE...
constant FOLLOW_REQUEST_AUTHORIZE_FAIL (line 71) | const FOLLOW_REQUEST_AUTHORIZE_FAIL = 'FOLLOW_REQUEST_AUTHORIZE_FAIL';
constant FOLLOW_REQUEST_REJECT_REQUEST (line 73) | const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST';
constant FOLLOW_REQUEST_REJECT_SUCCESS (line 74) | const FOLLOW_REQUEST_REJECT_SUCCESS = 'FOLLOW_REQUEST_REJECT_SUCCESS';
constant FOLLOW_REQUEST_REJECT_FAIL (line 75) | const FOLLOW_REQUEST_REJECT_FAIL = 'FOLLOW_REQUEST_REJECT_FAIL';
function getFromDB (line 77) | function getFromDB(dispatch, getState, index, id) {
function fetchAccount (line 95) | function fetchAccount(id) {
function fetchAccountRequest (line 123) | function fetchAccountRequest(id) {
function fetchAccountSuccess (line 130) | function fetchAccountSuccess() {
function fetchAccountFail (line 136) | function fetchAccountFail(id, error) {
function followAccount (line 145) | function followAccount(id, reblogs = true) {
function unfollowAccount (line 160) | function unfollowAccount(id) {
function followAccountRequest (line 172) | function followAccountRequest(id, locked) {
function followAccountSuccess (line 181) | function followAccountSuccess(relationship, alreadyFollowing) {
function followAccountFail (line 190) | function followAccountFail(error, locked) {
function unfollowAccountRequest (line 199) | function unfollowAccountRequest(id) {
function unfollowAccountSuccess (line 207) | function unfollowAccountSuccess(relationship, statuses) {
function unfollowAccountFail (line 216) | function unfollowAccountFail(error) {
function blockAccount (line 224) | function blockAccount(id) {
function unblockAccount (line 237) | function unblockAccount(id) {
function blockAccountRequest (line 249) | function blockAccountRequest(id) {
function blockAccountSuccess (line 256) | function blockAccountSuccess(relationship, statuses) {
function blockAccountFail (line 264) | function blockAccountFail(error) {
function unblockAccountRequest (line 271) | function unblockAccountRequest(id) {
function unblockAccountSuccess (line 278) | function unblockAccountSuccess(relationship) {
function unblockAccountFail (line 285) | function unblockAccountFail(error) {
function muteAccount (line 293) | function muteAccount(id, notifications) {
function unmuteAccount (line 306) | function unmuteAccount(id) {
function muteAccountRequest (line 318) | function muteAccountRequest(id) {
function muteAccountSuccess (line 325) | function muteAccountSuccess(relationship, statuses) {
function muteAccountFail (line 333) | function muteAccountFail(error) {
function unmuteAccountRequest (line 340) | function unmuteAccountRequest(id) {
function unmuteAccountSuccess (line 347) | function unmuteAccountSuccess(relationship) {
function unmuteAccountFail (line 354) | function unmuteAccountFail(error) {
function fetchFollowers (line 362) | function fetchFollowers(id) {
function fetchFollowersRequest (line 378) | function fetchFollowersRequest(id) {
function fetchFollowersSuccess (line 385) | function fetchFollowersSuccess(id, accounts, next) {
function fetchFollowersFail (line 394) | function fetchFollowersFail(id, error) {
function expandFollowers (line 402) | function expandFollowers(id) {
function expandFollowersRequest (line 424) | function expandFollowersRequest(id) {
function expandFollowersSuccess (line 431) | function expandFollowersSuccess(id, accounts, next) {
function expandFollowersFail (line 440) | function expandFollowersFail(id, error) {
function fetchFollowing (line 448) | function fetchFollowing(id) {
function fetchFollowingRequest (line 464) | function fetchFollowingRequest(id) {
function fetchFollowingSuccess (line 471) | function fetchFollowingSuccess(id, accounts, next) {
function fetchFollowingFail (line 480) | function fetchFollowingFail(id, error) {
function expandFollowing (line 488) | function expandFollowing(id) {
function expandFollowingRequest (line 510) | function expandFollowingRequest(id) {
function expandFollowingSuccess (line 517) | function expandFollowingSuccess(id, accounts, next) {
function expandFollowingFail (line 526) | function expandFollowingFail(id, error) {
function fetchRelationships (line 534) | function fetchRelationships(accountIds) {
function fetchRelationshipsRequest (line 553) | function fetchRelationshipsRequest(ids) {
function fetchRelationshipsSuccess (line 561) | function fetchRelationshipsSuccess(relationships) {
function fetchRelationshipsFail (line 569) | function fetchRelationshipsFail(error) {
function fetchFollowRequests (line 577) | function fetchFollowRequests() {
function fetchFollowRequestsRequest (line 589) | function fetchFollowRequestsRequest() {
function fetchFollowRequestsSuccess (line 595) | function fetchFollowRequestsSuccess(accounts, next) {
function fetchFollowRequestsFail (line 603) | function fetchFollowRequestsFail(error) {
function expandFollowRequests (line 610) | function expandFollowRequests() {
function expandFollowRequestsRequest (line 628) | function expandFollowRequestsRequest() {
function expandFollowRequestsSuccess (line 634) | function expandFollowRequestsSuccess(accounts, next) {
function expandFollowRequestsFail (line 642) | function expandFollowRequestsFail(error) {
function authorizeFollowRequest (line 649) | function authorizeFollowRequest(id) {
function authorizeFollowRequestRequest (line 660) | function authorizeFollowRequestRequest(id) {
function authorizeFollowRequestSuccess (line 667) | function authorizeFollowRequestSuccess(id) {
function authorizeFollowRequestFail (line 674) | function authorizeFollowRequestFail(id, error) {
function rejectFollowRequest (line 683) | function rejectFollowRequest(id) {
function rejectFollowRequestRequest (line 694) | function rejectFollowRequestRequest(id) {
function rejectFollowRequestSuccess (line 701) | function rejectFollowRequestSuccess(id) {
function rejectFollowRequestFail (line 708) | function rejectFollowRequestFail(id, error) {
function pinAccount (line 716) | function pinAccount(id) {
function unpinAccount (line 728) | function unpinAccount(id) {
function pinAccountRequest (line 740) | function pinAccountRequest(id) {
function pinAccountSuccess (line 747) | function pinAccountSuccess(relationship) {
function pinAccountFail (line 754) | function pinAccountFail(error) {
function unpinAccountRequest (line 761) | function unpinAccountRequest(id) {
function unpinAccountSuccess (line 768) | function unpinAccountSuccess(relationship) {
function unpinAccountFail (line 775) | function unpinAccountFail(error) {
FILE: app/javascript/mastodon/actions/alerts.js
constant ALERT_SHOW (line 8) | const ALERT_SHOW = 'ALERT_SHOW';
constant ALERT_DISMISS (line 9) | const ALERT_DISMISS = 'ALERT_DISMISS';
constant ALERT_CLEAR (line 10) | const ALERT_CLEAR = 'ALERT_CLEAR';
constant ALERT_NOOP (line 11) | const ALERT_NOOP = 'ALERT_NOOP';
function dismissAlert (line 13) | function dismissAlert(alert) {
function clearAlert (line 20) | function clearAlert() {
function showAlert (line 26) | function showAlert(title = messages.unexpectedTitle, message = messages....
function showAlertForError (line 34) | function showAlertForError(error) {
FILE: app/javascript/mastodon/actions/blocks.js
constant BLOCKS_FETCH_REQUEST (line 5) | const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST';
constant BLOCKS_FETCH_SUCCESS (line 6) | const BLOCKS_FETCH_SUCCESS = 'BLOCKS_FETCH_SUCCESS';
constant BLOCKS_FETCH_FAIL (line 7) | const BLOCKS_FETCH_FAIL = 'BLOCKS_FETCH_FAIL';
constant BLOCKS_EXPAND_REQUEST (line 9) | const BLOCKS_EXPAND_REQUEST = 'BLOCKS_EXPAND_REQUEST';
constant BLOCKS_EXPAND_SUCCESS (line 10) | const BLOCKS_EXPAND_SUCCESS = 'BLOCKS_EXPAND_SUCCESS';
constant BLOCKS_EXPAND_FAIL (line 11) | const BLOCKS_EXPAND_FAIL = 'BLOCKS_EXPAND_FAIL';
function fetchBlocks (line 13) | function fetchBlocks() {
function fetchBlocksRequest (line 26) | function fetchBlocksRequest() {
function fetchBlocksSuccess (line 32) | function fetchBlocksSuccess(accounts, next) {
function fetchBlocksFail (line 40) | function fetchBlocksFail(error) {
function expandBlocks (line 47) | function expandBlocks() {
function expandBlocksRequest (line 66) | function expandBlocksRequest() {
function expandBlocksSuccess (line 72) | function expandBlocksSuccess(accounts, next) {
function expandBlocksFail (line 80) | function expandBlocksFail(error) {
FILE: app/javascript/mastodon/actions/bundles.js
constant BUNDLE_FETCH_REQUEST (line 1) | const BUNDLE_FETCH_REQUEST = 'BUNDLE_FETCH_REQUEST';
constant BUNDLE_FETCH_SUCCESS (line 2) | const BUNDLE_FETCH_SUCCESS = 'BUNDLE_FETCH_SUCCESS';
constant BUNDLE_FETCH_FAIL (line 3) | const BUNDLE_FETCH_FAIL = 'BUNDLE_FETCH_FAIL';
function fetchBundleRequest (line 5) | function fetchBundleRequest(skipLoading) {
function fetchBundleSuccess (line 12) | function fetchBundleSuccess(skipLoading) {
function fetchBundleFail (line 19) | function fetchBundleFail(error, skipLoading) {
FILE: app/javascript/mastodon/actions/columns.js
constant COLUMN_ADD (line 3) | const COLUMN_ADD = 'COLUMN_ADD';
constant COLUMN_REMOVE (line 4) | const COLUMN_REMOVE = 'COLUMN_REMOVE';
constant COLUMN_MOVE (line 5) | const COLUMN_MOVE = 'COLUMN_MOVE';
constant COLUMN_PARAMS_CHANGE (line 6) | const COLUMN_PARAMS_CHANGE = 'COLUMN_PARAMS_CHANGE';
function addColumn (line 8) | function addColumn(id, params) {
function removeColumn (line 20) | function removeColumn(uuid) {
function moveColumn (line 31) | function moveColumn(uuid, direction) {
function changeColumnParams (line 43) | function changeColumnParams(uuid, path, value) {
FILE: app/javascript/mastodon/actions/compose.js
constant COMPOSE_CHANGE (line 16) | const COMPOSE_CHANGE = 'COMPOSE_CHANGE';
constant COMPOSE_SUBMIT_REQUEST (line 17) | const COMPOSE_SUBMIT_REQUEST = 'COMPOSE_SUBMIT_REQUEST';
constant COMPOSE_SUBMIT_SUCCESS (line 18) | const COMPOSE_SUBMIT_SUCCESS = 'COMPOSE_SUBMIT_SUCCESS';
constant COMPOSE_SUBMIT_FAIL (line 19) | const COMPOSE_SUBMIT_FAIL = 'COMPOSE_SUBMIT_FAIL';
constant COMPOSE_REPLY (line 20) | const COMPOSE_REPLY = 'COMPOSE_REPLY';
constant COMPOSE_REPLY_CANCEL (line 21) | const COMPOSE_REPLY_CANCEL = 'COMPOSE_REPLY_CANCEL';
constant COMPOSE_DIRECT (line 22) | const COMPOSE_DIRECT = 'COMPOSE_DIRECT';
constant COMPOSE_MENTION (line 23) | const COMPOSE_MENTION = 'COMPOSE_MENTION';
constant COMPOSE_RESET (line 24) | const COMPOSE_RESET = 'COMPOSE_RESET';
constant COMPOSE_UPLOAD_REQUEST (line 25) | const COMPOSE_UPLOAD_REQUEST = 'COMPOSE_UPLOAD_REQUEST';
constant COMPOSE_UPLOAD_SUCCESS (line 26) | const COMPOSE_UPLOAD_SUCCESS = 'COMPOSE_UPLOAD_SUCCESS';
constant COMPOSE_UPLOAD_FAIL (line 27) | const COMPOSE_UPLOAD_FAIL = 'COMPOSE_UPLOAD_FAIL';
constant COMPOSE_UPLOAD_PROGRESS (line 28) | const COMPOSE_UPLOAD_PROGRESS = 'COMPOSE_UPLOAD_PROGRESS';
constant COMPOSE_UPLOAD_UNDO (line 29) | const COMPOSE_UPLOAD_UNDO = 'COMPOSE_UPLOAD_UNDO';
constant COMPOSE_SUGGESTIONS_CLEAR (line 31) | const COMPOSE_SUGGESTIONS_CLEAR = 'COMPOSE_SUGGESTIONS_CLEAR';
constant COMPOSE_SUGGESTIONS_READY (line 32) | const COMPOSE_SUGGESTIONS_READY = 'COMPOSE_SUGGESTIONS_READY';
constant COMPOSE_SUGGESTION_SELECT (line 33) | const COMPOSE_SUGGESTION_SELECT = 'COMPOSE_SUGGESTION_SELECT';
constant COMPOSE_SUGGESTION_TAGS_UPDATE (line 34) | const COMPOSE_SUGGESTION_TAGS_UPDATE = 'COMPOSE_SUGGESTION_TAGS_UPDATE';
constant COMPOSE_TAG_HISTORY_UPDATE (line 36) | const COMPOSE_TAG_HISTORY_UPDATE = 'COMPOSE_TAG_HISTORY_UPDATE';
constant COMPOSE_MOUNT (line 38) | const COMPOSE_MOUNT = 'COMPOSE_MOUNT';
constant COMPOSE_UNMOUNT (line 39) | const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT';
constant COMPOSE_SENSITIVITY_CHANGE (line 41) | const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
constant COMPOSE_SPOILERNESS_CHANGE (line 42) | const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
constant COMPOSE_SPOILER_TEXT_CHANGE (line 43) | const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
constant COMPOSE_VISIBILITY_CHANGE (line 44) | const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE';
constant COMPOSE_LISTABILITY_CHANGE (line 45) | const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
constant COMPOSE_COMPOSING_CHANGE (line 46) | const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE';
constant COMPOSE_EMOJI_INSERT (line 48) | const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT';
constant COMPOSE_UPLOAD_CHANGE_REQUEST (line 50) | const COMPOSE_UPLOAD_CHANGE_REQUEST = 'COMPOSE_UPLOAD_UPDATE_REQUEST';
constant COMPOSE_UPLOAD_CHANGE_SUCCESS (line 51) | const COMPOSE_UPLOAD_CHANGE_SUCCESS = 'COMPOSE_UPLOAD_UPDATE_SUCCESS';
constant COMPOSE_UPLOAD_CHANGE_FAIL (line 52) | const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL';
constant COMPOSE_POLL_ADD (line 54) | const COMPOSE_POLL_ADD = 'COMPOSE_POLL_ADD';
constant COMPOSE_POLL_REMOVE (line 55) | const COMPOSE_POLL_REMOVE = 'COMPOSE_POLL_REMOVE';
constant COMPOSE_POLL_OPTION_ADD (line 56) | const COMPOSE_POLL_OPTION_ADD = 'COMPOSE_POLL_OPTION_ADD';
constant COMPOSE_POLL_OPTION_CHANGE (line 57) | const COMPOSE_POLL_OPTION_CHANGE = 'COMPOSE_POLL_OPTION_CHANGE';
constant COMPOSE_POLL_OPTION_REMOVE (line 58) | const COMPOSE_POLL_OPTION_REMOVE = 'COMPOSE_POLL_OPTION_REMOVE';
constant COMPOSE_POLL_SETTINGS_CHANGE (line 59) | const COMPOSE_POLL_SETTINGS_CHANGE = 'COMPOSE_POLL_SETTINGS_CHANGE';
constant COMPOSE_PANEL_BREAKPOINT (line 66) | const COMPOSE_PANEL_BREAKPOINT = 600 + (285 * 1) + (10 * 1);
function changeCompose (line 74) | function changeCompose(text) {
function replyCompose (line 81) | function replyCompose(status, routerHistory) {
function cancelReplyCompose (line 92) | function cancelReplyCompose() {
function resetCompose (line 98) | function resetCompose() {
function mentionCompose (line 104) | function mentionCompose(account, routerHistory) {
function directCompose (line 115) | function directCompose(account, routerHistory) {
function submitCompose (line 126) | function submitCompose(routerHistory) {
function submitComposeRequest (line 184) | function submitComposeRequest() {
function submitComposeSuccess (line 190) | function submitComposeSuccess(status) {
function submitComposeFail (line 197) | function submitComposeFail(error) {
function uploadCompose (line 204) | function uploadCompose(files) {
function changeUploadCompose (line 243) | function changeUploadCompose(id, params) {
function changeUploadComposeRequest (line 255) | function changeUploadComposeRequest() {
function changeUploadComposeSuccess (line 261) | function changeUploadComposeSuccess(media) {
function changeUploadComposeFail (line 269) | function changeUploadComposeFail(error) {
function uploadComposeRequest (line 277) | function uploadComposeRequest() {
function uploadComposeProgress (line 284) | function uploadComposeProgress(loaded, total) {
function uploadComposeSuccess (line 292) | function uploadComposeSuccess(media) {
function uploadComposeFail (line 300) | function uploadComposeFail(error) {
function undoUploadCompose (line 308) | function undoUploadCompose(media_id) {
function clearComposeSuggestions (line 315) | function clearComposeSuggestions() {
function fetchComposeSuggestions (line 356) | function fetchComposeSuggestions(token) {
function readyComposeSuggestionsEmojis (line 372) | function readyComposeSuggestionsEmojis(token, emojis) {
function readyComposeSuggestionsAccounts (line 380) | function readyComposeSuggestionsAccounts(token, accounts) {
function selectComposeSuggestion (line 388) | function selectComposeSuggestion(position, token, suggestion, path) {
function updateSuggestionTags (line 415) | function updateSuggestionTags(token) {
function updateTagHistory (line 422) | function updateTagHistory(tags) {
function hydrateCompose (line 429) | function hydrateCompose() {
function insertIntoTagHistory (line 440) | function insertIntoTagHistory(recognizedTags, text) {
function mountCompose (line 457) | function mountCompose() {
function unmountCompose (line 463) | function unmountCompose() {
function changeComposeSensitivity (line 469) | function changeComposeSensitivity() {
function changeComposeSpoilerness (line 475) | function changeComposeSpoilerness() {
function changeComposeSpoilerText (line 481) | function changeComposeSpoilerText(text) {
function changeComposeVisibility (line 488) | function changeComposeVisibility(value) {
function insertEmojiCompose (line 495) | function insertEmojiCompose(position, emoji, needsSpace) {
function changeComposing (line 504) | function changeComposing(value) {
function addPoll (line 511) | function addPoll() {
function removePoll (line 517) | function removePoll() {
function addPollOption (line 523) | function addPollOption(title) {
function changePollOption (line 530) | function changePollOption(index, title) {
function removePollOption (line 538) | function removePollOption(index) {
function changePollSettings (line 545) | function changePollSettings(expiresIn, isMultiple) {
FILE: app/javascript/mastodon/actions/conversations.js
constant CONVERSATIONS_MOUNT (line 8) | const CONVERSATIONS_MOUNT = 'CONVERSATIONS_MOUNT';
constant CONVERSATIONS_UNMOUNT (line 9) | const CONVERSATIONS_UNMOUNT = 'CONVERSATIONS_UNMOUNT';
constant CONVERSATIONS_FETCH_REQUEST (line 11) | const CONVERSATIONS_FETCH_REQUEST = 'CONVERSATIONS_FETCH_REQUEST';
constant CONVERSATIONS_FETCH_SUCCESS (line 12) | const CONVERSATIONS_FETCH_SUCCESS = 'CONVERSATIONS_FETCH_SUCCESS';
constant CONVERSATIONS_FETCH_FAIL (line 13) | const CONVERSATIONS_FETCH_FAIL = 'CONVERSATIONS_FETCH_FAIL';
constant CONVERSATIONS_UPDATE (line 14) | const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE';
constant CONVERSATIONS_READ (line 16) | const CONVERSATIONS_READ = 'CONVERSATIONS_READ';
FILE: app/javascript/mastodon/actions/custom_emojis.js
constant CUSTOM_EMOJIS_FETCH_REQUEST (line 3) | const CUSTOM_EMOJIS_FETCH_REQUEST = 'CUSTOM_EMOJIS_FETCH_REQUEST';
constant CUSTOM_EMOJIS_FETCH_SUCCESS (line 4) | const CUSTOM_EMOJIS_FETCH_SUCCESS = 'CUSTOM_EMOJIS_FETCH_SUCCESS';
constant CUSTOM_EMOJIS_FETCH_FAIL (line 5) | const CUSTOM_EMOJIS_FETCH_FAIL = 'CUSTOM_EMOJIS_FETCH_FAIL';
function fetchCustomEmojis (line 7) | function fetchCustomEmojis() {
function fetchCustomEmojisRequest (line 19) | function fetchCustomEmojisRequest() {
function fetchCustomEmojisSuccess (line 26) | function fetchCustomEmojisSuccess(custom_emojis) {
function fetchCustomEmojisFail (line 34) | function fetchCustomEmojisFail(error) {
FILE: app/javascript/mastodon/actions/domain_blocks.js
constant DOMAIN_BLOCK_REQUEST (line 3) | const DOMAIN_BLOCK_REQUEST = 'DOMAIN_BLOCK_REQUEST';
constant DOMAIN_BLOCK_SUCCESS (line 4) | const DOMAIN_BLOCK_SUCCESS = 'DOMAIN_BLOCK_SUCCESS';
constant DOMAIN_BLOCK_FAIL (line 5) | const DOMAIN_BLOCK_FAIL = 'DOMAIN_BLOCK_FAIL';
constant DOMAIN_UNBLOCK_REQUEST (line 7) | const DOMAIN_UNBLOCK_REQUEST = 'DOMAIN_UNBLOCK_REQUEST';
constant DOMAIN_UNBLOCK_SUCCESS (line 8) | const DOMAIN_UNBLOCK_SUCCESS = 'DOMAIN_UNBLOCK_SUCCESS';
constant DOMAIN_UNBLOCK_FAIL (line 9) | const DOMAIN_UNBLOCK_FAIL = 'DOMAIN_UNBLOCK_FAIL';
constant DOMAIN_BLOCKS_FETCH_REQUEST (line 11) | const DOMAIN_BLOCKS_FETCH_REQUEST = 'DOMAIN_BLOCKS_FETCH_REQUEST';
constant DOMAIN_BLOCKS_FETCH_SUCCESS (line 12) | const DOMAIN_BLOCKS_FETCH_SUCCESS = 'DOMAIN_BLOCKS_FETCH_SUCCESS';
constant DOMAIN_BLOCKS_FETCH_FAIL (line 13) | const DOMAIN_BLOCKS_FETCH_FAIL = 'DOMAIN_BLOCKS_FETCH_FAIL';
constant DOMAIN_BLOCKS_EXPAND_REQUEST (line 15) | const DOMAIN_BLOCKS_EXPAND_REQUEST = 'DOMAIN_BLOCKS_EXPAND_REQUEST';
constant DOMAIN_BLOCKS_EXPAND_SUCCESS (line 16) | const DOMAIN_BLOCKS_EXPAND_SUCCESS = 'DOMAIN_BLOCKS_EXPAND_SUCCESS';
constant DOMAIN_BLOCKS_EXPAND_FAIL (line 17) | const DOMAIN_BLOCKS_EXPAND_FAIL = 'DOMAIN_BLOCKS_EXPAND_FAIL';
function blockDomain (line 19) | function blockDomain(domain) {
function blockDomainRequest (line 33) | function blockDomainRequest(domain) {
function blockDomainSuccess (line 40) | function blockDomainSuccess(domain, accounts) {
function blockDomainFail (line 48) | function blockDomainFail(domain, error) {
function unblockDomain (line 56) | function unblockDomain(domain) {
function unblockDomainRequest (line 70) | function unblockDomainRequest(domain) {
function unblockDomainSuccess (line 77) | function unblockDomainSuccess(domain, accounts) {
function unblockDomainFail (line 85) | function unblockDomainFail(domain, error) {
function fetchDomainBlocks (line 93) | function fetchDomainBlocks() {
function fetchDomainBlocksRequest (line 106) | function fetchDomainBlocksRequest() {
function fetchDomainBlocksSuccess (line 112) | function fetchDomainBlocksSuccess(domains, next) {
function fetchDomainBlocksFail (line 120) | function fetchDomainBlocksFail(error) {
function expandDomainBlocks (line 127) | function expandDomainBlocks() {
function expandDomainBlocksRequest (line 146) | function expandDomainBlocksRequest() {
function expandDomainBlocksSuccess (line 152) | function expandDomainBlocksSuccess(domains, next) {
function expandDomainBlocksFail (line 160) | function expandDomainBlocksFail(error) {
FILE: app/javascript/mastodon/actions/dropdown_menu.js
constant DROPDOWN_MENU_OPEN (line 1) | const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN';
constant DROPDOWN_MENU_CLOSE (line 2) | const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE';
function openDropdownMenu (line 4) | function openDropdownMenu(id, placement, keyboard) {
function closeDropdownMenu (line 8) | function closeDropdownMenu(id) {
FILE: app/javascript/mastodon/actions/emojis.js
constant EMOJI_USE (line 3) | const EMOJI_USE = 'EMOJI_USE';
function useEmoji (line 5) | function useEmoji(emoji) {
FILE: app/javascript/mastodon/actions/favourites.js
constant FAVOURITED_STATUSES_FETCH_REQUEST (line 4) | const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQ...
constant FAVOURITED_STATUSES_FETCH_SUCCESS (line 5) | const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUC...
constant FAVOURITED_STATUSES_FETCH_FAIL (line 6) | const FAVOURITED_STATUSES_FETCH_FAIL = 'FAVOURITED_STATUSES_FETCH_FAIL';
constant FAVOURITED_STATUSES_EXPAND_REQUEST (line 8) | const FAVOURITED_STATUSES_EXPAND_REQUEST = 'FAVOURITED_STATUSES_EXPAND_R...
constant FAVOURITED_STATUSES_EXPAND_SUCCESS (line 9) | const FAVOURITED_STATUSES_EXPAND_SUCCESS = 'FAVOURITED_STATUSES_EXPAND_S...
constant FAVOURITED_STATUSES_EXPAND_FAIL (line 10) | const FAVOURITED_STATUSES_EXPAND_FAIL = 'FAVOURITED_STATUSES_EXPAND_F...
function fetchFavouritedStatuses (line 12) | function fetchFavouritedStatuses() {
function fetchFavouritedStatusesRequest (line 30) | function fetchFavouritedStatusesRequest() {
function fetchFavouritedStatusesSuccess (line 37) | function fetchFavouritedStatusesSuccess(statuses, next) {
function fetchFavouritedStatusesFail (line 46) | function fetchFavouritedStatusesFail(error) {
function expandFavouritedStatuses (line 54) | function expandFavouritedStatuses() {
function expandFavouritedStatusesRequest (line 74) | function expandFavouritedStatusesRequest() {
function expandFavouritedStatusesSuccess (line 80) | function expandFavouritedStatusesSuccess(statuses, next) {
function expandFavouritedStatusesFail (line 88) | function expandFavouritedStatusesFail(error) {
FILE: app/javascript/mastodon/actions/filters.js
constant FILTERS_FETCH_REQUEST (line 3) | const FILTERS_FETCH_REQUEST = 'FILTERS_FETCH_REQUEST';
constant FILTERS_FETCH_SUCCESS (line 4) | const FILTERS_FETCH_SUCCESS = 'FILTERS_FETCH_SUCCESS';
constant FILTERS_FETCH_FAIL (line 5) | const FILTERS_FETCH_FAIL = 'FILTERS_FETCH_FAIL';
FILE: app/javascript/mastodon/actions/height_cache.js
constant HEIGHT_CACHE_SET (line 1) | const HEIGHT_CACHE_SET = 'HEIGHT_CACHE_SET';
constant HEIGHT_CACHE_CLEAR (line 2) | const HEIGHT_CACHE_CLEAR = 'HEIGHT_CACHE_CLEAR';
function setHeight (line 4) | function setHeight (key, id, height) {
function clearHeight (line 13) | function clearHeight () {
FILE: app/javascript/mastodon/actions/identity_proofs.js
constant IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST (line 3) | const IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST = 'IDENTITY_PROOFS_ACCOUNT_F...
constant IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS (line 4) | const IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS = 'IDENTITY_PROOFS_ACCOUNT_F...
constant IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL (line 5) | const IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL = 'IDENTITY_PROOFS_ACCOUNT_F...
FILE: app/javascript/mastodon/actions/importer/index.js
constant ACCOUNT_IMPORT (line 3) | const ACCOUNT_IMPORT = 'ACCOUNT_IMPORT';
constant ACCOUNTS_IMPORT (line 4) | const ACCOUNTS_IMPORT = 'ACCOUNTS_IMPORT';
constant STATUS_IMPORT (line 5) | const STATUS_IMPORT = 'STATUS_IMPORT';
constant STATUSES_IMPORT (line 6) | const STATUSES_IMPORT = 'STATUSES_IMPORT';
constant POLLS_IMPORT (line 7) | const POLLS_IMPORT = 'POLLS_IMPORT';
function pushUnique (line 9) | function pushUnique(array, object) {
function importAccount (line 15) | function importAccount(account) {
function importAccounts (line 19) | function importAccounts(accounts) {
function importStatus (line 23) | function importStatus(status) {
function importStatuses (line 27) | function importStatuses(statuses) {
function importPolls (line 31) | function importPolls(polls) {
function importFetchedAccount (line 35) | function importFetchedAccount(account) {
function importFetchedAccounts (line 39) | function importFetchedAccounts(accounts) {
function importFetchedStatus (line 55) | function importFetchedStatus(status) {
function importFetchedStatuses (line 59) | function importFetchedStatuses(statuses) {
function importFetchedPoll (line 86) | function importFetchedPoll(poll) {
FILE: app/javascript/mastodon/actions/importer/normalizer.js
function normalizeAccount (line 13) | function normalizeAccount(account) {
function normalizeStatus (line 38) | function normalizeStatus(status, normalOldStatus) {
function normalizePoll (line 71) | function normalizePoll(poll) {
FILE: app/javascript/mastodon/actions/interactions.js
constant REBLOG_REQUEST (line 4) | const REBLOG_REQUEST = 'REBLOG_REQUEST';
constant REBLOG_SUCCESS (line 5) | const REBLOG_SUCCESS = 'REBLOG_SUCCESS';
constant REBLOG_FAIL (line 6) | const REBLOG_FAIL = 'REBLOG_FAIL';
constant FAVOURITE_REQUEST (line 8) | const FAVOURITE_REQUEST = 'FAVOURITE_REQUEST';
constant FAVOURITE_SUCCESS (line 9) | const FAVOURITE_SUCCESS = 'FAVOURITE_SUCCESS';
constant FAVOURITE_FAIL (line 10) | const FAVOURITE_FAIL = 'FAVOURITE_FAIL';
constant UNREBLOG_REQUEST (line 12) | const UNREBLOG_REQUEST = 'UNREBLOG_REQUEST';
constant UNREBLOG_SUCCESS (line 13) | const UNREBLOG_SUCCESS = 'UNREBLOG_SUCCESS';
constant UNREBLOG_FAIL (line 14) | const UNREBLOG_FAIL = 'UNREBLOG_FAIL';
constant UNFAVOURITE_REQUEST (line 16) | const UNFAVOURITE_REQUEST = 'UNFAVOURITE_REQUEST';
constant UNFAVOURITE_SUCCESS (line 17) | const UNFAVOURITE_SUCCESS = 'UNFAVOURITE_SUCCESS';
constant UNFAVOURITE_FAIL (line 18) | const UNFAVOURITE_FAIL = 'UNFAVOURITE_FAIL';
constant REBLOGS_FETCH_REQUEST (line 20) | const REBLOGS_FETCH_REQUEST = 'REBLOGS_FETCH_REQUEST';
constant REBLOGS_FETCH_SUCCESS (line 21) | const REBLOGS_FETCH_SUCCESS = 'REBLOGS_FETCH_SUCCESS';
constant REBLOGS_FETCH_FAIL (line 22) | const REBLOGS_FETCH_FAIL = 'REBLOGS_FETCH_FAIL';
constant FAVOURITES_FETCH_REQUEST (line 24) | const FAVOURITES_FETCH_REQUEST = 'FAVOURITES_FETCH_REQUEST';
constant FAVOURITES_FETCH_SUCCESS (line 25) | const FAVOURITES_FETCH_SUCCESS = 'FAVOURITES_FETCH_SUCCESS';
constant FAVOURITES_FETCH_FAIL (line 26) | const FAVOURITES_FETCH_FAIL = 'FAVOURITES_FETCH_FAIL';
constant PIN_REQUEST (line 28) | const PIN_REQUEST = 'PIN_REQUEST';
constant PIN_SUCCESS (line 29) | const PIN_SUCCESS = 'PIN_SUCCESS';
constant PIN_FAIL (line 30) | const PIN_FAIL = 'PIN_FAIL';
constant UNPIN_REQUEST (line 32) | const UNPIN_REQUEST = 'UNPIN_REQUEST';
constant UNPIN_SUCCESS (line 33) | const UNPIN_SUCCESS = 'UNPIN_SUCCESS';
constant UNPIN_FAIL (line 34) | const UNPIN_FAIL = 'UNPIN_FAIL';
function reblog (line 36) | function reblog(status) {
function unreblog (line 51) | function unreblog(status) {
function reblogRequest (line 64) | function reblogRequest(status) {
function reblogSuccess (line 72) | function reblogSuccess(status) {
function reblogFail (line 80) | function reblogFail(status, error) {
function unreblogRequest (line 89) | function unreblogRequest(status) {
function unreblogSuccess (line 97) | function unreblogSuccess(status) {
function unreblogFail (line 105) | function unreblogFail(status, error) {
function favourite (line 114) | function favourite(status) {
function unfavourite (line 127) | function unfavourite(status) {
function favouriteRequest (line 140) | function favouriteRequest(status) {
function favouriteSuccess (line 148) | function favouriteSuccess(status) {
function favouriteFail (line 156) | function favouriteFail(status, error) {
function unfavouriteRequest (line 165) | function unfavouriteRequest(status) {
function unfavouriteSuccess (line 173) | function unfavouriteSuccess(status) {
function unfavouriteFail (line 181) | function unfavouriteFail(status, error) {
function fetchReblogs (line 190) | function fetchReblogs(id) {
function fetchReblogsRequest (line 203) | function fetchReblogsRequest(id) {
function fetchReblogsSuccess (line 210) | function fetchReblogsSuccess(id, accounts) {
function fetchReblogsFail (line 218) | function fetchReblogsFail(id, error) {
function fetchFavourites (line 225) | function fetchFavourites(id) {
function fetchFavouritesRequest (line 238) | function fetchFavouritesRequest(id) {
function fetchFavouritesSuccess (line 245) | function fetchFavouritesSuccess(id, accounts) {
function fetchFavouritesFail (line 253) | function fetchFavouritesFail(id, error) {
function pin (line 260) | function pin(status) {
function pinRequest (line 273) | function pinRequest(status) {
function pinSuccess (line 281) | function pinSuccess(status) {
function pinFail (line 289) | function pinFail(status, error) {
function unpin (line 298) | function unpin (status) {
function unpinRequest (line 311) | function unpinRequest(status) {
function unpinSuccess (line 319) | function unpinSuccess(status) {
function unpinFail (line 327) | function unpinFail(status, error) {
FILE: app/javascript/mastodon/actions/lists.js
constant LIST_FETCH_REQUEST (line 5) | const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST';
constant LIST_FETCH_SUCCESS (line 6) | const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS';
constant LIST_FETCH_FAIL (line 7) | const LIST_FETCH_FAIL = 'LIST_FETCH_FAIL';
constant LISTS_FETCH_REQUEST (line 9) | const LISTS_FETCH_REQUEST = 'LISTS_FETCH_REQUEST';
constant LISTS_FETCH_SUCCESS (line 10) | const LISTS_FETCH_SUCCESS = 'LISTS_FETCH_SUCCESS';
constant LISTS_FETCH_FAIL (line 11) | const LISTS_FETCH_FAIL = 'LISTS_FETCH_FAIL';
constant LIST_EDITOR_TITLE_CHANGE (line 13) | const LIST_EDITOR_TITLE_CHANGE = 'LIST_EDITOR_TITLE_CHANGE';
constant LIST_EDITOR_RESET (line 14) | const LIST_EDITOR_RESET = 'LIST_EDITOR_RESET';
constant LIST_EDITOR_SETUP (line 15) | const LIST_EDITOR_SETUP = 'LIST_EDITOR_SETUP';
constant LIST_CREATE_REQUEST (line 17) | const LIST_CREATE_REQUEST = 'LIST_CREATE_REQUEST';
constant LIST_CREATE_SUCCESS (line 18) | const LIST_CREATE_SUCCESS = 'LIST_CREATE_SUCCESS';
constant LIST_CREATE_FAIL (line 19) | const LIST_CREATE_FAIL = 'LIST_CREATE_FAIL';
constant LIST_UPDATE_REQUEST (line 21) | const LIST_UPDATE_REQUEST = 'LIST_UPDATE_REQUEST';
constant LIST_UPDATE_SUCCESS (line 22) | const LIST_UPDATE_SUCCESS = 'LIST_UPDATE_SUCCESS';
constant LIST_UPDATE_FAIL (line 23) | const LIST_UPDATE_FAIL = 'LIST_UPDATE_FAIL';
constant LIST_DELETE_REQUEST (line 25) | const LIST_DELETE_REQUEST = 'LIST_DELETE_REQUEST';
constant LIST_DELETE_SUCCESS (line 26) | const LIST_DELETE_SUCCESS = 'LIST_DELETE_SUCCESS';
constant LIST_DELETE_FAIL (line 27) | const LIST_DELETE_FAIL = 'LIST_DELETE_FAIL';
constant LIST_ACCOUNTS_FETCH_REQUEST (line 29) | const LIST_ACCOUNTS_FETCH_REQUEST = 'LIST_ACCOUNTS_FETCH_REQUEST';
constant LIST_ACCOUNTS_FETCH_SUCCESS (line 30) | const LIST_ACCOUNTS_FETCH_SUCCESS = 'LIST_ACCOUNTS_FETCH_SUCCESS';
constant LIST_ACCOUNTS_FETCH_FAIL (line 31) | const LIST_ACCOUNTS_FETCH_FAIL = 'LIST_ACCOUNTS_FETCH_FAIL';
constant LIST_EDITOR_SUGGESTIONS_CHANGE (line 33) | const LIST_EDITOR_SUGGESTIONS_CHANGE = 'LIST_EDITOR_SUGGESTIONS_CHANGE';
constant LIST_EDITOR_SUGGESTIONS_READY (line 34) | const LIST_EDITOR_SUGGESTIONS_READY = 'LIST_EDITOR_SUGGESTIONS_READY';
constant LIST_EDITOR_SUGGESTIONS_CLEAR (line 35) | const LIST_EDITOR_SUGGESTIONS_CLEAR = 'LIST_EDITOR_SUGGESTIONS_CLEAR';
constant LIST_EDITOR_ADD_REQUEST (line 37) | const LIST_EDITOR_ADD_REQUEST = 'LIST_EDITOR_ADD_REQUEST';
constant LIST_EDITOR_ADD_SUCCESS (line 38) | const LIST_EDITOR_ADD_SUCCESS = 'LIST_EDITOR_ADD_SUCCESS';
constant LIST_EDITOR_ADD_FAIL (line 39) | const LIST_EDITOR_ADD_FAIL = 'LIST_EDITOR_ADD_FAIL';
constant LIST_EDITOR_REMOVE_REQUEST (line 41) | const LIST_EDITOR_REMOVE_REQUEST = 'LIST_EDITOR_REMOVE_REQUEST';
constant LIST_EDITOR_REMOVE_SUCCESS (line 42) | const LIST_EDITOR_REMOVE_SUCCESS = 'LIST_EDITOR_REMOVE_SUCCESS';
constant LIST_EDITOR_REMOVE_FAIL (line 43) | const LIST_EDITOR_REMOVE_FAIL = 'LIST_EDITOR_REMOVE_FAIL';
constant LIST_ADDER_RESET (line 45) | const LIST_ADDER_RESET = 'LIST_ADDER_RESET';
constant LIST_ADDER_SETUP (line 46) | const LIST_ADDER_SETUP = 'LIST_ADDER_SETUP';
constant LIST_ADDER_LISTS_FETCH_REQUEST (line 48) | const LIST_ADDER_LISTS_FETCH_REQUEST = 'LIST_ADDER_LISTS_FETCH_REQUEST';
constant LIST_ADDER_LISTS_FETCH_SUCCESS (line 49) | const LIST_ADDER_LISTS_FETCH_SUCCESS = 'LIST_ADDER_LISTS_FETCH_SUCCESS';
constant LIST_ADDER_LISTS_FETCH_FAIL (line 50) | const LIST_ADDER_LISTS_FETCH_FAIL = 'LIST_ADDER_LISTS_FETCH_FAIL';
FILE: app/javascript/mastodon/actions/modal.js
constant MODAL_OPEN (line 1) | const MODAL_OPEN = 'MODAL_OPEN';
constant MODAL_CLOSE (line 2) | const MODAL_CLOSE = 'MODAL_CLOSE';
function openModal (line 4) | function openModal(type, props) {
function closeModal (line 12) | function closeModal() {
FILE: app/javascript/mastodon/actions/mutes.js
constant MUTES_FETCH_REQUEST (line 6) | const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST';
constant MUTES_FETCH_SUCCESS (line 7) | const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS';
constant MUTES_FETCH_FAIL (line 8) | const MUTES_FETCH_FAIL = 'MUTES_FETCH_FAIL';
constant MUTES_EXPAND_REQUEST (line 10) | const MUTES_EXPAND_REQUEST = 'MUTES_EXPAND_REQUEST';
constant MUTES_EXPAND_SUCCESS (line 11) | const MUTES_EXPAND_SUCCESS = 'MUTES_EXPAND_SUCCESS';
constant MUTES_EXPAND_FAIL (line 12) | const MUTES_EXPAND_FAIL = 'MUTES_EXPAND_FAIL';
constant MUTES_INIT_MODAL (line 14) | const MUTES_INIT_MODAL = 'MUTES_INIT_MODAL';
constant MUTES_TOGGLE_HIDE_NOTIFICATIONS (line 15) | const MUTES_TOGGLE_HIDE_NOTIFICATIONS = 'MUTES_TOGGLE_HIDE_NOTIFICATIONS';
function fetchMutes (line 17) | function fetchMutes() {
function fetchMutesRequest (line 30) | function fetchMutesRequest() {
function fetchMutesSuccess (line 36) | function fetchMutesSuccess(accounts, next) {
function fetchMutesFail (line 44) | function fetchMutesFail(error) {
function expandMutes (line 51) | function expandMutes() {
function expandMutesRequest (line 70) | function expandMutesRequest() {
function expandMutesSuccess (line 76) | function expandMutesSuccess(accounts, next) {
function expandMutesFail (line 84) | function expandMutesFail(error) {
function initMuteModal (line 91) | function initMuteModal(account) {
function toggleHideNotifications (line 102) | function toggleHideNotifications() {
FILE: app/javascript/mastodon/actions/notifications.js
constant NOTIFICATIONS_UPDATE (line 16) | const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE';
constant NOTIFICATIONS_UPDATE_NOOP (line 17) | const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP';
constant NOTIFICATIONS_EXPAND_REQUEST (line 19) | const NOTIFICATIONS_EXPAND_REQUEST = 'NOTIFICATIONS_EXPAND_REQUEST';
constant NOTIFICATIONS_EXPAND_SUCCESS (line 20) | const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS';
constant NOTIFICATIONS_EXPAND_FAIL (line 21) | const NOTIFICATIONS_EXPAND_FAIL = 'NOTIFICATIONS_EXPAND_FAIL';
constant NOTIFICATIONS_FILTER_SET (line 23) | const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET';
constant NOTIFICATIONS_CLEAR (line 25) | const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR';
constant NOTIFICATIONS_SCROLL_TOP (line 26) | const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP';
function updateNotifications (line 41) | function updateNotifications(notification, intlMessages, intlLocale) {
function expandNotifications (line 102) | function expandNotifications({ maxId } = {}, done = noOp) {
function expandNotificationsRequest (line 142) | function expandNotificationsRequest(isLoadingMore) {
function expandNotificationsSuccess (line 149) | function expandNotificationsSuccess(notifications, next, isLoadingMore) {
function expandNotificationsFail (line 158) | function expandNotificationsFail(error, isLoadingMore) {
function clearNotifications (line 166) | function clearNotifications() {
function scrollTopNotifications (line 176) | function scrollTopNotifications(top) {
function setFilter (line 183) | function setFilter (filterType) {
FILE: app/javascript/mastodon/actions/onboarding.js
constant INTRODUCTION_VERSION (line 3) | const INTRODUCTION_VERSION = 20181216044202;
FILE: app/javascript/mastodon/actions/pin_statuses.js
constant PINNED_STATUSES_FETCH_REQUEST (line 4) | const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST';
constant PINNED_STATUSES_FETCH_SUCCESS (line 5) | const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS';
constant PINNED_STATUSES_FETCH_FAIL (line 6) | const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL';
function fetchPinnedStatuses (line 10) | function fetchPinnedStatuses() {
function fetchPinnedStatusesRequest (line 23) | function fetchPinnedStatusesRequest() {
function fetchPinnedStatusesSuccess (line 29) | function fetchPinnedStatusesSuccess(statuses, next) {
function fetchPinnedStatusesFail (line 37) | function fetchPinnedStatusesFail(error) {
FILE: app/javascript/mastodon/actions/polls.js
constant POLL_VOTE_REQUEST (line 4) | const POLL_VOTE_REQUEST = 'POLL_VOTE_REQUEST';
constant POLL_VOTE_SUCCESS (line 5) | const POLL_VOTE_SUCCESS = 'POLL_VOTE_SUCCESS';
constant POLL_VOTE_FAIL (line 6) | const POLL_VOTE_FAIL = 'POLL_VOTE_FAIL';
constant POLL_FETCH_REQUEST (line 8) | const POLL_FETCH_REQUEST = 'POLL_FETCH_REQUEST';
constant POLL_FETCH_SUCCESS (line 9) | const POLL_FETCH_SUCCESS = 'POLL_FETCH_SUCCESS';
constant POLL_FETCH_FAIL (line 10) | const POLL_FETCH_FAIL = 'POLL_FETCH_FAIL';
FILE: app/javascript/mastodon/actions/push_notifications/index.js
function changeAlerts (line 18) | function changeAlerts(path, value) {
FILE: app/javascript/mastodon/actions/push_notifications/registerer.js
function register (line 50) | function register () {
function saveSettings (line 118) | function saveSettings() {
FILE: app/javascript/mastodon/actions/push_notifications/setter.js
constant SET_BROWSER_SUPPORT (line 1) | const SET_BROWSER_SUPPORT = 'PUSH_NOTIFICATIONS_SET_BROWSER_SUPPORT';
constant SET_SUBSCRIPTION (line 2) | const SET_SUBSCRIPTION = 'PUSH_NOTIFICATIONS_SET_SUBSCRIPTION';
constant CLEAR_SUBSCRIPTION (line 3) | const CLEAR_SUBSCRIPTION = 'PUSH_NOTIFICATIONS_CLEAR_SUBSCRIPTION';
constant SET_ALERTS (line 4) | const SET_ALERTS = 'PUSH_NOTIFICATIONS_SET_ALERTS';
function setBrowserSupport (line 6) | function setBrowserSupport (value) {
function setSubscription (line 13) | function setSubscription (subscription) {
function clearSubscription (line 20) | function clearSubscription () {
function setAlerts (line 26) | function setAlerts (path, value) {
FILE: app/javascript/mastodon/actions/reports.js
constant REPORT_INIT (line 4) | const REPORT_INIT = 'REPORT_INIT';
constant REPORT_CANCEL (line 5) | const REPORT_CANCEL = 'REPORT_CANCEL';
constant REPORT_SUBMIT_REQUEST (line 7) | const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';
constant REPORT_SUBMIT_SUCCESS (line 8) | const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS';
constant REPORT_SUBMIT_FAIL (line 9) | const REPORT_SUBMIT_FAIL = 'REPORT_SUBMIT_FAIL';
constant REPORT_STATUS_TOGGLE (line 11) | const REPORT_STATUS_TOGGLE = 'REPORT_STATUS_TOGGLE';
constant REPORT_COMMENT_CHANGE (line 12) | const REPORT_COMMENT_CHANGE = 'REPORT_COMMENT_CHANGE';
constant REPORT_FORWARD_CHANGE (line 13) | const REPORT_FORWARD_CHANGE = 'REPORT_FORWARD_CHANGE';
function initReport (line 15) | function initReport(account, status) {
function cancelReport (line 27) | function cancelReport() {
function toggleStatusReport (line 33) | function toggleStatusReport(statusId, checked) {
function submitReport (line 41) | function submitReport() {
function submitReportRequest (line 57) | function submitReportRequest() {
function submitReportSuccess (line 63) | function submitReportSuccess(report) {
function submitReportFail (line 70) | function submitReportFail(error) {
function changeReportComment (line 77) | function changeReportComment(comment) {
function changeReportForward (line 84) | function changeReportForward(forward) {
FILE: app/javascript/mastodon/actions/search.js
constant SEARCH_CHANGE (line 5) | const SEARCH_CHANGE = 'SEARCH_CHANGE';
constant SEARCH_CLEAR (line 6) | const SEARCH_CLEAR = 'SEARCH_CLEAR';
constant SEARCH_SHOW (line 7) | const SEARCH_SHOW = 'SEARCH_SHOW';
constant SEARCH_FETCH_REQUEST (line 9) | const SEARCH_FETCH_REQUEST = 'SEARCH_FETCH_REQUEST';
constant SEARCH_FETCH_SUCCESS (line 10) | const SEARCH_FETCH_SUCCESS = 'SEARCH_FETCH_SUCCESS';
constant SEARCH_FETCH_FAIL (line 11) | const SEARCH_FETCH_FAIL = 'SEARCH_FETCH_FAIL';
function changeSearch (line 13) | function changeSearch(value) {
function clearSearch (line 20) | function clearSearch() {
function submitSearch (line 26) | function submitSearch() {
function fetchSearchRequest (line 59) | function fetchSearchRequest() {
function fetchSearchSuccess (line 65) | function fetchSearchSuccess(results) {
function fetchSearchFail (line 72) | function fetchSearchFail(error) {
function showSearch (line 79) | function showSearch() {
FILE: app/javascript/mastodon/actions/settings.js
constant SETTING_CHANGE (line 5) | const SETTING_CHANGE = 'SETTING_CHANGE';
constant SETTING_SAVE (line 6) | const SETTING_SAVE = 'SETTING_SAVE';
function changeSetting (line 8) | function changeSetting(path, value) {
function saveSettings (line 32) | function saveSettings() {
FILE: app/javascript/mastodon/actions/statuses.js
constant STATUS_FETCH_REQUEST (line 9) | const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
constant STATUS_FETCH_SUCCESS (line 10) | const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS';
constant STATUS_FETCH_FAIL (line 11) | const STATUS_FETCH_FAIL = 'STATUS_FETCH_FAIL';
constant STATUS_DELETE_REQUEST (line 13) | const STATUS_DELETE_REQUEST = 'STATUS_DELETE_REQUEST';
constant STATUS_DELETE_SUCCESS (line 14) | const STATUS_DELETE_SUCCESS = 'STATUS_DELETE_SUCCESS';
constant STATUS_DELETE_FAIL (line 15) | const STATUS_DELETE_FAIL = 'STATUS_DELETE_FAIL';
constant CONTEXT_FETCH_REQUEST (line 17) | const CONTEXT_FETCH_REQUEST = 'CONTEXT_FETCH_REQUEST';
constant CONTEXT_FETCH_SUCCESS (line 18) | const CONTEXT_FETCH_SUCCESS = 'CONTEXT_FETCH_SUCCESS';
constant CONTEXT_FETCH_FAIL (line 19) | const CONTEXT_FETCH_FAIL = 'CONTEXT_FETCH_FAIL';
constant STATUS_MUTE_REQUEST (line 21) | const STATUS_MUTE_REQUEST = 'STATUS_MUTE_REQUEST';
constant STATUS_MUTE_SUCCESS (line 22) | const STATUS_MUTE_SUCCESS = 'STATUS_MUTE_SUCCESS';
constant STATUS_MUTE_FAIL (line 23) | const STATUS_MUTE_FAIL = 'STATUS_MUTE_FAIL';
constant STATUS_UNMUTE_REQUEST (line 25) | const STATUS_UNMUTE_REQUEST = 'STATUS_UNMUTE_REQUEST';
constant STATUS_UNMUTE_SUCCESS (line 26) | const STATUS_UNMUTE_SUCCESS = 'STATUS_UNMUTE_SUCCESS';
constant STATUS_UNMUTE_FAIL (line 27) | const STATUS_UNMUTE_FAIL = 'STATUS_UNMUTE_FAIL';
constant STATUS_REVEAL (line 29) | const STATUS_REVEAL = 'STATUS_REVEAL';
constant STATUS_HIDE (line 30) | const STATUS_HIDE = 'STATUS_HIDE';
constant REDRAFT (line 32) | const REDRAFT = 'REDRAFT';
function fetchStatusRequest (line 34) | function fetchStatusRequest(id, skipLoading) {
function getFromDB (line 42) | function getFromDB(dispatch, getState, accountIndex, index, id) {
function fetchStatus (line 84) | function fetchStatus(id) {
function fetchStatusSuccess (line 118) | function fetchStatusSuccess(skipLoading) {
function fetchStatusFail (line 125) | function fetchStatusFail(id, error, skipLoading) {
function redraft (line 135) | function redraft(status, raw_text) {
function deleteStatus (line 143) | function deleteStatus(id, routerHistory, withRedraft = false) {
function deleteStatusRequest (line 168) | function deleteStatusRequest(id) {
function deleteStatusSuccess (line 175) | function deleteStatusSuccess(id) {
function deleteStatusFail (line 182) | function deleteStatusFail(id, error) {
function fetchContext (line 190) | function fetchContext(id) {
function fetchContextRequest (line 208) | function fetchContextRequest(id) {
function fetchContextSuccess (line 215) | function fetchContextSuccess(id, ancestors, descendants) {
function fetchContextFail (line 225) | function fetchContextFail(id, error) {
function muteStatus (line 234) | function muteStatus(id) {
function muteStatusRequest (line 246) | function muteStatusRequest(id) {
function muteStatusSuccess (line 253) | function muteStatusSuccess(id) {
function muteStatusFail (line 260) | function muteStatusFail(id, error) {
function unmuteStatus (line 268) | function unmuteStatus(id) {
function unmuteStatusRequest (line 280) | function unmuteStatusRequest(id) {
function unmuteStatusSuccess (line 287) | function unmuteStatusSuccess(id) {
function unmuteStatusFail (line 294) | function unmuteStatusFail(id, error) {
function hideStatus (line 302) | function hideStatus(ids) {
function revealStatus (line 313) | function revealStatus(ids) {
FILE: app/javascript/mastodon/actions/store.js
constant STORE_HYDRATE (line 5) | const STORE_HYDRATE = 'STORE_HYDRATE';
constant STORE_HYDRATE_LAZY (line 6) | const STORE_HYDRATE_LAZY = 'STORE_HYDRATE_LAZY';
function hydrateStore (line 12) | function hydrateStore(rawState) {
FILE: app/javascript/mastodon/actions/streaming.js
function connectTimelineStream (line 16) | function connectTimelineStream (timelineId, path, pollingRefresh = null,...
FILE: app/javascript/mastodon/actions/suggestions.js
constant SUGGESTIONS_FETCH_REQUEST (line 4) | const SUGGESTIONS_FETCH_REQUEST = 'SUGGESTIONS_FETCH_REQUEST';
constant SUGGESTIONS_FETCH_SUCCESS (line 5) | const SUGGESTIONS_FETCH_SUCCESS = 'SUGGESTIONS_FETCH_SUCCESS';
constant SUGGESTIONS_FETCH_FAIL (line 6) | const SUGGESTIONS_FETCH_FAIL = 'SUGGESTIONS_FETCH_FAIL';
constant SUGGESTIONS_DISMISS (line 8) | const SUGGESTIONS_DISMISS = 'SUGGESTIONS_DISMISS';
function fetchSuggestions (line 10) | function fetchSuggestions() {
function fetchSuggestionsRequest (line 21) | function fetchSuggestionsRequest() {
function fetchSuggestionsSuccess (line 28) | function fetchSuggestionsSuccess(accounts) {
function fetchSuggestionsFail (line 36) | function fetchSuggestionsFail(error) {
FILE: app/javascript/mastodon/actions/timelines.js
constant TIMELINE_UPDATE (line 5) | const TIMELINE_UPDATE = 'TIMELINE_UPDATE';
constant TIMELINE_DELETE (line 6) | const TIMELINE_DELETE = 'TIMELINE_DELETE';
constant TIMELINE_CLEAR (line 7) | const TIMELINE_CLEAR = 'TIMELINE_CLEAR';
constant TIMELINE_EXPAND_REQUEST (line 9) | const TIMELINE_EXPAND_REQUEST = 'TIMELINE_EXPAND_REQUEST';
constant TIMELINE_EXPAND_SUCCESS (line 10) | const TIMELINE_EXPAND_SUCCESS = 'TIMELINE_EXPAND_SUCCESS';
constant TIMELINE_EXPAND_FAIL (line 11) | const TIMELINE_EXPAND_FAIL = 'TIMELINE_EXPAND_FAIL';
constant TIMELINE_SCROLL_TOP (line 13) | const TIMELINE_SCROLL_TOP = 'TIMELINE_SCROLL_TOP';
constant TIMELINE_CONNECT (line 15) | const TIMELINE_CONNECT = 'TIMELINE_CONNECT';
constant TIMELINE_DISCONNECT (line 16) | const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT';
function updateTimeline (line 18) | function updateTimeline(timeline, status, accept) {
function deleteFromTimelines (line 34) | function deleteFromTimelines(id) {
function clearTimeline (line 50) | function clearTimeline(timeline) {
function expandTimeline (line 64) | function expandTimeline(timelineId, path, params = {}, done = noOp) {
function expandTimelineRequest (line 110) | function expandTimelineRequest(timeline, isLoadingMore) {
function expandTimelineSuccess (line 118) | function expandTimelineSuccess(timeline, statuses, next, partial, isLoad...
function expandTimelineFail (line 130) | function expandTimelineFail(timeline, error, isLoadingMore) {
function scrollTopTimeline (line 139) | function scrollTopTimeline(timeline, top) {
function connectTimeline (line 147) | function connectTimeline(timeline) {
function disconnectTimeline (line 154) | function disconnectTimeline(timeline) {
FILE: app/javascript/mastodon/api.js
function setCSRFHeader (line 17) | function setCSRFHeader() {
FILE: app/javascript/mastodon/base_polyfills.js
method value (line 30) | value(callback, type = 'image/png', quality) {
FILE: app/javascript/mastodon/common.js
function start (line 3) | function start() {
FILE: app/javascript/mastodon/compare_id.js
function compareId (line 1) | function compareId(id1, id2) {
FILE: app/javascript/mastodon/components/account.js
class Account (line 22) | @injectIntl
method render (line 62) | render () {
FILE: app/javascript/mastodon/components/attachment_list.js
class AttachmentList (line 9) | class AttachmentList extends ImmutablePureComponent {
method render (line 16) | render () {
FILE: app/javascript/mastodon/components/autosuggest_emoji.js
class AutosuggestEmoji (line 7) | class AutosuggestEmoji extends React.PureComponent {
method render (line 13) | render () {
FILE: app/javascript/mastodon/components/autosuggest_input.js
class AutosuggestInput (line 36) | class AutosuggestInput extends ImmutablePureComponent {
method componentWillReceiveProps (line 156) | componentWillReceiveProps (nextProps) {
method render (line 188) | render () {
FILE: app/javascript/mastodon/components/autosuggest_textarea.js
class AutosuggestTextarea (line 36) | class AutosuggestTextarea extends ImmutablePureComponent {
method componentWillReceiveProps (line 155) | componentWillReceiveProps (nextProps) {
method render (line 194) | render () {
FILE: app/javascript/mastodon/components/avatar.js
class Avatar (line 6) | class Avatar extends React.PureComponent {
method render (line 36) | render () {
FILE: app/javascript/mastodon/components/avatar_composite.js
class AvatarComposite (line 6) | class AvatarComposite extends React.PureComponent {
method renderItem (line 18) | renderItem (account, size, index) {
method render (line 86) | render() {
FILE: app/javascript/mastodon/components/avatar_overlay.js
class AvatarOverlay (line 6) | class AvatarOverlay extends React.PureComponent {
method render (line 18) | render() {
FILE: app/javascript/mastodon/components/button.js
class Button (line 5) | class Button extends React.PureComponent {
method focus (line 33) | focus() {
method render (line 37) | render () {
FILE: app/javascript/mastodon/components/column.js
class Column (line 6) | class Column extends React.PureComponent {
method scrollTop (line 13) | scrollTop () {
method componentDidMount (line 35) | componentDidMount () {
method componentWillUnmount (line 39) | componentWillUnmount () {
method render (line 43) | render () {
FILE: app/javascript/mastodon/components/column_back_button.js
class ColumnBackButton (line 6) | class ColumnBackButton extends React.PureComponent {
method render (line 20) | render () {
FILE: app/javascript/mastodon/components/column_back_button_slim.js
class ColumnBackButtonSlim (line 6) | class ColumnBackButtonSlim extends ColumnBackButton {
method render (line 8) | render () {
FILE: app/javascript/mastodon/components/column_header.js
class ColumnHeader (line 14) | @injectIntl
method render (line 81) | render () {
FILE: app/javascript/mastodon/components/display_name.js
class DisplayName (line 5) | class DisplayName extends React.PureComponent {
method render (line 13) | render () {
FILE: app/javascript/mastodon/components/domain.js
class Account (line 11) | @injectIntl
method render (line 24) | render () {
FILE: app/javascript/mastodon/components/dropdown_menu.js
class DropdownMenu (line 13) | class DropdownMenu extends React.PureComponent {
method componentDidMount (line 44) | componentDidMount () {
method componentWillUnmount (line 52) | componentWillUnmount () {
method renderItem (line 120) | renderItem (option, i) {
method render (line 136) | render () {
class Dropdown (line 160) | class Dropdown extends React.PureComponent {
method render (line 247) | render () {
FILE: app/javascript/mastodon/components/error_boundary.js
class ErrorBoundary (line 5) | class ErrorBoundary extends React.PureComponent {
method componentDidCatch (line 17) | componentDidCatch(error, info) {
method render (line 25) | render() {
FILE: app/javascript/mastodon/components/extended_video_player.js
class ExtendedVideoPlayer (line 4) | class ExtendedVideoPlayer extends React.PureComponent {
method componentDidMount (line 23) | componentDidMount () {
method componentWillUnmount (line 27) | componentWillUnmount () {
method render (line 41) | render () {
FILE: app/javascript/mastodon/components/icon.js
class Icon (line 5) | class Icon extends React.PureComponent {
method render (line 13) | render () {
FILE: app/javascript/mastodon/components/icon_button.js
class IconButton (line 8) | class IconButton extends React.PureComponent {
method render (line 45) | render () {
FILE: app/javascript/mastodon/components/intersection_observer_article.js
class IntersectionObserverArticle (line 12) | class IntersectionObserverArticle extends React.Component {
method shouldComponentUpdate (line 29) | shouldComponentUpdate (nextProps, nextState) {
method componentDidMount (line 41) | componentDidMount () {
method componentWillUnmount (line 53) | componentWillUnmount () {
method render (line 104) | render () {
FILE: app/javascript/mastodon/components/load_gap.js
class LoadGap (line 10) | @injectIntl
method render (line 24) | render () {
FILE: app/javascript/mastodon/components/load_more.js
class LoadMore (line 5) | class LoadMore extends React.PureComponent {
method render (line 17) | render() {
FILE: app/javascript/mastodon/components/media_gallery.js
class Item (line 16) | class Item extends React.PureComponent {
method hoverToPlay (line 51) | hoverToPlay () {
method componentDidMount (line 71) | componentDidMount () {
method componentDidUpdate (line 77) | componentDidUpdate (prevProps) {
method _decode (line 83) | _decode () {
method render (line 103) | render () {
class MediaGallery (line 234) | @injectIntl
method componentWillReceiveProps (line 260) | componentWillReceiveProps (nextProps) {
method isStandaloneEligible (line 291) | isStandaloneEligible() {
method render (line 296) | render () {
FILE: app/javascript/mastodon/components/modal_root.js
class ModalRoot (line 4) | class ModalRoot extends React.PureComponent {
method componentDidMount (line 24) | componentDidMount () {
method componentWillReceiveProps (line 28) | componentWillReceiveProps (nextProps) {
method componentDidUpdate (line 42) | componentDidUpdate (prevProps) {
method componentWillUnmount (line 53) | componentWillUnmount () {
method render (line 65) | render () {
FILE: app/javascript/mastodon/components/permalink.js
class Permalink (line 4) | class Permalink extends React.PureComponent {
method render (line 30) | render () {
FILE: app/javascript/mastodon/components/poll.js
class Poll (line 23) | @injectIntl
method renderOption (line 71) | renderOption (option, optionIndex) {
method render (line 113) | render () {
FILE: app/javascript/mastodon/components/relative_timestamp.js
constant SECOND (line 32) | const SECOND = 1000;
constant MINUTE (line 33) | const MINUTE = 1000 * 60;
constant HOUR (line 34) | const HOUR = 1000 * 60 * 60;
constant DAY (line 35) | const DAY = 1000 * 60 * 60 * 24;
constant MAX_DELAY (line 37) | const MAX_DELAY = 2147483647;
class RelativeTimestamp (line 114) | @injectIntl
method shouldComponentUpdate (line 132) | shouldComponentUpdate (nextProps, nextState) {
method componentWillReceiveProps (line 140) | componentWillReceiveProps (nextProps) {
method componentDidMount (line 146) | componentDidMount () {
method componentWillUpdate (line 150) | componentWillUpdate (nextProps, nextState) {
method componentWillUnmount (line 154) | componentWillUnmount () {
method _scheduleNextUpdate (line 158) | _scheduleNextUpdate (props, state) {
method render (line 173) | render () {
FILE: app/javascript/mastodon/components/scrollable_list.js
constant MOUSE_IDLE_DELAY (line 13) | const MOUSE_IDLE_DELAY = 300;
class ScrollableList (line 15) | class ScrollableList extends PureComponent {
method componentDidMount (line 124) | componentDidMount () {
method getSnapshotBeforeUpdate (line 148) | getSnapshotBeforeUpdate (prevProps) {
method componentDidUpdate (line 160) | componentDidUpdate (prevProps, prevState, snapshot) {
method componentWillUnmount (line 174) | componentWillUnmount () {
method attachIntersectionObserver (line 185) | attachIntersectionObserver () {
method detachIntersectionObserver (line 192) | detachIntersectionObserver () {
method attachScrollListener (line 196) | attachScrollListener () {
method detachScrollListener (line 201) | detachScrollListener () {
method getFirstChildKey (line 206) | getFirstChildKey (props) {
method render (line 228) | render () {
FILE: app/javascript/mastodon/components/setting_text.js
class SettingText (line 5) | class SettingText extends React.PureComponent {
method render (line 18) | render () {
FILE: app/javascript/mastodon/components/status.js
class Status (line 54) | @injectIntl
method componentDidMount (line 106) | componentDidMount () {
method getSnapshotBeforeUpdate (line 110) | getSnapshotBeforeUpdate () {
method getDerivedStateFromProps (line 118) | static getDerivedStateFromProps(nextProps, prevState) {
method componentDidUpdate (line 130) | componentDidUpdate (prevProps, prevState, snapshot) {
method componentWillUnmount (line 144) | componentWillUnmount() {
method renderLoadingMediaGallery (line 201) | renderLoadingMediaGallery () {
method renderLoadingVideoPlayer (line 205) | renderLoadingVideoPlayer () {
method _properStatus (line 255) | _properStatus () {
method render (line 269) | render () {
FILE: app/javascript/mastodon/components/status_action_bar.js
class StatusActionBar (line 48) | @injectIntl
method render (line 180) | render () {
FILE: app/javascript/mastodon/components/status_content.js
constant MAX_HEIGHT (line 11) | const MAX_HEIGHT = 642;
class StatusContent (line 13) | class StatusContent extends React.PureComponent {
method _updateStatusLinks (line 32) | _updateStatusLinks () {
method componentDidMount (line 74) | componentDidMount () {
method componentDidUpdate (line 78) | componentDidUpdate () {
method render (line 145) | render () {
FILE: app/javascript/mastodon/components/status_list.js
class StatusList (line 11) | class StatusList extends ImmutablePureComponent {
method _selectChild (line 61) | _selectChild (index, align_top) {
method render (line 79) | render () {
FILE: app/javascript/mastodon/containers/account_container.js
method onFollow (line 34) | onFollow (account) {
method onBlock (line 50) | onBlock (account) {
method onMute (line 58) | onMute (account) {
method onMuteNotifications (line 67) | onMuteNotifications (account, notifications) {
FILE: app/javascript/mastodon/containers/compose_container.js
class TimelineContainer (line 23) | class TimelineContainer extends React.PureComponent {
method render (line 29) | render () {
FILE: app/javascript/mastodon/containers/domain_container.js
method onBlockDomain (line 19) | onBlockDomain (domain) {
method onUnblockDomain (line 27) | onUnblockDomain (domain) {
FILE: app/javascript/mastodon/containers/dropdown_menu_container.js
method onOpen (line 15) | onOpen(id, onItemClick, dropdownPlacement, keyboard) {
method onClose (line 22) | onClose(id) {
FILE: app/javascript/mastodon/containers/intersection_observer_article_container.js
method onHeightChange (line 11) | onHeightChange (key, id, height) {
FILE: app/javascript/mastodon/containers/mastodon.js
class MastodonMount (line 31) | @connect(mapStateToProps)
method render (line 38) | render () {
class Mastodon (line 56) | class Mastodon extends React.PureComponent {
method componentDidMount (line 62) | componentDidMount() {
method componentWillUnmount (line 66) | componentWillUnmount () {
method render (line 73) | render () {
FILE: app/javascript/mastodon/containers/media_container.js
constant MEDIA_COMPONENTS (line 17) | const MEDIA_COMPONENTS = { MediaGallery, Video, Card, Poll };
class MediaContainer (line 19) | class MediaContainer extends PureComponent {
method render (line 49) | render () {
FILE: app/javascript/mastodon/containers/status_container.js
method onReply (line 56) | onReply (status, router) {
method onModalReblog (line 71) | onModalReblog (status) {
method onReblog (line 79) | onReblog (status, e) {
method onFavourite (line 87) | onFavourite (status) {
method onPin (line 95) | onPin (status) {
method onEmbed (line 103) | onEmbed (status) {
method onDelete (line 110) | onDelete (status, history, withRedraft = false) {
method onDirect (line 122) | onDirect (account, router) {
method onMention (line 126) | onMention (account, router) {
method onOpenMedia (line 130) | onOpenMedia (media, index) {
method onOpenVideo (line 134) | onOpenVideo (media, time) {
method onBlock (line 138) | onBlock (status) {
method onReport (line 152) | onReport (status) {
method onMute (line 156) | onMute (account) {
method onMuteConversation (line 160) | onMuteConversation (status) {
method onToggleHidden (line 168) | onToggleHidden (status) {
FILE: app/javascript/mastodon/containers/timeline_container.js
class TimelineContainer (line 23) | class TimelineContainer extends React.PureComponent {
method render (line 35) | render () {
FILE: app/javascript/mastodon/features/account/components/header.js
class Header (line 58) | @injectIntl
method render (line 82) | render () {
FILE: app/javascript/mastodon/features/account_gallery/components/media_item.js
class MediaItem (line 11) | class MediaItem extends ImmutablePureComponent {
method componentDidMount (line 24) | componentDidMount () {
method componentDidUpdate (line 30) | componentDidUpdate (prevProps) {
method _decode (line 36) | _decode () {
method hoverToPlay (line 69) | hoverToPlay () {
method render (line 85) | render () {
FILE: app/javascript/mastodon/features/account_gallery/index.js
class LoadMoreMedia (line 26) | class LoadMoreMedia extends ImmutablePureComponent {
method render (line 38) | render () {
class AccountGallery (line 49) | @connect(mapStateToProps)
method componentDidMount (line 65) | componentDidMount () {
method componentWillReceiveProps (line 70) | componentWillReceiveProps (nextProps) {
method render (line 118) | render () {
FILE: app/javascript/mastodon/features/account_timeline/components/header.js
class Header (line 10) | class Header extends ImmutablePureComponent {
method render (line 86) | render () {
FILE: app/javascript/mastodon/features/account_timeline/components/moved_note.js
class MovedNote (line 10) | class MovedNote extends ImmutablePureComponent {
method render (line 30) | render () {
FILE: app/javascript/mastodon/features/account_timeline/containers/header_container.js
method onFollow (line 47) | onFollow (account) {
method onBlock (line 63) | onBlock (account) {
method onMention (line 80) | onMention (account, router) {
method onDirect (line 84) | onDirect (account, router) {
method onReblogToggle (line 88) | onReblogToggle (account) {
method onEndorseToggle (line 96) | onEndorseToggle (account) {
method onReport (line 104) | onReport (account) {
method onMute (line 108) | onMute (account) {
method onBlockDomain (line 116) | onBlockDomain (domain) {
method onUnblockDomain (line 124) | onUnblockDomain (domain) {
method onAddToList (line 128) | onAddToList(account){
FILE: app/javascript/mastodon/features/account_timeline/index.js
class AccountTimeline (line 33) | @connect(mapStateToProps)
method componentWillMount (line 49) | componentWillMount () {
method componentWillReceiveProps (line 62) | componentWillReceiveProps (nextProps) {
method render (line 79) | render () {
FILE: app/javascript/mastodon/features/blocks/index.js
class Blocks (line 24) | @connect(mapStateToProps)
method componentWillMount (line 37) | componentWillMount () {
method render (line 45) | render () {
FILE: app/javascript/mastodon/features/community_timeline/components/column_settings.js
class ColumnSettings (line 7) | @injectIntl
method render (line 17) | render () {
FILE: app/javascript/mastodon/features/community_timeline/containers/column_settings_container.js
method onChange (line 18) | onChange (key, checked) {
FILE: app/javascript/mastodon/features/community_timeline/index.js
class CommunityTimeline (line 28) | @connect(mapStateToProps)
method componentDidMount (line 69) | componentDidMount () {
method componentDidUpdate (line 76) | componentDidUpdate (prevProps) {
method componentWillUnmount (line 86) | componentWillUnmount () {
method render (line 103) | render () {
FILE: app/javascript/mastodon/features/compose/components/action_bar.js
class ActionBar (line 20) | @injectIntl
method render (line 28) | render () {
FILE: app/javascript/mastodon/features/compose/components/autosuggest_account.js
class AutosuggestAccount (line 7) | class AutosuggestAccount extends ImmutablePureComponent {
method render (line 13) | render () {
FILE: app/javascript/mastodon/features/compose/components/character_counter.js
class CharacterCounter (line 5) | class CharacterCounter extends React.PureComponent {
method checkRemainingText (line 12) | checkRemainingText (diff) {
method render (line 20) | render () {
FILE: app/javascript/mastodon/features/compose/components/compose_form.js
class ComposeForm (line 34) | @injectIntl
method componentDidUpdate (line 125) | componentDidUpdate (prevProps) {
method render (line 178) | render () {
FILE: app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
class ModifierPickerMenu (line 47) | class ModifierPickerMenu extends React.PureComponent {
method componentWillReceiveProps (line 59) | componentWillReceiveProps (nextProps) {
method componentWillUnmount (line 67) | componentWillUnmount () {
method attachListeners (line 77) | attachListeners () {
method removeListeners (line 82) | removeListeners () {
method render (line 91) | render () {
class ModifierPicker (line 108) | class ModifierPicker extends React.PureComponent {
method render (line 131) | render () {
class EmojiPickerMenu (line 144) | @injectIntl
method componentDidMount (line 179) | componentDidMount () {
method componentWillUnmount (line 184) | componentWillUnmount () {
method render (line 236) | render () {
class EmojiPickerDropdown (line 281) | @injectIntl
method render (line 350) | render () {
FILE: app/javascript/mastodon/features/compose/components/navigation_bar.js
class NavigationBar (line 11) | class NavigationBar extends ImmutablePureComponent {
method render (line 18) | render () {
FILE: app/javascript/mastodon/features/compose/components/poll_button.js
class PollButton (line 17) | @injectIntl
method render (line 32) | render () {
FILE: app/javascript/mastodon/features/compose/components/poll_form.js
class Option (line 21) | @injectIntl
method render (line 65) | render () {
class PollForm (line 101) | @injectIntl
method render (line 131) | render () {
FILE: app/javascript/mastodon/features/compose/components/privacy_dropdown.js
class PrivacyDropdownMenu (line 26) | class PrivacyDropdownMenu extends React.PureComponent {
method componentDidMount (line 102) | componentDidMount () {
method componentWillUnmount (line 109) | componentWillUnmount () {
method render (line 122) | render () {
class PrivacyDropdown (line 153) | @injectIntl
method componentWillMount (line 213) | componentWillMount () {
method render (line 224) | render () {
FILE: app/javascript/mastodon/features/compose/components/reply_indicator.js
class ReplyIndicator (line 16) | @injectIntl
method render (line 40) | render () {
FILE: app/javascript/mastodon/features/compose/components/search.js
class SearchPopout (line 14) | class SearchPopout extends React.PureComponent {
method render (line 20) | render () {
class Search (line 47) | @injectIntl
method render (line 104) | render () {
FILE: app/javascript/mastodon/features/compose/components/search_results.js
class SearchResults (line 15) | @injectIntl
method componentDidMount (line 26) | componentDidMount () {
method render (line 30) | render () {
FILE: app/javascript/mastodon/features/compose/components/text_icon_button.js
class TextIconButton (line 4) | class TextIconButton extends React.PureComponent {
method render (line 19) | render () {
FILE: app/javascript/mastodon/features/compose/components/upload.js
class Upload (line 15) | @injectIntl
method render (line 88) | render () {
FILE: app/javascript/mastodon/features/compose/components/upload_button.js
class UploadButton (line 26) | @connect(makeMapStateToProps)
method render (line 54) | render () {
FILE: app/javascript/mastodon/features/compose/components/upload_form.js
class UploadForm (line 8) | class UploadForm extends ImmutablePureComponent {
method render (line 14) | render () {
FILE: app/javascript/mastodon/features/compose/components/upload_progress.js
class UploadProgress (line 8) | class UploadProgress extends React.PureComponent {
method render (line 15) | render () {
FILE: app/javascript/mastodon/features/compose/components/warning.js
class Warning (line 6) | class Warning extends React.PureComponent {
method render (line 12) | render () {
FILE: app/javascript/mastodon/features/compose/containers/compose_form_container.js
method onChange (line 32) | onChange (text) {
method onSubmit (line 36) | onSubmit (router) {
method onClearSuggestions (line 40) | onClearSuggestions () {
method onFetchSuggestions (line 44) | onFetchSuggestions (token) {
method onSuggestionSelected (line 48) | onSuggestionSelected (position, token, suggestion, path) {
method onChangeSpoilerText (line 52) | onChangeSpoilerText (checked) {
method onPaste (line 56) | onPaste (files) {
method onPickEmoji (line 60) | onPickEmoji (position, data, needsSpace) {
FILE: app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js
constant DEFAULTS (line 11) | const DEFAULTS = [
FILE: app/javascript/mastodon/features/compose/containers/poll_button_container.js
method onClick (line 12) | onClick () {
FILE: app/javascript/mastodon/features/compose/containers/poll_form_container.js
method onAddOption (line 18) | onAddOption(title) {
method onRemoveOption (line 22) | onRemoveOption(index) {
method onChangeOption (line 26) | onChangeOption(index, title) {
method onChangeSettings (line 30) | onChangeSettings(expiresIn, isMultiple) {
method onClearSuggestions (line 34) | onClearSuggestions () {
method onFetchSuggestions (line 38) | onFetchSuggestions (token) {
method onSuggestionSelected (line 42) | onSuggestionSelected (position, token, accountId, path) {
FILE: app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js
method onChange (line 14) | onChange (value) {
FILE: app/javascript/mastodon/features/compose/containers/reply_indicator_container.js
method onCancel (line 18) | onCancel () {
FILE: app/javascript/mastodon/features/compose/containers/search_container.js
method onChange (line 17) | onChange (value) {
method onClear (line 21) | onClear () {
method onSubmit (line 25) | onSubmit () {
method onShow (line 29) | onShow () {
FILE: app/javascript/mastodon/features/compose/containers/sensitive_button_container.js
method onClick (line 20) | onClick () {
class SensitiveButton (line 26) | class SensitiveButton extends React.PureComponent {
method render (line 35) | render () {
FILE: app/javascript/mastodon/features/compose/containers/spoiler_button_container.js
method onClick (line 20) | onClick () {
FILE: app/javascript/mastodon/features/compose/containers/upload_button_container.js
method onSelectFile (line 13) | onSelectFile (files) {
FILE: app/javascript/mastodon/features/compose/containers/upload_container.js
method onSubmit (line 25) | onSubmit (router) {
FILE: app/javascript/mastodon/features/compose/containers/warning_container.js
constant APPROX_HASHTAG_RE (line 8) | const APPROX_HASHTAG_RE = /(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i;
FILE: app/javascript/mastodon/features/compose/index.js
class Compose (line 35) | @connect(mapStateToProps)
method componentDidMount (line 48) | componentDidMount () {
method componentWillUnmount (line 56) | componentWillUnmount () {
method render (line 72) | render () {
FILE: app/javascript/mastodon/features/compose/util/counter.js
function countableText (line 5) | function countableText(inputText) {
FILE: app/javascript/mastodon/features/direct_timeline/components/conversation.js
class Conversation (line 7) | class Conversation extends ImmutablePureComponent {
method render (line 45) | render () {
FILE: app/javascript/mastodon/features/direct_timeline/components/conversations_list.js
class ConversationsList (line 9) | class ConversationsList extends ImmutablePureComponent {
method _selectChild (line 31) | _selectChild (index, align_top) {
method render (line 57) | render () {
FILE: app/javascript/mastodon/features/direct_timeline/index.js
class DirectTimeline (line 16) | @connect()
method componentDidMount (line 48) | componentDidMount () {
method componentWillUnmount (line 56) | componentWillUnmount () {
method render (line 73) | render () {
FILE: app/javascript/mastodon/features/domain_blocks/index.js
class Blocks (line 25) | @connect(mapStateToProps)
method componentWillMount (line 38) | componentWillMount () {
method render (line 46) | render () {
FILE: app/javascript/mastodon/features/emoji/emoji_mart_search_light.js
function clearCustomEmojis (line 32) | function clearCustomEmojis(pool) {
function addCustomToPool (line 41) | function addCustomToPool(custom, pool) {
function search (line 57) | function search(value, { emojisToShowFilter, maxResults, include, exclud...
FILE: app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.js
function processEmojiMapData (line 17) | function processEmojiMapData(emojiMapData, shortCode) {
FILE: app/javascript/mastodon/features/emoji/emoji_utils.js
constant COLONS_REGEX (line 76) | const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/;
constant SKINS (line 77) | const SKINS = [
function unifiedToNative (line 82) | function unifiedToNative(unified) {
function sanitize (line 89) | function sanitize(emoji) {
function getSanitizedData (line 120) | function getSanitizedData() {
function getData (line 124) | function getData(emoji, skin, set) {
function uniq (line 196) | function uniq(arr) {
function intersect (line 205) | function intersect(a, b) {
function deepMerge (line 212) | function deepMerge(a, b) {
function measureScrollbar (line 234) | function measureScrollbar() {
FILE: app/javascript/mastodon/features/emoji/unicode_to_unified_name.js
function padLeft (line 1) | function padLeft(str, num) {
FILE: app/javascript/mastodon/features/favourited_statuses/index.js
class Favourites (line 24) | @connect(mapStateToProps)
method componentWillMount (line 39) | componentWillMount () {
method render (line 70) | render () {
FILE: app/javascript/mastodon/features/favourites/index.js
class Favourites (line 18) | @connect(mapStateToProps)
method componentWillMount (line 28) | componentWillMount () {
method componentWillReceiveProps (line 32) | componentWillReceiveProps (nextProps) {
method render (line 38) | render () {
FILE: app/javascript/mastodon/features/follow_requests/components/account_authorize.js
class AccountAuthorize (line 16) | @injectIntl
method render (line 26) | render () {
FILE: app/javascript/mastodon/features/follow_requests/containers/account_authorize_container.js
method onAuthorize (line 17) | onAuthorize () {
method onReject (line 21) | onReject () {
FILE: app/javascript/mastodon/features/follow_requests/index.js
class FollowRequests (line 24) | @connect(mapStateToProps)
method componentWillMount (line 37) | componentWillMount () {
method render (line 45) | render () {
FILE: app/javascript/mastodon/features/followers/index.js
class Followers (line 28) | @connect(mapStateToProps)
method componentWillMount (line 41) | componentWillMount () {
method componentWillReceiveProps (line 46) | componentWillReceiveProps (nextProps) {
method render (line 57) | render () {
FILE: app/javascript/mastodon/features/following/index.js
class Following (line 28) | @connect(mapStateToProps)
method componentWillMount (line 41) | componentWillMount () {
method componentWillReceiveProps (line 46) | componentWillReceiveProps (nextProps) {
method render (line 57) | render () {
FILE: app/javascript/mastodon/features/getting_started/index.js
constant NAVIGATION_PANEL_BREAKPOINT (line 58) | const NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2);
class GettingStarted (line 60) | @connect(mapStateToProps, mapDispatchToProps)
method componentDidMount (line 78) | componentDidMount () {
method render (line 91) | render () {
FILE: app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
class ColumnSettings (line 13) | @injectIntl
method hasTags (line 27) | hasTags () {
method tags (line 31) | tags (mode) {
method modeSelect (line 53) | modeSelect (mode) {
method modeLabel (line 76) | modeLabel (mode) {
method render (line 89) | render () {
FILE: app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js
method onChange (line 18) | onChange (key, value) {
method onLoad (line 22) | onLoad (value) {
FILE: app/javascript/mastodon/features/hashtag_timeline/index.js
class HashtagTimeline (line 18) | @connect(mapStateToProps)
method _subscribe (line 79) | _subscribe (dispatch, id, tags = {}) {
method _unsubscribe (line 94) | _unsubscribe () {
method componentDidMount (line 99) | componentDidMount () {
method componentWillReceiveProps (line 107) | componentWillReceiveProps (nextProps) {
method componentWillUnmount (line 119) | componentWillUnmount () {
method render (line 132) | render () {
FILE: app/javascript/mastodon/features/home_timeline/components/column_settings.js
class ColumnSettings (line 7) | @injectIntl
method render (line 16) | render () {
FILE: app/javascript/mastodon/features/home_timeline/containers/column_settings_container.js
method onChange (line 11) | onChange (key, checked) {
method onSave (line 15) | onSave () {
FILE: app/javascript/mastodon/features/home_timeline/index.js
class HomeTimeline (line 22) | @connect(mapStateToProps)
method componentDidMount (line 63) | componentDidMount () {
method componentDidUpdate (line 67) | componentDidUpdate (prevProps) {
method componentWillUnmount (line 71) | componentWillUnmount () {
method _checkIfReloadNeeded (line 75) | _checkIfReloadNeeded (wasPartial, isPartial) {
method _stopPolling (line 89) | _stopPolling () {
method render (line 96) | render () {
FILE: app/javascript/mastodon/features/introduction/index.js
class Introduction (line 101) | @connect(state => ({ domain: state.getIn(['meta', 'domain']) }))
method componentWillMount (line 113) | componentWillMount () {
method componentDidMount (line 121) | componentDidMount() {
method componentWillUnmount (line 125) | componentWillUnmount() {
method render (line 168) | render () {
FILE: app/javascript/mastodon/features/keyboard_shortcuts/index.js
class KeyboardShortcuts (line 12) | @injectIntl
method render (line 20) | render () {
FILE: app/javascript/mastodon/features/list_adder/components/account.js
class Account (line 21) | @connect(makeMapStateToProps)
method render (line 29) | render () {
FILE: app/javascript/mastodon/features/list_adder/components/list.js
class List (line 26) | @connect(MapStateToProps, mapDispatchToProps)
method render (line 42) | render () {
FILE: app/javascript/mastodon/features/list_adder/index.js
class ListAdder (line 31) | @connect(mapStateToProps, mapDispatchToProps)
method componentDidMount (line 44) | componentDidMount () {
method componentWillUnmount (line 49) | componentWillUnmount () {
method render (line 54) | render () {
FILE: app/javascript/mastodon/features/list_editor/components/account.js
class Account (line 34) | @connect(makeMapStateToProps, mapDispatchToProps)
method render (line 50) | render () {
FILE: app/javascript/mastodon/features/list_editor/components/edit_list_form.js
class ListForm (line 22) | @connect(mapStateToProps, mapDispatchToProps)
method render (line 47) | render () {
FILE: app/javascript/mastodon/features/list_editor/components/search.js
class Search (line 23) | @connect(mapStateToProps, mapDispatchToProps)
method render (line 49) | render () {
FILE: app/javascript/mastodon/features/list_editor/index.js
class ListEditor (line 25) | @connect(mapStateToProps, mapDispatchToProps)
method componentDidMount (line 40) | componentDidMount () {
method componentWillUnmount (line 45) | componentWillUnmount () {
method render (line 50) | render () {
FILE: app/javascript/mastodon/features/list_timeline/index.js
class ListTimeline (line 29) | @connect(mapStateToProps)
method componentDidMount (line 68) | componentDidMount () {
method componentWillReceiveProps (line 78) | componentWillReceiveProps (nextProps) {
method componentWillUnmount (line 95) | componentWillUnmount () {
method render (line 134) | render () {
FILE: app/javascript/mastodon/features/lists/components/new_list_form.js
class NewListForm (line 23) | @connect(mapStateToProps, mapDispatchToProps)
method render (line 48) | render () {
FILE: app/javascript/mastodon/features/lists/index.js
class Lists (line 34) | @connect(mapStateToProps)
method componentWillMount (line 45) | componentWillMount () {
method render (line 49) | render () {
FILE: app/javascript/mastodon/features/mutes/index.js
class Mutes (line 24) | @connect(mapStateToProps)
method componentWillMount (line 37) | componentWillMount () {
method render (line 45) | render () {
FILE: app/javascript/mastodon/features/notifications/components/clear_column_button.js
class ClearColumnButton (line 6) | class ClearColumnButton extends React.PureComponent {
method render (line 12) | render () {
FILE: app/javascript/mastodon/features/notifications/components/column_settings.js
class ColumnSettings (line 8) | class ColumnSettings extends React.PureComponent {
method render (line 21) | render () {
FILE: app/javascript/mastodon/features/notifications/components/filter_bar.js
class FilterBar (line 14) | @injectIntl
method onClick (line 24) | onClick (notificationType) {
method render (line 28) | render () {
FILE: app/javascript/mastodon/features/notifications/components/notification.js
class Notification (line 20) | @injectIntl
method getHandlers (line 91) | getHandlers () {
method renderFollow (line 105) | renderFollow (notification, account, link) {
method renderMention (line 127) | renderMention (notification) {
method renderFavourite (line 144) | renderFavourite (notification, link) {
method renderReblog (line 176) | renderReblog (notification, link) {
method renderPoll (line 208) | renderPoll (notification) {
method render (line 240) | render () {
FILE: app/javascript/mastodon/features/notifications/components/setting_toggle.js
class SettingToggle (line 6) | class SettingToggle extends React.PureComponent {
method render (line 20) | render () {
FILE: app/javascript/mastodon/features/notifications/containers/column_settings_container.js
method onChange (line 22) | onChange (path, checked) {
method onClear (line 33) | onClear () {
FILE: app/javascript/mastodon/features/notifications/containers/filter_bar_container.js
method selectFilter (line 11) | selectFilter (newActiveFilter) {
FILE: app/javascript/mastodon/features/notifications/containers/notification_container.js
method onModalReblog (line 38) | onModalReblog (status) {
method onReblog (line 42) | onReblog (status, e) {
method onFavourite (line 54) | onFavourite (status) {
method onToggleHidden (line 62) | onToggleHidden (status) {
FILE: app/javascript/mastodon/features/notifications/index.js
class Notifications (line 46) | @connect(mapStateToProps)
method componentWillUnmount (line 67) | componentWillUnmount () {
method _selectChild (line 124) | _selectChild (index, align_top) {
method render (line 138) | render () {
FILE: app/javascript/mastodon/features/pinned_statuses/index.js
class PinnedStatuses (line 21) | @connect(mapStateToProps)
method componentWillMount (line 33) | componentWillMount () {
method render (line 45) | render () {
FILE: app/javascript/mastodon/features/public_timeline/containers/column_settings_container.js
method onChange (line 18) | onChange (key, checked) {
FILE: app/javascript/mastodon/features/public_timeline/index.js
class PublicTimeline (line 28) | @connect(mapStateToProps)
method componentDidMount (line 69) | componentDidMount () {
method componentDidUpdate (line 76) | componentDidUpdate (prevProps) {
method componentWillUnmount (line 86) | componentWillUnmount () {
method render (line 103) | render () {
FILE: app/javascript/mastodon/features/reblogs/index.js
class Reblogs (line 18) | @connect(mapStateToProps)
method componentWillMount (line 28) | componentWillMount () {
method componentWillReceiveProps (line 32) | componentWillReceiveProps(nextProps) {
method render (line 38) | render () {
FILE: app/javascript/mastodon/features/report/components/status_check_box.js
class StatusCheckBox (line 10) | class StatusCheckBox extends React.PureComponent {
method render (line 19) | render () {
FILE: app/javascript/mastodon/features/report/containers/status_check_box_container.js
method onToggle (line 13) | onToggle (e) {
FILE: app/javascript/mastodon/features/standalone/compose/index.js
class Compose (line 7) | class Compose extends React.PureComponent {
method render (line 9) | render () {
FILE: app/javascript/mastodon/features/standalone/hashtag_timeline/index.js
class HashtagTimeline (line 18) | @connect(mapStateToProps)
method componentDidMount (line 29) | componentDidMount () {
method render (line 55) | render () {
FILE: app/javascript/mastodon/features/standalone/public_timeline/index.js
class PublicTimeline (line 22) | @connect(mapStateToProps)
method componentDidMount (line 33) | componentDidMount () {
method componentDidUpdate (line 37) | componentDidUpdate (prevProps) {
method _connect (line 43) | _connect () {
method render (line 70) | render () {
FILE: app/javascript/mastodon/features/status/components/action_bar.js
class ActionBar (line 34) | @injectIntl
method render (line 136) | render () {
FILE: app/javascript/mastodon/features/status/components/card.js
constant IDNA_PREFIX (line 9) | const IDNA_PREFIX = 'xn--';
class Card (line 57) | class Card extends React.PureComponent {
method componentWillReceiveProps (line 78) | componentWillReceiveProps (nextProps) {
method renderVideo (line 122) | renderVideo () {
method render (line 139) | render () {
FILE: app/javascript/mastodon/features/status/components/detailed_status.js
class DetailedStatus (line 17) | class DetailedStatus extends ImmutablePureComponent {
method _measureHeight (line 57) | _measureHeight (heightJustChanged) {
method componentDidUpdate (line 72) | componentDidUpdate (prevProps, prevState) {
method render (line 90) | render () {
FILE: app/javascript/mastodon/features/status/containers/detailed_status_container.js
method onReply (line 57) | onReply (status, router) {
method onModalReblog (line 72) | onModalReblog (status) {
method onReblog (line 76) | onReblog (status, e) {
method onFavourite (line 88) | onFavourite (status) {
method onPin (line 96) | onPin (status) {
method onEmbed (line 104) | onEmbed (status) {
method onDelete (line 111) | onDelete (status, history, withRedraft = false) {
method onDirect (line 123) | onDirect (account, router) {
method onMention (line 127) | onMention (account, router) {
method onOpenMedia (line 131) | onOpenMedia (media, index) {
method onOpenVideo (line 135) | onOpenVideo (media, time) {
method onBlock (line 139) | onBlock (status) {
method onReport (line 153) | onReport (status) {
method onMute (line 157) | onMute (account) {
method onMuteConversation (line 161) | onMuteConversation (status) {
method onToggleHidden (line 169) | onToggleHidden (status) {
FILE: app/javascript/mastodon/features/status/index.js
class Status (line 113) | @injectIntl
method componentWillMount (line 138) | componentWillMount () {
method componentDidMount (line 142) | componentDidMount () {
method componentWillReceiveProps (line 146) | componentWillReceiveProps (nextProps) {
method _selectChild (line 363) | _selectChild (index, align_top) {
method renderChildren (line 377) | renderChildren (list) {
method componentDidUpdate (line 393) | componentDidUpdate () {
method componentWillUnmount (line 410) | componentWillUnmount () {
method render (line 418) | render () {
FILE: app/javascript/mastodon/features/ui/components/actions_modal.js
class ActionsModal (line 12) | class ActionsModal extends ImmutablePureComponent {
method render (line 40) | render () {
FILE: app/javascript/mastodon/features/ui/components/boost_modal.js
class BoostModal (line 19) | @injectIntl
method componentDidMount (line 33) | componentDidMount() {
method render (line 54) | render () {
FILE: app/javascript/mastodon/features/ui/components/bundle.js
class Bundle (line 7) | class Bundle extends React.PureComponent {
method componentWillMount (line 36) | componentWillMount() {
method componentWillReceiveProps (line 40) | componentWillReceiveProps(nextProps) {
method componentWillUnmount (line 46) | componentWillUnmount () {
method render (line 88) | render() {
FILE: app/javascript/mastodon/features/ui/components/bundle_column_error.js
class BundleColumnError (line 16) | class BundleColumnError extends React.PureComponent {
method render (line 27) | render () {
FILE: app/javascript/mastodon/features/ui/components/bundle_modal_error.js
class BundleModalError (line 13) | class BundleModalError extends React.PureComponent {
method render (line 25) | render () {
FILE: app/javascript/mastodon/features/ui/components/column.js
class Column (line 8) | class Column extends React.PureComponent {
method scrollTop (line 28) | scrollTop () {
method render (line 49) | render () {
FILE: app/javascript/mastodon/features/ui/components/column_header.js
class ColumnHeader (line 6) | class ColumnHeader extends React.PureComponent {
method render (line 20) | render () {
FILE: app/javascript/mastodon/features/ui/components/column_loading.js
class ColumnLoading (line 8) | class ColumnLoading extends ImmutablePureComponent {
method render (line 20) | render() {
FILE: app/javascript/mastodon/features/ui/components/columns_area.js
class ColumnsArea (line 42) | class ColumnsArea extends ImmutablePureComponent {
method componentWillReceiveProps (line 60) | componentWillReceiveProps() {
method componentDidMount (line 64) | componentDidMount() {
method componentWillUpdate (line 75) | componentWillUpdate(nextProps) {
method componentDidUpdate (line 81) | componentDidUpdate(prevProps) {
method componentWillUnmount (line 89) | componentWillUnmount () {
method handleChildrenContentChange (line 95) | handleChildrenContentChange() {
method render (line 158) | render () {
FILE: app/javascript/mastodon/features/ui/components/confirmation_modal.js
class ConfirmationModal (line 6) | @injectIntl
method componentDidMount (line 19) | componentDidMount() {
method render (line 41) | render () {
FILE: app/javascript/mastodon/features/ui/components/embed_modal.js
class EmbedModal (line 7) | @injectIntl
method componentDidMount (line 22) | componentDidMount () {
method render (line 52) | render () {
FILE: app/javascript/mastodon/features/ui/components/focal_point_modal.js
class FocalPointModal (line 22) | @connect(mapStateToProps, mapDispatchToProps)
method componentWillMount (line 37) | componentWillMount () {
method componentWillReceiveProps (line 41) | componentWillReceiveProps (nextProps) {
method componentWillUnmount (line 47) | componentWillUnmount () {
method render (line 98) | render () {
FILE: app/javascript/mastodon/features/ui/components/follow_requests_nav_link.js
class FollowRequestsNavLink (line 16) | @withRouter
method componentDidMount (line 26) | componentDidMount () {
method render (line 34) | render () {
FILE: app/javascript/mastodon/features/ui/components/image_loader.js
class ImageLoader (line 7) | class ImageLoader extends React.PureComponent {
method canvasContext (line 33) | get canvasContext() {
method componentDidMount (line 41) | componentDidMount () {
method componentWillReceiveProps (line 45) | componentWillReceiveProps (nextProps) {
method componentWillUnmount (line 51) | componentWillUnmount () {
method loadImage (line 55) | loadImage (props) {
method clearPreviewCanvas (line 90) | clearPreviewCanvas () {
method removeEventListeners (line 115) | removeEventListeners () {
method hasSize (line 120) | hasSize () {
method render (line 130) | render () {
FILE: app/javascript/mastodon/features/ui/components/list_panel.js
class ListPanel (line 23) | @withRouter
method componentDidMount (line 32) | componentDidMount () {
method render (line 37) | render () {
FILE: app/javascript/mastodon/features/ui/components/media_modal.js
class MediaModal (line 22) | @injectIntl
method componentDidMount (line 74) | componentDidMount () {
method componentWillUnmount (line 88) | componentWillUnmount () {
method getIndex (line 100) | getIndex () {
method render (line 117) | render () {
FILE: app/javascript/mastodon/features/ui/components/modal_root.js
constant MODAL_COMPONENTS (line 21) | const MODAL_COMPONENTS = {
class ModalRoot (line 35) | class ModalRoot extends React.PureComponent {
method getSnapshotBeforeUpdate (line 43) | getSnapshotBeforeUpdate () {
method componentDidUpdate (line 47) | componentDidUpdate (prevProps, prevState, { visible }) {
method render (line 65) | render () {
FILE: app/javascript/mastodon/features/ui/components/mute_modal.js
method onConfirm (line 22) | onConfirm(account, notifications) {
method onClose (line 26) | onClose() {
method onToggleNotifications (line 30) | onToggleNotifications() {
class MuteModal (line 36) | @connect(mapStateToProps, mapDispatchToProps)
method componentDidMount (line 50) | componentDidMount() {
method render (line 71) | render () {
FILE: app/javascript/mastodon/features/ui/components/report_modal.js
class ReportModal (line 40) | @connect(makeMapStateToProps)
method componentDidMount (line 72) | componentDidMount () {
method componentWillReceiveProps (line 76) | componentWillReceiveProps (nextProps) {
method render (line 82) | render () {
FILE: app/javascript/mastodon/features/ui/components/tabs_bar.js
function getIndex (line 19) | function getIndex (path) {
function getLink (line 23) | function getLink (index) {
class TabsBar (line 27) | @injectIntl
method render (line 72) | render () {
FILE: app/javascript/mastodon/features/ui/components/upload_area.js
class UploadArea (line 7) | class UploadArea extends React.PureComponent {
method componentDidMount (line 27) | componentDidMount () {
method componentWillUnmount (line 31) | componentWillUnmount () {
method render (line 35) | render () {
FILE: app/javascript/mastodon/features/ui/components/video_modal.js
class VideoModal (line 10) | class VideoModal extends ImmutablePureComponent {
method componentDidMount (line 23) | componentDidMount () {
method componentWillUnmount (line 35) | componentWillUnmount () {
method render (line 52) | render () {
FILE: app/javascript/mastodon/features/ui/components/zoomable_image.js
constant MIN_SCALE (line 4) | const MIN_SCALE = 1;
constant MAX_SCALE (line 5) | const MAX_SCALE = 4;
class ZoomableImage (line 17) | class ZoomableImage extends React.PureComponent {
method componentDidMount (line 43) | componentDidMount () {
method componentWillUnmount (line 54) | componentWillUnmount () {
method removeEventListeners (line 58) | removeEventListeners () {
method zoom (line 91) | zoom(nextScale, midpoint) {
method render (line 125) | render () {
FILE: app/javascript/mastodon/features/ui/containers/bundle_container.js
method onFetch (line 8) | onFetch () {
method onFetchSuccess (line 11) | onFetchSuccess () {
method onFetchFail (line 14) | onFetchFail (error) {
FILE: app/javascript/mastodon/features/ui/containers/modal_container.js
method onClose (line 11) | onClose () {
FILE: app/javascript/mastodon/features/ui/index.js
class SwitchingColumnsArea (line 99) | class SwitchingColumnsArea extends React.PureComponent {
method componentWillMount (line 111) | componentWillMount () {
method componentDidUpdate (line 115) | componentDidUpdate (prevProps) {
method componentWillUnmount (line 121) | componentWillUnmount () {
method shouldUpdateScroll (line 125) | shouldUpdateScroll (_, { location }) {
method render (line 142) | render () {
class UI (line 192) | @connect(mapStateToProps)
method componentWillMount (line 303) | componentWillMount () {
method componentDidMount (line 326) | componentDidMount () {
method componentWillUnmount (line 332) | componentWillUnmount () {
method render (line 456) | render () {
FILE: app/javascript/mastodon/features/ui/util/async-components.js
function EmojiPicker (line 1) | function EmojiPicker () {
function Compose (line 5) | function Compose () {
function Notifications (line 9) | function Notifications () {
function HomeTimeline (line 13) | function HomeTimeline () {
function PublicTimeline (line 17) | function PublicTimeline () {
function CommunityTimeline (line 21) | function CommunityTimeline () {
function HashtagTimeline (line 25) | function HashtagTimeline () {
function DirectTimeline (line 29) | function DirectTimeline() {
function ListTimeline (line 33) | function ListTimeline () {
function Lists (line 37) | function Lists () {
function Status (line 41) | function Status () {
function GettingStarted (line 45) | function GettingStarted () {
function KeyboardShortcuts (line 49) | function KeyboardShortcuts () {
function PinnedStatuses (line 53) | function PinnedStatuses () {
function AccountTimeline (line 57) | function AccountTimeline () {
function AccountGallery (line 61) | function AccountGallery () {
function Followers (line 65) | function Followers () {
function Following (line 69) | function Following () {
function Reblogs (line 73) | function Reblogs () {
function Favourites (line 77) | function Favourites () {
function FollowRequests (line 81) | function FollowRequests () {
function GenericNotFound (line 85) | function GenericNotFound () {
function FavouritedStatuses (line 89) | function FavouritedStatuses () {
function Blocks (line 93) | function Blocks () {
function DomainBlocks (line 97) | function DomainBlocks () {
function Mutes (line 101) | function Mutes () {
function MuteModal (line 105) | function MuteModal () {
function ReportModal (line 109) | function ReportModal () {
function MediaGallery (line 113) | function MediaGallery () {
function Video (line 117) | function Video () {
function EmbedModal (line 121) | function EmbedModal () {
function ListEditor (line 125) | function ListEditor () {
function ListAdder (line 129) | function ListAdder () {
function Search (line 133) | function Search () {
FILE: app/javascript/mastodon/features/ui/util/get_rect_from_entry.js
function getRectFromEntry (line 7) | function getRectFromEntry(entry) {
FILE: app/javascript/mastodon/features/ui/util/intersection_observer_wrapper.js
class IntersectionObserverWrapper (line 8) | class IntersectionObserverWrapper {
method connect (line 14) | connect (options) {
method observe (line 31) | observe (id, node, callback) {
method unobserve (line 40) | unobserve (id, node) {
method disconnect (line 47) | disconnect () {
FILE: app/javascript/mastodon/features/ui/util/react_router_helpers.js
class WrappedSwitch (line 10) | class WrappedSwitch extends React.PureComponent {
method render (line 12) | render () {
class WrappedRoute (line 32) | class WrappedRoute extends React.Component {
method rend
Condensed preview — 2374 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,923K chars).
[
{
"path": ".buildpacks",
"chars": 180,
"preview": "https://github.com/heroku/heroku-buildpack-apt\nhttps://github.com/Scalingo/ffmpeg-buildpack\nhttps://github.com/Scalingo/"
},
{
"path": ".circleci/config.yml",
"chars": 5684,
"preview": "version: 2\n\naliases:\n - &defaults\n docker:\n - image: circleci/ruby:2.6.0-stretch-node\n environment: &rub"
},
{
"path": ".codeclimate.yml",
"chars": 642,
"preview": "version: \"2\"\nchecks:\n argument-count:\n enabled: false\n complex-logic:\n enabled: false\n file-lines:\n enabled:"
},
{
"path": ".dependabot/config.yml",
"chars": 197,
"preview": "version: 1\n\nupdate_configs:\n - package_manager: \"ruby:bundler\"\n directory: \"/\"\n update_schedule: \"weekly\"\n\n - pa"
},
{
"path": ".dockerignore",
"chars": 142,
"preview": ".bundle\n.env\n.env.*\npublic/system\npublic/assets\npublic/packs\nnode_modules\nneo4j\nvendor/bundle\n.DS_Store\n*.swp\n*~\npostgre"
},
{
"path": ".editorconfig",
"chars": 251,
"preview": "# EditorConfig is awesome: http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Unix-style newlines with"
},
{
"path": ".eslintignore",
"chars": 146,
"preview": "/build/**\n/coverage/**\n/db/**\n/lib/**\n/log/**\n/node_modules/**\n/nonobox/**\n/public/**\n!/public/embed.js\n/spec/**\n/tmp/**"
},
{
"path": ".eslintrc.js",
"chars": 4738,
"preview": "module.exports = {\n root: true,\n\n env: {\n browser: true,\n node: true,\n es6: true,\n jest: true,\n },\n\n glo"
},
{
"path": ".foreman",
"chars": 23,
"preview": "procfile: Procfile.dev\n"
},
{
"path": ".gitattributes",
"chars": 520,
"preview": "* text=auto eol=lf\n*.eot -text\n*.gif -text\n*"
},
{
"path": ".gitignore",
"chars": 1075,
"preview": "# See https://help.github.com/articles/ignoring-files for more about ignoring files.\n#\n# If you find yourself ignoring t"
},
{
"path": ".haml-lint.yml",
"chars": 1905,
"preview": "# Whether to ignore frontmatter at the beginning of HAML documents for\n# frameworks such as Jekyll/Middleman\nskip_frontm"
},
{
"path": ".nanoignore",
"chars": 178,
"preview": ".DS_Store\n.git/\n.gitignore\n\n.bundle/\n.cache/\nconfig/deploy/*\ncoverage\ndocs/\n.env\nlog/*.log\nneo4j/\nnode_modules/\npublic/a"
},
{
"path": ".nvmrc",
"chars": 2,
"preview": "8\n"
},
{
"path": ".profile",
"chars": 150,
"preview": "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/.apt/lib/x86_64-linux-gnu:/app/.apt/usr/lib/x86_64-linux-gnu/mesa:/app/.apt/usr/li"
},
{
"path": ".rspec",
"chars": 46,
"preview": "--color\n--require spec_helper\n--format Fuubar\n"
},
{
"path": ".rubocop.yml",
"chars": 1978,
"preview": "require:\n - rubocop-rails\n\nAllCops:\n TargetRubyVersion: 2.3\n Exclude:\n - 'spec/**/*'\n - 'db/**/*'\n - 'app/views/**"
},
{
"path": ".ruby-version",
"chars": 6,
"preview": "2.6.1\n"
},
{
"path": ".sass-lint.yml",
"chars": 740,
"preview": "# Linter Documentation:\n# https://github.com/sasstools/sass-lint/tree/v1.13.1/docs/options\n\nfiles:\n include: app/javasc"
},
{
"path": ".slugignore",
"chars": 34,
"preview": "node_modules/\n.cache/\ndocs/\nspec/\n"
},
{
"path": ".yarnclean",
"chars": 454,
"preview": "# test directories\n__tests__\ntest\ntests\npowered-test\n\n# asset directories\ndocs\ndoc\nwebsite\nimages\n# assets\n\n# examples\ne"
},
{
"path": "AUTHORS.md",
"chars": 31884,
"preview": "Authors\n=======\n\nMastodon is available on [GitHub](https://github.com/tootsuite/mastodon)\nand provided thanks to the wor"
},
{
"path": "Aptfile",
"chars": 372,
"preview": "ffmpeg\nlibicu[0-9][0-9]\nlibicu-dev\nlibidn11\nlibidn11-dev\nlibpq-dev\nlibprotobuf-dev\nlibssl-dev\nlibxdamage1\nlibxfixes3\npro"
},
{
"path": "CHANGELOG.md",
"chars": 6259,
"preview": "# Changelog\n\nThis changelog will only include differences from upstream Mastodon. [You can find the upstream\nchangelog h"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 18390,
"preview": "### Table of Contents\n\n- [Code of Conduct](#code-of-conduct)\n - [Positive participation and communication](#positive-pa"
},
{
"path": "CONTRIBUTING.md",
"chars": 1801,
"preview": "Contributing\n============\n\nThank you for considering contributing to Florence Mastodon\n\nYou can contribute in the follow"
},
{
"path": "Capfile",
"chars": 369,
"preview": "# frozen_string_literal: true\nrequire 'capistrano/setup'\nrequire 'capistrano/deploy'\nrequire 'capistrano/scm/git'\n\ninsta"
},
{
"path": "Dockerfile",
"chars": 3790,
"preview": "FROM ubuntu:18.04 as build-dep\n\n# Use bash for the shell\nSHELL [\"bash\", \"-c\"]\n\n# Install Node\nENV NODE_VER=\"8.15.0\"\nRUN\t"
},
{
"path": "Gemfile",
"chars": 4172,
"preview": "# frozen_string_literal: true\n\nsource 'https://rubygems.org'\nruby '>= 2.4.0', '< 2.7.0'\n\ngem 'pkg-config', '~> 1.3'\n\ngem"
},
{
"path": "LICENSE",
"chars": 34520,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "Procfile",
"chars": 68,
"preview": "web: bundle exec puma -C config/puma.rb\nworker: bundle exec sidekiq\n"
},
{
"path": "Procfile.dev",
"chars": 190,
"preview": "web: env PORT=3000 bundle exec puma -C config/puma.rb\nsidekiq: env PORT=3000 bundle exec sidekiq\nstream: env PORT=4000 y"
},
{
"path": "README.md",
"chars": 2779,
"preview": "Florence Mastodon\n=================\n\nMastodon is a **free, open-source social network server** based on ActivityPub. Thi"
},
{
"path": "Rakefile",
"chars": 249,
"preview": "# Add your own tasks in files placed in lib/tasks ending in .rake,\n# for example lib/tasks/capistrano.rake, and they wil"
},
{
"path": "Vagrantfile",
"chars": 4613,
"preview": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nENV[\"PORT\"] ||= \"3000\"\n\n$provision = <<SCRIPT\n\ncd /vagrant # This is where the"
},
{
"path": "app/chewy/statuses_index.rb",
"chars": 1946,
"preview": "# frozen_string_literal: true\n\nclass StatusesIndex < Chewy::Index\n settings index: { refresh_interval: '15m' }, analysi"
},
{
"path": "app/controllers/about_controller.rb",
"chars": 483,
"preview": "# frozen_string_literal: true\n\nclass AboutController < ApplicationController\n layout 'public'\n\n before_action :set_ins"
},
{
"path": "app/controllers/account_follow_controller.rb",
"chars": 284,
"preview": "# frozen_string_literal: true\n\nclass AccountFollowController < ApplicationController\n include AccountControllerConcern\n"
},
{
"path": "app/controllers/account_unfollow_controller.rb",
"chars": 283,
"preview": "# frozen_string_literal: true\n\nclass AccountUnfollowController < ApplicationController\n include AccountControllerConcer"
},
{
"path": "app/controllers/accounts_controller.rb",
"chars": 3970,
"preview": "# frozen_string_literal: true\n\nclass AccountsController < ApplicationController\n PAGE_SIZE = 20\n\n include AccountContr"
},
{
"path": "app/controllers/activitypub/collections_controller.rb",
"chars": 1469,
"preview": "# frozen_string_literal: true\n\nclass ActivityPub::CollectionsController < Api::BaseController\n include SignatureVerific"
},
{
"path": "app/controllers/activitypub/inboxes_controller.rb",
"chars": 1515,
"preview": "# frozen_string_literal: true\n\nclass ActivityPub::InboxesController < Api::BaseController\n include SignatureVerificatio"
},
{
"path": "app/controllers/activitypub/outboxes_controller.rb",
"chars": 1923,
"preview": "# frozen_string_literal: true\n\nclass ActivityPub::OutboxesController < Api::BaseController\n LIMIT = 20\n\n include Signa"
},
{
"path": "app/controllers/admin/account_actions_controller.rb",
"chars": 974,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class AccountActionsController < BaseController\n before_action :set_acc"
},
{
"path": "app/controllers/admin/account_moderation_notes_controller.rb",
"chars": 1348,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class AccountModerationNotesController < BaseController\n before_action "
},
{
"path": "app/controllers/admin/accounts_controller.rb",
"chars": 3690,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class AccountsController < BaseController\n before_action :set_account, "
},
{
"path": "app/controllers/admin/action_logs_controller.rb",
"chars": 180,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class ActionLogsController < BaseController\n def index\n @action_lo"
},
{
"path": "app/controllers/admin/base_controller.rb",
"chars": 444,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class BaseController < ApplicationController\n include Authorization\n "
},
{
"path": "app/controllers/admin/change_emails_controller.rb",
"chars": 1118,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class ChangeEmailsController < BaseController\n before_action :set_accou"
},
{
"path": "app/controllers/admin/confirmations_controller.rb",
"chars": 799,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class ConfirmationsController < BaseController\n before_action :set_user"
},
{
"path": "app/controllers/admin/custom_emojis_controller.rb",
"chars": 3223,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class CustomEmojisController < BaseController\n before_action :set_custo"
},
{
"path": "app/controllers/admin/dashboard_controller.rb",
"chars": 2285,
"preview": "# frozen_string_literal: true\nrequire 'sidekiq/api'\n\nmodule Admin\n class DashboardController < BaseController\n def i"
},
{
"path": "app/controllers/admin/domain_blocks_controller.rb",
"chars": 1958,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class DomainBlocksController < BaseController\n before_action :set_domai"
},
{
"path": "app/controllers/admin/email_domain_blocks_controller.rb",
"chars": 1262,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class EmailDomainBlocksController < BaseController\n before_action :set_"
},
{
"path": "app/controllers/admin/followers_controller.rb",
"chars": 371,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class FollowersController < BaseController\n before_action :set_account\n"
},
{
"path": "app/controllers/admin/instances_controller.rb",
"chars": 1486,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class InstancesController < BaseController\n def index\n authorize :"
},
{
"path": "app/controllers/admin/invites_controller.rb",
"chars": 1155,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class InvitesController < BaseController\n def index\n authorize :in"
},
{
"path": "app/controllers/admin/pending_accounts_controller.rb",
"chars": 1501,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class PendingAccountsController < BaseController\n before_action :set_ac"
},
{
"path": "app/controllers/admin/relays_controller.rb",
"chars": 1088,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class RelaysController < BaseController\n before_action :set_relay, exce"
},
{
"path": "app/controllers/admin/report_notes_controller.rb",
"chars": 1424,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class ReportNotesController < BaseController\n before_action :set_report"
},
{
"path": "app/controllers/admin/reported_statuses_controller.rb",
"chars": 1079,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class ReportedStatusesController < BaseController\n before_action :set_r"
},
{
"path": "app/controllers/admin/reports_controller.rb",
"chars": 1674,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class ReportsController < BaseController\n before_action :set_report, ex"
},
{
"path": "app/controllers/admin/resets_controller.rb",
"chars": 311,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class ResetsController < BaseController\n before_action :set_user\n\n d"
},
{
"path": "app/controllers/admin/roles_controller.rb",
"chars": 453,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class RolesController < BaseController\n before_action :set_user\n\n de"
},
{
"path": "app/controllers/admin/settings_controller.rb",
"chars": 1721,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class SettingsController < BaseController\n ADMIN_SETTINGS = %w(\n s"
},
{
"path": "app/controllers/admin/statuses_controller.rb",
"chars": 1990,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class StatusesController < BaseController\n helper_method :current_param"
},
{
"path": "app/controllers/admin/subscriptions_controller.rb",
"chars": 394,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class SubscriptionsController < BaseController\n def index\n authori"
},
{
"path": "app/controllers/admin/tags_controller.rb",
"chars": 918,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class TagsController < BaseController\n before_action :set_tags, only: :"
},
{
"path": "app/controllers/admin/two_factor_authentications_controller.rb",
"chars": 406,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class TwoFactorAuthenticationsController < BaseController\n before_actio"
},
{
"path": "app/controllers/admin/warning_presets_controller.rb",
"chars": 1293,
"preview": "# frozen_string_literal: true\n\nmodule Admin\n class WarningPresetsController < BaseController\n before_action :set_war"
},
{
"path": "app/controllers/api/base_controller.rb",
"chars": 2790,
"preview": "# frozen_string_literal: true\n\nclass Api::BaseController < ApplicationController\n DEFAULT_STATUSES_LIMIT = 20\n DEFAULT"
},
{
"path": "app/controllers/api/oembed_controller.rb",
"chars": 519,
"preview": "# frozen_string_literal: true\n\nclass Api::OEmbedController < Api::BaseController\n respond_to :json\n\n def show\n @sta"
},
{
"path": "app/controllers/api/proofs_controller.rb",
"chars": 666,
"preview": "# frozen_string_literal: true\n\nclass Api::ProofsController < Api::BaseController\n before_action :set_account\n before_a"
},
{
"path": "app/controllers/api/push_controller.rb",
"chars": 1668,
"preview": "# frozen_string_literal: true\n\nclass Api::PushController < Api::BaseController\n include SignatureVerification\n\n def up"
},
{
"path": "app/controllers/api/salmon_controller.rb",
"chars": 704,
"preview": "# frozen_string_literal: true\n\nclass Api::SalmonController < Api::BaseController\n include SignatureVerification\n\n befo"
},
{
"path": "app/controllers/api/subscriptions_controller.rb",
"chars": 1043,
"preview": "# frozen_string_literal: true\n\nclass Api::SubscriptionsController < Api::BaseController\n before_action :set_account\n r"
},
{
"path": "app/controllers/api/v1/accounts/credentials_controller.rb",
"chars": 1424,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::CredentialsController < Api::BaseController\n before_action -> {"
},
{
"path": "app/controllers/api/v1/accounts/follower_accounts_controller.rb",
"chars": 1776,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::FollowerAccountsController < Api::BaseController\n before_action"
},
{
"path": "app/controllers/api/v1/accounts/following_accounts_controller.rb",
"chars": 1786,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::FollowingAccountsController < Api::BaseController\n before_actio"
},
{
"path": "app/controllers/api/v1/accounts/identity_proofs_controller.rb",
"chars": 410,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::IdentityProofsController < Api::BaseController\n before_action :"
},
{
"path": "app/controllers/api/v1/accounts/lists_controller.rb",
"chars": 471,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::ListsController < Api::BaseController\n before_action -> { doork"
},
{
"path": "app/controllers/api/v1/accounts/pins_controller.rb",
"chars": 904,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::PinsController < Api::BaseController\n include Authorization\n\n "
},
{
"path": "app/controllers/api/v1/accounts/relationships_controller.rb",
"chars": 792,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::RelationshipsController < Api::BaseController\n before_action ->"
},
{
"path": "app/controllers/api/v1/accounts/search_controller.rb",
"chars": 622,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::SearchController < Api::BaseController\n before_action -> { door"
},
{
"path": "app/controllers/api/v1/accounts/statuses_controller.rb",
"chars": 3137,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Accounts::StatusesController < Api::BaseController\n before_action -> { au"
},
{
"path": "app/controllers/api/v1/accounts_controller.rb",
"chars": 3087,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::AccountsController < Api::BaseController\n before_action -> { authorize_if"
},
{
"path": "app/controllers/api/v1/apps/credentials_controller.rb",
"chars": 312,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Apps::CredentialsController < Api::BaseController\n before_action -> { doo"
},
{
"path": "app/controllers/api/v1/apps_controller.rb",
"chars": 642,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::AppsController < Api::BaseController\n def create\n @app = Doorkeeper::A"
},
{
"path": "app/controllers/api/v1/blocks_controller.rb",
"chars": 1548,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::BlocksController < Api::BaseController\n before_action -> { doorkeeper_aut"
},
{
"path": "app/controllers/api/v1/conversations_controller.rb",
"chars": 1793,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::ConversationsController < Api::BaseController\n LIMIT = 20\n\n before_actio"
},
{
"path": "app/controllers/api/v1/custom_emojis_controller.rb",
"chars": 397,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::CustomEmojisController < Api::BaseController\n respond_to :json\n\n skip_be"
},
{
"path": "app/controllers/api/v1/domain_blocks_controller.rb",
"chars": 1726,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::DomainBlocksController < Api::BaseController\n BLOCK_LIMIT = 100\n\n before"
},
{
"path": "app/controllers/api/v1/endorsements_controller.rb",
"chars": 1477,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::EndorsementsController < Api::BaseController\n before_action -> { doorkeep"
},
{
"path": "app/controllers/api/v1/favourites_controller.rb",
"chars": 1531,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::FavouritesController < Api::BaseController\n before_action -> { doorkeeper"
},
{
"path": "app/controllers/api/v1/filters_controller.rb",
"chars": 1204,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::FiltersController < Api::BaseController\n before_action -> { doorkeeper_au"
},
{
"path": "app/controllers/api/v1/follow_requests_controller.rb",
"chars": 1962,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::FollowRequestsController < Api::BaseController\n before_action -> { doorke"
},
{
"path": "app/controllers/api/v1/follows_controller.rb",
"chars": 732,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::FollowsController < Api::BaseController\n before_action -> { doorkeeper_au"
},
{
"path": "app/controllers/api/v1/instances/activity_controller.rb",
"chars": 900,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Instances::ActivityController < Api::BaseController\n before_action :requi"
},
{
"path": "app/controllers/api/v1/instances/peers_controller.rb",
"chars": 408,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Instances::PeersController < Api::BaseController\n before_action :require_"
},
{
"path": "app/controllers/api/v1/instances_controller.rb",
"chars": 343,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::InstancesController < Api::BaseController\n respond_to :json\n skip_before"
},
{
"path": "app/controllers/api/v1/lists/accounts_controller.rb",
"chars": 2072,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Lists::AccountsController < Api::BaseController\n before_action -> { doork"
},
{
"path": "app/controllers/api/v1/lists_controller.rb",
"chars": 1029,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::ListsController < Api::BaseController\n before_action -> { doorkeeper_auth"
},
{
"path": "app/controllers/api/v1/media_controller.rb",
"chars": 1082,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::MediaController < Api::BaseController\n before_action -> { doorkeeper_auth"
},
{
"path": "app/controllers/api/v1/mutes_controller.rb",
"chars": 1510,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::MutesController < Api::BaseController\n before_action -> { doorkeeper_auth"
},
{
"path": "app/controllers/api/v1/notifications_controller.rb",
"chars": 2424,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::NotificationsController < Api::BaseController\n before_action -> { doorkee"
},
{
"path": "app/controllers/api/v1/polls/votes_controller.rb",
"chars": 666,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Polls::VotesController < Api::BaseController\n include Authorization\n\n be"
},
{
"path": "app/controllers/api/v1/polls_controller.rb",
"chars": 702,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::PollsController < Api::BaseController\n include Authorization\n\n before_ac"
},
{
"path": "app/controllers/api/v1/preferences_controller.rb",
"chars": 307,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::PreferencesController < Api::BaseController\n before_action -> { doorkeepe"
},
{
"path": "app/controllers/api/v1/push/subscriptions_controller.rb",
"chars": 1546,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Push::SubscriptionsController < Api::BaseController\n before_action -> { d"
},
{
"path": "app/controllers/api/v1/reports_controller.rb",
"chars": 852,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::ReportsController < Api::BaseController\n before_action -> { doorkeeper_au"
},
{
"path": "app/controllers/api/v1/scheduled_statuses_controller.rb",
"chars": 1857,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::ScheduledStatusesController < Api::BaseController\n include Authorization\n"
},
{
"path": "app/controllers/api/v1/search_controller.rb",
"chars": 675,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::SearchController < Api::BaseController\n include Authorization\n\n RESULTS_"
},
{
"path": "app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb",
"chars": 1801,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController\n include A"
},
{
"path": "app/controllers/api/v1/statuses/favourites_controller.rb",
"chars": 957,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::FavouritesController < Api::BaseController\n include Authorizati"
},
{
"path": "app/controllers/api/v1/statuses/mutes_controller.rb",
"chars": 1052,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::MutesController < Api::BaseController\n include Authorization\n\n "
},
{
"path": "app/controllers/api/v1/statuses/pins_controller.rb",
"chars": 1359,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::PinsController < Api::BaseController\n include Authorization\n\n "
},
{
"path": "app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb",
"chars": 1789,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController\n include Au"
},
{
"path": "app/controllers/api/v1/statuses/reblogs_controller.rb",
"chars": 1049,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Statuses::ReblogsController < Api::BaseController\n include Authorization\n"
},
{
"path": "app/controllers/api/v1/statuses_controller.rb",
"chars": 3639,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::StatusesController < Api::BaseController\n include Authorization\n\n before"
},
{
"path": "app/controllers/api/v1/streaming_controller.rb",
"chars": 409,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::StreamingController < Api::BaseController\n respond_to :json\n\n def index\n"
},
{
"path": "app/controllers/api/v1/suggestions_controller.rb",
"chars": 596,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::SuggestionsController < Api::BaseController\n include Authorization\n\n bef"
},
{
"path": "app/controllers/api/v1/timelines/direct_controller.rb",
"chars": 1512,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::DirectController < Api::BaseController\n before_action -> { doo"
},
{
"path": "app/controllers/api/v1/timelines/home_controller.rb",
"chars": 1608,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::HomeController < Api::BaseController\n before_action -> { doork"
},
{
"path": "app/controllers/api/v1/timelines/list_controller.rb",
"chars": 1496,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::ListController < Api::BaseController\n before_action -> { doork"
},
{
"path": "app/controllers/api/v1/timelines/public_controller.rb",
"chars": 1678,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::PublicController < Api::BaseController\n after_action :insert_p"
},
{
"path": "app/controllers/api/v1/timelines/tag_controller.rb",
"chars": 1888,
"preview": "# frozen_string_literal: true\n\nclass Api::V1::Timelines::TagController < Api::BaseController\n before_action :load_tag\n "
},
{
"path": "app/controllers/api/v2/search_controller.rb",
"chars": 219,
"preview": "# frozen_string_literal: true\n\nclass Api::V2::SearchController < Api::V1::SearchController\n def index\n @search = Sea"
},
{
"path": "app/controllers/api/web/base_controller.rb",
"chars": 276,
"preview": "# frozen_string_literal: true\n\nclass Api::Web::BaseController < Api::BaseController\n protect_from_forgery with: :except"
},
{
"path": "app/controllers/api/web/embeds_controller.rb",
"chars": 600,
"preview": "# frozen_string_literal: true\n\nclass Api::Web::EmbedsController < Api::Web::BaseController\n respond_to :json\n\n before_"
},
{
"path": "app/controllers/api/web/push_subscriptions_controller.rb",
"chars": 1853,
"preview": "# frozen_string_literal: true\n\nclass Api::Web::PushSubscriptionsController < Api::Web::BaseController\n respond_to :json"
},
{
"path": "app/controllers/api/web/settings_controller.rb",
"chars": 368,
"preview": "# frozen_string_literal: true\n\nclass Api::Web::SettingsController < Api::Web::BaseController\n respond_to :json\n\n befor"
},
{
"path": "app/controllers/application_controller.rb",
"chars": 4188,
"preview": "# frozen_string_literal: true\n\nclass ApplicationController < ActionController::Base\n # Prevent CSRF attacks by raising "
},
{
"path": "app/controllers/auth/confirmations_controller.rb",
"chars": 900,
"preview": "# frozen_string_literal: true\n\nclass Auth::ConfirmationsController < Devise::ConfirmationsController\n layout 'auth'\n\n "
},
{
"path": "app/controllers/auth/omniauth_callbacks_controller.rb",
"chars": 932,
"preview": "# frozen_string_literal: true\n\nclass Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController\n skip_befo"
},
{
"path": "app/controllers/auth/passwords_controller.rb",
"chars": 636,
"preview": "# frozen_string_literal: true\n\nclass Auth::PasswordsController < Devise::PasswordsController\n before_action :check_vali"
},
{
"path": "app/controllers/auth/registrations_controller.rb",
"chars": 2606,
"preview": "# frozen_string_literal: true\n\nclass Auth::RegistrationsController < Devise::RegistrationsController\n layout :determine"
},
{
"path": "app/controllers/auth/sessions_controller.rb",
"chars": 3228,
"preview": "# frozen_string_literal: true\n\nclass Auth::SessionsController < Devise::SessionsController\n include Devise::Controllers"
},
{
"path": "app/controllers/authorize_interactions_controller.rb",
"chars": 1388,
"preview": "# frozen_string_literal: true\n\nclass AuthorizeInteractionsController < ApplicationController\n include Authorization\n\n "
},
{
"path": "app/controllers/concerns/account_controller_concern.rb",
"chars": 1505,
"preview": "# frozen_string_literal: true\n\nmodule AccountControllerConcern\n extend ActiveSupport::Concern\n\n FOLLOW_PER_PAGE = 12\n\n"
},
{
"path": "app/controllers/concerns/accountable_concern.rb",
"chars": 219,
"preview": "# frozen_string_literal: true\n\nmodule AccountableConcern\n extend ActiveSupport::Concern\n\n def log_action(action, targe"
},
{
"path": "app/controllers/concerns/authorization.rb",
"chars": 426,
"preview": "# frozen_string_literal: true\n\nmodule Authorization\n extend ActiveSupport::Concern\n\n include Pundit\n\n def pundit_user"
},
{
"path": "app/controllers/concerns/export_controller_concern.rb",
"chars": 519,
"preview": "# frozen_string_literal: true\n\nmodule ExportControllerConcern\n extend ActiveSupport::Concern\n\n included do\n before_"
},
{
"path": "app/controllers/concerns/localized.rb",
"chars": 809,
"preview": "# frozen_string_literal: true\n\nmodule Localized\n extend ActiveSupport::Concern\n\n included do\n before_action :set_lo"
},
{
"path": "app/controllers/concerns/obfuscate_filename.rb",
"chars": 344,
"preview": "# frozen_string_literal: true\n\nmodule ObfuscateFilename\n extend ActiveSupport::Concern\n\n class_methods do\n def obfu"
},
{
"path": "app/controllers/concerns/rate_limit_headers.rb",
"chars": 1289,
"preview": "# frozen_string_literal: true\n\nmodule RateLimitHeaders\n extend ActiveSupport::Concern\n\n included do\n before_action "
},
{
"path": "app/controllers/concerns/session_tracking_concern.rb",
"chars": 422,
"preview": "# frozen_string_literal: true\n\nmodule SessionTrackingConcern\n extend ActiveSupport::Concern\n\n UPDATE_SIGN_IN_HOURS = 2"
},
{
"path": "app/controllers/concerns/signature_authentication.rb",
"chars": 196,
"preview": "# frozen_string_literal: true\n\nmodule SignatureAuthentication\n extend ActiveSupport::Concern\n\n include SignatureVerifi"
},
{
"path": "app/controllers/concerns/signature_verification.rb",
"chars": 4753,
"preview": "# frozen_string_literal: true\n\n# Implemented according to HTTP signatures (Draft 6)\n# <https://tools.ietf.org/html/draft"
},
{
"path": "app/controllers/concerns/user_tracking_concern.rb",
"chars": 487,
"preview": "# frozen_string_literal: true\n\nmodule UserTrackingConcern\n extend ActiveSupport::Concern\n\n UPDATE_SIGN_IN_HOURS = 24\n\n"
},
{
"path": "app/controllers/custom_css_controller.rb",
"chars": 253,
"preview": "# frozen_string_literal: true\n\nclass CustomCssController < ApplicationController\n skip_before_action :store_current_loc"
},
{
"path": "app/controllers/directories_controller.rb",
"chars": 906,
"preview": "# frozen_string_literal: true\n\nclass DirectoriesController < ApplicationController\n layout 'public'\n\n before_action :c"
},
{
"path": "app/controllers/emojis_controller.rb",
"chars": 570,
"preview": "# frozen_string_literal: true\n\nclass EmojisController < ApplicationController\n before_action :set_emoji\n before_action"
},
{
"path": "app/controllers/filters_controller.rb",
"chars": 1163,
"preview": "# frozen_string_literal: true\n\nclass FiltersController < ApplicationController\n include Authorization\n\n layout 'admin'"
},
{
"path": "app/controllers/follower_accounts_controller.rb",
"chars": 1827,
"preview": "# frozen_string_literal: true\n\nclass FollowerAccountsController < ApplicationController\n include AccountControllerConce"
},
{
"path": "app/controllers/following_accounts_controller.rb",
"chars": 1866,
"preview": "# frozen_string_literal: true\n\nclass FollowingAccountsController < ApplicationController\n include AccountControllerConc"
},
{
"path": "app/controllers/home_controller.rb",
"chars": 2004,
"preview": "# frozen_string_literal: true\n\nclass HomeController < ApplicationController\n before_action :authenticate_user!\n before"
},
{
"path": "app/controllers/intents_controller.rb",
"chars": 680,
"preview": "# frozen_string_literal: true\n\nclass IntentsController < ApplicationController\n before_action :check_uri\n rescue_from "
},
{
"path": "app/controllers/invites_controller.rb",
"chars": 931,
"preview": "# frozen_string_literal: true\n\nclass InvitesController < ApplicationController\n include Authorization\n\n layout 'admin'"
},
{
"path": "app/controllers/manifests_controller.rb",
"chars": 219,
"preview": "# frozen_string_literal: true\n\nclass ManifestsController < ApplicationController\n skip_before_action :store_current_loc"
},
{
"path": "app/controllers/media_controller.rb",
"chars": 961,
"preview": "# frozen_string_literal: true\n\nclass MediaController < ApplicationController\n include Authorization\n\n skip_before_acti"
},
{
"path": "app/controllers/media_proxy_controller.rb",
"chars": 1026,
"preview": "# frozen_string_literal: true\n\nclass MediaProxyController < ApplicationController\n include RoutingHelper\n\n skip_before"
},
{
"path": "app/controllers/oauth/authorizations_controller.rb",
"chars": 706,
"preview": "# frozen_string_literal: true\n\nclass Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController\n skip_befor"
},
{
"path": "app/controllers/oauth/authorized_applications_controller.rb",
"chars": 579,
"preview": "# frozen_string_literal: true\n\nclass Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicationsControl"
},
{
"path": "app/controllers/oauth/tokens_controller.rb",
"chars": 303,
"preview": "# frozen_string_literal: true\n\nclass Oauth::TokensController < Doorkeeper::TokensController\n def revoke\n unsubscribe"
},
{
"path": "app/controllers/public_timelines_controller.rb",
"chars": 842,
"preview": "# frozen_string_literal: true\n\nclass PublicTimelinesController < ApplicationController\n layout 'public'\n\n before_actio"
},
{
"path": "app/controllers/relationships_controller.rb",
"chars": 2866,
"preview": "# frozen_string_literal: true\n\nclass RelationshipsController < ApplicationController\n layout 'admin'\n\n before_action :"
},
{
"path": "app/controllers/remote_follow_controller.rb",
"chars": 932,
"preview": "# frozen_string_literal: true\n\nclass RemoteFollowController < ApplicationController\n layout 'modal'\n\n before_action :s"
},
{
"path": "app/controllers/remote_interaction_controller.rb",
"chars": 1147,
"preview": "# frozen_string_literal: true\n\nclass RemoteInteractionController < ApplicationController\n include Authorization\n\n layo"
},
{
"path": "app/controllers/remote_unfollows_controller.rb",
"chars": 786,
"preview": "# frozen_string_literal: true\n\nclass RemoteUnfollowsController < ApplicationController\n layout 'modal'\n\n before_action"
},
{
"path": "app/controllers/settings/applications_controller.rb",
"chars": 1808,
"preview": "# frozen_string_literal: true\n\nclass Settings::ApplicationsController < Settings::BaseController\n layout 'admin'\n\n bef"
},
{
"path": "app/controllers/settings/base_controller.rb",
"chars": 193,
"preview": "# frozen_string_literal: true\n\nclass Settings::BaseController < ApplicationController\n before_action :set_body_classes\n"
},
{
"path": "app/controllers/settings/deletes_controller.rb",
"chars": 801,
"preview": "# frozen_string_literal: true\n\nclass Settings::DeletesController < Settings::BaseController\n layout 'admin'\n\n before_a"
},
{
"path": "app/controllers/settings/exports/blocked_accounts_controller.rb",
"chars": 320,
"preview": "# frozen_string_literal: true\n\nmodule Settings\n module Exports\n class BlockedAccountsController < ApplicationControl"
},
{
"path": "app/controllers/settings/exports/blocked_domains_controller.rb",
"chars": 318,
"preview": "# frozen_string_literal: true\n\nmodule Settings\n module Exports\n class BlockedDomainsController < ApplicationControll"
},
{
"path": "app/controllers/settings/exports/following_accounts_controller.rb",
"chars": 324,
"preview": "# frozen_string_literal: true\n\nmodule Settings\n module Exports\n class FollowingAccountsController < ApplicationContr"
},
{
"path": "app/controllers/settings/exports/lists_controller.rb",
"chars": 299,
"preview": "# frozen_string_literal: true\n\nmodule Settings\n module Exports\n class ListsController < ApplicationController\n "
},
{
"path": "app/controllers/settings/exports/muted_accounts_controller.rb",
"chars": 316,
"preview": "# frozen_string_literal: true\n\nmodule Settings\n module Exports\n class MutedAccountsController < ApplicationControlle"
},
{
"path": "app/controllers/settings/exports_controller.rb",
"chars": 766,
"preview": "# frozen_string_literal: true\n\nclass Settings::ExportsController < Settings::BaseController\n include Authorization\n\n l"
},
{
"path": "app/controllers/settings/featured_tags_controller.rb",
"chars": 1204,
"preview": "# frozen_string_literal: true\n\nclass Settings::FeaturedTagsController < Settings::BaseController\n layout 'admin'\n\n bef"
},
{
"path": "app/controllers/settings/identity_proofs_controller.rb",
"chars": 1998,
"preview": "# frozen_string_literal: true\n\nclass Settings::IdentityProofsController < Settings::BaseController\n layout 'admin'\n\n b"
},
{
"path": "app/controllers/settings/imports_controller.rb",
"chars": 637,
"preview": "# frozen_string_literal: true\n\nclass Settings::ImportsController < Settings::BaseController\n layout 'admin'\n\n before_a"
},
{
"path": "app/controllers/settings/migrations_controller.rb",
"chars": 892,
"preview": "# frozen_string_literal: true\n\nclass Settings::MigrationsController < Settings::BaseController\n layout 'admin'\n\n befor"
},
{
"path": "app/controllers/settings/preferences/appearance_controller.rb",
"chars": 210,
"preview": "# frozen_string_literal: true\n\nclass Settings::Preferences::AppearanceController < Settings::PreferencesController\n pri"
},
{
"path": "app/controllers/settings/preferences/notifications_controller.rb",
"chars": 216,
"preview": "# frozen_string_literal: true\n\nclass Settings::Preferences::NotificationsController < Settings::PreferencesController\n "
},
{
"path": "app/controllers/settings/preferences/other_controller.rb",
"chars": 200,
"preview": "# frozen_string_literal: true\n\nclass Settings::Preferences::OtherController < Settings::PreferencesController\n private\n"
},
{
"path": "app/controllers/settings/preferences_controller.rb",
"chars": 1511,
"preview": "# frozen_string_literal: true\n\nclass Settings::PreferencesController < Settings::BaseController\n layout 'admin'\n\n befo"
},
{
"path": "app/controllers/settings/profiles_controller.rb",
"chars": 876,
"preview": "# frozen_string_literal: true\n\nclass Settings::ProfilesController < Settings::BaseController\n include ObfuscateFilename"
},
{
"path": "app/controllers/settings/sessions_controller.rb",
"chars": 422,
"preview": "# frozen_string_literal: true\n\nclass Settings::SessionsController < Settings::BaseController\n before_action :authentica"
},
{
"path": "app/controllers/settings/two_factor_authentication/confirmations_controller.rb",
"chars": 1409,
"preview": "# frozen_string_literal: true\n\nmodule Settings\n module TwoFactorAuthentication\n class ConfirmationsController < Base"
},
{
"path": "app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb",
"chars": 442,
"preview": "# frozen_string_literal: true\n\nmodule Settings\n module TwoFactorAuthentication\n class RecoveryCodesController < Base"
},
{
"path": "app/controllers/settings/two_factor_authentications_controller.rb",
"chars": 1293,
"preview": "# frozen_string_literal: true\n\nmodule Settings\n class TwoFactorAuthenticationsController < BaseController\n layout 'a"
},
{
"path": "app/controllers/shares_controller.rb",
"chars": 961,
"preview": "# frozen_string_literal: true\n\nclass SharesController < ApplicationController\n layout 'modal'\n\n before_action :authent"
},
{
"path": "app/controllers/statuses_controller.rb",
"chars": 7044,
"preview": "# frozen_string_literal: true\n\nclass StatusesController < ApplicationController\n include SignatureAuthentication\n incl"
},
{
"path": "app/controllers/stream_entries_controller.rb",
"chars": 1851,
"preview": "# frozen_string_literal: true\n\nclass StreamEntriesController < ApplicationController\n include Authorization\n include S"
},
{
"path": "app/controllers/tags_controller.rb",
"chars": 1700,
"preview": "# frozen_string_literal: true\n\nclass TagsController < ApplicationController\n PAGE_SIZE = 20\n\n layout 'public'\n\n befor"
},
{
"path": "app/controllers/well_known/host_meta_controller.rb",
"chars": 425,
"preview": "# frozen_string_literal: true\n\nmodule WellKnown\n class HostMetaController < ActionController::Base\n include RoutingH"
},
{
"path": "app/controllers/well_known/keybase_proof_config_controller.rb",
"chars": 217,
"preview": "# frozen_string_literal: true\n\nmodule WellKnown\n class KeybaseProofConfigController < ActionController::Base\n def sh"
},
{
"path": "app/controllers/well_known/webfinger_controller.rb",
"chars": 1063,
"preview": "# frozen_string_literal: true\n\nmodule WellKnown\n class WebfingerController < ActionController::Base\n include Routing"
},
{
"path": "app/helpers/admin/account_moderation_notes_helper.rb",
"chars": 974,
"preview": "# frozen_string_literal: true\n\nmodule Admin::AccountModerationNotesHelper\n def admin_account_link_to(account)\n retur"
},
{
"path": "app/helpers/admin/action_logs_helper.rb",
"chars": 3627,
"preview": "# frozen_string_literal: true\n\nmodule Admin::ActionLogsHelper\n def log_target(log)\n if log.target\n linkable_log"
}
]
// ... and 2174 more files (download for full content)
About this extraction
This page contains the full source code of the florence-social/mastodon-fork GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2374 files (7.4 MB), approximately 2.1M tokens, and a symbol index with 5947 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.