diff --git a/config/feature_flags/development/global_file_size_check.yml b/config/feature_flags/development/global_file_size_check.yml
new file mode 100644
index 0000000000000000000000000000000000000000..eea775cdad56470f5433fbeec6ff7bb2ca52fc24
--- /dev/null
+++ b/config/feature_flags/development/global_file_size_check.yml
@@ -0,0 +1,8 @@
+---
+name: global_file_size_check
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125956
+rollout_issue_url:
+milestone: '16.2'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/lib/gitlab/checks/changes_access.rb b/lib/gitlab/checks/changes_access.rb
index 194e3f6e93868eb2befe831367c19419ff8fed81..3fd7e44985e9acf4b2a1447e00f08f603487786d 100644
--- a/lib/gitlab/checks/changes_access.rb
+++ b/lib/gitlab/checks/changes_access.rb
@@ -117,6 +117,7 @@ def single_access_checks!
 
       def bulk_access_checks!
         Gitlab::Checks::LfsCheck.new(self).validate!
+        Gitlab::Checks::GlobalFileSizeCheck.new(self).validate!
       end
 
       def blank_rev?(rev)
diff --git a/lib/gitlab/checks/global_file_size_check.rb b/lib/gitlab/checks/global_file_size_check.rb
new file mode 100644
index 0000000000000000000000000000000000000000..418d2d32b57fe7d178ec80c6334246ef5beccd41
--- /dev/null
+++ b/lib/gitlab/checks/global_file_size_check.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Gitlab
+  module Checks
+    class GlobalFileSizeCheck < BaseBulkChecker
+      MAX_FILE_SIZE_MB = 100
+      LOG_MESSAGE = 'Checking for blobs over the file size limit'
+
+      def validate!
+        return unless Feature.enabled?(:global_file_size_check, project)
+
+        Gitlab::AppJsonLogger.info(LOG_MESSAGE)
+        logger.log_timed(LOG_MESSAGE) do
+          Gitlab::Checks::FileSizeCheck::AllowExistingOversizedBlobs.new(
+            project: project,
+            changes: changes,
+            file_size_limit_megabytes: MAX_FILE_SIZE_MB
+          ).find
+
+          # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/393535
+          # - set limit per plan tier
+          # - raise an error if large blobs are found
+        end
+
+        true
+      end
+    end
+  end
+end
diff --git a/spec/lib/gitlab/checks/changes_access_spec.rb b/spec/lib/gitlab/checks/changes_access_spec.rb
index 552afcdb1806ffe99210958a84c322679cda36cd..854c04dd581cd68162d9d5f363b50ce6c34a942d 100644
--- a/spec/lib/gitlab/checks/changes_access_spec.rb
+++ b/spec/lib/gitlab/checks/changes_access_spec.rb
@@ -24,6 +24,14 @@
 
         subject.validate!
       end
+
+      it 'calls file size check' do
+        expect_next_instance_of(Gitlab::Checks::GlobalFileSizeCheck) do |instance|
+          expect(instance).to receive(:validate!)
+        end
+
+        subject.validate!
+      end
     end
 
     context 'when time limit was reached' do
diff --git a/spec/lib/gitlab/checks/global_file_size_check_spec.rb b/spec/lib/gitlab/checks/global_file_size_check_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9ea0c73b1c7a0e322dad4e06a149bead1a493814
--- /dev/null
+++ b/spec/lib/gitlab/checks/global_file_size_check_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Checks::GlobalFileSizeCheck, feature_category: :source_code_management do
+  include_context 'changes access checks context'
+
+  describe '#validate!' do
+    context 'when global_file_size_check is disabled' do
+      before do
+        stub_feature_flags(global_file_size_check: false)
+      end
+
+      it 'does not log' do
+        expect(subject).not_to receive(:log_timed)
+        expect(Gitlab::AppJsonLogger).not_to receive(:info)
+        expect(Gitlab::Checks::FileSizeCheck::AllowExistingOversizedBlobs).not_to receive(:new)
+        subject.validate!
+      end
+    end
+
+    it 'checks for file sizes' do
+      expect_next_instance_of(Gitlab::Checks::FileSizeCheck::AllowExistingOversizedBlobs,
+        project: project,
+        changes: changes,
+        file_size_limit_megabytes: 100
+      ) do |check|
+        expect(check).to receive(:find).and_call_original
+      end
+      expect(subject.logger).to receive(:log_timed).with('Checking for blobs over the file size limit')
+        .and_call_original
+      expect(Gitlab::AppJsonLogger).to receive(:info).with('Checking for blobs over the file size limit')
+      subject.validate!
+    end
+  end
+end