diff --git a/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap
index 9100d9c208e1fb98ea48007838f21cae5b69c729..9e051b41102cf7eca6b99af6927e5282e5439663 100644
--- a/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap
+++ b/lib/modules/manager/npm/extract/__snapshots__/index.spec.ts.snap
@@ -312,6 +312,32 @@ exports[`modules/manager/npm/extract/index .extractPackageFile() extracts non-np
       "sourceUrl": "https://github.com/Owner/P",
       "versioning": "npm",
     },
+    {
+      "currentRawValue": "github:owner/q#semver:1.1.0",
+      "currentValue": "1.1.0",
+      "datasource": "github-tags",
+      "depName": "q",
+      "depType": "dependencies",
+      "gitRef": true,
+      "packageName": "owner/q",
+      "pinDigests": false,
+      "prettyDepType": "dependency",
+      "sourceUrl": "https://github.com/owner/q",
+      "versioning": "npm",
+    },
+    {
+      "currentRawValue": "github:owner/r#semver:^1.0.0",
+      "currentValue": "^1.0.0",
+      "datasource": "github-tags",
+      "depName": "r",
+      "depType": "dependencies",
+      "gitRef": true,
+      "packageName": "owner/r",
+      "pinDigests": false,
+      "prettyDepType": "dependency",
+      "sourceUrl": "https://github.com/owner/r",
+      "versioning": "npm",
+    },
   ],
   "extractedConstraints": {},
   "managerData": {
diff --git a/lib/modules/manager/npm/extract/common/dependency.ts b/lib/modules/manager/npm/extract/common/dependency.ts
index 7ee3740330122ee09039cfa251a76edbde9c364f..04ce25d038f07ac10eb56c4bc568bbeea7858f38 100644
--- a/lib/modules/manager/npm/extract/common/dependency.ts
+++ b/lib/modules/manager/npm/extract/common/dependency.ts
@@ -181,8 +181,22 @@ export function extractDependency(
     dep.versioning = npmVersioningId;
     dep.packageName = githubOwnerRepo;
   } else {
-    dep.skipReason = 'unversioned-reference';
-    return dep;
+    // <protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
+    // https://docs.npmjs.com/cli/v10/configuring-npm/package-json#git-urls-as-dependencies
+    const len = 7; // length of 'semver:'
+    const maybeVersion = depRefPart.substring(len);
+
+    if (depRefPart.startsWith('semver:') && isValid(maybeVersion)) {
+      dep.currentRawValue = dep.currentValue;
+      dep.currentValue = maybeVersion;
+      dep.datasource = GithubTagsDatasource.id;
+      dep.versioning = npmVersioningId;
+      dep.packageName = githubOwnerRepo;
+      dep.pinDigests = false;
+    } else {
+      dep.skipReason = 'unversioned-reference';
+      return dep;
+    }
   }
   dep.sourceUrl = `https://github.com/${githubOwnerRepo}`;
   dep.gitRef = true;
diff --git a/lib/modules/manager/npm/extract/index.spec.ts b/lib/modules/manager/npm/extract/index.spec.ts
index 032faf0a18ac951e0dad352586e0b0eb732d7207..cd9de9df4432518acb02d267087d719dde60f8a0 100644
--- a/lib/modules/manager/npm/extract/index.spec.ts
+++ b/lib/modules/manager/npm/extract/index.spec.ts
@@ -594,6 +594,8 @@ describe('modules/manager/npm/extract/index', () => {
           n: 'git+https://github.com/owner/n#v2.0.0',
           o: 'git@github.com:owner/o.git#v2.0.0',
           p: 'Owner/P.git#v2.0.0',
+          q: 'github:owner/q#semver:1.1.0',
+          r: 'github:owner/r#semver:^1.0.0',
         },
       };
       const pJsonStr = JSON.stringify(pJson);
@@ -691,6 +693,18 @@ describe('modules/manager/npm/extract/index', () => {
             datasource: 'github-tags',
             sourceUrl: 'https://github.com/Owner/P',
           },
+          {
+            depName: 'q',
+            currentValue: '1.1.0',
+            datasource: 'github-tags',
+            sourceUrl: 'https://github.com/owner/q',
+          },
+          {
+            depName: 'r',
+            currentValue: '^1.0.0',
+            datasource: 'github-tags',
+            sourceUrl: 'https://github.com/owner/r',
+          },
         ],
       });
     });