diff --git a/packed/index.js b/packed/index.js
index 617f50d..734d5ae 100644
--- a/packed/index.js
+++ b/packed/index.js
@@ -7,47 +7,9 @@
 "use strict";
 
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.SDL_TAGS = exports.SDL_GIT_URL = exports.NINJA_VERSION = void 0;
+exports.SDL_GIT_URL = exports.NINJA_VERSION = void 0;
 exports.NINJA_VERSION = "1.11.1";
 exports.SDL_GIT_URL = "https://github.com/libsdl-org/SDL.git";
-exports.SDL_TAGS = [
-    "2.0.22-RC1",
-    "2.0.22-RC2",
-    "2.0.22-RC3",
-    "release-2.0.0",
-    "release-2.0.1",
-    "release-2.0.2",
-    "release-2.0.3",
-    "release-2.0.4",
-    "release-2.0.5",
-    "release-2.0.6",
-    "release-2.0.7",
-    "release-2.0.8",
-    "release-2.0.9",
-    "release-2.0.10",
-    "release-2.0.12",
-    "release-2.0.14",
-    "release-2.0.16",
-    "release-2.0.18",
-    "release-2.0.20",
-    "release-2.0.22",
-    "prerelease-2.23.1",
-    "prerelease-2.23.2",
-    "release-2.24.0",
-    "release-2.24.1",
-    "release-2.24.2",
-    "prerelease-2.25.1",
-    "release-2.26.0",
-    "release-2.26.1",
-    "release-2.26.2",
-    "release-2.26.3",
-    "release-2.26.4",
-    "release-2.26.5",
-    "prerelease-2.27.1",
-    // Add SDL2 releases here
-    "prerelease-3.0.0",
-    // Add SDL3 releases here
-];
 
 
 /***/ }),
@@ -385,7 +347,7 @@
 }
 function run() {
     return __awaiter(this, void 0, void 0, function () {
-        var SDL_BUILD_PLATFORM, SETUP_SDL_ROOT, IGNORED_SHELLS, shell_in, SHELL, REQUESTED_VERSION_TYPE, CMAKE_BUILD_TYPE, CMAKE_BUILD_TYPES, git_branch_hash, requested_version, requested_type, sdl_release, GIT_HASH, CMAKE_TOOLCHAIN_FILE, STATE_HASH, PACKAGE_DIR, CACHE_KEY, CACHE_PATHS, sdl_from_cache, SOURCE_DIR, BUILD_DIR, USE_NINJA, cmake_configure_args, SDL_VERSION;
+        var SDL_BUILD_PLATFORM, SETUP_SDL_ROOT, IGNORED_SHELLS, shell_in, SHELL, REQUESTED_VERSION_TYPE, CMAKE_BUILD_TYPE, CMAKE_BUILD_TYPES, git_branch_hash, requested_version, requested_type, github_releases, release_db, sdl_release, GIT_HASH, CMAKE_TOOLCHAIN_FILE, STATE_HASH, PACKAGE_DIR, CACHE_KEY, CACHE_PATHS, sdl_from_cache, SOURCE_DIR, BUILD_DIR, USE_NINJA, cmake_configure_args, SDL_VERSION;
         var _this = this;
         return __generator(this, function (_a) {
             switch (_a.label) {
@@ -428,7 +390,9 @@
                             }
                         }
                         else {
-                            sdl_release = version_1.SdlRelease.find_release(requested_version, core.getBooleanInput("pre-release"), requested_type);
+                            github_releases = version_1.GitHubRelease.fetch_all("libsdl-org/SDL");
+                            release_db = version_1.SdlReleaseDb.create(github_releases);
+                            sdl_release = release_db.find(requested_version, core.getBooleanInput("pre-release"), requested_type);
                             if (!sdl_release) {
                                 throw new util_1.SetupSdlError("Could not find a matching SDL release for ".concat(requested_version));
                             }
@@ -845,10 +809,30 @@
     return result;
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.parse_requested_sdl_version = exports.SdlRelease = exports.SdlReleaseType = exports.SdlVersion = void 0;
+exports.parse_requested_sdl_version = exports.SdlRelease = exports.SdlReleaseDb = exports.SdlReleaseType = exports.SdlVersion = exports.GitHubRelease = void 0;
+var child_process = __importStar(__nccwpck_require__(2081));
 var fs = __importStar(__nccwpck_require__(7147));
-var constants_1 = __nccwpck_require__(7077);
 var util_1 = __nccwpck_require__(9731);
+var GitHubRelease = /** @class */ (function () {
+    function GitHubRelease(name, prerelease, tag, time) {
+        this.name = name;
+        this.prerelease = prerelease;
+        this.tag = tag;
+        this.time = time;
+    }
+    GitHubRelease.fetch_all = function (repo) {
+        var buffer = child_process.execSync("gh release list -R ".concat(repo, " -L 1000"));
+        return GitHubRelease.from_gh_output(buffer.toString());
+    };
+    GitHubRelease.from_gh_output = function (text) {
+        return text.trim().split("\n").map(function (line_str) {
+            var line_parts = line_str.split("\t");
+            return new GitHubRelease(line_parts[0], line_parts[1].toLowerCase() == "pre-release", line_parts[2], Date.parse(line_parts[3]));
+        });
+    };
+    return GitHubRelease;
+}());
+exports.GitHubRelease = GitHubRelease;
 var SdlVersion = /** @class */ (function () {
     function SdlVersion(version) {
         if (typeof version == "string") {
@@ -961,20 +945,36 @@
     SdlReleaseType["Latest"] = "Latest";
     SdlReleaseType["Exact"] = "Exact";
 })(SdlReleaseType = exports.SdlReleaseType || (exports.SdlReleaseType = {}));
-var SdlRelease = /** @class */ (function () {
-    function SdlRelease(version, prerelease, tag) {
-        this.version = version;
-        this.prerelease = prerelease;
-        this.tag = tag;
+var SdlReleaseDb = /** @class */ (function () {
+    function SdlReleaseDb(releases) {
+        this.releases = releases;
     }
-    SdlRelease.get_releases = function () {
-        var releases = [];
+    SdlReleaseDb.prototype.find = function (version, prerelease, type) {
+        for (var _i = 0, _a = this.releases; _i < _a.length; _i++) {
+            var release = _a[_i];
+            // Skip if a pre-release has not been requested
+            if (release.prerelease != null && !prerelease) {
+                continue;
+            }
+            if (type == SdlReleaseType.Exact) {
+                if (release.version.equals(version)) {
+                    return release;
+                }
+            }
+            if (type == SdlReleaseType.Latest || type == SdlReleaseType.Any) {
+                if (release.version.major == version.major) {
+                    return release;
+                }
+            }
+        }
+        return null;
+    };
+    SdlReleaseDb.create = function (github_releases) {
         var R = new RegExp("(release-|prerelease-)?([0-9.]+)(-RC([0-9]+))?");
-        for (var _i = 0, SDL_TAGS_1 = constants_1.SDL_TAGS; _i < SDL_TAGS_1.length; _i++) {
-            var tag = SDL_TAGS_1[_i];
-            var m = tag.match(R);
+        var releases = github_releases.map(function (gh_release) {
+            var m = gh_release.tag.match(R);
             if (m == null) {
-                throw new util_1.SetupSdlError("Invalid tag: ".concat(tag));
+                throw new util_1.SetupSdlError("Invalid tag: ".concat(gh_release.tag));
             }
             var prerelease = null;
             if (m[1] != null && m[1] != "release-") {
@@ -984,34 +984,22 @@
                 prerelease = Number(m[4]) + 1;
             }
             var version = m[2];
-            releases.push(new SdlRelease(new SdlVersion(version), prerelease, tag));
-        }
+            return new SdlRelease(new SdlVersion(version), prerelease, gh_release.tag);
+        });
         releases.sort(function (release1, release2) {
             return release1.compare(release2);
         });
-        return releases;
+        return new SdlReleaseDb(releases);
     };
-    SdlRelease.find_release = function (version, prerelease, type) {
-        var RELEASES = SdlRelease.get_releases();
-        for (var _i = 0, RELEASES_1 = RELEASES; _i < RELEASES_1.length; _i++) {
-            var sdl_release = RELEASES_1[_i];
-            // Skip if a pre-release has not been requested
-            if (sdl_release.prerelease != null && !prerelease) {
-                continue;
-            }
-            if (type == SdlReleaseType.Exact) {
-                if (sdl_release.version.equals(version)) {
-                    return sdl_release;
-                }
-            }
-            if (type == SdlReleaseType.Latest || type == SdlReleaseType.Any) {
-                if (sdl_release.version.major == version.major) {
-                    return sdl_release;
-                }
-            }
-        }
-        return null;
-    };
+    return SdlReleaseDb;
+}());
+exports.SdlReleaseDb = SdlReleaseDb;
+var SdlRelease = /** @class */ (function () {
+    function SdlRelease(version, prerelease, tag) {
+        this.version = version;
+        this.prerelease = prerelease;
+        this.tag = tag;
+    }
     SdlRelease.prototype.compare = function (other) {
         var cmp = this.version.compare(other.version);
         if (cmp != 0) {
diff --git a/src/constants.ts b/src/constants.ts
index cfa7da9..7c1ba19 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -1,42 +1,3 @@
 export const NINJA_VERSION = "1.11.1";
 
 export const SDL_GIT_URL = "https://github.com/libsdl-org/SDL.git";
-
-export const SDL_TAGS = [
-  "2.0.22-RC1",
-  "2.0.22-RC2",
-  "2.0.22-RC3",
-  "release-2.0.0",
-  "release-2.0.1",
-  "release-2.0.2",
-  "release-2.0.3",
-  "release-2.0.4",
-  "release-2.0.5",
-  "release-2.0.6",
-  "release-2.0.7",
-  "release-2.0.8",
-  "release-2.0.9",
-  "release-2.0.10",
-  "release-2.0.12",
-  "release-2.0.14",
-  "release-2.0.16",
-  "release-2.0.18",
-  "release-2.0.20",
-  "release-2.0.22",
-  "prerelease-2.23.1",
-  "prerelease-2.23.2",
-  "release-2.24.0",
-  "release-2.24.1",
-  "release-2.24.2",
-  "prerelease-2.25.1",
-  "release-2.26.0",
-  "release-2.26.1",
-  "release-2.26.2",
-  "release-2.26.3",
-  "release-2.26.4",
-  "release-2.26.5",
-  "prerelease-2.27.1",
-  // Add SDL2 releases here
-  "prerelease-3.0.0",
-  // Add SDL3 releases here
-];
diff --git a/src/main.ts b/src/main.ts
index a13349d..89f2805 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -12,7 +12,8 @@
 import { SetupSdlError } from "./util";
 
 import {
-  SdlRelease,
+  GitHubRelease,
+  SdlReleaseDb,
   SdlReleaseType,
   SdlVersion,
   parse_requested_sdl_version,
@@ -306,7 +307,9 @@
         throw new SetupSdlError("Invalid -head version");
       }
     } else {
-      const sdl_release = SdlRelease.find_release(
+      const github_releases = GitHubRelease.fetch_all("libsdl-org/SDL");
+      const release_db = SdlReleaseDb.create(github_releases);
+      const sdl_release = release_db.find(
         requested_version,
         core.getBooleanInput("pre-release"),
         requested_type
diff --git a/src/version.test.ts b/src/version.test.ts
index 9a55536..a2e677e 100644
--- a/src/version.test.ts
+++ b/src/version.test.ts
@@ -1,12 +1,39 @@
 import {
+  GitHubRelease,
   parse_requested_sdl_version,
   SdlVersion,
   SdlRelease,
+  SdlReleaseDb,
   SdlReleaseType,
 } from "./version";
 
 import { describe, expect, test } from "@jest/globals";
 
+const GH_RELEASE_OUTPUT = ""
+  + "3.1.1\tLatest\tprerelease-3.1.1\t2023-12-25T18:45:17Z\n"
+  + "2.28.0\tLatest\trelease-2.28.0\t2023-06-20T18:45:17Z\n"
+  + "2.28.0 RC1\tPre-release\tprerelease-2.27.1\t2023-06-14T03:59:14Z\n"
+  + "2.26.5\t\trelease-2.26.5\t2023-04-05T19:35:40Z\n"
+  + "2.26.4\t\trelease-2.26.4\t2023-03-07T00:17:02Z\n"
+  + "2.26.3\t\trelease-2.26.3\t2023-02-06T23:31:56Z\n"
+  + "2.26.2\t\trelease-2.26.2\t2023-01-03T15:08:11Z\n"
+  + "2.26.1\t\trelease-2.26.1\t2022-12-01T20:33:11Z\n"
+  + "2.26.0\t\trelease-2.26.0\t2022-11-22T00:28:26Z\n"
+  + "2.26.0 RC1\tPre-release\tprerelease-2.25.1\t2022-11-17T17:49:02Z\n"
+  + "2.24.2\t\trelease-2.24.2\t2022-11-01T13:39:15Z\n"
+  + "2.24.1\t\trelease-2.24.1\t2022-10-05T00:16:33Z\n"
+  + "2.24.0\t\trelease-2.24.0\t2022-08-19T16:04:03Z\n"
+  + "2.0.22\t\trelease-2.0.22\t2022-04-25T19:20:25Z\n"
+  + "2.0.20\t\trelease-2.0.20\t2022-01-11T01:03:58Z\n"
+  + "2.0.18\t\trelease-2.0.18\t2021-11-30T17:15:42Z\n"
+  + "2.0.16\t\trelease-2.0.16\t2021-08-10T16:03:15Z\n"
+  + "2.0.14\t\trelease-2.0.14\t2021-07-08T17:14:16Z\n"
+  + "2.0.12\t\trelease-2.0.12\t2022-05-24T22:37:24Z\n"
+  + "2.0.10\t\trelease-2.0.10\t2022-05-24T22:35:08Z\n"
+  + "2.0.9\t\trelease-2.0.9\t2022-05-24T22:33:03Z\n"
+  + "2.0.8\t\trelease-2.0.8\t2022-05-23T22:20:21Z\n"
+;
+
 describe("testing parsing of version string", () => {
   function add_parse_to_version_test(
     input: string,
@@ -69,11 +96,13 @@
 });
 
 describe("test finding a release", () => {
-  expect(SdlRelease.get_releases()).toBeTruthy();
+  const github_releases = GitHubRelease.from_gh_output(GH_RELEASE_OUTPUT);
+  const sdl_release_db = SdlReleaseDb.create(github_releases);
+  expect(sdl_release_db.releases).toBeTruthy();
 
   test(`test finding exact 2.0.22 release`, () => {
     const v = new SdlVersion({ major: 2, minor: 0, patch: 22 });
-    const rel = SdlRelease.find_release(v, true, SdlReleaseType.Exact);
+    const rel = sdl_release_db.find(v, true, SdlReleaseType.Exact);
     expect(rel).not.toBeNull();
     if (rel) {
       expect(rel.version).toStrictEqual(v);
@@ -83,7 +112,7 @@
 
   test(`test finding exact 2.26.1 release`, () => {
     const v = new SdlVersion({ major: 2, minor: 26, patch: 1 });
-    const rel = SdlRelease.find_release(v, true, SdlReleaseType.Exact);
+    const rel = sdl_release_db.find(v, true, SdlReleaseType.Exact);
     expect(rel).not.toBeNull();
     if (rel) {
       expect(rel.version).toStrictEqual(v);
@@ -93,7 +122,7 @@
 
   test(`test finding latest 2 release`, () => {
     const v = new SdlVersion({ major: 2, minor: 0, patch: 0 });
-    const rel = SdlRelease.find_release(v, true, SdlReleaseType.Latest);
+    const rel = sdl_release_db.find(v, true, SdlReleaseType.Latest);
     expect(rel).not.toBeNull();
     if (rel) {
       // 2.26.5 exists, so the result must be > 2.26.4
@@ -104,7 +133,7 @@
 
   test(`test finding latest non-prerelease 2 release`, () => {
     const v = new SdlVersion({ major: 2, minor: 0, patch: 0 });
-    const rel = SdlRelease.find_release(v, false, SdlReleaseType.Latest);
+    const rel = sdl_release_db.find(v, false, SdlReleaseType.Latest);
     expect(rel).not.toBeNull();
     if (rel) {
       // 2.26.5 exists, so the result must be > 2.26.4
@@ -116,7 +145,7 @@
 
   test(`test finding any 2 release`, () => {
     const v = new SdlVersion({ major: 2, minor: 0, patch: 0 });
-    const rel = SdlRelease.find_release(v, true, SdlReleaseType.Any);
+    const rel = sdl_release_db.find(v, true, SdlReleaseType.Any);
     expect(rel).not.toBeNull();
     if (rel) {
       // 2.26.5 exists, so the result must be > 2.26.4
@@ -126,7 +155,7 @@
 
   test(`test finding any 3 release`, () => {
     const v = new SdlVersion({ major: 3, minor: 0, patch: 0 });
-    const rel = SdlRelease.find_release(v, true, SdlReleaseType.Any);
+    const rel = sdl_release_db.find(v, true, SdlReleaseType.Any);
     expect(rel).not.toBeNull();
     if (rel) {
       // FIXME: Only 3.0.0-prerelease exists at the moment
diff --git a/src/version.ts b/src/version.ts
index c0543c0..eb64351 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1,8 +1,38 @@
+import * as child_process from "child_process";
 import * as fs from "fs";
 
-import { SDL_TAGS } from "./constants";
 import { SetupSdlError } from "./util";
 
+export class GitHubRelease {
+  name: string;
+  prerelease: boolean;
+  tag: string;
+  time: number;
+  constructor(name: string, prerelease: boolean, tag: string, time: number) {
+    this.name = name;
+    this.prerelease = prerelease;
+    this.tag = tag;
+    this.time = time;
+  }
+
+  static fetch_all(repo: string): GitHubRelease[] {
+    const buffer = child_process.execSync(`gh release list -R ${repo} -L 1000`);
+    return GitHubRelease.from_gh_output(buffer.toString());
+  }
+
+  static from_gh_output(text: string): GitHubRelease[] {
+    return text.trim().split("\n").map(line_str => {
+      const line_parts = line_str.split("\t");
+      return new GitHubRelease(
+        line_parts[0],
+        line_parts[1].toLowerCase() == "pre-release",
+        line_parts[2],
+        Date.parse(line_parts[3]),
+      );
+    });
+  }
+}
+
 export class SdlVersion {
   major: number;
   minor: number;
@@ -163,6 +193,62 @@
   Exact = "Exact",
 }
 
+export class SdlReleaseDb {
+  releases: SdlRelease[];
+
+  constructor(releases: SdlRelease[]) {
+    this.releases = releases;
+  }
+
+  find(
+    version: SdlVersion,
+    prerelease: boolean,
+    type: SdlReleaseType
+  ): SdlRelease | null {
+    for (const release of this.releases) {
+      // Skip if a pre-release has not been requested
+      if (release.prerelease != null && !prerelease) {
+        continue;
+      }
+      if (type == SdlReleaseType.Exact) {
+        if (release.version.equals(version)) {
+          return release;
+        }
+      }
+      if (type == SdlReleaseType.Latest || type == SdlReleaseType.Any) {
+        if (release.version.major == version.major) {
+          return release;
+        }
+      }
+    }
+    return null;
+  }
+
+  static create(github_releases: GitHubRelease[]): SdlReleaseDb {
+
+    const R = new RegExp("(release-|prerelease-)?([0-9.]+)(-RC([0-9]+))?");
+    const releases = github_releases.map(gh_release => {
+      const m = gh_release.tag.match(R);
+      if (m == null) {
+        throw new SetupSdlError(`Invalid tag: ${gh_release.tag}`);
+      }
+      let prerelease: number | null = null;
+      if (m[1] != null && m[1] != "release-") {
+        prerelease = 1;
+      } else if (m[3] != null && m[4] != null) {
+        prerelease = Number(m[4]) + 1;
+      }
+      const version = m[2];
+      return new SdlRelease(new SdlVersion(version), prerelease, gh_release.tag);
+    });
+    releases.sort((release1, release2) => {
+      return release1.compare(release2);
+    });
+
+    return new SdlReleaseDb(releases);
+  }
+}
+
 export class SdlRelease {
   version: SdlVersion;
   prerelease: number | null;
@@ -174,55 +260,6 @@
     this.tag = tag;
   }
 
-  static get_releases(): SdlRelease[] {
-    const releases: SdlRelease[] = [];
-    const R = new RegExp("(release-|prerelease-)?([0-9.]+)(-RC([0-9]+))?");
-
-    for (const tag of SDL_TAGS) {
-      const m = tag.match(R);
-      if (m == null) {
-        throw new SetupSdlError(`Invalid tag: ${tag}`);
-      }
-      let prerelease: number | null = null;
-      if (m[1] != null && m[1] != "release-") {
-        prerelease = 1;
-      } else if (m[3] != null && m[4] != null) {
-        prerelease = Number(m[4]) + 1;
-      }
-      const version = m[2];
-      releases.push(new SdlRelease(new SdlVersion(version), prerelease, tag));
-    }
-    releases.sort(function (release1, release2) {
-      return release1.compare(release2);
-    });
-    return releases;
-  }
-
-  static find_release(
-    version: SdlVersion,
-    prerelease: boolean,
-    type: SdlReleaseType
-  ): SdlRelease | null {
-    const RELEASES: SdlRelease[] = SdlRelease.get_releases();
-    for (const sdl_release of RELEASES) {
-      // Skip if a pre-release has not been requested
-      if (sdl_release.prerelease != null && !prerelease) {
-        continue;
-      }
-      if (type == SdlReleaseType.Exact) {
-        if (sdl_release.version.equals(version)) {
-          return sdl_release;
-        }
-      }
-      if (type == SdlReleaseType.Latest || type == SdlReleaseType.Any) {
-        if (sdl_release.version.major == version.major) {
-          return sdl_release;
-        }
-      }
-    }
-    return null;
-  }
-
   compare(other: SdlRelease): number {
     const cmp = this.version.compare(other.version);
     if (cmp != 0) {
