diff --git a/lib/modules/datasource/conan/index.ts b/lib/modules/datasource/conan/index.ts
index b8cc3d77d3a21b41f2d5fbfd0d882b810162fef9..b4fae4da514b3c3e37dfb28f744337c45c966f87 100644
--- a/lib/modules/datasource/conan/index.ts
+++ b/lib/modules/datasource/conan/index.ts
@@ -1,9 +1,9 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import { cache } from '../../../util/cache/package/decorator';
 import { GithubHttp } from '../../../util/http/github';
 import { ensureTrailingSlash, joinUrlParts } from '../../../util/url';
+import { load } from '../../../util/yaml';
 import * as allVersioning from '../../versioning';
 import { Datasource } from '../datasource';
 import type {
diff --git a/lib/modules/datasource/custom/formats/yaml.ts b/lib/modules/datasource/custom/formats/yaml.ts
index 076ded0a7f9a5b7a830b3b41f780cc47ff34dc08..f20f32d13000453e0671afc2275faec4b519e197 100644
--- a/lib/modules/datasource/custom/formats/yaml.ts
+++ b/lib/modules/datasource/custom/formats/yaml.ts
@@ -1,18 +1,18 @@
-import yaml from 'js-yaml';
 import { readLocalFile } from '../../../../util/fs';
 import type { Http } from '../../../../util/http';
+import { load } from '../../../../util/yaml';
 import type { CustomDatasourceFetcher } from './types';
 
 export class YamlFetcher implements CustomDatasourceFetcher {
   async fetch(http: Http, registryURL: string): Promise<unknown> {
     const response = await http.get(registryURL);
 
-    return yaml.load(response.body);
+    return load(response.body);
   }
 
   async readFile(registryURL: string): Promise<unknown> {
     const fileContent = await readLocalFile(registryURL, 'utf8');
 
-    return yaml.load(fileContent!);
+    return load(fileContent!);
   }
 }
diff --git a/lib/modules/datasource/helm/common.spec.ts b/lib/modules/datasource/helm/common.spec.ts
index 2de9e3d13b21a3df3c50cdf653bdc834614957bd..63db19e8c4ed45fcd914dba6ed4ccd269c6c3389 100644
--- a/lib/modules/datasource/helm/common.spec.ts
+++ b/lib/modules/datasource/helm/common.spec.ts
@@ -1,5 +1,5 @@
-import { load } from 'js-yaml';
 import { Fixtures } from '../../../../test/fixtures';
+import { load } from '../../../util/yaml';
 import { findSourceUrl } from './common';
 import type { HelmRepository } from './types';
 
diff --git a/lib/modules/datasource/helm/index.ts b/lib/modules/datasource/helm/index.ts
index 5f5eb92fdef39ae7ea749e567a4ab0e6aa172d68..aeff449f255eee7e7736bb87d42e4158c9240438 100644
--- a/lib/modules/datasource/helm/index.ts
+++ b/lib/modules/datasource/helm/index.ts
@@ -1,9 +1,9 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import { cache } from '../../../util/cache/package/decorator';
 import type { HttpResponse } from '../../../util/http/types';
 import { ensureTrailingSlash } from '../../../util/url';
+import { load } from '../../../util/yaml';
 import * as helmVersioning from '../../versioning/helm';
 import { Datasource } from '../datasource';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
diff --git a/lib/modules/manager/argocd/extract.ts b/lib/modules/manager/argocd/extract.ts
index 249fb4a9a9e4f7641d8c41db67a0659c5abe759e..8553a748f064f401bd1f9c7700c213989791af46 100644
--- a/lib/modules/manager/argocd/extract.ts
+++ b/lib/modules/manager/argocd/extract.ts
@@ -1,8 +1,8 @@
 import is from '@sindresorhus/is';
-import { loadAll } from 'js-yaml';
 import { logger } from '../../../logger';
 import { coerceArray } from '../../../util/array';
 import { trimTrailingSlash } from '../../../util/url';
+import { loadAll } from '../../../util/yaml';
 import { DockerDatasource } from '../../datasource/docker';
 import { GitTagsDatasource } from '../../datasource/git-tags';
 import { HelmDatasource } from '../../datasource/helm';
diff --git a/lib/modules/manager/azure-pipelines/extract.ts b/lib/modules/manager/azure-pipelines/extract.ts
index 33f770c2f9c5e364203d1b3c1545d474bcb55a38..b5d353dec58c98a98e103128c751fdc9998a2720 100644
--- a/lib/modules/manager/azure-pipelines/extract.ts
+++ b/lib/modules/manager/azure-pipelines/extract.ts
@@ -1,9 +1,9 @@
-import { load } from 'js-yaml';
 import { GlobalConfig } from '../../../config/global';
 import { logger } from '../../../logger';
 import { coerceArray } from '../../../util/array';
 import { regEx } from '../../../util/regex';
 import { joinUrlParts } from '../../../util/url';
+import { load } from '../../../util/yaml';
 import { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks';
 import { GitTagsDatasource } from '../../datasource/git-tags';
 import { getDep } from '../dockerfile/extract';
diff --git a/lib/modules/manager/batect/extract.ts b/lib/modules/manager/batect/extract.ts
index b2c8105dc29a1cf3d454965a904a99eeb7d12a39..fd9f4c4a03d784641be207ef32750dead72841e3 100644
--- a/lib/modules/manager/batect/extract.ts
+++ b/lib/modules/manager/batect/extract.ts
@@ -1,8 +1,8 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import upath from 'upath';
 import { logger } from '../../../logger';
 import { readLocalFile } from '../../../util/fs';
+import { load } from '../../../util/yaml';
 import { GitTagsDatasource } from '../../datasource/git-tags';
 import { id as dockerVersioning } from '../../versioning/docker';
 import { id as semverVersioning } from '../../versioning/semver';
diff --git a/lib/modules/manager/cloudbuild/extract.ts b/lib/modules/manager/cloudbuild/extract.ts
index b00c00e8122cabf5fb9005eef39a7a4cc9e55328..6f04657b95545e333fee93fa842f42a1fa0ad371 100644
--- a/lib/modules/manager/cloudbuild/extract.ts
+++ b/lib/modules/manager/cloudbuild/extract.ts
@@ -1,6 +1,6 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
+import { load } from '../../../util/yaml';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFileContent } from '../types';
 
diff --git a/lib/modules/manager/crossplane/extract.ts b/lib/modules/manager/crossplane/extract.ts
index 35f70e8783b56063bb709248a3132d6d3e72ef9b..605a70fdf540c55b5364de0fd749bd1082d15acc 100644
--- a/lib/modules/manager/crossplane/extract.ts
+++ b/lib/modules/manager/crossplane/extract.ts
@@ -1,5 +1,5 @@
-import { loadAll } from 'js-yaml';
 import { logger } from '../../../logger';
+import { loadAll } from '../../../util/yaml';
 import { getDep } from '../dockerfile/extract';
 import type {
   ExtractConfig,
diff --git a/lib/modules/manager/docker-compose/extract.ts b/lib/modules/manager/docker-compose/extract.ts
index 67ffe6db2356df9949e4574c8d2c1c9a4f3e8dd0..06ccb814744e219e4737df136a85aea2bd8b996f 100644
--- a/lib/modules/manager/docker-compose/extract.ts
+++ b/lib/modules/manager/docker-compose/extract.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import { newlineRegex, regEx } from '../../../util/regex';
+import { load } from '../../../util/yaml';
 import { getDep } from '../dockerfile/extract';
 import type { ExtractConfig, PackageFileContent } from '../types';
 import type { DockerComposeConfig } from './types';
diff --git a/lib/modules/manager/fleet/extract.ts b/lib/modules/manager/fleet/extract.ts
index 65fa42d8de2ea81856864ab65fcfa5925ee7418b..cee52e074f950ae798924e66fef020f2bd54e375 100644
--- a/lib/modules/manager/fleet/extract.ts
+++ b/lib/modules/manager/fleet/extract.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
-import { loadAll } from 'js-yaml';
 import { logger } from '../../../logger';
 import { regEx } from '../../../util/regex';
+import { loadAll } from '../../../util/yaml';
 import { GitTagsDatasource } from '../../datasource/git-tags';
 import { HelmDatasource } from '../../datasource/helm';
 import { checkIfStringIsPath } from '../terraform/util';
diff --git a/lib/modules/manager/flux/extract.ts b/lib/modules/manager/flux/extract.ts
index 89c260319a705aaa86035ea67de7452443d98d08..036c1a46f142c7f7c07d4561e4d25c8256499c2a 100644
--- a/lib/modules/manager/flux/extract.ts
+++ b/lib/modules/manager/flux/extract.ts
@@ -1,8 +1,8 @@
 import is from '@sindresorhus/is';
-import { loadAll } from 'js-yaml';
 import { logger } from '../../../logger';
 import { readLocalFile } from '../../../util/fs';
 import { regEx } from '../../../util/regex';
+import { loadAll } from '../../../util/yaml';
 import { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags';
 import { DockerDatasource } from '../../datasource/docker';
 import { GitRefsDatasource } from '../../datasource/git-refs';
diff --git a/lib/modules/manager/github-actions/extract.ts b/lib/modules/manager/github-actions/extract.ts
index 4f0e59b5ae79a4d1093d42ec5e65ae0dde490dbc..e0415683c9a1c26ad6f3f89ea08acb478548af8e 100644
--- a/lib/modules/manager/github-actions/extract.ts
+++ b/lib/modules/manager/github-actions/extract.ts
@@ -1,9 +1,9 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { GlobalConfig } from '../../../config/global';
 import { logger } from '../../../logger';
 import { isNotNullOrUndefined } from '../../../util/array';
 import { newlineRegex, regEx } from '../../../util/regex';
+import { load } from '../../../util/yaml';
 import { GithubRunnersDatasource } from '../../datasource/github-runners';
 import { GithubTagsDatasource } from '../../datasource/github-tags';
 import * as dockerVersioning from '../../versioning/docker';
diff --git a/lib/modules/manager/gitlabci-include/common.spec.ts b/lib/modules/manager/gitlabci-include/common.spec.ts
index 7484698925386af35226eef68ff5d2b1e93a05b0..c71f0cf03fb05fa88d3057f40560dcc89f38bc73 100644
--- a/lib/modules/manager/gitlabci-include/common.spec.ts
+++ b/lib/modules/manager/gitlabci-include/common.spec.ts
@@ -1,5 +1,5 @@
-import { load } from 'js-yaml';
 import { Fixtures } from '../../../../test/fixtures';
+import { load } from '../../../util/yaml';
 import type { GitlabPipeline } from '../gitlabci/types';
 import { replaceReferenceTags } from '../gitlabci/utils';
 import {
diff --git a/lib/modules/manager/gitlabci-include/extract.ts b/lib/modules/manager/gitlabci-include/extract.ts
index 9c4a2892042396b0e4d7191a9b4f126961bcd605..b38d730e485e2c61ad5f7a75e2e989348138b540 100644
--- a/lib/modules/manager/gitlabci-include/extract.ts
+++ b/lib/modules/manager/gitlabci-include/extract.ts
@@ -1,8 +1,8 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { GlobalConfig } from '../../../config/global';
 import { logger } from '../../../logger';
 import { regEx } from '../../../util/regex';
+import { load } from '../../../util/yaml';
 import { GitlabTagsDatasource } from '../../datasource/gitlab-tags';
 import type {
   GitlabInclude,
diff --git a/lib/modules/manager/gitlabci/extract.ts b/lib/modules/manager/gitlabci/extract.ts
index 00da59a140dad44a80c56a9fc7a91496e003c12f..a520e0349a74c5cf6d7d35975c3d84ce8d39a986 100644
--- a/lib/modules/manager/gitlabci/extract.ts
+++ b/lib/modules/manager/gitlabci/extract.ts
@@ -1,8 +1,8 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import { readLocalFile } from '../../../util/fs';
 import { trimLeadingSlash } from '../../../util/url';
+import { load } from '../../../util/yaml';
 import type {
   ExtractConfig,
   PackageDependency,
diff --git a/lib/modules/manager/helm-requirements/extract.ts b/lib/modules/manager/helm-requirements/extract.ts
index 5a6a8567aa84ad42154f3bae1f7adfeaafda9865..52834af8251d67924d7c2d42b3ed016d6d6c5b0e 100644
--- a/lib/modules/manager/helm-requirements/extract.ts
+++ b/lib/modules/manager/helm-requirements/extract.ts
@@ -1,6 +1,6 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
+import { load } from '../../../util/yaml';
 import { HelmDatasource } from '../../datasource/helm';
 import type {
   ExtractConfig,
diff --git a/lib/modules/manager/helm-values/extract.ts b/lib/modules/manager/helm-values/extract.ts
index 1f9ea32f61b571b05ee559df95d14682b641a622..e75026dec80a47d62a77da40094a8a181c07e627 100644
--- a/lib/modules/manager/helm-values/extract.ts
+++ b/lib/modules/manager/helm-values/extract.ts
@@ -1,5 +1,5 @@
-import { loadAll } from 'js-yaml';
 import { logger } from '../../../logger';
+import { loadAll } from '../../../util/yaml';
 import { id as dockerVersioning } from '../../versioning/docker';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFileContent } from '../types';
diff --git a/lib/modules/manager/helmfile/extract.ts b/lib/modules/manager/helmfile/extract.ts
index 0a29612900046597f0d122a1730a161f490a883b..0ca299a2232b7aeaa3d44fdc792f82529746e8fb 100644
--- a/lib/modules/manager/helmfile/extract.ts
+++ b/lib/modules/manager/helmfile/extract.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
-import { loadAll } from 'js-yaml';
 import { logger } from '../../../logger';
 import { regEx } from '../../../util/regex';
+import { loadAll } from '../../../util/yaml';
 import { DockerDatasource } from '../../datasource/docker';
 import { HelmDatasource } from '../../datasource/helm';
 import type {
@@ -18,13 +18,6 @@ import {
 const isValidChartName = (name: string | undefined): boolean =>
   !!name && !regEx(/[!@#$%^&*(),.?":{}/|<>A-Z]/).test(name);
 
-function extractYaml(content: string): string {
-  // regex remove go templated ({{ . }}) values
-  return content
-    .replace(regEx(/{{`.+?`}}/gs), '')
-    .replace(regEx(/{{.+?}}/g), '');
-}
-
 function isLocalPath(possiblePath: string): boolean {
   return ['./', '../', '/'].some((localPrefix) =>
     possiblePath.startsWith(localPrefix),
@@ -42,7 +35,10 @@ export async function extractPackageFile(
   // Record kustomization usage for all deps, since updating artifacts is run on the helmfile.yaml as a whole.
   let needKustomize = false;
   try {
-    docs = loadAll(extractYaml(content), null, { json: true }) as Doc[];
+    docs = loadAll(content, null, {
+      removeTemplates: true,
+      json: true,
+    }) as Doc[];
   } catch (err) {
     logger.debug(
       { err, packageFile },
diff --git a/lib/modules/manager/helmsman/extract.ts b/lib/modules/manager/helmsman/extract.ts
index 504b2f43af57867eb2d4b11a8c03edf9bb7f69ca..f776cd0b2f0a45dbe1083f3d7c7161e577485e8a 100644
--- a/lib/modules/manager/helmsman/extract.ts
+++ b/lib/modules/manager/helmsman/extract.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import { regEx } from '../../../util/regex';
+import { load } from '../../../util/yaml';
 import { DockerDatasource } from '../../datasource/docker';
 import { HelmDatasource } from '../../datasource/helm';
 import type {
diff --git a/lib/modules/manager/helmv3/artifacts.ts b/lib/modules/manager/helmv3/artifacts.ts
index 93616df86e557bdd3947a5705597099886665097..7f7df8d6c600b48b7b80a1312a941be7623016f3 100644
--- a/lib/modules/manager/helmv3/artifacts.ts
+++ b/lib/modules/manager/helmv3/artifacts.ts
@@ -1,5 +1,4 @@
 import is from '@sindresorhus/is';
-import yaml from 'js-yaml';
 import pMap from 'p-map';
 import { quote } from 'shlex';
 import { TEMPORARY_ERROR } from '../../../constants/error-messages';
@@ -14,6 +13,7 @@ import {
 } from '../../../util/fs';
 import { getRepoStatus } from '../../../util/git';
 import * as hostRules from '../../../util/host-rules';
+import * as yaml from '../../../util/yaml';
 import { DockerDatasource } from '../../datasource/docker';
 import { HelmDatasource } from '../../datasource/helm';
 import type { UpdateArtifact, UpdateArtifactsResult } from '../types';
diff --git a/lib/modules/manager/helmv3/extract.ts b/lib/modules/manager/helmv3/extract.ts
index d7fc59518c0e169173c7f18c2ffff3b28aa9301c..f6d9e9d4649ad28f418eb12be88e8d9efba2eb86 100644
--- a/lib/modules/manager/helmv3/extract.ts
+++ b/lib/modules/manager/helmv3/extract.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import { getSiblingFileName, localPathExists } from '../../../util/fs';
+import { load } from '../../../util/yaml';
 import { HelmDatasource } from '../../datasource/helm';
 import type {
   ExtractConfig,
diff --git a/lib/modules/manager/helmv3/update.spec.ts b/lib/modules/manager/helmv3/update.spec.ts
index 43062508b6da9323a2ea78519358b4076692c102..854dcfc2e8f6da6173f1b0957a604fba4df37554 100644
--- a/lib/modules/manager/helmv3/update.spec.ts
+++ b/lib/modules/manager/helmv3/update.spec.ts
@@ -1,4 +1,4 @@
-import { dump } from 'js-yaml';
+import { dump } from '../../../util/yaml';
 import * as helmv3Updater from '.';
 
 describe('modules/manager/helmv3/update', () => {
diff --git a/lib/modules/manager/jenkins/extract.ts b/lib/modules/manager/jenkins/extract.ts
index c8b1dad120d01d5bc29bfe6a5e5a364361f114d8..51d3fa54acaca81cadee10df27f1006bb3f91649 100644
--- a/lib/modules/manager/jenkins/extract.ts
+++ b/lib/modules/manager/jenkins/extract.ts
@@ -1,8 +1,8 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import { isSkipComment } from '../../../util/ignore';
 import { newlineRegex, regEx } from '../../../util/regex';
+import { load } from '../../../util/yaml';
 import { JenkinsPluginsDatasource } from '../../datasource/jenkins-plugins';
 import * as mavenVersioning from '../../versioning/maven';
 import type { PackageDependency, PackageFileContent } from '../types';
diff --git a/lib/modules/manager/kubernetes/extract.ts b/lib/modules/manager/kubernetes/extract.ts
index 4588f63d1f07db1055287d1a99c29daed570794c..9920f16007281c6569ec6d1070e078b040fda46e 100644
--- a/lib/modules/manager/kubernetes/extract.ts
+++ b/lib/modules/manager/kubernetes/extract.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
-import { loadAll } from 'js-yaml';
 import { logger } from '../../../logger';
 import { newlineRegex, regEx } from '../../../util/regex';
+import { loadAll } from '../../../util/yaml';
 import {
   KubernetesApiDatasource,
   supportedApis,
diff --git a/lib/modules/manager/kustomize/extract.ts b/lib/modules/manager/kustomize/extract.ts
index 8af061713a609e0cb730ccaa12bbcb414c9bde93..bca4d553c03da7bf001da751fbbdb8c3b344067e 100644
--- a/lib/modules/manager/kustomize/extract.ts
+++ b/lib/modules/manager/kustomize/extract.ts
@@ -1,8 +1,8 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import { coerceArray } from '../../../util/array';
 import { regEx } from '../../../util/regex';
+import { load } from '../../../util/yaml';
 import { DockerDatasource } from '../../datasource/docker';
 import { GitTagsDatasource } from '../../datasource/git-tags';
 import { GithubTagsDatasource } from '../../datasource/github-tags';
diff --git a/lib/modules/manager/npm/extract/pnpm.spec.ts b/lib/modules/manager/npm/extract/pnpm.spec.ts
index 9927655a776f07eef73e4d10c7055cd98b3045bc..590a941f9f33237337e3905b6eae6749786289c6 100644
--- a/lib/modules/manager/npm/extract/pnpm.spec.ts
+++ b/lib/modules/manager/npm/extract/pnpm.spec.ts
@@ -1,8 +1,8 @@
-import yaml from 'js-yaml';
 import { Fixtures } from '../../../../../test/fixtures';
 import { getFixturePath, logger, partial } from '../../../../../test/util';
 import { GlobalConfig } from '../../../../config/global';
 import * as fs from '../../../../util/fs';
+import * as yaml from '../../../../util/yaml';
 import type { PackageFile } from '../../types';
 import type { NpmManagerData } from '../types';
 import {
diff --git a/lib/modules/manager/npm/extract/pnpm.ts b/lib/modules/manager/npm/extract/pnpm.ts
index 3de992b46027baa9729390deff05ebaf2a417b7d..d358212cdbc8408bee5d6879799b86db276d2d89 100644
--- a/lib/modules/manager/npm/extract/pnpm.ts
+++ b/lib/modules/manager/npm/extract/pnpm.ts
@@ -1,6 +1,5 @@
 import is from '@sindresorhus/is';
 import { findPackages } from 'find-packages';
-import { load } from 'js-yaml';
 import upath from 'upath';
 import { GlobalConfig } from '../../../../config/global';
 import { logger } from '../../../../logger';
@@ -10,6 +9,7 @@ import {
   localPathExists,
   readLocalFile,
 } from '../../../../util/fs';
+import { load } from '../../../../util/yaml';
 import type { PackageFile } from '../../types';
 import type { PnpmDependencySchema, PnpmLockFile } from '../post-update/types';
 import type { NpmManagerData } from '../types';
diff --git a/lib/modules/manager/npm/post-update/index.ts b/lib/modules/manager/npm/post-update/index.ts
index 5b8d92b4e1a4cba2abfc567c34361a8bf147633f..fa318343b0528a54348bbab34400b03f09e3abab 100644
--- a/lib/modules/manager/npm/post-update/index.ts
+++ b/lib/modules/manager/npm/post-update/index.ts
@@ -1,7 +1,6 @@
 // TODO: types (#22198)
 import is from '@sindresorhus/is';
 import deepmerge from 'deepmerge';
-import { dump, load } from 'js-yaml';
 import upath from 'upath';
 import { logger } from '../../../../logger';
 import { ExternalHostError } from '../../../../types/errors/external-host-error';
@@ -18,6 +17,7 @@ import type { FileChange } from '../../../../util/git/types';
 import * as hostRules from '../../../../util/host-rules';
 import { newlineRegex, regEx } from '../../../../util/regex';
 import { ensureTrailingSlash } from '../../../../util/url';
+import { dump, load } from '../../../../util/yaml';
 import { NpmDatasource } from '../../../datasource/npm';
 import { scm } from '../../../platform/scm';
 import type { PackageFile, PostUpdateConfig, Upgrade } from '../../types';
diff --git a/lib/modules/manager/npm/post-update/pnpm.ts b/lib/modules/manager/npm/post-update/pnpm.ts
index c3db89f25a67945043cff1ae3ded1a1dc07747c6..9cbffebfdef9192163f73202b5efee4012dbcb21 100644
--- a/lib/modules/manager/npm/post-update/pnpm.ts
+++ b/lib/modules/manager/npm/post-update/pnpm.ts
@@ -1,5 +1,4 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import upath from 'upath';
 import { GlobalConfig } from '../../../../config/global';
 import { TEMPORARY_ERROR } from '../../../../constants/error-messages';
@@ -11,6 +10,7 @@ import type {
   ToolConstraint,
 } from '../../../../util/exec/types';
 import { deleteLocalFile, readLocalFile } from '../../../../util/fs';
+import { load } from '../../../../util/yaml';
 import type { PostUpdateConfig, Upgrade } from '../../types';
 import { getNodeToolConstraint } from './node-version';
 import type { GenerateLockFileResult, PnpmLockFile } from './types';
diff --git a/lib/modules/manager/pre-commit/extract.ts b/lib/modules/manager/pre-commit/extract.ts
index 30a6eac49c65b450dd01d1bf6e09f8470955e611..345e3d66d9e864eb4ac400e81f31fd65727ce988 100644
--- a/lib/modules/manager/pre-commit/extract.ts
+++ b/lib/modules/manager/pre-commit/extract.ts
@@ -1,10 +1,10 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import type { SkipReason } from '../../../types';
 import { detectPlatform } from '../../../util/common';
 import { find } from '../../../util/host-rules';
 import { regEx } from '../../../util/regex';
+import { load } from '../../../util/yaml';
 import { GithubTagsDatasource } from '../../datasource/github-tags';
 import { GitlabTagsDatasource } from '../../datasource/gitlab-tags';
 import type { PackageDependency, PackageFileContent } from '../types';
diff --git a/lib/modules/manager/tekton/extract.ts b/lib/modules/manager/tekton/extract.ts
index 810a4a8673bb8826ecf68cb4f9568c6a15cd948d..9c4ab35d74ec1b77840a197da49c342a75026b81 100644
--- a/lib/modules/manager/tekton/extract.ts
+++ b/lib/modules/manager/tekton/extract.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
-import { loadAll } from 'js-yaml';
 import { logger } from '../../../logger';
 import { coerceArray } from '../../../util/array';
+import { loadAll } from '../../../util/yaml';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFileContent } from '../types';
 import type {
diff --git a/lib/modules/manager/travis/extract.ts b/lib/modules/manager/travis/extract.ts
index 886cc4a0f4b1e80a80f02c58227ceb2cffa82128..9427813c07aed74934c915fbdfe4d3a1c0a2ac11 100644
--- a/lib/modules/manager/travis/extract.ts
+++ b/lib/modules/manager/travis/extract.ts
@@ -1,6 +1,6 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
+import { load } from '../../../util/yaml';
 import { GithubTagsDatasource } from '../../datasource/github-tags';
 import type { PackageDependency, PackageFileContent } from '../types';
 import type { TravisMatrixItem, TravisYaml } from './types';
diff --git a/lib/modules/manager/velaci/extract.ts b/lib/modules/manager/velaci/extract.ts
index 50ea39a6ea3aa29195ac3ecd231630782e731d16..6be65899f03bfb3482955c048754bab2eb1c425d 100644
--- a/lib/modules/manager/velaci/extract.ts
+++ b/lib/modules/manager/velaci/extract.ts
@@ -1,6 +1,6 @@
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
 import { coerceArray } from '../../../util/array';
+import { load } from '../../../util/yaml';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFileContent } from '../types';
 import type { VelaPipelineConfiguration } from './types';
diff --git a/lib/modules/manager/woodpecker/extract.ts b/lib/modules/manager/woodpecker/extract.ts
index 6012709aaff281e52cc9fa40727f40c611930f94..a5fabef1c75bb437ad9ca71d9ed209cf3f62c9a7 100644
--- a/lib/modules/manager/woodpecker/extract.ts
+++ b/lib/modules/manager/woodpecker/extract.ts
@@ -1,6 +1,6 @@
 import is from '@sindresorhus/is';
-import { load } from 'js-yaml';
 import { logger } from '../../../logger';
+import { load } from '../../../util/yaml';
 import { getDep } from '../dockerfile/extract';
 import type { ExtractConfig, PackageFileContent } from '../types';
 import type { WoodpeckerConfig } from './types';
diff --git a/lib/util/schema-utils.ts b/lib/util/schema-utils.ts
index f2b5bed1e490d7adf00b339cee9ea8d59085f8ec..28698d2c8f81beda5ec66d4fb58b7450a62d86d7 100644
--- a/lib/util/schema-utils.ts
+++ b/lib/util/schema-utils.ts
@@ -1,9 +1,9 @@
-import { load, loadAll } from 'js-yaml';
 import JSON5 from 'json5';
 import { DateTime } from 'luxon';
 import type { JsonArray, JsonValue } from 'type-fest';
 import { z } from 'zod';
 import { parse as parseToml } from './toml';
+import { load, loadAll } from './yaml';
 
 interface ErrorContext<T> {
   error: z.ZodError;
diff --git a/lib/util/yaml.spec.ts b/lib/util/yaml.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..39b1ba55a07d6d9cf7bf7dc51883f181ea271440
--- /dev/null
+++ b/lib/util/yaml.spec.ts
@@ -0,0 +1,115 @@
+import { codeBlock } from 'common-tags';
+import { load, loadAll } from './yaml';
+
+describe('util/yaml', () => {
+  describe('loadAll', () => {
+    it('should return empty array for empty string', () => {
+      expect(loadAll(``)).toEqual([]);
+    });
+
+    it('should parse content with single document', () => {
+      expect(
+        loadAll(codeBlock`
+      myObject:
+        aString: value
+      `),
+      ).toEqual([
+        {
+          myObject: {
+            aString: 'value',
+          },
+        },
+      ]);
+    });
+
+    it('should parse content with multiple documents', () => {
+      expect(
+        loadAll(codeBlock`
+      myObject:
+        aString: value
+      ---
+      foo: bar
+      `),
+      ).toEqual([
+        {
+          myObject: {
+            aString: 'value',
+          },
+        },
+        {
+          foo: 'bar',
+        },
+      ]);
+    });
+
+    it('should parse content with templates', () => {
+      expect(
+        loadAll(
+          codeBlock`
+      myObject:
+        aString: {{ value }}
+      ---
+      foo: {{ foo.bar }}
+      `,
+          undefined,
+          { removeTemplates: true },
+        ),
+      ).toEqual([
+        {
+          myObject: {
+            aString: null,
+          },
+        },
+        {
+          foo: null,
+        },
+      ]);
+    });
+  });
+
+  describe('load', () => {
+    it('should return undefined', () => {
+      expect(load(``)).toBeUndefined();
+    });
+
+    it('should parse content with single document', () => {
+      expect(
+        load(codeBlock`
+      myObject:
+        aString: value
+      `),
+      ).toEqual({
+        myObject: {
+          aString: 'value',
+        },
+      });
+    });
+
+    it('should parse content with multiple documents', () => {
+      expect(() =>
+        load(codeBlock`
+      myObject:
+        aString: value
+      ---
+      foo: bar
+      `),
+      ).toThrow();
+    });
+
+    it('should parse content with template', () => {
+      expect(
+        load(
+          codeBlock`
+      myObject:
+        aString: {{value}}
+      `,
+          { removeTemplates: true },
+        ),
+      ).toEqual({
+        myObject: {
+          aString: null,
+        },
+      });
+    });
+  });
+});
diff --git a/lib/util/yaml.ts b/lib/util/yaml.ts
new file mode 100644
index 0000000000000000000000000000000000000000..620c330dfacb372792e7ce262606dd5201e7be2d
--- /dev/null
+++ b/lib/util/yaml.ts
@@ -0,0 +1,41 @@
+import {
+  DumpOptions,
+  LoadOptions,
+  loadAll as multiple,
+  load as single,
+  dump as upstreamDump,
+} from 'js-yaml';
+import { regEx } from './regex';
+
+interface YamlOptions extends LoadOptions {
+  removeTemplates?: boolean;
+}
+
+export function loadAll(
+  content: string,
+  iterator?: null | undefined,
+  options?: YamlOptions,
+): unknown[] {
+  const massagedContent = massageContent(content, options);
+
+  return multiple(massagedContent, iterator, options);
+}
+
+export function load(content: string, options?: YamlOptions): unknown {
+  const massagedContent = massageContent(content, options);
+  return single(massagedContent, options);
+}
+
+export function dump(obj: any, opts?: DumpOptions | undefined): string {
+  return upstreamDump(obj, opts);
+}
+
+function massageContent(content: string, options?: YamlOptions): string {
+  if (options?.removeTemplates) {
+    return content
+      .replace(regEx(/{{`.+?`}}/gs), '')
+      .replace(regEx(/{{.+?}}/g), '');
+  }
+
+  return content;
+}
diff --git a/lib/workers/global/config/parse/file.ts b/lib/workers/global/config/parse/file.ts
index 3d0ecb7d9d42eea5d00fd6f88779526c701523cf..f66cee56d1b494b009b933e82bf1e6fe19038e1a 100644
--- a/lib/workers/global/config/parse/file.ts
+++ b/lib/workers/global/config/parse/file.ts
@@ -1,6 +1,5 @@
 import is from '@sindresorhus/is';
 import fs from 'fs-extra';
-import { load } from 'js-yaml';
 import JSON5 from 'json5';
 import upath from 'upath';
 import { migrateConfig } from '../../../../config/migration';
@@ -8,6 +7,7 @@ import type { AllConfig, RenovateConfig } from '../../../../config/types';
 import { logger } from '../../../../logger';
 import { parseJson } from '../../../../util/common';
 import { readSystemFile } from '../../../../util/fs';
+import { load } from '../../../../util/yaml';
 
 export async function getParsedContent(file: string): Promise<RenovateConfig> {
   if (upath.basename(file) === '.renovaterc') {