Releases publish only two things per tool now: a current-stable
canonical symlink and an immutable per-version file. No more channel
mirrors (_stable/_beta/_alpha) and no more partial-version pins
(_v<X.Y>, _v<X>) — those were debt from a release model that never
matched the project's actual usage.
The `./build beta` verb stays, but narrowed: it's an internal SHA
snapshot for the BMC dev chart pipeline (chart's appVersion pins to
"<X.Y.Z>-beta-<sha>" and the chart Dockerfile fetches that SHA from
git). No public artifact on /srv/zddc/releases/. The embedded/* +
chore commit produced by `./build beta` is the actual snapshot.
`./build alpha` is removed entirely.
build/build-lib.sh:
- Drop alpha verb; narrow beta verb to embedded regen + chore commit
- promote_release: stable cut writes <tool>_v<X.Y.Z>.html + <tool>.html
symlink + <tool>.html.sig companion symlink; beta is a no-op
- promote_zddc_server: same shape — per-version binary +
per-platform canonical symlink (zddc-server_<plat>) + .sig symlink
- write_zddc_server_stub: singular; emits per-version stubs +
one canonical zddc-server.html for current stable
- Delete _promote_channel, verify_channel_links, _channel_is_active
- Seed-from-live now copies only per-version files + .sig + pubkey.pem
(the canonical symlinks get rewritten by this cut; old layout files
get cleaned by deploy's --delete-after)
- build_releases_index: dropdown simplified to "latest stable +
pinned versions"; channels-explainer section removed; tool cards +
CTA URLs point at canonical <tool>.html / zddc-server_<plat>;
composer emits "stable" sentinel for `apps:` entries
- Fix the acl:{allow:[...]} footgun in the apps_pubkey example
apps.go:
- isValidChannelOrVersion: accept only "stable" + exact X.Y.Z
(drop alpha/beta and partial pins v0.0/v0)
- normalizeChannel: same
- Resolve URL composition: stable → canonical <prefix>/<app>.html
(no _stable_ suffix), exact-version → <prefix>/<app>_v<X.Y.Z>.html
- Tests rewritten to match (beta/alpha replaced with v0.0.4 / stable;
a new TestParseSpec_RejectsLegacyChannelsAndPartialPins locks in
that the removed forms now error)
browse/build.sh: gate promote_release on $is_release like every other
tool's build.sh (longstanding inconsistency that errored under the new
promote_release case-statement).
freshen-channel: deleted (no channels to freshen).
Net: -254 lines, all green on full `go test ./...`. Dev build verified
via `./build` (no-arg) — new label format "v<next>-dev · <ts> · <sha>".
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| css | ||
| js | ||
| build.sh | ||
| README.md | ||
| template.html | ||
browse — directory listing tool
Generic file browser for any directory. Designed to work with ZDDC archives but useful for any folder. Single-file HTML, no install.
How it's used
Two modes, auto-detected at page load:
-
Online (zddc-server backed). When this HTML is served by zddc-server at a folder URL — which it is by default for any directory under
ZDDC_ROOTthat doesn't have anindex.html— the JS queries the same URL withAccept: application/jsonto load the directory's listing and renders it as a sortable, filterable table. -
Local (FileSystemAccessAPI). Click "Select Directory" in the header to pick any folder on your computer. Works in Chromium-based browsers (Chrome, Edge, Brave, etc.). No server required; the directory is read directly from disk.
What it does
- Lists files and folders with name, size, type (extension), and modified date.
- Click a folder to expand inline. Children load lazily on first expand.
- Click a column header to sort by that column. Click again to reverse.
- Type in the filter to narrow to entries whose name contains the substring.
- Click any file to open it in a new tab — for server-backed pages,
this routes through zddc-server's normal handler (so an
.archiveredirect, an apps cascade override, etc. all work as expected).
Design notes
- No ZDDC-specific filtering. This tool is intentionally
domain-agnostic. The companion
archivetool layers ZDDC parsing (project / status / revision filters, tracking-number resolution) on top of the same listing API. Usearchivewhen you want ZDDC semantics; usebrowsewhen you just want to see what's in a folder. - Default at directory URLs. zddc-server's
directory.goserves the embedded browse.html bytes for any directory request withAccept: text/htmland noindex.htmlpresent. This means a user navigating to any folder underZDDC_ROOTgets a usable browser without anyone having to drop a file into the archive. - Apps cascade override. Like every other ZDDC tool, the
served
browse.htmlcan be overridden per-folder via a.zddc apps:entry. The default is the embedded copy from the binary; operators can pin a specific version or URL if they want.