diff --git a/.bazelignore b/.bazelignore
index e5c2c9453d9d..5f43add393c9 100644
--- a/.bazelignore
+++ b/.bazelignore
@@ -17,4 +17,5 @@ packages/ngtools/webpack/node_modules
 packages/schematics/angular/node_modules
 modules/testing/builder/node_modules
 tests/node_modules
+tools/baseline_browserslist/node_modules
 tools/legacy-rnjs/node_modules
diff --git a/WORKSPACE b/WORKSPACE
index 9754913f609a..8271c2116486 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -169,6 +169,7 @@ npm_translate_lock(
         "//packages/ngtools/webpack:package.json",
         "//packages/schematics/angular:package.json",
         "//tests:package.json",
+        "//tools/baseline_browserslist:package.json",
     ],
     lifecycle_hooks_envs = {
         # TODO: Standardize browser management for `rules_js`
diff --git a/constants.bzl b/constants.bzl
index 87028bf0a607..836bee1080e8 100644
--- a/constants.bzl
+++ b/constants.bzl
@@ -8,6 +8,13 @@ ANGULAR_FW_VERSION = "^20.0.0-next.0"
 ANGULAR_FW_PEER_DEP = "^20.0.0 || ^20.0.0-next.0"
 NG_PACKAGR_PEER_DEP = "^20.0.0 || ^20.0.0-next.0"
 
+# Baseline widely-available date in `YYYY-MM-DD` format which defines Angular's
+# browser support. This date serves as the source of truth for the Angular CLI's
+# default browser set used to determine what downleveling is necessary.
+#
+# See: https://web.dev/baseline
+BASELINE_DATE = "2025-03-31"
+
 SNAPSHOT_REPOS = {
     "@angular/cli": "angular/cli-builds",
     "@angular/pwa": "angular/angular-pwa-builds",
diff --git a/docs/process/release.md b/docs/process/release.md
index 3e89c2900261..e8867c909ce3 100644
--- a/docs/process/release.md
+++ b/docs/process/release.md
@@ -145,3 +145,34 @@ will block the next weekly release.
     accept the invite for the new package.
 
 Once Wombat accepts the invite, regular automated releases should work as expected.
+
+## Updating Browser Support
+
+Angular's browser support is defined by a [Baseline](https://web.dev/baseline)
+"widely available" date. Before a new major version is released, this should be
+updated to approximately the current date.
+
+A few weeks before a major (around feature freeze):
+
+1.  Update `BASELINE_DATE` in
+    [`/constants.bzl`](/constants.bzl) to the end of the most recent month.
+    - For example, if it is currently May 12th, set `baselineThreshold` to April
+      30th.
+    - Picking a date at the end of a month makes it easier to cross-reference
+      Angular's support with other tools (like MDN) which state Baseline support
+      using month specificity.
+    - You can view the generated `browserlist` configuration with:
+      ```shell
+      bazel build //packages/angular/build:angular_browserslist
+      cat dist/bin/packages/angular/build/.browserslistrc
+      ```
+    - Commit and merge the change, no other alterations or automation is
+      necessary in the CLI repo.
+2.  Update
+    [`/.browserslistrc`](https://github.com/ng-packagr/ng-packagr/tree/main/.browserslistrc)
+    in the `ng-packagr` repo.
+    - Use the generated configuration from above.
+3.  Update
+    [`angular.dev` documentation](https://github.com/angular/angular/tree/main/adev/src/content/reference/versions.md#browser-support)
+    to specify the date used and link to [browsersl.ist](https://browsersl.ist)
+    with the generated configuration.
diff --git a/modules/testing/builder/projects/hello-world-app/.browserslistrc b/modules/testing/builder/projects/hello-world-app/.browserslistrc
deleted file mode 100644
index 7fd7c3b8783f..000000000000
--- a/modules/testing/builder/projects/hello-world-app/.browserslistrc
+++ /dev/null
@@ -1,4 +0,0 @@
-# We want to run tests large with ever green browser so that 
-# we never trigger differential loading as this will slow down the tests.
-
-last 2 Chrome versions
\ No newline at end of file
diff --git a/packages/angular/build/BUILD.bazel b/packages/angular/build/BUILD.bazel
index c842065f865a..2eab4b6d3491 100644
--- a/packages/angular/build/BUILD.bazel
+++ b/packages/angular/build/BUILD.bazel
@@ -1,7 +1,9 @@
 load("@devinfra//bazel/api-golden:index_rjs.bzl", "api_golden_test_npm_package")
 load("@npm2//:defs.bzl", "npm_link_all_packages")
+load("//:constants.bzl", "BASELINE_DATE")
 load("//tools:defaults.bzl", "copy_to_bin", "jasmine_test", "npm_package", "ts_project")
 load("//tools:ts_json_schema.bzl", "ts_json_schema")
+load("//tools/baseline_browserslist:baseline_browserslist.bzl", "baseline_browserslist")
 
 licenses(["notice"])
 
@@ -39,6 +41,12 @@ copy_to_bin(
     srcs = glob(["**/schema.json"]),
 )
 
+baseline_browserslist(
+    name = "angular_browserslist",
+    out = ".browserslistrc",
+    baseline = BASELINE_DATE,
+)
+
 RUNTIME_ASSETS = glob(
     include = [
         "src/**/schema.json",
@@ -49,6 +57,7 @@ RUNTIME_ASSETS = glob(
 ) + [
     "builders.json",
     "package.json",
+    ":angular_browserslist",
 ]
 
 ts_project(
diff --git a/packages/angular/build/src/builders/application/tests/behavior/browser-support_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/browser-support_spec.ts
index 6ba660677104..e281ca8caeb9 100644
--- a/packages/angular/build/src/builders/application/tests/behavior/browser-support_spec.ts
+++ b/packages/angular/build/src/builders/application/tests/behavior/browser-support_spec.ts
@@ -84,12 +84,12 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
     });
 
     it('warns when IE is present in browserslist', async () => {
-      await harness.appendToFile(
+      await harness.writeFile(
         '.browserslistrc',
         `
-           IE 9
-           IE 11
-         `,
+          IE 9
+          IE 11
+        `,
       );
 
       harness.useTarget('build', {
@@ -102,10 +102,30 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
       expect(logs).toContain(
         jasmine.objectContaining({
           level: 'warn',
-          message:
-            `One or more browsers which are configured in the project's Browserslist ` +
-            'configuration will be ignored as ES5 output is not supported by the Angular CLI.\n' +
-            'Ignored browsers: ie 11, ie 9',
+          message: jasmine.stringContaining('ES5 output is not supported'),
+        }),
+      );
+
+      // Don't duplicate the error.
+      expect(logs).not.toContain(
+        jasmine.objectContaining({
+          message: jasmine.stringContaining("fall outside Angular's browser support"),
+        }),
+      );
+    });
+
+    it("warns when targeting a browser outside Angular's minimum support", async () => {
+      await harness.writeFile('.browserslistrc', 'Chrome >= 100');
+
+      harness.useTarget('build', BASE_OPTIONS);
+
+      const { result, logs } = await harness.executeOnce();
+      expect(result?.success).toBeTrue();
+
+      expect(logs).toContain(
+        jasmine.objectContaining({
+          level: 'warn',
+          message: jasmine.stringContaining("fall outside Angular's browser support"),
         }),
       );
     });
diff --git a/packages/angular/build/src/utils/supported-browsers.ts b/packages/angular/build/src/utils/supported-browsers.ts
index 30c3d502fcdd..a8546a039082 100644
--- a/packages/angular/build/src/utils/supported-browsers.ts
+++ b/packages/angular/build/src/utils/supported-browsers.ts
@@ -12,15 +12,16 @@ export function getSupportedBrowsers(
   projectRoot: string,
   logger: { warn(message: string): void },
 ): string[] {
-  browserslist.defaults = [
-    'last 2 Chrome versions',
-    'last 1 Firefox version',
-    'last 2 Edge major versions',
-    'last 2 Safari major versions',
-    'last 2 iOS major versions',
-    'last 2 Android major versions',
-    'Firefox ESR',
-  ];
+  // Read the browserslist configuration containing Angular's browser support policy.
+  const angularBrowserslist = browserslist(undefined, {
+    path: require.resolve('../../.browserslistrc'),
+  });
+
+  // Use Angular's configuration as the default.
+  browserslist.defaults = angularBrowserslist;
+
+  // Get the minimum set of browser versions supported by Angular.
+  const minimumBrowsers = new Set(angularBrowserslist);
 
   // Get browsers from config or default.
   const browsersFromConfigOrDefault = new Set(browserslist(undefined, { path: projectRoot }));
@@ -28,19 +29,32 @@ export function getSupportedBrowsers(
   // Get browsers that support ES6 modules.
   const browsersThatSupportEs6 = new Set(browserslist('supports es6-module'));
 
+  const nonEs6Browsers: string[] = [];
   const unsupportedBrowsers: string[] = [];
   for (const browser of browsersFromConfigOrDefault) {
     if (!browsersThatSupportEs6.has(browser)) {
+      // Any browser which does not support ES6 is explicitly ignored, as Angular will not build successfully.
       browsersFromConfigOrDefault.delete(browser);
+      nonEs6Browsers.push(browser);
+    } else if (!minimumBrowsers.has(browser)) {
+      // Any other unsupported browser we will attempt to use, but provide no support for.
       unsupportedBrowsers.push(browser);
     }
   }
 
-  if (unsupportedBrowsers.length) {
+  if (nonEs6Browsers.length) {
     logger.warn(
       `One or more browsers which are configured in the project's Browserslist configuration ` +
         'will be ignored as ES5 output is not supported by the Angular CLI.\n' +
-        `Ignored browsers: ${unsupportedBrowsers.join(', ')}`,
+        `Ignored browsers:\n${nonEs6Browsers.join(', ')}`,
+    );
+  }
+
+  if (unsupportedBrowsers.length) {
+    logger.warn(
+      `One or more browsers which are configured in the project's Browserslist configuration ` +
+        "fall outside Angular's browser support for this version.\n" +
+        `Unsupported browsers:\n${unsupportedBrowsers.join(', ')}`,
     );
   }
 
diff --git a/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/browser-support_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/browser-support_spec.ts
index 5fb8e9d4cd0b..f24c83f2d96b 100644
--- a/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/browser-support_spec.ts
+++ b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/browser-support_spec.ts
@@ -65,12 +65,12 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
     });
 
     it('warns when IE is present in browserslist', async () => {
-      await harness.appendToFile(
+      await harness.writeFile(
         '.browserslistrc',
         `
-           IE 9
-           IE 11
-         `,
+          IE 9
+          IE 11
+        `,
       );
 
       harness.useTarget('build', {
@@ -83,10 +83,30 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => {
       expect(logs).toContain(
         jasmine.objectContaining({
           level: 'warn',
-          message:
-            `One or more browsers which are configured in the project's Browserslist ` +
-            'configuration will be ignored as ES5 output is not supported by the Angular CLI.\n' +
-            'Ignored browsers: ie 11, ie 9',
+          message: jasmine.stringContaining('ES5 output is not supported'),
+        }),
+      );
+
+      // Don't duplicate the error.
+      expect(logs).not.toContain(
+        jasmine.objectContaining({
+          message: jasmine.stringContaining("fall outside Angular's browser support"),
+        }),
+      );
+    });
+
+    it("warns when targeting a browser outside Angular's minimum support", async () => {
+      await harness.writeFile('.browserslistrc', 'Chrome >= 100');
+
+      harness.useTarget('build', BASE_OPTIONS);
+
+      const { result, logs } = await harness.executeOnce();
+      expect(result?.success).toBeTrue();
+
+      expect(logs).toContain(
+        jasmine.objectContaining({
+          level: 'warn',
+          message: jasmine.stringContaining("fall outside Angular's browser support"),
         }),
       );
     });
diff --git a/packages/schematics/angular/BUILD.bazel b/packages/schematics/angular/BUILD.bazel
index 365017ed0906..16632748036a 100644
--- a/packages/schematics/angular/BUILD.bazel
+++ b/packages/schematics/angular/BUILD.bazel
@@ -4,8 +4,10 @@
 # found in the LICENSE file at https://angular.dev/license
 
 load("@npm2//:defs.bzl", "npm_link_all_packages")
+load("//:constants.bzl", "BASELINE_DATE")
 load("//tools:defaults.bzl", "copy_to_bin", "jasmine_test", "npm_package", "ts_project")
 load("//tools:ts_json_schema.bzl", "ts_json_schema")
+load("//tools/baseline_browserslist:baseline_browserslist.bzl", "baseline_browserslist")
 
 licenses(["notice"])
 
@@ -42,11 +44,18 @@ copy_to_bin(
     srcs = glob(["**/schema.json"]),
 )
 
+baseline_browserslist(
+    name = "angular_browserslist",
+    out = "config/.browserslistrc",
+    baseline = BASELINE_DATE,
+)
+
 RUNTIME_ASSETS = [
     "collection.json",
     "migrations/migration-collection.json",
     "package.json",
     "utility/latest-versions/package.json",
+    ":angular_browserslist",
 ] + glob(
     include = [
         "*/schema.json",
diff --git a/packages/schematics/angular/config/files/.browserslistrc.template b/packages/schematics/angular/config/files/.browserslistrc.template
index 4ec7f1adf73c..d11dabc56bdf 100644
--- a/packages/schematics/angular/config/files/.browserslistrc.template
+++ b/packages/schematics/angular/config/files/.browserslistrc.template
@@ -2,16 +2,10 @@
 # For additional information regarding the format and rule options, please see:
 # https://github.com/browserslist/browserslist#queries
 
-# For the full list of supported browsers by the Angular framework, please see:
+# For Angular's browser support policy, please see:
 # https://angular.dev/reference/versions#browser-support
 
 # You can see what browsers were selected by your queries by running:
 #   npx browserslist
 
-last 2 Chrome versions
-last 1 Firefox version
-last 2 Edge major versions
-last 2 Safari major versions
-last 2 iOS major versions
-last 2 Android major versions
-Firefox ESR
+<%= config %>
diff --git a/packages/schematics/angular/config/index.ts b/packages/schematics/angular/config/index.ts
index 638766e67a42..5878bd8c498a 100644
--- a/packages/schematics/angular/config/index.ts
+++ b/packages/schematics/angular/config/index.ts
@@ -17,6 +17,7 @@ import {
   strings,
   url,
 } from '@angular-devkit/schematics';
+import { readFile } from 'node:fs/promises';
 import { posix as path } from 'node:path';
 import { relativePathToWorkspaceRoot } from '../utility/paths';
 import { getWorkspace as readWorkspace, updateWorkspace } from '../utility/workspace';
@@ -42,10 +43,13 @@ function addBrowserslistConfig(options: ConfigOptions): Rule {
       throw new SchematicsException(`Project name "${options.project}" doesn't not exist.`);
     }
 
+    // Read Angular's default vendored `.browserslistrc` file.
+    const config = await readFile(path.join(__dirname, '.browserslistrc'), 'utf8');
+
     return mergeWith(
       apply(url('./files'), [
         filter((p) => p.endsWith('.browserslistrc.template')),
-        applyTemplates({}),
+        applyTemplates({ config }),
         move(project.root),
       ]),
     );
diff --git a/packages/schematics/angular/config/index_spec.ts b/packages/schematics/angular/config/index_spec.ts
index f7f7b335ad68..c9349bcb609d 100644
--- a/packages/schematics/angular/config/index_spec.ts
+++ b/packages/schematics/angular/config/index_spec.ts
@@ -94,7 +94,7 @@ describe('Config Schematic', () => {
   describe(`when 'type' is 'browserslist'`, () => {
     it('should create a .browserslistrc file', async () => {
       const tree = await runConfigSchematic(ConfigType.Browserslist);
-      expect(tree.exists('projects/foo/.browserslistrc')).toBeTrue();
+      expect(tree.readContent('projects/foo/.browserslistrc')).toContain('Chrome >=');
     });
   });
 });
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 186f70a2c62d..e38f1c12efcc 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -874,6 +874,12 @@ importers:
         specifier: 1.2.2
         version: 1.2.2
 
+  tools/baseline_browserslist:
+    devDependencies:
+      baseline-browser-mapping:
+        specifier: ^2.2.0
+        version: 2.2.0
+
 packages:
 
   '@ampproject/remapping@2.3.0':
@@ -1990,6 +1996,9 @@ packages:
     cpu: [x64]
     os: [win32]
 
+  '@mdn/browser-compat-data@6.0.6':
+    resolution: {integrity: sha512-awlDnCGbtdkyLieMpIKJQEgK7mxnL3he4UHm5AGn+asofiemlx4LVHM0FsYmp6O1irAClPNS135zZLhD2SZi+A==}
+
   '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
     resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==}
     cpu: [arm64]
@@ -3420,6 +3429,9 @@ packages:
     resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==}
     engines: {node: ^4.5.0 || >= 5.9}
 
+  baseline-browser-mapping@2.2.0:
+    resolution: {integrity: sha512-tLVamSyLn6h5kp7aDzBIPiNnx+ighswrdRs9ug3aeBgSXFQG2nFj1EfWvWTD1Y/ra9GDS8znPwMxTEitF6cC/g==}
+
   basic-ftp@5.0.5:
     resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
     engines: {node: '>=10.0.0'}
@@ -7654,6 +7666,9 @@ packages:
   weak-lru-cache@1.2.2:
     resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==}
 
+  web-features@2.33.0:
+    resolution: {integrity: sha512-oLzTO29Ax9TyQGNoNxpC+2Hj9if7lm2tuuAiEAb01BxcBt7yH40LAmIDg5PtuJ39lnwqm4wELATIKhj6WlJJpQ==}
+
   web-streams-polyfill@3.3.3:
     resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
     engines: {node: '>= 8'}
@@ -9183,6 +9198,8 @@ snapshots:
   '@lmdb/lmdb-win32-x64@3.2.6':
     optional: true
 
+  '@mdn/browser-compat-data@6.0.6': {}
+
   '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
     optional: true
 
@@ -10837,6 +10854,11 @@ snapshots:
 
   base64id@2.0.0: {}
 
+  baseline-browser-mapping@2.2.0:
+    dependencies:
+      '@mdn/browser-compat-data': 6.0.6
+      web-features: 2.33.0
+
   basic-ftp@5.0.5: {}
 
   batch@0.6.1: {}
@@ -15751,6 +15773,8 @@ snapshots:
   weak-lru-cache@1.2.2:
     optional: true
 
+  web-features@2.33.0: {}
+
   web-streams-polyfill@3.3.3: {}
 
   webdriver-js-extender@2.1.0:
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index ed02a080e9db..977541458634 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -15,3 +15,4 @@ packages:
   - packages/ngtools/webpack
   - modules/testing/builder
   - tests
+  - tools/baseline_browserslist
diff --git a/tools/baseline_browserslist/BUILD.bazel b/tools/baseline_browserslist/BUILD.bazel
new file mode 100644
index 000000000000..b8afa2926fa2
--- /dev/null
+++ b/tools/baseline_browserslist/BUILD.bazel
@@ -0,0 +1,52 @@
+load("@aspect_rules_js//js:defs.bzl", "js_binary")
+load("@aspect_rules_ts//ts:defs.bzl", "ts_config")
+load("@npm2//:defs.bzl", "npm_link_all_packages")
+load("//tools:defaults.bzl", "jasmine_test", "ts_project")
+
+npm_link_all_packages()
+
+js_binary(
+    name = "baseline_browserslist",
+    data = [":baseline_browserslist_lib"],
+    entry_point = "index.mjs",
+    visibility = ["//:__subpackages__"],
+)
+
+ts_project(
+    name = "baseline_browserslist_lib",
+    srcs = [
+        "generate_browserslist.mts",
+        "index.mts",
+    ],
+    source_map = True,
+    tsconfig = ":build_tsconfig",
+    deps = [":node_modules/baseline-browser-mapping"],
+)
+
+ts_project(
+    name = "baseline_browserslist_test_lib",
+    testonly = True,
+    srcs = ["generate_browserslist_spec.mts"],
+    tsconfig = ":test_tsconfig",
+    deps = [":baseline_browserslist_lib"],
+)
+
+jasmine_test(
+    name = "baseline_browserslist_test",
+    data = [":baseline_browserslist_test_lib"],
+)
+
+ts_config(
+    name = "build_tsconfig",
+    src = "tsconfig-build.json",
+    deps = [
+        "//:build-tsconfig-esm",
+        "//:node_modules/@types/node",
+    ],
+)
+
+ts_config(
+    name = "test_tsconfig",
+    src = "tsconfig-test.json",
+    deps = ["//:test-tsconfig-esm"],
+)
diff --git a/tools/baseline_browserslist/baseline_browserslist.bzl b/tools/baseline_browserslist/baseline_browserslist.bzl
new file mode 100644
index 000000000000..144b33153828
--- /dev/null
+++ b/tools/baseline_browserslist/baseline_browserslist.bzl
@@ -0,0 +1,26 @@
+"""Generates a `browserslist` configuration from a Baseline date."""
+
+load("@aspect_rules_js//js:defs.bzl", "js_run_binary")
+
+def baseline_browserslist(name, baseline, out, **kwargs):
+    """Generates a `browserslist` configuration from a Baseline date.
+
+    Args:
+        name: Name of this target.
+        baseline: A string date in "YYYY-MM-DD" format of the Baseline widely
+            available browser set to use in the generated `browserslist`.
+        out: Name of the output browserslist file. Prefer using `.browserslistrc`
+            for the output as the `browserslist` package seems to not like files
+            with a different name, even when explicitly provided.
+
+    See: https://web.dev/baseline
+    """
+
+    js_run_binary(
+        name = name,
+        srcs = [],
+        tool = Label(":baseline_browserslist"),
+        stdout = out,
+        args = [baseline],
+        **kwargs
+    )
diff --git a/tools/baseline_browserslist/generate_browserslist.mts b/tools/baseline_browserslist/generate_browserslist.mts
new file mode 100644
index 000000000000..68dc8d7e2c5b
--- /dev/null
+++ b/tools/baseline_browserslist/generate_browserslist.mts
@@ -0,0 +1,38 @@
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.dev/license
+ */
+
+import { getCompatibleVersions } from 'baseline-browser-mapping';
+
+// Map `baseline-browser-mapping` browsers to `browserslist` browsers.
+const browsers: Record<string, string> = {
+  chrome: 'Chrome',
+  chrome_android: 'ChromeAndroid',
+  edge: 'Edge',
+  firefox: 'Firefox',
+  firefox_android: 'FirefoxAndroid',
+  safari: 'Safari',
+  safari_ios: 'iOS',
+};
+
+/**
+ * Generates the `browserslist` configuration for the given Baseline date.
+ *
+ * @param date The Baseline "widely available" date to generate a `browserslist`
+ *     configuration for. Uses `YYYY-MM-DD` format.
+ * @returns The `browserslist` configuration file content.
+ */
+export function generateBrowserslist(date: string): string {
+  // Generate a `browserslist` configuration.
+  return getCompatibleVersions({
+    widelyAvailableOnDate: date,
+    includeDownstreamBrowsers: false,
+  })
+    .filter(({ browser }) => browsers[browser])
+    .map(({ browser, version }) => `${browsers[browser]} >= ${version}`)
+    .join('\n');
+}
diff --git a/tools/baseline_browserslist/generate_browserslist_spec.mts b/tools/baseline_browserslist/generate_browserslist_spec.mts
new file mode 100644
index 000000000000..c46f243f405c
--- /dev/null
+++ b/tools/baseline_browserslist/generate_browserslist_spec.mts
@@ -0,0 +1,27 @@
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.dev/license
+ */
+
+import { generateBrowserslist } from './generate_browserslist.mjs';
+
+describe('generate_browserslist', () => {
+  describe('generateBrowserslist', () => {
+    it('generates a `browserslist` file', () => {
+      expect(generateBrowserslist('2025-03-31').trim()).toBe(
+        `
+Chrome >= 107
+ChromeAndroid >= 107
+Edge >= 107
+Firefox >= 104
+FirefoxAndroid >= 104
+Safari >= 16
+iOS >= 16
+        `.trim(),
+      );
+    });
+  });
+});
diff --git a/tools/baseline_browserslist/index.mts b/tools/baseline_browserslist/index.mts
new file mode 100644
index 000000000000..78d5aec5e3d5
--- /dev/null
+++ b/tools/baseline_browserslist/index.mts
@@ -0,0 +1,15 @@
+/**
+ * @license
+ * Copyright Google LLC All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.dev/license
+ */
+
+import { generateBrowserslist } from './generate_browserslist.mjs';
+
+const [baselineDate] = process.argv.slice(2);
+const browserslist = generateBrowserslist(baselineDate);
+
+// eslint-disable-next-line no-console
+console.log(browserslist);
diff --git a/tools/baseline_browserslist/package.json b/tools/baseline_browserslist/package.json
new file mode 100644
index 000000000000..6480f833ecf9
--- /dev/null
+++ b/tools/baseline_browserslist/package.json
@@ -0,0 +1,6 @@
+{
+  "type": "module",
+  "devDependencies": {
+    "baseline-browser-mapping": "^2.2.0"
+  }
+}
diff --git a/tools/baseline_browserslist/tsconfig-build.json b/tools/baseline_browserslist/tsconfig-build.json
new file mode 100644
index 000000000000..acbbe1ae9949
--- /dev/null
+++ b/tools/baseline_browserslist/tsconfig-build.json
@@ -0,0 +1,8 @@
+{
+  "extends": "../../tsconfig-build-esm.json",
+  "include": ["**.mts"],
+  "exclude": ["**_spec.mts"],
+  "compilerOptions": {
+    "types": ["node"]
+  }
+}
diff --git a/tools/baseline_browserslist/tsconfig-test.json b/tools/baseline_browserslist/tsconfig-test.json
new file mode 100644
index 000000000000..48ba7db3fd84
--- /dev/null
+++ b/tools/baseline_browserslist/tsconfig-test.json
@@ -0,0 +1,4 @@
+{
+  "extends": "../../tsconfig-test-esm.json",
+  "include": ["**_spec.mts"]
+}
diff --git a/tools/baseline_browserslist/tsconfig.json b/tools/baseline_browserslist/tsconfig.json
new file mode 100644
index 000000000000..53c965a91293
--- /dev/null
+++ b/tools/baseline_browserslist/tsconfig.json
@@ -0,0 +1,4 @@
+{
+  "files": [],
+  "references": ["./tsconfig-build.json", "./tsconfig-test.json"]
+}