diff --git a/web/assets/style.css b/web/assets/style.css
index 10c2ce3..3f7345b 100644
--- a/web/assets/style.css
+++ b/web/assets/style.css
@@ -214,3 +214,16 @@ code{font-family:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,"Co
/* download copy-command card */
.dl-cmd{margin-top:8px;border:1px solid var(--line);border-radius:8px;padding:10px 12px;background:#0a0e15}
.dl-cmd code{font-size:12.5px;white-space:pre-wrap;word-break:break-all;color:#d0d0d0}
+
+/* ---------- git.php releases ---------- */
+.gh-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
+.rel-list{display:grid;gap:18px}
+.rel-card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:22px}
+.rel-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:10px}
+.rel-version{font-weight:800;font-size:17px;color:#fff}
+.rel-tag{font-family:ui-monospace,monospace;font-size:12.5px;color:var(--muted);margin-left:8px}
+.rel-date{font-size:12.5px;color:var(--dim);font-family:ui-monospace,monospace}
+.rel-assets{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}
+.rel-asset{border:1px solid var(--line);border-radius:8px;padding:6px 10px;font-size:12.5px;font-family:ui-monospace,monospace;color:var(--text);text-decoration:none}
+.rel-asset:hover{border-color:#fff;color:#fff}
+.rel-size{color:var(--dim);margin-left:6px}
diff --git a/web/git.php b/web/git.php
index 5744a79..891fec2 100644
--- a/web/git.php
+++ b/web/git.php
@@ -57,7 +57,57 @@ function md(string $t): string {
$t = preg_replace('/`([^`]+)`/', '$1', $t);
return $t;
}
+function gh_api(string $url): array {
+ $json = null;
+ if (function_exists('curl_init')) {
+ $ch = curl_init($url);
+ curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 15,
+ CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYPEER => false,
+ CURLOPT_SSL_VERIFYHOST => false, CURLOPT_USERAGENT => 'pmm-site']);
+ $r = curl_exec($ch); curl_close($ch);
+ if (is_string($r) && $r !== '') $json = $r;
+ }
+ if ($json === null) $json = (string)@shell_exec('curl -s --max-time 15 ' . escapeshellarg($url));
+ $d = json_decode((string)$json, true);
+ return is_array($d) ? $d : [];
+}
+function render_releases(): void {
+ $rels = gh_api('https://api.github.com/repos/JGZYES/ParlzPackageManger/releases?per_page=30');
+ if (!$rels) { echo '
source