#!/bin/sh set -eu # Top-level build script — builds all ZDDC HTML tools, the zddc-server # binaries, and the bootstrap stubs published under website/bootstrap/. SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) echo "=== Building ZDDC tools ===" sh "$SCRIPT_DIR/transmittal/build.sh" "${1:-}" "${2:-}" sh "$SCRIPT_DIR/archive/build.sh" "${1:-}" "${2:-}" sh "$SCRIPT_DIR/classifier/build.sh" "${1:-}" "${2:-}" sh "$SCRIPT_DIR/mdedit/build.sh" "${1:-}" "${2:-}" sh "$SCRIPT_DIR/landing/build.sh" "${1:-}" "${2:-}" echo "" echo "=== Assembling zddc/dist/web/ ===" # Only landing and archive ship inside the server bundle: they call the # server's JSON API (GET / for the project list, directory listings for the # archive) and are useless without it. transmittal, classifier, and mdedit # are pure client-side tools that work from file:// or any static host; # they are released to website/ for download but not bundled with the server. mkdir -p "$SCRIPT_DIR/zddc/dist/web" cp "$SCRIPT_DIR/landing/dist/index.html" "$SCRIPT_DIR/zddc/dist/web/index.html" cp "$SCRIPT_DIR/archive/dist/archive.html" "$SCRIPT_DIR/zddc/dist/web/archive.html" echo "Wrote zddc/dist/web/index.html" echo "Wrote zddc/dist/web/archive.html" # Cross-compiled zddc-server binaries — only relevant if you're shipping # standalone Linux/macOS/Windows binaries to users. Skipped silently when # podman isn't on PATH; the runtime container release path # (release-image.sh) does its own internal build via Containerfile's # multi-stage flow and doesn't need these host-side binaries. echo "" echo "=== Building zddc-server binaries ===" if command -v podman >/dev/null 2>&1; then podman build --target binaries -o "$SCRIPT_DIR/zddc/dist/" "$SCRIPT_DIR/zddc/" 2>&1 | grep -v "^-->" else echo "podman not found — skipping cross-compiled binary build." echo " (Standalone-binary distribution only; the runtime container" echo " release path builds its own copy via Containerfile.)" fi # ─── Bootstrap stubs ───────────────────────────────────────────────────────── # Generated from bootstrap/level{1,2}.html.tmpl on every build and published # as standalone files under website/bootstrap/. The website's "Install on # your server" section prints copy-pasteable shell snippets that curl these # files into the operator's deployment directory. # # bootstrap/level1/.html — same-origin stubs for # /.html (4 tools; # landing only lives at root) # bootstrap/track-/.html — level-2 stubs that fetch the # named channel from upstream # (5 tools × 3 channels = 15) WEBSITE_DIR="$SCRIPT_DIR/website" RELEASES_DIR="$WEBSITE_DIR/releases" BOOTSTRAP_DIR="$SCRIPT_DIR/bootstrap" mkdir -p "$WEBSITE_DIR" # tool|filename|title TOOL_TABLE='archive|archive.html|Archive transmittal|transmittal.html|Transmittal classifier|classifier.html|Classifier mdedit|mdedit.html|Markdown Editor landing|index.html|ZDDC' # Substitute {{TOOL}}, {{TOOL_TITLE}}, {{CHANNEL}}, {{FAVICON}} in a template. # The favicon is a base64-encoded data URI built once from shared/favicon.svg. _favicon_data_uri="" if [ -f "$SCRIPT_DIR/shared/favicon.svg" ]; then _favicon_data_uri="data:image/svg+xml;base64,$(base64 -w 0 "$SCRIPT_DIR/shared/favicon.svg")" fi render_stub() { sed \ -e "s|{{TOOL_TITLE}}|$3|g" \ -e "s|{{TOOL}}|$2|g" \ -e "s|{{CHANNEL}}|${4:-}|g" \ -e "s|{{FAVICON}}|$_favicon_data_uri|g" \ "$1" > "$5" } build_bootstrap_stubs() { _stubs="$WEBSITE_DIR/bootstrap" rm -rf "$_stubs" mkdir -p "$_stubs/level1" # Level-1 stubs (same-origin, channel-agnostic). Drop into a project # subdirectory so /.html fetches ../.html. # Landing has no level-1 stub — landing only lives at deployment root. while IFS='|' read -r _tool _file _title; do render_stub "$BOOTSTRAP_DIR/level1.html.tmpl" "$_tool" "$_title" "" \ "$_stubs/level1/$_file" done < Releases — ZDDC

Releases

All published versions and channel builds of every ZDDC tool. Stable releases are immutable; alpha and beta channels are rebuilt without notice.

HEAD printf '%s\n' "$TOOL_TABLE" | while IFS='|' read -r _tool _file _title; do _stable_target="" if [ -L "$RELEASES_DIR/${_tool}_stable.html" ]; then _stable_target=$(readlink "$RELEASES_DIR/${_tool}_stable.html") fi printf '
\n' printf '

%s

\n' "$_title" printf '
\n' [ -e "$RELEASES_DIR/${_tool}_stable.html" ] && printf ' stable\n' "$_tool" [ -e "$RELEASES_DIR/${_tool}_beta.html" ] && printf ' beta\n' "$_tool" [ -e "$RELEASES_DIR/${_tool}_alpha.html" ] && printf ' alpha\n' "$_tool" printf '
\n' _versions=$(ls -1 "$RELEASES_DIR" 2>/dev/null | grep -E "^${_tool}_v[0-9]" | sort -V -r) if [ -n "$_versions" ]; then printf '
Pin to version:\n' printf '%s\n' "$_versions" | while read -r _v; do _ver=${_v#${_tool}_v}; _ver=${_ver%.html} printf ' v%s\n' "$_v" "$_ver" done printf '
\n' fi if [ -n "$_stable_target" ]; then printf '
stable currently → %s
\n' "$_stable_target" fi printf '
\n' done # zddc-server section — different artifact shape than the HTML tools. # Two artifact families: # 1. Downloadable binaries at website/releases/zddc-server--- # (mutable channel pointers; release-image.sh writes them). # 2. Container images at codeberg.org/varasys/zddc-server: and # : (the registry; we don't proxy them through the website, # but we list the recent tags and a `podman pull` snippet for each). printf '
\n' printf '

zddc-server

\n' printf '

Go HTTP file server with ACL, .archive index, and a delegated-admin .zddc editor. Distributed as a container image (preferred) or a standalone binary.

\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 '

Standalone binaries

\n' printf ' ' for _p in $_platforms; do printf '' "$_p"; done printf '\n' for _ch in stable beta alpha; do printf ' ' "$_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 '' "$_f" else printf '' fi done printf '\n' done printf '
Channel%s
%sdownload
\n' fi # Container image: pull-snippet box plus the recent git tag list. printf '

Container image

\n' printf '

Pull from codeberg.org/varasys/zddc-server:

\n' printf '
\n' printf ' :stable\n' printf ' :beta\n' printf ' :alpha\n' printf '
\n' printf ' podman pull codeberg.org/varasys/zddc-server:stable\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 '
Pin to version:\n' printf '%s\n' "$_server_stables" | while read -r _v; do [ -n "$_v" ] || continue printf ' v%s\n' "$_v" "$_v" done if [ -n "$_server_prereleases" ]; then printf ' recent pre-releases:\n' printf '%s\n' "$_server_prereleases" | while read -r _v; do [ -n "$_v" ] || continue printf ' v%s\n' "$_v" "$_v" done fi printf '
\n' fi printf '
\n' cat <<'TAIL'

Append ?v=alpha, ?v=beta, ?v=stable, or ?v=0.0.1 to any deployment URL to switch versions for a single request — see the home page.

TAIL } > "$_out" echo "Wrote $_out" } echo "" echo "=== Building bootstrap stubs and releases/index.html ===" build_bootstrap_stubs build_releases_index echo "" echo "=== All tools built successfully ===" echo "" echo "Server deployment package: zddc/dist/" echo " Binaries: zddc-server-{linux,darwin,windows}-*" echo " Web files: web/ (copy contents to ZDDC_ROOT)" echo "" echo "Bootstrap stubs: website/bootstrap/" echo " level1/.html — same-origin stubs for project subdirs" echo " track-{alpha,beta,stable}/ — level-2 stubs for each channel" echo "" echo "The home page's 'Install on your server' section prints copy-pasteable" echo "shell snippets that curl these files into the operator's deployment dir."