diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index b1a2ed57376dfc942385d858c607eaa359e217ea..4e73e9e8b564c35ef6713574d8c434319a76a4ac 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -51,7 +51,7 @@ class Api::V1::AccountsController < Api::BaseController
     @account = Account.find(params[:id])
   end
 
-  def relationships(options = {})
+  def relationships(**options)
     AccountRelationshipsPresenter.new([@account.id], current_user.account_id, options)
   end
 end
diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb
index 73250cbf56e63d145f8a64cfd51ea2407185101b..9443934b304b0636d5a2c2620bda60675793f467 100644
--- a/app/helpers/admin/filter_helper.rb
+++ b/app/helpers/admin/filter_helper.rb
@@ -13,7 +13,7 @@ module Admin::FilterHelper
     link_to text, new_url, class: filter_link_class(new_class)
   end
 
-  def table_link_to(icon, text, path, options = {})
+  def table_link_to(icon, text, path, **options)
     link_to safe_join([fa_icon(icon), text]), path, options.merge(class: 'table-action-link')
   end
 
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 7dfab1df11b9eba012df95faf9d6640379e1c08e..8ed5c8bdacad2746671c1f07e87fa800b1c2bf4e 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -5,7 +5,7 @@ module ApplicationHelper
     current_page?(path) ? 'active' : ''
   end
 
-  def active_link_to(label, path, options = {})
+  def active_link_to(label, path, **options)
     link_to label, path, options.merge(class: active_nav_class(path))
   end
 
diff --git a/app/helpers/routing_helper.rb b/app/helpers/routing_helper.rb
index f4693358c7a6749c8dc34bbeedd0a10f6aa1c952..11894a8952101d0fe411fec73f65685ce03fadaf 100644
--- a/app/helpers/routing_helper.rb
+++ b/app/helpers/routing_helper.rb
@@ -11,7 +11,7 @@ module RoutingHelper
     end
   end
 
-  def full_asset_url(source, options = {})
+  def full_asset_url(source, **options)
     source = ActionController::Base.helpers.asset_url(source, options) unless use_storage?
 
     URI.join(root_url, source).to_s
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 01144f5952b5c21e1690759d6fa9e35687f93b34..820189d29c96ba7383ce69e21f802d212bad3d47 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -3,7 +3,7 @@
 class ActivityPub::Activity
   include JsonLdHelper
 
-  def initialize(json, account, options = {})
+  def initialize(json, account, **options)
     @json    = json
     @account = account
     @object  = @json['object']
@@ -15,7 +15,7 @@ class ActivityPub::Activity
   end
 
   class << self
-    def factory(json, account, options = {})
+    def factory(json, account, **options)
       @json = json
       klass&.new(json, account, options)
     end
diff --git a/app/lib/extractor.rb b/app/lib/extractor.rb
index 738ec89a0de983dcb2c5b1a114ed6a8774435456..479689d602298b922dacf3d33996b7e6898787cf 100644
--- a/app/lib/extractor.rb
+++ b/app/lib/extractor.rb
@@ -32,7 +32,7 @@ module Extractor
     possible_entries
   end
 
-  def extract_hashtags_with_indices(text, _options = {})
+  def extract_hashtags_with_indices(text, **)
     return [] unless text =~ /#/
 
     tags = []
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index 9d8bc52db1aa4368c02363f7a9d7ae5386902629..f5bf64cc7ac93a9c607712c3d98af675e04e0614 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -9,7 +9,7 @@ class Formatter
 
   include ActionView::Helpers::TextHelper
 
-  def format(status, options = {})
+  def format(status, **options)
     if status.reblog?
       prepend_reblog = status.reblog.account.acct
       status         = status.proper
diff --git a/app/lib/ostatus/activity/base.rb b/app/lib/ostatus/activity/base.rb
index 8b27b124f68c0e9d35f6ef03ec279360968814ae..c5933f3adfecfeb6e6612bc53f11742da1d6aca7 100644
--- a/app/lib/ostatus/activity/base.rb
+++ b/app/lib/ostatus/activity/base.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class OStatus::Activity::Base
-  def initialize(xml, account = nil, options = {})
+  def initialize(xml, account = nil, **options)
     @xml     = xml
     @account = account
     @options = options
diff --git a/app/lib/ostatus/atom_serializer.rb b/app/lib/ostatus/atom_serializer.rb
index 3ca6c594398ed88686b6523fc35ec6a4f2442cf7..656e4582228945e1c9cab03edeff6824a94346f6 100644
--- a/app/lib/ostatus/atom_serializer.rb
+++ b/app/lib/ostatus/atom_serializer.rb
@@ -319,7 +319,7 @@ class OStatus::AtomSerializer
 
   private
 
-  def append_element(parent, name, content = nil, attributes = {})
+  def append_element(parent, name, content = nil, **attributes)
     element = Ox::Element.new(name)
     attributes.each { |k, v| element[k] = sanitize_str(v) }
     element << sanitize_str(content) unless content.nil?
diff --git a/app/lib/provider_discovery.rb b/app/lib/provider_discovery.rb
index 5e02e68066f8d598d1c815fc80ff159474e6bede..bcc4ed500eb2e9b50e726ca4567265f0edad2536 100644
--- a/app/lib/provider_discovery.rb
+++ b/app/lib/provider_discovery.rb
@@ -2,7 +2,7 @@
 
 class ProviderDiscovery < OEmbed::ProviderDiscovery
   class << self
-    def discover_provider(url, options = {})
+    def discover_provider(url, **options)
       res    = Request.new(:get, url).perform
       format = options[:format]
 
diff --git a/app/lib/request.rb b/app/lib/request.rb
index 30ea0e7ee0c865262d655e044750e4e20d4f14a9..7671f4ffc752aaa81a427f2dcd2c478405c419d8 100644
--- a/app/lib/request.rb
+++ b/app/lib/request.rb
@@ -5,7 +5,7 @@ class Request
 
   include RoutingHelper
 
-  def initialize(verb, url, options = {})
+  def initialize(verb, url, **options)
     @verb    = verb
     @url     = Addressable::URI.parse(url).normalize
     @options = options
diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb
index d79f26366ae1216dffc321bc04ca679fba121c7b..fd2b0649acc45d32d2ec6aab5cdc21eb04365e34 100644
--- a/app/mailers/notification_mailer.rb
+++ b/app/mailers/notification_mailer.rb
@@ -63,7 +63,7 @@ class NotificationMailer < ApplicationMailer
     end
   end
 
-  def digest(recipient, opts = {})
+  def digest(recipient, **opts)
     @me            = recipient
     @since         = opts[:since] || @me.user.last_emailed_at || @me.user.current_sign_in_at
     @notifications = Notification.where(account: @me, activity_type: 'Mention').where('created_at > ?', @since)
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index bdb29ebadeeba2d8d8bf346272e227a5ade87333..5a062dc257413c89e803839fd1a70c24b1c89bff 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -5,7 +5,7 @@ class UserMailer < Devise::Mailer
 
   helper :instance
 
-  def confirmation_instructions(user, token, _opts = {})
+  def confirmation_instructions(user, token, **)
     @resource = user
     @token    = token
     @instance = Rails.configuration.x.local_domain
@@ -17,7 +17,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def reset_password_instructions(user, token, _opts = {})
+  def reset_password_instructions(user, token, **)
     @resource = user
     @token    = token
     @instance = Rails.configuration.x.local_domain
@@ -29,7 +29,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def password_change(user, _opts = {})
+  def password_change(user, **)
     @resource = user
     @instance = Rails.configuration.x.local_domain
 
diff --git a/app/models/remote_follow.rb b/app/models/remote_follow.rb
index c3f86774335973b9ca6e861b0d4682f52031eec0..070144e2d81dc20f309470234977d8b5084a14bd 100644
--- a/app/models/remote_follow.rb
+++ b/app/models/remote_follow.rb
@@ -7,8 +7,8 @@ class RemoteFollow
 
   validates :acct, presence: true
 
-  def initialize(attrs = {})
-    @acct = attrs[:acct].gsub(/\A@/, '').strip unless attrs[:acct].nil?
+  def initialize(attrs = nil)
+    @acct = attrs[:acct].gsub(/\A@/, '').strip if !attrs.nil? && !attrs[:acct].nil?
   end
 
   def valid?
diff --git a/app/models/session_activation.rb b/app/models/session_activation.rb
index d19489b36c9349f641a6539338311e467fcc1ba3..8b711d0d695252f80a9e18ae0f15a2c17c8777f4 100644
--- a/app/models/session_activation.rb
+++ b/app/models/session_activation.rb
@@ -53,7 +53,7 @@ class SessionActivation < ApplicationRecord
       id && where(session_id: id).exists?
     end
 
-    def activate(options = {})
+    def activate(**options)
       activation = create!(options)
       purge_old
       activation
diff --git a/app/presenters/account_relationships_presenter.rb b/app/presenters/account_relationships_presenter.rb
index a30558bace3f69c4c81201b9532f30d791265ba0..bf1ba371619cbe083b28a5f224471510beb8e62b 100644
--- a/app/presenters/account_relationships_presenter.rb
+++ b/app/presenters/account_relationships_presenter.rb
@@ -4,7 +4,7 @@ class AccountRelationshipsPresenter
   attr_reader :following, :followed_by, :blocking,
               :muting, :requested, :domain_blocking
 
-  def initialize(account_ids, current_account_id, options = {})
+  def initialize(account_ids, current_account_id, **options)
     @following       = Account.following_map(account_ids, current_account_id).merge(options[:following_map] || {})
     @followed_by     = Account.followed_by_map(account_ids, current_account_id).merge(options[:followed_by_map] || {})
     @blocking        = Account.blocking_map(account_ids, current_account_id).merge(options[:blocking_map] || {})
diff --git a/app/presenters/status_relationships_presenter.rb b/app/presenters/status_relationships_presenter.rb
index bc3887a446b07dd4e4bda2d8ce598cb0270335e4..b04e10e2f6d6e0de7fb3b5a800d6d6c0d74981bb 100644
--- a/app/presenters/status_relationships_presenter.rb
+++ b/app/presenters/status_relationships_presenter.rb
@@ -3,7 +3,7 @@
 class StatusRelationshipsPresenter
   attr_reader :reblogs_map, :favourites_map, :mutes_map, :pins_map
 
-  def initialize(statuses, current_account_id = nil, options = {})
+  def initialize(statuses, current_account_id = nil, **options)
     if current_account_id.nil?
       @reblogs_map    = {}
       @favourites_map = {}
diff --git a/app/services/activitypub/process_collection_service.rb b/app/services/activitypub/process_collection_service.rb
index db4d1b4bc032d04e2e7fbbc27ad2d7e838aacef3..eb93329e976a9a7f907f88571606d70eff3141d6 100644
--- a/app/services/activitypub/process_collection_service.rb
+++ b/app/services/activitypub/process_collection_service.rb
@@ -3,7 +3,7 @@
 class ActivityPub::ProcessCollectionService < BaseService
   include JsonLdHelper
 
-  def call(body, account, options = {})
+  def call(body, account, **options)
     @account = account
     @json    = Oj.load(body, mode: :strict)
     @options = options
diff --git a/app/services/authorize_follow_service.rb b/app/services/authorize_follow_service.rb
index b1bff89627eb29fa6d2f0d1df7d0e29d1b5f9c8f..f47d488f11c6db297aab466b2f5fe388ace95425 100644
--- a/app/services/authorize_follow_service.rb
+++ b/app/services/authorize_follow_service.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class AuthorizeFollowService < BaseService
-  def call(source_account, target_account, options = {})
+  def call(source_account, target_account, **options)
     if options[:skip_follow_request]
       follow_request = FollowRequest.new(account: source_account, target_account: target_account)
     else
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index de350f8e6f4d064352cf960b48cf3eadaf7622f9..92d868afe45dea75dd8fc2107db54138053bf015 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -13,7 +13,7 @@ class PostStatusService < BaseService
   # @option [Doorkeeper::Application] :application
   # @option [String] :idempotency Optional idempotency key
   # @return [Status]
-  def call(account, text, in_reply_to = nil, options = {})
+  def call(account, text, in_reply_to = nil, **options)
     if options[:idempotency].present?
       existing_id = redis.get("idempotency:status:#{account.id}:#{options[:idempotency]}")
       return Status.find(existing_id) if existing_id
diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb
index 60eff135e986becea2a5d69a3924c40b4a5f7f06..30a9dd85ebcb176abc9b7bd2df31603f1546556a 100644
--- a/app/services/process_feed_service.rb
+++ b/app/services/process_feed_service.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class ProcessFeedService < BaseService
-  def call(body, account, options = {})
+  def call(body, account, **options)
     @options = options
 
     xml = Nokogiri::XML(body)
diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb
index 9f603bb36d401c8bed2574bd79e2e364e8af1805..a100f73cebc27221ed0d7553675991617b9738cf 100644
--- a/app/services/remove_status_service.rb
+++ b/app/services/remove_status_service.rb
@@ -3,7 +3,7 @@
 class RemoveStatusService < BaseService
   include StreamEntryRenderer
 
-  def call(status, options = {})
+  def call(status, **options)
     @payload      = Oj.dump(event: :delete, payload: status.id.to_s)
     @status       = status
     @account      = status.account
diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb
index 5b37ba9ba7fe9c0a58bb2a342b108c2e60c7c901..958b28cdcff3c57593027e5f584d91473f1552f8 100644
--- a/app/services/suspend_account_service.rb
+++ b/app/services/suspend_account_service.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class SuspendAccountService < BaseService
-  def call(account, options = {})
+  def call(account, **options)
     @account = account
     @options = options
 
diff --git a/lib/mastodon/migration_helpers.rb b/lib/mastodon/migration_helpers.rb
index 2b5a6cd4269e35eca750839bdecf58bf2b091ab4..6f6f99f63ca7bbd870812cc57591fd9541578ef0 100644
--- a/lib/mastodon/migration_helpers.rb
+++ b/lib/mastodon/migration_helpers.rb
@@ -99,7 +99,7 @@ module Mastodon
     # default - The default value for the column.
     # null - When set to `true` the column will allow NULL values.
     #        The default is to not allow NULL values.
-    def add_timestamps_with_timezone(table_name, options = {})
+    def add_timestamps_with_timezone(table_name, **options)
       options[:null] = false if options[:null].nil?
 
       [:created_at, :updated_at].each do |column_name|
@@ -134,7 +134,7 @@ module Mastodon
     #     add_concurrent_index :users, :some_column
     #
     # See Rails' `add_index` for more info on the available arguments.
-    def add_concurrent_index(table_name, column_name, options = {})
+    def add_concurrent_index(table_name, column_name, **options)
       if transaction_open?
         raise 'add_concurrent_index can not be run inside a transaction, ' \
           'you can disable transactions by calling disable_ddl_transaction! ' \
@@ -158,7 +158,7 @@ module Mastodon
     #     remove_concurrent_index :users, :some_column
     #
     # See Rails' `remove_index` for more info on the available arguments.
-    def remove_concurrent_index(table_name, column_name, options = {})
+    def remove_concurrent_index(table_name, column_name, **options)
       if transaction_open?
         raise 'remove_concurrent_index can not be run inside a transaction, ' \
           'you can disable transactions by calling disable_ddl_transaction! ' \
@@ -182,7 +182,7 @@ module Mastodon
     #     remove_concurrent_index :users, "index_X_by_Y"
     #
     # See Rails' `remove_index` for more info on the available arguments.
-    def remove_concurrent_index_by_name(table_name, index_name, options = {})
+    def remove_concurrent_index_by_name(table_name, index_name, **options)
       if transaction_open?
         raise 'remove_concurrent_index_by_name can not be run inside a transaction, ' \
           'you can disable transactions by calling disable_ddl_transaction! ' \
diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb
index 91902ff69dba4c35cd55142fd409c5dbb0326828..92fbc73cd24f1ba08e66fb463e3885e8d4900192 100644
--- a/spec/services/post_status_service_spec.rb
+++ b/spec/services/post_status_service_spec.rb
@@ -182,7 +182,7 @@ RSpec.describe PostStatusService do
     expect(status2.id).to eq status1.id
   end
 
-  def create_status_with_options(options = {})
+  def create_status_with_options(**options)
     subject.call(Fabricate(:account), 'test', nil, options)
   end
 end