diff --git a/lib/mastodon/cli/accounts.rb b/lib/mastodon/cli/accounts.rb
index 417f126ccd..fd8368565c 100644
--- a/lib/mastodon/cli/accounts.rb
+++ b/lib/mastodon/cli/accounts.rb
@@ -217,7 +217,6 @@ module Mastodon::CLI
         exit(1)
       end
 
-      dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
       account = nil
 
       if username.present?
@@ -234,9 +233,9 @@ module Mastodon::CLI
         end
       end
 
-      say("Deleting user with #{account.statuses_count} statuses, this might take a while...#{dry_run}")
-      DeleteAccountService.new.call(account, reserve_email: false) unless options[:dry_run]
-      say("OK#{dry_run}", :green)
+      say("Deleting user with #{account.statuses_count} statuses, this might take a while...#{dry_run_mode_suffix}")
+      DeleteAccountService.new.call(account, reserve_email: false) unless dry_run?
+      say("OK#{dry_run_mode_suffix}", :green)
     end
 
     option :force, type: :boolean, aliases: [:f], description: 'Override public key check'
@@ -291,7 +290,7 @@ module Mastodon::CLI
       Account.remote.select(:uri, 'count(*)').group(:uri).having('count(*) > 1').pluck(:uri).each do |uri|
         say("Duplicates found for #{uri}")
         begin
-          ActivityPub::FetchRemoteAccountService.new.call(uri) unless options[:dry_run]
+          ActivityPub::FetchRemoteAccountService.new.call(uri) unless dry_run?
         rescue => e
           say("Error processing #{uri}: #{e}", :red)
         end
@@ -332,7 +331,6 @@ module Mastodon::CLI
     LONG_DESC
     def cull(*domains)
       skip_threshold = 7.days.ago
-      dry_run        = options[:dry_run] ? ' (DRY RUN)' : ''
       skip_domains   = Concurrent::Set.new
 
       query = Account.remote.where(protocol: :activitypub)
@@ -350,7 +348,7 @@ module Mastodon::CLI
         end
 
         if [404, 410].include?(code)
-          DeleteAccountService.new.call(account, reserve_username: false) unless options[:dry_run]
+          DeleteAccountService.new.call(account, reserve_username: false) unless dry_run?
           1
         else
           # Touch account even during dry run to avoid getting the account into the window again
@@ -358,7 +356,7 @@ module Mastodon::CLI
         end
       end
 
-      say("Visited #{processed} accounts, removed #{culled}#{dry_run}", :green)
+      say("Visited #{processed} accounts, removed #{culled}#{dry_run_mode_suffix}", :green)
 
       unless skip_domains.empty?
         say('The following domains were not available during the check:', :yellow)
@@ -381,21 +379,19 @@ module Mastodon::CLI
       specified with space-separated USERNAMES.
     LONG_DESC
     def refresh(*usernames)
-      dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
-
       if options[:domain] || options[:all]
         scope  = Account.remote
         scope  = scope.where(domain: options[:domain]) if options[:domain]
 
         processed, = parallelize_with_progress(scope) do |account|
-          next if options[:dry_run]
+          next if dry_run?
 
           account.reset_avatar!
           account.reset_header!
           account.save
         end
 
-        say("Refreshed #{processed} accounts#{dry_run}", :green, true)
+        say("Refreshed #{processed} accounts#{dry_run_mode_suffix}", :green, true)
       elsif !usernames.empty?
         usernames.each do |user|
           user, domain = user.split('@')
@@ -406,7 +402,7 @@ module Mastodon::CLI
             exit(1)
           end
 
-          next if options[:dry_run]
+          next if dry_run?
 
           begin
             account.reset_avatar!
@@ -417,7 +413,7 @@ module Mastodon::CLI
           end
         end
 
-        say("OK#{dry_run}", :green)
+        say("OK#{dry_run_mode_suffix}", :green)
       else
         say('No account(s) given', :red)
         exit(1)
@@ -568,8 +564,6 @@ module Mastodon::CLI
       - not muted/blocked by us
     LONG_DESC
     def prune
-      dry_run = options[:dry_run] ? ' (dry run)' : ''
-
       query = Account.remote.where.not(actor_type: %i(Application Service))
       query = query.where('NOT EXISTS (SELECT 1 FROM mentions WHERE account_id = accounts.id)')
       query = query.where('NOT EXISTS (SELECT 1 FROM favourites WHERE account_id = accounts.id)')
@@ -585,11 +579,11 @@ module Mastodon::CLI
         next if account.suspended?
         next if account.silenced?
 
-        account.destroy unless options[:dry_run]
+        account.destroy unless dry_run?
         1
       end
 
-      say("OK, pruned #{deleted} accounts#{dry_run}", :green)
+      say("OK, pruned #{deleted} accounts#{dry_run_mode_suffix}", :green)
     end
 
     option :force, type: :boolean
diff --git a/lib/mastodon/cli/domains.rb b/lib/mastodon/cli/domains.rb
index d885c95638..d17b253681 100644
--- a/lib/mastodon/cli/domains.rb
+++ b/lib/mastodon/cli/domains.rb
@@ -34,7 +34,6 @@ module Mastodon::CLI
       When the --purge-domain-blocks option is given, also purge matching domain blocks.
     LONG_DESC
     def purge(*domains)
-      dry_run            = options[:dry_run] ? ' (DRY RUN)' : ''
       domains            = domains.map { |domain| TagManager.instance.normalize_domain(domain) }
       account_scope      = Account.none
       domain_block_scope = DomainBlock.none
@@ -79,23 +78,23 @@ module Mastodon::CLI
 
       # Actually perform the deletions
       processed, = parallelize_with_progress(account_scope) do |account|
-        DeleteAccountService.new.call(account, reserve_username: false, skip_side_effects: true) unless options[:dry_run]
+        DeleteAccountService.new.call(account, reserve_username: false, skip_side_effects: true) unless dry_run?
       end
 
-      say("Removed #{processed} accounts#{dry_run}", :green)
+      say("Removed #{processed} accounts#{dry_run_mode_suffix}", :green)
 
       if options[:purge_domain_blocks]
         domain_block_count = domain_block_scope.count
-        domain_block_scope.in_batches.destroy_all unless options[:dry_run]
-        say("Removed #{domain_block_count} domain blocks#{dry_run}", :green)
+        domain_block_scope.in_batches.destroy_all unless dry_run?
+        say("Removed #{domain_block_count} domain blocks#{dry_run_mode_suffix}", :green)
       end
 
       custom_emojis_count = emoji_scope.count
-      emoji_scope.in_batches.destroy_all unless options[:dry_run]
+      emoji_scope.in_batches.destroy_all unless dry_run?
 
-      Instance.refresh unless options[:dry_run]
+      Instance.refresh unless dry_run?
 
-      say("Removed #{custom_emojis_count} custom emojis#{dry_run}", :green)
+      say("Removed #{custom_emojis_count} custom emojis#{dry_run_mode_suffix}", :green)
     end
 
     option :concurrency, type: :numeric, default: 50, aliases: [:c]
diff --git a/lib/mastodon/cli/feeds.rb b/lib/mastodon/cli/feeds.rb
index 342b550ca3..34617e7538 100644
--- a/lib/mastodon/cli/feeds.rb
+++ b/lib/mastodon/cli/feeds.rb
@@ -18,14 +18,12 @@ module Mastodon::CLI
       Otherwise, a single user specified by USERNAME.
     LONG_DESC
     def build(username = nil)
-      dry_run = options[:dry_run] ? '(DRY RUN)' : ''
-
       if options[:all] || username.nil?
         processed, = parallelize_with_progress(Account.joins(:user).merge(User.active)) do |account|
-          PrecomputeFeedService.new.call(account) unless options[:dry_run]
+          PrecomputeFeedService.new.call(account) unless dry_run?
         end
 
-        say("Regenerated feeds for #{processed} accounts #{dry_run}", :green, true)
+        say("Regenerated feeds for #{processed} accounts #{dry_run_mode_suffix}", :green, true)
       elsif username.present?
         account = Account.find_local(username)
 
@@ -34,9 +32,9 @@ module Mastodon::CLI
           exit(1)
         end
 
-        PrecomputeFeedService.new.call(account) unless options[:dry_run]
+        PrecomputeFeedService.new.call(account) unless dry_run?
 
-        say("OK #{dry_run}", :green, true)
+        say("OK #{dry_run_mode_suffix}", :green, true)
       else
         say('No account(s) given', :red)
         exit(1)
diff --git a/lib/mastodon/cli/helper.rb b/lib/mastodon/cli/helper.rb
index b277e16ebd..78931b9a22 100644
--- a/lib/mastodon/cli/helper.rb
+++ b/lib/mastodon/cli/helper.rb
@@ -15,6 +15,10 @@ module Mastodon::CLI
       options[:dry_run]
     end
 
+    def dry_run_mode_suffix
+      dry_run? ? ' (DRY RUN)' : ''
+    end
+
     def create_progress_bar(total = nil)
       ProgressBar.create(total: total, format: '%c/%u |%b%i| %e')
     end
diff --git a/lib/mastodon/cli/main.rb b/lib/mastodon/cli/main.rb
index e61a6f9c46..1594eadce8 100644
--- a/lib/mastodon/cli/main.rb
+++ b/lib/mastodon/cli/main.rb
@@ -94,7 +94,7 @@ module Mastodon::CLI
 
       exit(1) unless prompt.ask('Type in the domain of the server to confirm:', required: true) == Rails.configuration.x.local_domain
 
-      unless options[:dry_run]
+      unless dry_run?
         prompt.warn('This operation WILL NOT be reversible. It can also take a long time.')
         prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.')
         prompt.warn('A running Sidekiq process is required. Do not shut it down until queues clear.')
@@ -104,12 +104,11 @@ module Mastodon::CLI
 
       inboxes   = Account.inboxes
       processed = 0
-      dry_run   = options[:dry_run] ? ' (DRY RUN)' : ''
 
-      Setting.registrations_mode = 'none' unless options[:dry_run]
+      Setting.registrations_mode = 'none' unless dry_run?
 
       if inboxes.empty?
-        Account.local.without_suspended.in_batches.update_all(suspended_at: Time.now.utc, suspension_origin: :local) unless options[:dry_run]
+        Account.local.without_suspended.in_batches.update_all(suspended_at: Time.now.utc, suspension_origin: :local) unless dry_run?
         prompt.ok('It seems like your server has not federated with anything')
         prompt.ok('You can shut it down and delete it any time')
         return
@@ -126,7 +125,7 @@ module Mastodon::CLI
 
         json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(account))
 
-        unless options[:dry_run]
+        unless dry_run?
           ActivityPub::DeliveryWorker.push_bulk(inboxes, limit: 1_000) do |inbox_url|
             [json, account.id, inbox_url]
           end
@@ -140,7 +139,7 @@ module Mastodon::CLI
       Account.local.without_suspended.find_each { |account| delete_account.call(account) }
       Account.local.suspended.joins(:deletion_request).find_each { |account| delete_account.call(account) }
 
-      prompt.ok("Queued #{inboxes.size * processed} items into Sidekiq for #{processed} accounts#{dry_run}")
+      prompt.ok("Queued #{inboxes.size * processed} items into Sidekiq for #{processed} accounts#{dry_run_mode_suffix}")
       prompt.ok('Wait until Sidekiq processes all items, then you can shut everything down and delete the data')
     rescue TTY::Reader::InputInterrupt
       exit(1)
diff --git a/lib/mastodon/cli/media.rb b/lib/mastodon/cli/media.rb
index 045f6351ad..40b270ffb2 100644
--- a/lib/mastodon/cli/media.rb
+++ b/lib/mastodon/cli/media.rb
@@ -35,12 +35,12 @@ module Mastodon::CLI
         say('--prune-profiles and --remove-headers should not be specified simultaneously', :red, true)
         exit(1)
       end
+
       if options[:include_follows] && !(options[:prune_profiles] || options[:remove_headers])
         say('--include-follows can only be used with --prune-profiles or --remove-headers', :red, true)
         exit(1)
       end
-      time_ago        = options[:days].days.ago
-      dry_run         = options[:dry_run] ? ' (DRY RUN)' : ''
+      time_ago = options[:days].days.ago
 
       if options[:prune_profiles] || options[:remove_headers]
         processed, aggregate = parallelize_with_progress(Account.remote.where({ last_webfingered_at: ..time_ago, updated_at: ..time_ago })) do |account|
@@ -51,7 +51,7 @@ module Mastodon::CLI
           size = (account.header_file_size || 0)
           size += (account.avatar_file_size || 0) if options[:prune_profiles]
 
-          unless options[:dry_run]
+          unless dry_run?
             account.header.destroy
             account.avatar.destroy if options[:prune_profiles]
             account.save!
@@ -60,7 +60,7 @@ module Mastodon::CLI
           size
         end
 
-        say("Visited #{processed} accounts and removed profile media totaling #{number_to_human_size(aggregate)}#{dry_run}", :green, true)
+        say("Visited #{processed} accounts and removed profile media totaling #{number_to_human_size(aggregate)}#{dry_run_mode_suffix}", :green, true)
       end
 
       unless options[:prune_profiles] || options[:remove_headers]
@@ -69,7 +69,7 @@ module Mastodon::CLI
 
           size = (media_attachment.file_file_size || 0) + (media_attachment.thumbnail_file_size || 0)
 
-          unless options[:dry_run]
+          unless dry_run?
             media_attachment.file.destroy
             media_attachment.thumbnail.destroy
             media_attachment.save
@@ -78,7 +78,7 @@ module Mastodon::CLI
           size
         end
 
-        say("Removed #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run}", :green, true)
+        say("Removed #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run_mode_suffix}", :green, true)
       end
     end
 
@@ -97,7 +97,6 @@ module Mastodon::CLI
       progress        = create_progress_bar(nil)
       reclaimed_bytes = 0
       removed         = 0
-      dry_run         = options[:dry_run] ? ' (DRY RUN)' : ''
       prefix          = options[:prefix]
 
       case Paperclip::Attachment.default_options[:storage]
@@ -123,7 +122,7 @@ module Mastodon::CLI
           record_map = preload_records_from_mixed_objects(objects)
 
           objects.each do |object|
-            object.acl.put(acl: s3_permissions) if options[:fix_permissions] && !options[:dry_run]
+            object.acl.put(acl: s3_permissions) if options[:fix_permissions] && !dry_run?
 
             path_segments = object.key.split('/')
             path_segments.delete('cache')
@@ -145,7 +144,7 @@ module Mastodon::CLI
             next unless attachment.blank? || !attachment.variant?(file_name)
 
             begin
-              object.delete unless options[:dry_run]
+              object.delete unless dry_run?
 
               reclaimed_bytes += object.size
               removed += 1
@@ -194,7 +193,7 @@ module Mastodon::CLI
           begin
             size = File.size(path)
 
-            unless options[:dry_run]
+            unless dry_run?
               File.delete(path)
               begin
                 FileUtils.rmdir(File.dirname(path), parents: true)
@@ -216,7 +215,7 @@ module Mastodon::CLI
       progress.total = progress.progress
       progress.finish
 
-      say("Removed #{removed} orphans (approx. #{number_to_human_size(reclaimed_bytes)})#{dry_run}", :green, true)
+      say("Removed #{removed} orphans (approx. #{number_to_human_size(reclaimed_bytes)})#{dry_run_mode_suffix}", :green, true)
     end
 
     option :account, type: :string
@@ -246,8 +245,6 @@ module Mastodon::CLI
       not be re-downloaded. To force re-download of every URL, use --force.
     DESC
     def refresh
-      dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
-
       if options[:status]
         scope = MediaAttachment.where(status_id: options[:status])
       elsif options[:account]
@@ -274,7 +271,7 @@ module Mastodon::CLI
         next if media_attachment.remote_url.blank? || (!options[:force] && media_attachment.file_file_name.present?)
         next if DomainBlock.reject_media?(media_attachment.account.domain)
 
-        unless options[:dry_run]
+        unless dry_run?
           media_attachment.reset_file!
           media_attachment.reset_thumbnail!
           media_attachment.save
@@ -283,7 +280,7 @@ module Mastodon::CLI
         media_attachment.file_file_size + (media_attachment.thumbnail_file_size || 0)
       end
 
-      say("Downloaded #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run}", :green, true)
+      say("Downloaded #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run_mode_suffix}", :green, true)
     end
 
     desc 'usage', 'Calculate disk space consumed by Mastodon'
diff --git a/lib/mastodon/cli/preview_cards.rb b/lib/mastodon/cli/preview_cards.rb
index c66bcb504a..2df3d095da 100644
--- a/lib/mastodon/cli/preview_cards.rb
+++ b/lib/mastodon/cli/preview_cards.rb
@@ -27,7 +27,6 @@ module Mastodon::CLI
     DESC
     def remove
       time_ago = options[:days].days.ago
-      dry_run  = options[:dry_run] ? ' (DRY RUN)' : ''
       link     = options[:link] ? 'link-type ' : ''
       scope    = PreviewCard.cached
       scope    = scope.where(type: :link) if options[:link]
@@ -38,7 +37,7 @@ module Mastodon::CLI
 
         size = preview_card.image_file_size
 
-        unless options[:dry_run]
+        unless dry_run?
           preview_card.image.destroy
           preview_card.save
         end
@@ -46,7 +45,7 @@ module Mastodon::CLI
         size
       end
 
-      say("Removed #{processed} #{link}preview cards (approx. #{number_to_human_size(aggregate)})#{dry_run}", :green, true)
+      say("Removed #{processed} #{link}preview cards (approx. #{number_to_human_size(aggregate)})#{dry_run_mode_suffix}", :green, true)
     end
   end
 end
diff --git a/lib/mastodon/cli/upgrade.rb b/lib/mastodon/cli/upgrade.rb
index e5c86b3d73..88390da5bf 100644
--- a/lib/mastodon/cli/upgrade.rb
+++ b/lib/mastodon/cli/upgrade.rb
@@ -17,7 +17,6 @@ module Mastodon::CLI
     LONG_DESC
     def storage_schema
       progress = create_progress_bar(nil)
-      dry_run  = dry_run? ? ' (DRY RUN)' : ''
       records  = 0
 
       klasses = [
@@ -69,7 +68,7 @@ module Mastodon::CLI
       progress.total = progress.progress
       progress.finish
 
-      say("Upgraded storage schema of #{records} records#{dry_run}", :green, true)
+      say("Upgraded storage schema of #{records} records#{dry_run_mode_suffix}", :green, true)
     end
 
     private