feat(web): list zddc-server binaries + image tags on releases page

The releases index already enumerated HTML tools by channel and
version. Add a parallel section for zddc-server with two artifact
families:

- Standalone binaries: a channel × platform table linking to
  website/releases/zddc-server-{linux,darwin,windows}-{amd64,arm64}-<channel>
  (the files release-image.sh now mirrors there). Empty cells render
  as em-dashes; the table only renders when at least one binary
  exists locally so freshly-cloned repos don't show a ghost section.
- Container images: pull-snippet, channel chips linking to the
  codeberg package page, and a "Pin to version" row of historical
  tags (clean stables first, recent pre-releases listed separately
  with a "recent pre-releases:" label so the pre-release noise
  doesn't drown out the stable list).

Recent pre-releases capped at 10 entries to keep the list scannable
as alpha cuts proliferate over time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
ZDDC 2026-04-29 20:04:28 -05:00
parent 566070ca80
commit 6e1777e9c2
7 changed files with 135 additions and 5 deletions

View file

@ -147,6 +147,15 @@ build_releases_index() {
.rel-versions a { margin-right: 0.5rem; color: var(--color-text); text-decoration: none; padding: 0.1rem 0.4rem; border-radius: 4px; }
.rel-versions a:hover { background: var(--color-bg-subtle); text-decoration: underline; }
.rel-meta { font-size: 0.85rem; color: var(--color-text-muted); margin-top: 0.5rem; }
.rel-bin-table { width: 100%; border-collapse: collapse; margin: 0.5rem 0 1rem; font-size: 0.9rem; }
.rel-bin-table th, .rel-bin-table td { text-align: left; padding: 0.4rem 0.6rem; border-bottom: 1px solid var(--color-border); }
.rel-bin-table th { font-weight: 600; color: var(--color-text-muted); }
.rel-bin-table td.ch-stable { color: var(--color-primary); font-weight: 600; }
.rel-bin-table td.ch-beta, .rel-bin-table td.ch-alpha { color: var(--color-text-muted); }
.rel-bin-table a { color: var(--color-text); text-decoration: none; padding: 0.1rem 0.35rem; border-radius: 4px; }
.rel-bin-table a:hover { background: var(--color-bg-subtle); text-decoration: underline; }
.rel-bin-table td.empty { color: var(--color-text-muted); font-style: italic; }
.rel-pull { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.85rem; background: var(--color-bg-subtle); padding: 0.25rem 0.5rem; border-radius: 4px; display: inline-block; margin: 0.2rem 0; }
</style>
</head>
<body>
@ -201,6 +210,88 @@ HEAD
fi
printf ' </section>\n'
done
# zddc-server section — different artifact shape than the HTML tools.
# Two artifact families:
# 1. Downloadable binaries at website/releases/zddc-server-<os>-<arch>-<channel>
# (mutable channel pointers; release-image.sh writes them).
# 2. Container images at codeberg.org/varasys/zddc-server:<channel> and
# :<version> (the registry; we don't proxy them through the website,
# but we list the recent tags and a `podman pull` snippet for each).
printf ' <section class="rel-tool">\n'
printf ' <h2>zddc-server</h2>\n'
printf ' <p style="margin-top:0;color:var(--color-text-muted);font-size:0.95rem;">Go HTTP file server with ACL, .archive index, and a delegated-admin .zddc editor. Distributed as a container image (preferred) or a standalone binary.</p>\n'
# Binaries table.
_platforms="linux-amd64 darwin-amd64 darwin-arm64 windows-amd64"
_have_any_bin=0
for _ch in stable beta alpha; do
for _p in $_platforms; do
_ext=""; case "$_p" in windows-*) _ext=".exe" ;; esac
if [ -f "$RELEASES_DIR/zddc-server-${_p}-${_ch}${_ext}" ]; then
_have_any_bin=1; break 2
fi
done
done
if [ "$_have_any_bin" = "1" ]; then
printf ' <h3 style="font-size:1rem;margin:0.75rem 0 0.4rem;">Standalone binaries</h3>\n'
printf ' <table class="rel-bin-table"><thead><tr><th>Channel</th>'
for _p in $_platforms; do printf '<th>%s</th>' "$_p"; done
printf '</tr></thead><tbody>\n'
for _ch in stable beta alpha; do
printf ' <tr><td class="ch-%s">%s</td>' "$_ch" "$_ch"
for _p in $_platforms; do
_ext=""; case "$_p" in windows-*) _ext=".exe" ;; esac
_f="zddc-server-${_p}-${_ch}${_ext}"
if [ -f "$RELEASES_DIR/$_f" ]; then
printf '<td><a href="%s">download</a></td>' "$_f"
else
printf '<td class="empty">—</td>'
fi
done
printf '</tr>\n'
done
printf ' </tbody></table>\n'
fi
# Container image: pull-snippet box plus the recent git tag list.
printf ' <h3 style="font-size:1rem;margin:0.75rem 0 0.4rem;">Container image</h3>\n'
printf ' <p style="margin:0 0 0.4rem;font-size:0.9rem;">Pull from <a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server">codeberg.org/varasys/zddc-server</a>:</p>\n'
printf ' <div class="rel-channels">\n'
printf ' <a class="stable" href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/stable">:stable</a>\n'
printf ' <a class="beta" href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/beta">:beta</a>\n'
printf ' <a class="alpha" href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/alpha">:alpha</a>\n'
printf ' </div>\n'
printf ' <code class="rel-pull">podman pull codeberg.org/varasys/zddc-server:stable</code>\n'
# Recent zddc-server tags from git: clean stables first (top), then
# the most recent pre-releases. Dropping older pre-releases keeps the
# list readable since alpha/beta cuts proliferate.
_server_stables=$(git -C "$SCRIPT_DIR" tag --list 'zddc-server-v*' 2>/dev/null \
| grep -E '^zddc-server-v[0-9]+\.[0-9]+\.[0-9]+$' \
| sed 's|^zddc-server-v||' \
| sort -V -r)
_server_prereleases=$(git -C "$SCRIPT_DIR" tag --list 'zddc-server-v*' 2>/dev/null \
| grep -E '^zddc-server-v[0-9]+\.[0-9]+\.[0-9]+-' \
| sed 's|^zddc-server-v||' \
| sort -V -r \
| head -10)
if [ -n "$_server_stables" ] || [ -n "$_server_prereleases" ]; then
printf ' <div class="rel-versions" style="margin-top:0.6rem;"><strong>Pin to version:</strong>\n'
printf '%s\n' "$_server_stables" | while read -r _v; do
[ -n "$_v" ] || continue
printf ' <a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/%s">v%s</a>\n' "$_v" "$_v"
done
if [ -n "$_server_prereleases" ]; then
printf ' <span style="color:var(--color-text-muted);">recent pre-releases:</span>\n'
printf '%s\n' "$_server_prereleases" | while read -r _v; do
[ -n "$_v" ] || continue
printf ' <a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/%s">v%s</a>\n' "$_v" "$_v"
done
fi
printf ' </div>\n'
fi
printf ' </section>\n'
cat <<'TAIL'
<section style="margin-top: var(--spacing-2xl); color: var(--color-text-muted); font-size: 0.9rem;">

View file

@ -2095,7 +2095,7 @@ td[data-field="trackingNumber"] {
<div class="header-left">
<div class="header-title-group">
<span class="app-header__title">ZDDC Archive</span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-29 23:06:28 · 43c370a-dirty</span></span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-30 01:00:42 · 566070c-dirty</span></span>
</div>
<button id="addDirectoryBtn" class="btn btn-primary">Add Local Directory</button>
<button id="refreshHeaderBtn" class="btn btn-secondary hidden" title="Refresh Data" style="font-size:1.1rem;"></button>

View file

@ -1358,7 +1358,7 @@ body.help-open .app-header {
<div class="header-left">
<div class="header-title-group">
<span class="app-header__title">ZDDC Classifier</span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-29 23:06:28 · 43c370a-dirty</span></span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-30 01:00:42 · 566070c-dirty</span></span>
</div>
<button id="selectDirectoryBtn" class="btn btn-primary">Select Directory</button>
<button id="refreshBtn" class="btn btn-secondary hidden" title="Refresh and rescan directory">Refresh</button>

View file

@ -22,6 +22,15 @@
.rel-versions a { margin-right: 0.5rem; color: var(--color-text); text-decoration: none; padding: 0.1rem 0.4rem; border-radius: 4px; }
.rel-versions a:hover { background: var(--color-bg-subtle); text-decoration: underline; }
.rel-meta { font-size: 0.85rem; color: var(--color-text-muted); margin-top: 0.5rem; }
.rel-bin-table { width: 100%; border-collapse: collapse; margin: 0.5rem 0 1rem; font-size: 0.9rem; }
.rel-bin-table th, .rel-bin-table td { text-align: left; padding: 0.4rem 0.6rem; border-bottom: 1px solid var(--color-border); }
.rel-bin-table th { font-weight: 600; color: var(--color-text-muted); }
.rel-bin-table td.ch-stable { color: var(--color-primary); font-weight: 600; }
.rel-bin-table td.ch-beta, .rel-bin-table td.ch-alpha { color: var(--color-text-muted); }
.rel-bin-table a { color: var(--color-text); text-decoration: none; padding: 0.1rem 0.35rem; border-radius: 4px; }
.rel-bin-table a:hover { background: var(--color-bg-subtle); text-decoration: underline; }
.rel-bin-table td.empty { color: var(--color-text-muted); font-style: italic; }
.rel-pull { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.85rem; background: var(--color-bg-subtle); padding: 0.25rem 0.5rem; border-radius: 4px; display: inline-block; margin: 0.2rem 0; }
</style>
</head>
<body>
@ -114,6 +123,36 @@
</div>
<div class="rel-meta">stable currently → landing_v0.0.2.html</div>
</section>
<section class="rel-tool">
<h2>zddc-server</h2>
<p style="margin-top:0;color:var(--color-text-muted);font-size:0.95rem;">Go HTTP file server with ACL, .archive index, and a delegated-admin .zddc editor. Distributed as a container image (preferred) or a standalone binary.</p>
<h3 style="font-size:1rem;margin:0.75rem 0 0.4rem;">Standalone binaries</h3>
<table class="rel-bin-table"><thead><tr><th>Channel</th><th>linux-amd64</th><th>darwin-amd64</th><th>darwin-arm64</th><th>windows-amd64</th></tr></thead><tbody>
<tr><td class="ch-stable">stable</td><td class="empty"></td><td class="empty"></td><td class="empty"></td><td class="empty"></td></tr>
<tr><td class="ch-beta">beta</td><td class="empty"></td><td class="empty"></td><td class="empty"></td><td class="empty"></td></tr>
<tr><td class="ch-alpha">alpha</td><td><a href="zddc-server-linux-amd64-alpha">download</a></td><td><a href="zddc-server-darwin-amd64-alpha">download</a></td><td><a href="zddc-server-darwin-arm64-alpha">download</a></td><td><a href="zddc-server-windows-amd64-alpha.exe">download</a></td></tr>
</tbody></table>
<h3 style="font-size:1rem;margin:0.75rem 0 0.4rem;">Container image</h3>
<p style="margin:0 0 0.4rem;font-size:0.9rem;">Pull from <a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server">codeberg.org/varasys/zddc-server</a>:</p>
<div class="rel-channels">
<a class="stable" href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/stable">:stable</a>
<a class="beta" href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/beta">:beta</a>
<a class="alpha" href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/alpha">:alpha</a>
</div>
<code class="rel-pull">podman pull codeberg.org/varasys/zddc-server:stable</code>
<div class="rel-versions" style="margin-top:0.6rem;"><strong>Pin to version:</strong>
<a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/0.0.7">v0.0.7</a>
<a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/0.0.6">v0.0.6</a>
<a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/0.0.5">v0.0.5</a>
<a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/0.0.4">v0.0.4</a>
<a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/0.0.3">v0.0.3</a>
<a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/0.0.2">v0.0.2</a>
<a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/0.0.1">v0.0.1</a>
<span style="color:var(--color-text-muted);">recent pre-releases:</span>
<a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/0.0.8-alpha.2">v0.0.8-alpha.2</a>
<a href="https://codeberg.org/VARASYS/-/packages/container/zddc-server/0.0.8-alpha.1">v0.0.8-alpha.1</a>
</div>
</section>
<section style="margin-top: var(--spacing-2xl); color: var(--color-text-muted); font-size: 0.9rem;">
<p>Append <code>?v=alpha</code>, <code>?v=beta</code>, <code>?v=stable</code>, or <code>?v=0.0.1</code> to any deployment URL to switch versions for a single request — see <a href="../">the home page</a>.</p>

View file

@ -884,7 +884,7 @@ body {
<header class="app-header">
<div class="header-left">
<span class="app-header__title">ZDDC Archive</span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-29 23:06:28 · 43c370a-dirty</span></span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-30 01:00:42 · 566070c-dirty</span></span>
</div>
<div class="header-right">
<button id="theme-btn" class="btn btn-secondary" title="Theme: auto (follows OS)" aria-label="Theme: auto (follows OS)"></button>

View file

@ -1650,7 +1650,7 @@ body.help-open .app-header {
<div class="header-left">
<div class="header-title-group">
<span class="app-header__title">ZDDC Markdown</span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-29 23:06:28 · 43c370a-dirty</span></span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-30 01:00:42 · 566070c-dirty</span></span>
</div>
<button id="select-directory" class="btn btn-primary" title="Select a Directory">Select Directory</button>
</div>

View file

@ -2192,7 +2192,7 @@ dialog.modal--narrow {
<span id="no-js-notice" class="text-gray-400 text-xs italic">JavaScript not available</span>
<div class="header-title-group">
<span class="app-header__title">ZDDC Transmittal</span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-29 23:06:28 · 43c370a-dirty</span></span>
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.3-alpha · 2026-04-30 01:00:41 · 566070c-dirty</span></span>
</div>
<div class="app-header__spacer"></div>
<div class="app-header__icons">