chore: split website out into orphan branch + worktree
Moves website source + release artifacts off `main` and into a new
orphan branch named `website` in this same Codeberg repo. A `git worktree`
of that branch — typically at ~/src/zddc-website/ — is what the system
Caddy now bind-mounts and serves at zddc.varasys.io. Decoupling source
from the live site means editing source can no longer accidentally
affect what's published.
Layout going forward:
- ~/src/zddc/ — main worktree (this branch, source only).
- ~/src/zddc-website/ — git worktree of the `website` branch:
hand-edited content + LFS-tracked release
artifacts (server binaries) + regular-git
HTML tool releases + symlinks.
- Caddy bind-mount swapped: ~/src/zddc/website → ~/src/zddc-website
(quadlet at /etc/containers/systemd/caddy.container, restarted).
Build pipeline now writes releases to
${ZDDC_DEPLOY_RELEASES_DIR:-$HOME/src/zddc-website/releases}.
- build.sh: RELEASES_DIR points at the env var
- shared/build-lib.sh: promote_release honors the env var, falls
back to the legacy in-repo path so any
standalone single-tool release on a checkout
that still has website/ keeps working
- freshen-channel: passes ZDDC_DEPLOY_RELEASES_DIR through to
the worktree-based build
Docs (CLAUDE.md, AGENTS.md, ARCHITECTURE.md, .gitignore) updated for
the new layout. The 51 MB of website/ blobs stays in main's history
(no force-push); over time Codeberg's GC will pack them down.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d688e20dad
commit
76820fa8dd
92 changed files with 86 additions and 104555 deletions
18
.gitignore
vendored
18
.gitignore
vendored
|
|
@ -23,16 +23,14 @@ test-results/
|
|||
# New tool dist files must be force-added: git add -f tool/dist/tool.html
|
||||
dist/
|
||||
|
||||
# Release artifacts under website/releases/ ARE committed — including
|
||||
# zddc-server binaries. Per-version HTML tool files (<tool>_v<X.Y.Z>.html)
|
||||
# and per-version zddc-server binaries (zddc-server_v<X.Y.Z>_<platform>)
|
||||
# are immutable real files; partial-version pins (<tool>_v<X.Y>.html,
|
||||
# <tool>_v<X>.html, zddc-server_v<X.Y>_<platform>, zddc-server_v<X>_<platform>)
|
||||
# and channel mirrors (<tool>_<channel>.html, zddc-server_<channel>_<platform>)
|
||||
# are checked-in symlinks. The lockstep build (shared/build-lib.sh
|
||||
# promote_release + promote_zddc_server) maintains both chains. Everything
|
||||
# serves from zddc.varasys.io/releases/; no Codeberg release-asset
|
||||
# publication anymore.
|
||||
# The website (hand-edited index.html / reference.html / css/ / js/ / img/
|
||||
# plus all release artifacts) lives in the orphan `website` branch of this
|
||||
# same Codeberg repo. A `git worktree` of that branch is typically checked
|
||||
# out at ~/src/zddc-website/ and is what the system Caddy serves at
|
||||
# zddc.varasys.io. The lockstep build pipeline writes release artifacts
|
||||
# directly to ~/src/zddc-website/releases/ (override with
|
||||
# $ZDDC_DEPLOY_RELEASES_DIR). zddc-server binaries are LFS-tracked on
|
||||
# the website branch; HTML tools + symlinks stay in regular git.
|
||||
|
||||
# IDE and project files
|
||||
.opencode/
|
||||
|
|
|
|||
45
AGENTS.md
45
AGENTS.md
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
```bash
|
||||
# Dev build: 5 HTML tools + cross-compile zddc-server binaries + regen the
|
||||
# matrix at website/releases/index.html. dist/ artifacts only — no
|
||||
# website/releases/ side-effect for the build outputs themselves.
|
||||
# matrix at ~/src/zddc-website/releases/index.html. dist/ artifacts only — no
|
||||
# new per-version files / symlink updates in the website worktree.
|
||||
sh build.sh
|
||||
|
||||
# Build a single HTML tool (archive | transmittal | classifier | mdedit | landing)
|
||||
|
|
@ -44,7 +44,7 @@ The build ends with a **channel-link verifier** that asserts every
|
|||
`<tool>_{stable,beta,alpha}.html` (and zddc-server's per-platform binary
|
||||
mirrors + stub pages) resolves. Build fails if any link is dangling.
|
||||
Bootstrap-friendly: zddc-server checks are skipped until the first
|
||||
`--release` cut materializes the binaries under `website/releases/`.
|
||||
`--release` cut materializes the binaries under `~/src/zddc-website/releases/`.
|
||||
|
||||
## Architecture
|
||||
|
||||
|
|
@ -67,16 +67,19 @@ shared/
|
|||
build-lib.sh POSIX sh helpers (ensure_exists, concat_files, build_timestamp)
|
||||
sourced by every tool's build.sh via: . "$root_dir/../shared/build-lib.sh"
|
||||
|
||||
website/
|
||||
index.html hand-edited intro page + install snippets (root URL)
|
||||
releases/
|
||||
index.html versions index, regenerated by build.sh from filesystem scan
|
||||
<tool>_v<X.Y.Z>.html real per-version files (committed, immutable)
|
||||
<tool>_v<X.Y>.html -> ... symlink: latest patch within X.Y.*
|
||||
<tool>_v<X>.html -> ... symlink: latest within X.*.*
|
||||
<tool>_stable.html -> ... symlink: current stable
|
||||
<tool>_beta.html -> ... symlink to stable (or real bytes if active beta)
|
||||
<tool>_alpha.html -> ... symlink to beta/stable (or real bytes if active alpha)
|
||||
# Website lives on the `website` orphan branch of this same repo
|
||||
# (NOT in main's tree). Worktree typically at ~/src/zddc-website/:
|
||||
# index.html, reference.html, css/, js/, img/ hand-edited content
|
||||
# releases/
|
||||
# index.html regenerated by `sh build.sh`
|
||||
# <tool>_v<X.Y.Z>.html per-version (committed, immutable)
|
||||
# <tool>_v<X.Y>.html -> ... symlink chain (regular git symlinks)
|
||||
# <tool>_stable.html -> ... channel mirror, follows latest stable
|
||||
# <tool>_{beta,alpha}.html -> ... channels (cascade to stable when idle)
|
||||
# zddc-server_v<X.Y.Z>_<platform> per-platform binary (LFS-tracked)
|
||||
# zddc-server_<channel>_<platform> channel binary mirror (symlink)
|
||||
# zddc-server_<X>.html stub page surfacing 4 platform DLs
|
||||
# .gitattributes LFS rules for binaries
|
||||
|
||||
helm/
|
||||
zddc-server-prod/ production-shaped Helm chart (compiles from source via init container)
|
||||
|
|
@ -84,9 +87,9 @@ helm/
|
|||
README.md chart design rationale + quick-start
|
||||
```
|
||||
|
||||
**Critical:** `dist/` files are gitignored. They're the canonical built artifact for testing and the source for `--release` writes into `website/releases/`, but they aren't checked in. Never edit them directly.
|
||||
**Critical:** `dist/` files are gitignored. They're the canonical built artifact for testing and the source for `--release` writes into `~/src/zddc-website/releases/`, but they aren't checked in. Never edit them directly.
|
||||
|
||||
`website/releases/` IS committed — per-version HTML and per-version zddc-server binaries as real bytes, partial-version pins (`_v<X.Y>`, `_v<X>`) and channel mirrors (`_stable`, `_beta`, `_alpha`) as symlinks. `shared/build-lib.sh` provides `promote_release` (HTML tools) and `promote_zddc_server` (binaries + matching stub pages); the top-level `build.sh --release` calls them in lockstep. zddc-server binaries live in this repo too — there's no Codeberg release-asset publication anymore; everything serves from `zddc.varasys.io/releases/`.
|
||||
**Release artifacts live on the `website` orphan branch** of this same Codeberg repo, not on `main`. A `git worktree` of that branch — typically at `~/src/zddc-website/` — is what the system Caddy bind-mounts and serves at `zddc.varasys.io/`. The build pipeline writes its release outputs to `${ZDDC_DEPLOY_RELEASES_DIR:-$HOME/src/zddc-website/releases}` directly, then the operator commits + pushes that worktree separately from `main`. Per-version HTML and per-version zddc-server binaries are real bytes (binaries are LFS-tracked; HTML stays regular git); partial-version pins (`_v<X.Y>`, `_v<X>`) and channel mirrors (`_stable`, `_beta`, `_alpha`) are symlinks. `shared/build-lib.sh` provides `promote_release` (HTML tools) and `promote_zddc_server` (binaries + matching stub pages); the top-level `build.sh --release` calls them in lockstep. No Codeberg release-asset publication anymore; everything serves from `zddc.varasys.io/releases/`.
|
||||
|
||||
## Shared CSS (`shared/base.css`)
|
||||
|
||||
|
|
@ -172,13 +175,13 @@ Format: `trackingNumber_revision (status) - title.extension`
|
|||
- Conventional commits: `feat(archive): ...`, `fix(transmittal): ...`
|
||||
- Release tags: `<tool>-v<X.Y.Z>` per tool, all six sharing the same X.Y.Z on a coordinated cut (e.g. `archive-v0.0.8`, `transmittal-v0.0.8`, `classifier-v0.0.8`, `mdedit-v0.0.8`, `landing-v0.0.8`, `zddc-server-v0.0.8`)
|
||||
- Commit dist files: `git add -f tool/dist/tool.html`
|
||||
- Commit zddc-server binaries (per-version + symlinks): they live under `website/releases/` like every other release artifact
|
||||
- Commit zddc-server binaries (per-version + symlinks) on the `website` branch's worktree (`~/src/zddc-website/releases/`) — they're LFS-tracked there alongside the HTML tool releases. Push that branch separately from `main`
|
||||
|
||||
### Releasing — lockstep, channels, layout
|
||||
|
||||
**Lockstep convention.** Every release cut bumps all six artifacts (5 HTML tools + zddc-server) to the same version, even if a tool didn't change. Per-tool independent versions are gone. The coordinated next-stable target is `max(latest tag across all six tools) + 1` — `_coordinated_next_stable` in `shared/build-lib.sh`. Channel cuts (alpha/beta) follow the same lockstep — every tool's channel mirror is overwritten in step. Three channels, ordered: **alpha** (dev iteration) → **beta** (general testing) → **stable** (ship).
|
||||
|
||||
**Storage model.** All release artifacts live under `website/releases/` and are served from `zddc.varasys.io/releases/`. No Codeberg release assets, no third-party mirrors.
|
||||
**Storage model.** All release artifacts live under the `website` orphan branch of this repo (worktree typically at `~/src/zddc-website/releases/`) and are served from `zddc.varasys.io/releases/`. The `website` branch's history is independent of `main`. No Codeberg release assets, no third-party mirrors.
|
||||
|
||||
| Artifact | Type | Layout |
|
||||
|---|---|---|
|
||||
|
|
@ -190,12 +193,12 @@ Format: `trackingNumber_revision (status) - title.extension`
|
|||
| `zddc-server_<X>.html` | generated stub page | per-version / per-channel; lists the four platform downloads. This is what the matrix-cell link points at — one stub fans out to four binaries |
|
||||
| `index.html` | regenerated by `build.sh` | matrix table, one column per tool, one row per release |
|
||||
|
||||
**Single point of truth.** `sh build.sh --release` is the canonical lockstep cut. It forwards each HTML tool's build with the agreed version, then `promote_zddc_server` (in `shared/build-lib.sh`) copies the freshly cross-compiled binaries into `website/releases/` with the matching symlink chain, then `write_zddc_server_stubs_all` regenerates every stub page, then `build_releases_index` rewrites the matrix, then `verify_channel_links` asserts nothing dangles.
|
||||
**Single point of truth.** `sh build.sh --release` is the canonical lockstep cut. It forwards each HTML tool's build with the agreed version, then `promote_zddc_server` (in `shared/build-lib.sh`) copies the freshly cross-compiled binaries into `~/src/zddc-website/releases/` with the matching symlink chain, then `write_zddc_server_stubs_all` regenerates every stub page, then `build_releases_index` rewrites the matrix, then `verify_channel_links` asserts nothing dangles.
|
||||
|
||||
- **Stable** (`sh build.sh --release` or `--release X.Y.Z`): Writes per-version HTML for the five HTML tools + per-version binaries for zddc-server (real bytes, immutable). Refreshes 5 symlinks per HTML tool + 5 symlinks per zddc-server platform → the new version. Tags all six: `<tool>-v<X.Y.Z>`. Cascade: stable cut means beta and alpha both reset to stable for every tool. Skips silently if source for an HTML tool hasn't changed since the latest stable tag (the binary always builds).
|
||||
- **Beta** (`sh build.sh --release beta`): Overwrites `<tool>_beta.html` with dist bytes for each HTML tool, and `zddc-server_beta_<platform>` with each platform's binary. Cascade: `<tool>_alpha.html` → `<tool>_beta.html` and `zddc-server_alpha_<platform>` → `zddc-server_beta_<platform>` (symlinks). No tag.
|
||||
- **Alpha** (`sh build.sh --release alpha`): Overwrites only the alpha mirrors, all six tools. No tag, no other side-effects.
|
||||
- **Plain dev builds** (no `--release`): produce `tool/dist/<tool>.html` for HTML tools and `zddc/dist/zddc-server-<platform>` binaries; do NOT touch `website/releases/`. The matrix index and stub pages still get regenerated from whatever `website/releases/` contains, so the build is idempotent for repeated dev runs.
|
||||
- **Plain dev builds** (no `--release`): produce `tool/dist/<tool>.html` for HTML tools and `zddc/dist/zddc-server-<platform>` binaries; do NOT touch `~/src/zddc-website/releases/`. The matrix index and stub pages still get regenerated from whatever `~/src/zddc-website/releases/` contains, so the build is idempotent for repeated dev runs.
|
||||
|
||||
On-page `{{BUILD_LABEL}}` format (HTML tools only — zddc-server's version comes from the binary itself):
|
||||
|
||||
|
|
@ -300,7 +303,7 @@ zddc-server ships as a cross-compiled binary, not a container image. There's no
|
|||
(cd zddc && go run ./cmd/zddc-server)
|
||||
```
|
||||
|
||||
The repo's top-level `sh build.sh` cross-compiles the four release binaries (linux/amd64, darwin/amd64, darwin/arm64, windows/amd64) into `zddc/dist/` via a containerized Go toolchain (podman or docker). On `--release` it also promotes those binaries to `website/releases/` with the matching symlink chain and stub pages — same lockstep flow as the HTML tools.
|
||||
The repo's top-level `sh build.sh` cross-compiles the four release binaries (linux/amd64, darwin/amd64, darwin/arm64, windows/amd64) into `zddc/dist/` via a containerized Go toolchain (podman or docker). On `--release` it also promotes those binaries to `~/src/zddc-website/releases/` with the matching symlink chain and stub pages — same lockstep flow as the HTML tools.
|
||||
|
||||
### Run (development)
|
||||
|
||||
|
|
@ -331,7 +334,7 @@ ZDDC_ROOT=/path/to/your/archive ZDDC_TLS_CERT=none ZDDC_ADDR=:8080 \
|
|||
|
||||
### Release tagging
|
||||
|
||||
zddc-server has no separate release script anymore. The top-level `sh build.sh --release [version|alpha|beta]` is the canonical path: it cross-compiles the binaries inside the containerized Go toolchain, copies them into `website/releases/` with the lockstep symlink chain (one set of symlinks per platform), regenerates the per-version + per-channel stub pages, refreshes the matrix, and tags `zddc-server-v<X.Y.Z>` alongside the five HTML-tool tags.
|
||||
zddc-server has no separate release script anymore. The top-level `sh build.sh --release [version|alpha|beta]` is the canonical path: it cross-compiles the binaries inside the containerized Go toolchain, copies them into `~/src/zddc-website/releases/` with the lockstep symlink chain (one set of symlinks per platform), regenerates the per-version + per-channel stub pages, refreshes the matrix, and tags `zddc-server-v<X.Y.Z>` alongside the five HTML-tool tags.
|
||||
|
||||
```sh
|
||||
sh build.sh --release # lockstep stable, coordinated next version
|
||||
|
|
|
|||
|
|
@ -33,20 +33,23 @@ tool/
|
|||
tool.html # Generated output — never edit this manually
|
||||
```
|
||||
|
||||
Website files (what `zddc.varasys.io` serves) — committed in this repo as static assets, including the per-version HTML tool files AND the per-version zddc-server binaries:
|
||||
Website files (what `zddc.varasys.io` serves) live on the **`website` orphan branch** of this same Codeberg repo, separate from `main`. A `git worktree` of that branch — typically at `~/src/zddc-website/` — is what the system Caddy bind-mounts and serves. The build pipeline writes release artifacts directly to that worktree's `releases/` subdir:
|
||||
|
||||
```
|
||||
website/
|
||||
~/src/zddc-website/ (git worktree of `website` branch)
|
||||
index.html # hand-edited intro page + install snippets (root URL)
|
||||
reference.html # hand-edited file-naming convention spec
|
||||
css/, js/, img/ # hand-edited static assets
|
||||
.gitattributes # LFS rules: zddc-server_*-{amd64,arm64,*.exe}
|
||||
releases/
|
||||
index.html # matrix table, regenerated by build.sh from filesystem scan
|
||||
index.html # matrix-style download page, regenerated by build.sh
|
||||
<tool>_v<X.Y.Z>.html # real per-version HTML (committed, immutable)
|
||||
<tool>_v<X.Y>.html → ... # symlink: latest patch within X.Y.*
|
||||
<tool>_v<X>.html → ... # symlink: latest within X.*.*
|
||||
<tool>_stable.html → ... # symlink: current stable HTML
|
||||
<tool>_beta.html → ... # symlink to stable (or real bytes when active beta dev)
|
||||
<tool>_alpha.html → ... # symlink to beta/stable (or real bytes when active alpha dev)
|
||||
zddc-server_v<X.Y.Z>_<platform> # real per-version cross-compiled binary
|
||||
zddc-server_v<X.Y.Z>_<platform> # real per-version cross-compiled binary (LFS-tracked)
|
||||
zddc-server_v<X.Y>_<platform> → ... # symlink chain (mirrors the HTML cascade per platform)
|
||||
zddc-server_v<X>_<platform> → ...
|
||||
zddc-server_<channel>_<platform> → ... # channel mirror per platform
|
||||
|
|
@ -57,7 +60,7 @@ website/
|
|||
|
||||
Every URL under `/releases/` resolves directly via the symlink chain — no `manifest.json`, no Caddy regex-rewrite, no JavaScript indirection, no third-party mirror. Caddy serves these as plain static files. The Docker-tag pattern: `:1.2.3` is pinned, `:1.2` floats, `:1` floats further, `:stable` floats furthest, and `:beta` / `:alpha` are mutable channel mirrors that overwrite in place.
|
||||
|
||||
**zddc-server binaries live in this repo too** — committed under `website/releases/`, served from `zddc.varasys.io/releases/`. No Codeberg release assets, no separate distribution channel. The `helm/zddc-server-{prod,dev}/` charts build from source via init container, but operators who want a prebuilt binary just `curl -O https://zddc.varasys.io/releases/zddc-server_stable_linux-amd64`. The single matrix-cell link per release points at `zddc-server_<X>.html`, a small generated stub that surfaces all four platform downloads.
|
||||
**zddc-server binaries live in this repo too** — committed under `~/src/zddc-website/releases/`, served from `zddc.varasys.io/releases/`. No Codeberg release assets, no separate distribution channel. The `helm/zddc-server-{prod,dev}/` charts build from source via init container, but operators who want a prebuilt binary just `curl -O https://zddc.varasys.io/releases/zddc-server_stable_linux-amd64`. The single matrix-cell link per release points at `zddc-server_<X>.html`, a small generated stub that surfaces all four platform downloads.
|
||||
|
||||
There is no `website/dev/`. To preview a build locally, open `dist/tool.html` directly via the dev server. To publish on `zddc.varasys.io`, cut a release.
|
||||
|
||||
|
|
@ -73,14 +76,14 @@ Each topic has exactly one authoritative home; everything else links to it.
|
|||
|---|---|---|
|
||||
| What ZDDC is + tool channel links + dual-mode (local/server) overview + install snippets | `website/index.html` (hand-edited intro for `zddc.varasys.io/`) | repo `README.md`, `zddc/README.md` |
|
||||
| File-naming convention spec (status codes, modifiers, folder format) | `website/reference.html` | repo `README.md`, in-tool help text |
|
||||
| Versions + channel builds index of every tool | `website/releases/index.html` (regenerated by `build.sh`) | website intro nav, "Browse all versions" link |
|
||||
| Versions + channel builds index of every tool | `~/src/zddc-website/releases/index.html` (regenerated by `build.sh`) | website intro nav, "Browse all versions" link |
|
||||
| Customer-deployment install (`zddc-server` binary embeds current-stable tools; `.zddc apps:` cascade overrides; cache at `<root>/_app/`) | `zddc/README.md` "Apps: virtual tool HTMLs" section | website intro, `AGENTS.md` |
|
||||
| zddc-server operations: env vars, ACL syntax, `.archive` URLs, container vs binary | `zddc/README.md` | `AGENTS.md`, website intro |
|
||||
| Build / release / channel commands | `AGENTS.md` | repo `README.md` ("see AGENTS.md") |
|
||||
| Architecture & internal patterns | `ARCHITECTURE.md` (this file) | `AGENTS.md` |
|
||||
| Per-tool internal design quirks | `<tool>/README.md` | (linked from website intro tool cards) |
|
||||
|
||||
`website/index.html` is **hand-edited static content** (analogous to `reference.html`), not the landing-tool output. The install section points operators at two paths: **local** (download a `.html` file from `/releases/`) and **server** (run `zddc-server`; current-stable builds of all five tools are baked into the binary at compile time via `//go:embed`). The landing tool's released bytes live at `website/releases/landing_v<X.Y.Z>.html`; the embedded copy serves at the deployment root by default. The public website at `zddc.varasys.io/` is the same hand-edited `index.html` — its root URL is the introduction page, not the project picker (because there are no projects to pick from a static site).
|
||||
`index.html` on the `website` branch (working dir `~/src/zddc-website/index.html`) is **hand-edited static content** (analogous to `reference.html`), not the landing-tool output. The install section points operators at two paths: **local** (download a `.html` file from `/releases/`) and **server** (run `zddc-server`; current-stable builds of all five tools are baked into the binary at compile time via `//go:embed`). The landing tool's released bytes live at `~/src/zddc-website/releases/landing_v<X.Y.Z>.html`; the embedded copy serves at the deployment root by default. The public website at `zddc.varasys.io/` is the same hand-edited `index.html` — its root URL is the introduction page, not the project picker (because there are no projects to pick from a static site).
|
||||
|
||||
When updating documentation, prefer linking over duplicating. If you find yourself rewriting the file-naming convention in a tool's README, link to `reference.html` instead.
|
||||
|
||||
|
|
@ -96,15 +99,15 @@ Each HTML tool's `build.sh`:
|
|||
2. Reads JS files in declaration order, concatenates them
|
||||
3. Processes `template.html` with `awk`, replacing `{{PLACEHOLDER}}` markers with the concatenated content and stripping CDN `<script>`/`<link>` tags
|
||||
4. Writes the result to `dist/tool.html`
|
||||
5. If `--release <channel-or-version>` was passed, calls `promote_release` to write into `website/releases/` (per-version file + symlink updates for stable; channel mirror overwrite for alpha/beta).
|
||||
5. If `--release <channel-or-version>` was passed, calls `promote_release` to write into `~/src/zddc-website/releases/` (per-version file + symlink updates for stable; channel mirror overwrite for alpha/beta).
|
||||
|
||||
The top-level `build.sh` at the repository root is the canonical lockstep entry point. It:
|
||||
|
||||
1. Forwards `--release [version|alpha|beta]` to every HTML tool's build, computing a coordinated next-stable target via `_coordinated_next_stable` (max of every tool's latest tag + 1) when no explicit version is given.
|
||||
2. Cross-compiles zddc-server for the four target platforms inside a containerized Go toolchain (podman/docker).
|
||||
3. On `--release`, calls `promote_zddc_server` to copy the freshly cross-compiled binaries into `website/releases/` with the matching symlink chain (one set per platform) and tag `zddc-server-v<X.Y.Z>` alongside the five HTML-tool tags.
|
||||
4. Always calls `write_zddc_server_stubs_all` to refresh the per-version + per-channel stub HTML pages from whatever artifacts are in `website/releases/`.
|
||||
5. Regenerates `website/releases/index.html` as a matrix table (rows = versions, columns = tools).
|
||||
3. On `--release`, calls `promote_zddc_server` to copy the freshly cross-compiled binaries into `~/src/zddc-website/releases/` with the matching symlink chain (one set per platform) and tag `zddc-server-v<X.Y.Z>` alongside the five HTML-tool tags.
|
||||
4. Always calls `write_zddc_server_stubs_all` to refresh the per-version + per-channel stub HTML pages from whatever artifacts are in `~/src/zddc-website/releases/`.
|
||||
5. Regenerates `~/src/zddc-website/releases/index.html` as a matrix table (rows = versions, columns = tools).
|
||||
6. Calls `verify_channel_links` — fails the build if any channel link is dangling.
|
||||
|
||||
### Channels
|
||||
|
|
@ -115,7 +118,7 @@ Three release channels, applied in lockstep across all six tools (5 HTML + zddc-
|
|||
- **Beta** — `sh build.sh --release beta` overwrites `<tool>_beta.html` for each HTML tool and `zddc-server_beta_<platform>` for each platform with fresh bytes. Cascades alpha → beta for both HTML and binaries (one symlink per platform). No tag — channel URLs are stable URLs by design.
|
||||
- **Alpha** — `sh build.sh --release alpha` overwrites only the alpha mirrors, all six tools. No tag, no other side-effects.
|
||||
|
||||
A plain `sh build.sh` (no `--release`) is a dev build: it produces `dist/<tool>.html` and `zddc/dist/zddc-server-<platform>` binaries; doesn't touch `website/releases/`. The matrix index and stub pages still get regenerated from whatever's in `website/releases/`, so dev builds remain idempotent and don't break the channel-link verifier.
|
||||
A plain `sh build.sh` (no `--release`) is a dev build: it produces `dist/<tool>.html` and `zddc/dist/zddc-server-<platform>` binaries; doesn't touch `~/src/zddc-website/releases/`. The matrix index and stub pages still get regenerated from whatever's in `~/src/zddc-website/releases/`, so dev builds remain idempotent and don't break the channel-link verifier.
|
||||
|
||||
The cascade rule (stable cut → beta + alpha mirrors reset to stable; beta cut → alpha resets to beta) means downstream channels are never stale across either HTML or binaries. "No active beta" silently shows current stable; "no active alpha" silently shows current beta or stable. Operators don't need to run a freshen step after each stable release.
|
||||
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@ If something in this CLAUDE.md conflicts with those, those win — and please up
|
|||
This is a **monorepo of independent tools**, not one application:
|
||||
|
||||
- `archive/`, `transmittal/`, `classifier/`, `mdedit/`, `landing/` — five self-contained HTML tools, each compiled to a single inlined HTML file in its own `dist/`. Naming: the first four output `dist/tool.html`; **`landing/` outputs `dist/index.html`** (it's the project picker served at the root of `zddc-server`).
|
||||
- `zddc/` — Go HTTP server (separate sub-project; Go 1.24+). Serves `ZDDC_ROOT/index.html` at `GET /` as the landing page; `Accept: application/json` on `/` returns the ACL-filtered project list. Cross-compiled binaries are committed to `website/releases/` and served from `zddc.varasys.io/releases/` (no Codeberg release assets); the `helm/` charts in this repo build from source at deploy time.
|
||||
- `zddc/` — Go HTTP server (separate sub-project; Go 1.24+). Serves `ZDDC_ROOT/index.html` at `GET /` as the landing page; `Accept: application/json` on `/` returns the ACL-filtered project list. Cross-compiled binaries are committed to the `website` orphan branch (LFS-tracked) and served from `zddc.varasys.io/releases/` (no Codeberg release assets); the `helm/` charts in this repo build from source at deploy time.
|
||||
- `shared/` — `base.css` plus shared JS modules (`zddc.js`, `hash.js`, `zddc-filter.js`, `theme.js`, `help.js`) included by every tool's build, and `build-lib.sh` (POSIX sh helpers sourced by every tool's `build.sh` AND by the top-level `build.sh` for lockstep release helpers).
|
||||
- `website/` — committed static site: `index.html` (root URL, hand-edited intro), `releases/<tool>_v<X.Y.Z>.html` (immutable per-version archives), `releases/<tool>_v<X.Y>.html` and `_v<X>.html` (symlinks), `releases/<tool>_{stable,beta,alpha}.html` (channel mirrors), `releases/zddc-server_v<X.Y.Z>_<platform>` (per-version cross-compiled binaries), `releases/zddc-server_<channel>_<platform>` (binary symlinks following the same cascade), `releases/zddc-server_<X>.html` (per-version / per-channel stub pages that fan out the four platform downloads in one matrix-cell link), `releases/index.html` (matrix table regenerated by `build.sh`). **Install model:** local use is a download from `/releases/`. Server use is `zddc-server`, which has the current-stable build of all five tools baked in via `//go:embed` (compile-time default). Tools auto-served at folder-name-driven paths: `archive` everywhere, `classifier` in `Incoming`/`Working`/`Staging` subtrees, `mdedit` in `Working` subtrees, `transmittal` in `Staging` subtrees, `landing` only at root. Override via `.zddc apps:` cascade entry (channel/version/URL/path) — fetched once, cached at `<ZDDC_ROOT>/_app/`. Drop a real `.html` file at any path to override.
|
||||
- **`website` orphan branch** (same Codeberg repo) — committed static site: `index.html` (root URL, hand-edited intro), `releases/<tool>_v<X.Y.Z>.html` (immutable per-version archives), `releases/<tool>_v<X.Y>.html` and `_v<X>.html` (symlinks), `releases/<tool>_{stable,beta,alpha}.html` (channel mirrors), `releases/zddc-server_v<X.Y.Z>_<platform>` (per-version cross-compiled binaries; LFS-tracked), `releases/zddc-server_<channel>_<platform>` (binary symlinks following the same cascade), `releases/zddc-server_<X>.html` (per-version / per-channel stub pages that fan out the four platform downloads in one matrix-cell link), `releases/index.html` (matrix table regenerated by `build.sh`). **Working dir:** `~/src/zddc-website/` (a `git worktree` of the `website` branch — `git -C ~/src/zddc worktree add ~/src/zddc-website website`). **Caddy:** the `zddc.varasys.io:8443` vhost bind-mounts `~/src/zddc-website` and serves from there. **Install model:** local use is a download from `/releases/`. Server use is `zddc-server`, which has the current-stable build of all five tools baked in via `//go:embed` (compile-time default). Tools auto-served at folder-name-driven paths: `archive` everywhere, `classifier` in `Incoming`/`Working`/`Staging` subtrees, `mdedit` in `Working` subtrees, `transmittal` in `Staging` subtrees, `landing` only at root. Override via `.zddc apps:` cascade entry (channel/version/URL/path) — fetched once, cached at `<ZDDC_ROOT>/_app/`. Drop a real `.html` file at any path to override.
|
||||
- `helm/` — example Helm charts for zddc-server (`zddc-server-prod/`, `zddc-server-dev/`). Both compile from source via init container. Operators copy `values.yaml.example` and customize. No secrets in repo.
|
||||
- `tests/` — Playwright specs (Chromium only, requires File System Access API). `tests/schema.spec.js` validates `transmittal.schema.json` against canonical fixtures via `ajv` (only dev dep besides Playwright)
|
||||
|
||||
|
|
@ -50,11 +50,11 @@ No lint/typecheck/format commands exist for the HTML tools — vanilla JS + POSI
|
|||
|
||||
- **`dist/` is gitignored.** `tool/dist/<tool>.html` is the canonical built artifact for testing and as the source for `--release` writes. Never hand-edit a `dist/` file.
|
||||
- **Lockstep releases.** Every release cut bumps all six artifacts (5 HTML tools + zddc-server) to the same version, even if a tool didn't change. The coordinated next-stable target is `max(latest tag across all tools) + 1`. Per-tool independent versions are no longer the norm — `sh build.sh --release` is the canonical path. Workflow: alpha = active dev, beta = ready for general testing, stable = ready to ship.
|
||||
- **`website/releases/` is committed.** HTML tools: per-version `<tool>_v<X.Y.Z>.html` (real immutable files) + partial-version pins + channel mirrors (symlinks). zddc-server: `zddc-server_v<X.Y.Z>_<platform>` per-version binaries (real bytes), `zddc-server_v<X.Y>_<platform>` / `_v<X>_<platform>` / `_<channel>_<platform>` symlinks, plus `zddc-server_<X>.html` stub pages that surface the four platform downloads in one matrix-cell link. Same cascade rule for both: stable cut → beta + alpha both reset to stable; beta cut → alpha cascades to beta.
|
||||
- **Release artifacts live on the `website` orphan branch.** The build pipeline writes them to `${ZDDC_DEPLOY_RELEASES_DIR:-$HOME/src/zddc-website/releases}` — a git worktree of that branch, served by Caddy directly. HTML tools: per-version `<tool>_v<X.Y.Z>.html` (real immutable files) + partial-version pins + channel mirrors (symlinks). zddc-server: `zddc-server_v<X.Y.Z>_<platform>` per-version binaries (LFS), `zddc-server_v<X.Y>_<platform>` / `_v<X>_<platform>` / `_<channel>_<platform>` symlinks, plus `zddc-server_<X>.html` stub pages that surface the four platform downloads in one matrix-cell link. Same cascade rule for both: stable cut → beta + alpha both reset to stable; beta cut → alpha cascades to beta.
|
||||
- **No tags for alpha/beta.** Channel URLs are stable URLs by design — appending counter tags would defeat the purpose. The on-page label encodes `<date> · <sha>` for traceability. Stable cuts get clean `<tool>-vX.Y.Z` tags for every tool (six tags per cut, all sharing the same X.Y.Z).
|
||||
- **Pre-release semver in the on-page label.** Plain dev builds and `--release alpha|beta` cuts embed `vX.Y.Z-{alpha,beta}` in `{{BUILD_LABEL}}` where X.Y.Z is the next-stable target. Plain dev adds a full timestamp + `-dirty` marker; `--release alpha|beta` is date-only.
|
||||
- **Channel-link verifier.** Every `sh build.sh` ends with a check that every `<tool>_{stable,beta,alpha}.html` (and zddc-server's per-platform binary mirrors + stub pages) resolves. Bootstrap-friendly: skips zddc-server checks until the first `--release` cut materializes the binaries.
|
||||
- **Plain `sh tool/build.sh` is a dev build.** Writes `dist/<tool>.html` only; no `website/releases/` side-effect. To publish, re-run with `sh build.sh --release alpha` to cut all six tools' alpha mirrors together.
|
||||
- **Plain `sh tool/build.sh` is a dev build.** Writes `dist/<tool>.html` only; no new per-version files / symlink updates in the website worktree. To publish, re-run with `sh build.sh --release alpha` to cut all six tools' alpha mirrors together. The release writes go to the `website` worktree at `${ZDDC_DEPLOY_RELEASES_DIR:-~/src/zddc-website/releases}`, which is then committed + pushed on that branch separately from `main`.
|
||||
- **Always build before running tests** — Playwright opens `dist/tool.html` via `file://`.
|
||||
- **`</` in JS string/template literals breaks inline `<script>`** embedding. `shared/build-lib.sh` provides `escape_js_close_tags`; every tool's `build.sh` runs JS through it before inlining.
|
||||
- **All ZDDC parsing/formatting/hashing goes through `window.zddc`** (from `shared/zddc.js` + `shared/hash.js` + `shared/zddc-filter.js`). API: `parseFilename`, `parseFolder`, `parseRevision`, `formatFilename`, `formatFolder`, `compareRevisions`, `isValidStatus`, `splitExtension`, `joinExtension`, `crypto.{sha256Hex, sha256String, sha256File, bytesToHex}`, `filter.{parse, matches}`. File objects across tools use `trackingNumber` (string) and `extension` (string, **no leading dot** — use `zddc.joinExtension(name, ext)` to build a filename). Add edge cases to `tests/zddc.spec.js`, not per-tool tests.
|
||||
|
|
|
|||
7
build.sh
7
build.sh
|
|
@ -199,8 +199,11 @@ echo " binary version: $ZDDC_BINARY_VERSION"
|
|||
done
|
||||
'
|
||||
|
||||
WEBSITE_DIR="$SCRIPT_DIR/website"
|
||||
RELEASES_DIR="$WEBSITE_DIR/releases"
|
||||
# Deploy directory for release artifacts. The website lives in a separate
|
||||
# orphan branch served by Caddy from a fixed path; this directory is the
|
||||
# worktree of that branch (default ~/src/zddc-website/releases). Override
|
||||
# with $ZDDC_DEPLOY_RELEASES_DIR for testing or alternate deploy targets.
|
||||
RELEASES_DIR="${ZDDC_DEPLOY_RELEASES_DIR:-$HOME/src/zddc-website/releases}"
|
||||
mkdir -p "$RELEASES_DIR"
|
||||
|
||||
# --- Promote zddc-server release artifacts ---------------------------------
|
||||
|
|
|
|||
|
|
@ -79,20 +79,23 @@ trap cleanup EXIT INT TERM
|
|||
echo "Freshening ${TOOL} ${CHANNEL} from ${LATEST_TAG}"
|
||||
git -C "$REPO" worktree add --quiet --detach "$WT" "$LATEST_TAG"
|
||||
|
||||
# Build in the worktree. The tool's build.sh writes the channel artifact
|
||||
# to "$WT/website/releases/<tool>_<channel>.html"; we then copy it into
|
||||
# the main worktree.
|
||||
sh "$WT/${TOOL}/build.sh" --release "$CHANNEL"
|
||||
# Build in the worktree. The tool's build.sh resolves its release dir
|
||||
# from $ZDDC_DEPLOY_RELEASES_DIR (default ~/src/zddc-website/releases),
|
||||
# writing the channel artifact directly there. Pass through whatever the
|
||||
# parent process has set so freshen-channel honors the same target as
|
||||
# the regular build.
|
||||
DEPLOY_DIR="${ZDDC_DEPLOY_RELEASES_DIR:-$HOME/src/zddc-website/releases}"
|
||||
mkdir -p "$DEPLOY_DIR"
|
||||
ZDDC_DEPLOY_RELEASES_DIR="$DEPLOY_DIR" \
|
||||
sh "$WT/${TOOL}/build.sh" --release "$CHANNEL"
|
||||
|
||||
SRC="$WT/website/releases/${TOOL}_${CHANNEL}.html"
|
||||
DST="$REPO/website/releases/${TOOL}_${CHANNEL}.html"
|
||||
if [ ! -f "$SRC" ]; then
|
||||
echo "error: build did not produce $SRC" >&2
|
||||
DST="$DEPLOY_DIR/${TOOL}_${CHANNEL}.html"
|
||||
if [ ! -f "$DST" ]; then
|
||||
echo "error: build did not produce $DST" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$REPO/website/releases"
|
||||
cp "$SRC" "$DST"
|
||||
echo "Wrote $DST"
|
||||
echo "Done. ${CHANNEL} channel for ${TOOL} now reflects ${LATEST_TAG}."
|
||||
echo "Commit the change: git add $DST && git commit"
|
||||
echo "Commit the change in the website worktree:"
|
||||
echo " cd $(dirname "$DEPLOY_DIR") && git add $(basename "$DEPLOY_DIR")/$(basename "$DST") && git commit"
|
||||
|
|
|
|||
2
mdedit/dist/mdedit.html
vendored
2
mdedit/dist/mdedit.html
vendored
|
|
@ -1774,7 +1774,7 @@ body.help-open .app-header {
|
|||
</svg>
|
||||
<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.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty</span></span>
|
||||
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.9-alpha · 2026-05-02 12:47:59 · d688e20-dirty</span></span>
|
||||
</div>
|
||||
<button id="select-directory" class="btn btn-primary" title="Select a Directory">Select Directory</button>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -287,7 +287,11 @@ _coordinated_next_stable() {
|
|||
# handles binary uploads to Codeberg directly (different distribution model).
|
||||
promote_release() {
|
||||
_tool="$1"
|
||||
_releases_dir="$root_dir/../website/releases"
|
||||
# Honor $ZDDC_DEPLOY_RELEASES_DIR (set by the top-level build.sh and
|
||||
# documentable for one-off CI / test invocations). Fall back to the
|
||||
# legacy in-repo path so single-tool standalone invocations from a
|
||||
# checkout that still has website/ on disk continue to work.
|
||||
_releases_dir="${ZDDC_DEPLOY_RELEASES_DIR:-$root_dir/../website/releases}"
|
||||
|
||||
if [ ! -d "$_releases_dir" ]; then
|
||||
echo "promote_release: $_releases_dir not found" >&2
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
Before Width: | Height: | Size: 9.9 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 9.8 KiB |
|
|
@ -1,27 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Creator: CorelDRAW X7 -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="3.33333in" height="3.33333in" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
|
||||
viewBox="0 0 3333 3333"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<defs>
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
.fil1 {fill:#0AB3F7}
|
||||
.fil2 {fill:#1C283F}
|
||||
.fil0 {fill:white}
|
||||
.fil3 {fill:#1C283F;fill-rule:nonzero}
|
||||
]]>
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Layer_x0020_1">
|
||||
<metadata id="CorelCorpID_0Corel-Layer"/>
|
||||
<rect class="fil0" width="3333" height="3333"/>
|
||||
<g id="_434161592">
|
||||
<path class="fil1" d="M1732 1575l-1008 0 0 183 1008 0 0 -183zm-974 36l22 0 33 86 34 -86 21 0 -46 112 -18 0 -46 -112zm193 44l-10 23 0 0 -19 45 -20 0 40 -90 9 22zm0 -45l19 0 49 113 -18 0 -50 -113zm291 45l-10 23 0 0 -7 18 0 0 -12 27 -20 0 39 -90 10 22zm0 -45l18 0 50 113 -19 0 -49 -113zm151 114c-9,0 -17,-1 -25,-4 -8,-3 -15,-8 -22,-14l12 -14c5,5 11,8 16,11 6,2 12,4 19,4 6,0 11,-2 15,-4 3,-3 5,-6 5,-10l0 -1c0,-2 0,-3 -1,-5 -1,-2 -2,-3 -4,-4 -2,-2 -4,-3 -8,-4 -3,-1 -7,-3 -12,-4 -6,-1 -12,-3 -16,-4 -5,-2 -9,-4 -12,-7 -3,-2 -6,-5 -7,-9 -2,-4 -3,-8 -3,-13l0 0c0,-5 1,-10 3,-14 2,-4 5,-7 8,-10 3,-3 7,-5 12,-6 5,-2 10,-3 15,-3 9,0 16,1 22,4 7,2 13,6 19,10l-11 15c-5,-4 -10,-6 -15,-8 -5,-2 -10,-3 -15,-3 -6,0 -10,1 -13,3 -4,3 -5,6 -5,10l0 0c0,2 0,4 1,6 1,1 2,3 4,4 2,2 5,3 8,4 4,1 8,2 13,4 6,1 11,3 16,5 5,1 8,4 11,6 3,3 6,6 7,9 2,4 2,8 2,12l0 1c0,5 -1,10 -3,14 -1,4 -4,7 -8,10 -3,3 -7,5 -12,7 -5,1 -10,2 -16,2zm120 -46l-44 -67 23 0 41 67 0 45 -20 0 0 -45zm23 -38l19 -29 22 0 -30 46 -11 -17zm122 84c-8,0 -17,-1 -24,-4 -8,-3 -16,-8 -22,-14l12 -14c5,5 10,8 16,11 6,2 12,4 19,4 6,0 11,-2 14,-4 4,-3 6,-6 6,-10l0 -1c0,-2 -1,-3 -1,-5 -1,-2 -2,-3 -4,-4 -2,-2 -5,-3 -8,-4 -3,-1 -7,-3 -13,-4 -6,-1 -11,-3 -16,-4 -4,-2 -8,-4 -11,-7 -3,-2 -6,-5 -7,-9 -2,-4 -3,-8 -3,-13l0 0c0,-5 1,-10 3,-14 2,-4 4,-7 8,-10 3,-3 7,-5 12,-6 4,-2 10,-3 15,-3 8,0 16,1 22,4 7,2 13,6 19,10l-11 15c-5,-4 -10,-6 -15,-8 -5,-2 -10,-3 -15,-3 -6,0 -10,1 -14,3 -3,3 -4,6 -4,10l0 0c0,2 0,4 1,6 0,1 2,3 4,4 2,2 4,3 8,4 3,1 8,2 13,4 6,1 11,3 16,5 4,1 8,4 11,6 3,3 5,6 7,9 1,4 2,8 2,12l0 1c0,5 -1,10 -3,14 -2,4 -5,7 -8,10 -3,3 -8,5 -13,7 -4,1 -10,2 -16,2zm-547 -58c7,0 12,-2 17,-5 4,-3 6,-8 6,-14l0 0c0,-6 -2,-11 -6,-14 -4,-3 -10,-5 -17,-5l-49 0 0 -18 50 0c7,0 14,1 19,3 5,2 10,5 14,9 3,3 5,6 7,10 1,4 2,9 2,14l0 0c0,5 -1,9 -2,12 -1,4 -3,7 -6,10 -2,3 -5,6 -8,7 -3,2 -7,4 -11,5l30 43 -23 0 -27 -40 -1 0 -24 0 0 40 -20 0 0 -57 49 0z"/>
|
||||
<rect class="fil2" x="1778" y="1553" width="6.50317" height="228.228"/>
|
||||
<path class="fil3" d="M1836 1596c0,-7 6,-13 16,-13 8,0 16,3 23,9l5 -7c-8,-6 -16,-10 -27,-10 -15,0 -26,9 -26,22 0,13 8,18 26,22 16,4 20,8 20,15 0,8 -7,14 -17,14 -11,0 -19,-4 -27,-11l-5 6c9,8 19,12 32,12 15,0 26,-8 26,-22 0,-12 -8,-18 -25,-22 -17,-3 -21,-8 -21,-15zm71 -19l0 77 9 0 0 -77 -9 0zm104 14l0 63 9 0 0 -77 -9 0 -28 42 -29 -42 -9 0 0 77 9 0 0 -63 28 42 1 0 28 -42zm96 10c0,-15 -12,-24 -29,-24l-30 0 0 77 9 0 0 -27 19 0c17,0 31,-9 31,-26zm-9 1c0,10 -9,17 -22,17l-19 0 0 -34 20 0c12,0 21,5 21,17zm31 52l53 0 0 -8 -44 0 0 -69 -9 0 0 77zm76 -77l0 77 9 0 0 -77 -9 0zm94 0l-56 0 0 77 9 0 0 -34 42 0 0 -8 -42 0 0 -27 47 0 0 -8zm57 46l32 -46 -10 0 -26 38 -27 -38 -10 0 32 47 0 30 9 0 0 -31zm54 -46l0 77 8 0 0 -77 -8 0zm95 62l-49 -62 -8 0 0 77 8 0 0 -63 50 63 7 0 0 -77 -8 0 0 62zm104 5l0 -31 -32 0 0 8 24 0 0 19c-6,4 -14,8 -23,8 -19,0 -30,-14 -30,-33 0,-17 12,-32 29,-32 11,0 18,4 24,9l5 -6c-7,-7 -15,-11 -29,-11 -23,0 -39,19 -39,41 0,22 16,40 40,40 13,0 24,-6 31,-12z"/>
|
||||
<path class="fil3" d="M1894 1744l-6 -5c-7,7 -14,11 -25,11 -17,0 -30,-14 -30,-32 0,-18 13,-32 30,-32 11,0 18,4 25,10l6 -6c-8,-7 -17,-12 -31,-12 -23,0 -39,18 -39,40 0,22 16,40 39,40 14,0 23,-5 31,-14zm94 -26c0,-22 -16,-40 -40,-40 -24,0 -40,18 -40,40 0,21 16,40 40,40 24,0 40,-19 40,-40zm-9 0c0,18 -13,32 -31,32 -18,0 -31,-15 -31,-32 0,-18 13,-32 31,-32 18,0 31,14 31,32zm98 -24l0 63 8 0 0 -78 -9 0 -28 42 -28 -42 -9 0 0 78 8 0 0 -63 29 41 0 0 29 -41zm93 10c0,-16 -11,-25 -29,-25l-29 0 0 78 9 0 0 -28 19 0c16,0 30,-8 30,-25zm-9 0c0,10 -8,17 -21,17l-19 0 0 -34 19 0c13,0 21,6 21,17zm30 53l53 0 0 -8 -44 0 0 -70 -9 0 0 78zm130 -78l-57 0 0 78 57 0 0 -8 -48 0 0 -28 43 0 0 -8 -43 0 0 -26 48 0 0 -8zm87 78l-30 -40 29 -38 -10 0 -24 32 -24 -32 -10 0 29 38 -30 40 10 0 25 -34 25 34 10 0zm22 -78l0 78 8 0 0 -78 -8 0zm65 8l26 0 0 -8 -61 0 0 8 26 0 0 70 9 0 0 -70zm81 39l32 -47 -10 0 -27 39 -26 -39 -10 0 32 47 0 31 9 0 0 -31z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.6 KiB |
|
|
@ -1,246 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>ZDDC — Zero Day Document Control</title>
|
||||
<meta name="description" content="A file-naming convention and a small set of single-file HTML tools for managing project deliverables. Self-contained, offline-capable, dependency-free.">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://zddc.varasys.io/">
|
||||
<meta property="og:title" content="ZDDC — Zero Day Document Control">
|
||||
<meta property="og:description" content="A file-naming convention and a small set of single-file HTML tools for managing project deliverables. Self-contained, offline-capable, dependency-free.">
|
||||
<meta name="theme-color" content="#2a5a8a">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
<style>
|
||||
.channel-row { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 0.75rem; font-size: 0.9rem; }
|
||||
.channel-row a { display: inline-block; padding: 0.25rem 0.625rem; border-radius: 999px; text-decoration: none; border: 1px solid var(--color-border); color: var(--color-text); }
|
||||
.channel-row a:hover { background: var(--color-bg-subtle); }
|
||||
.channel-row .channel-stable { border-color: var(--color-primary); color: var(--color-primary); font-weight: 600; }
|
||||
.channel-row .channel-beta, .channel-row .channel-alpha { color: var(--color-text-muted); }
|
||||
.install-grid { display: grid; grid-template-columns: 1fr; gap: var(--spacing-md); margin-top: var(--spacing-md); }
|
||||
.install-card { padding: var(--spacing-md); border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-bg-subtle); }
|
||||
.install-card h3 { margin-top: 0; margin-bottom: 0.25rem; }
|
||||
.install-card .when { color: var(--color-text-muted); font-size: 0.92em; margin: 0.1rem 0 0.6rem 0; }
|
||||
.install-card pre { background: var(--color-bg); border: 1px solid var(--color-border); border-radius: 6px; padding: 0.6rem 0.8rem; overflow-x: auto; font-size: 0.82em; line-height: 1.45; margin: 0; }
|
||||
.install-card pre code { font-family: "SF Mono", Menlo, Consolas, monospace; }
|
||||
.install-points { margin: 0.4rem 0 0.4rem 1.4rem; padding: 0; line-height: 1.65; }
|
||||
.install-points li { margin-bottom: 0.15rem; }
|
||||
.mode-grid { display: grid; grid-template-columns: 1fr; gap: var(--spacing-md); margin-top: var(--spacing-md); }
|
||||
@media (min-width: 720px) { .mode-grid { grid-template-columns: 1fr 1fr; } }
|
||||
.mode-card { padding: var(--spacing-md); border: 1px solid var(--color-border); border-radius: 8px; }
|
||||
.mode-card h3 { margin-top: 0; }
|
||||
code.inline { background: var(--color-bg-subtle); padding: 0.1rem 0.35rem; border-radius: 4px; font-size: 0.9em; }
|
||||
.feature-list { line-height: 1.8; padding-left: 1.5rem; color: var(--color-text); }
|
||||
.feature-list li { margin-bottom: 0.4rem; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Header -->
|
||||
<header class="site-header">
|
||||
<div class="container header-content">
|
||||
<a href="/" class="brand">
|
||||
<svg class="brand-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" aria-hidden="true">
|
||||
<rect width="64" height="64" rx="12" fill="#1e3a5f"/>
|
||||
<g fill="#fff">
|
||||
<rect x="14" y="18" width="36" height="7"/>
|
||||
<polygon points="43,25 50,25 21,43 14,43"/>
|
||||
<rect x="14" y="43" width="36" height="7"/>
|
||||
</g>
|
||||
</svg>
|
||||
<span class="brand-name">ZDDC</span>
|
||||
</a>
|
||||
<nav class="header-nav">
|
||||
<div class="dropdown">
|
||||
<button class="dropdown-toggle" type="button" aria-haspopup="true">
|
||||
<span>Tools</span>
|
||||
<svg viewBox="0 0 24 24" style="width: 14px; height: 14px; fill: currentColor;">
|
||||
<path d="M7 10l5 5 5-5z"/>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="dropdown-menu">
|
||||
<div class="dropdown-menu__inner">
|
||||
<a href="releases/archive_stable.html">
|
||||
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M20 6H4a2 2 0 00-2 2v10a2 2 0 002 2h16a2 2 0 002-2V8a2 2 0 00-2-2zm0 12H4V8h16v10zM4 2h16v2H4z"/></svg>
|
||||
Archive Browser
|
||||
</a>
|
||||
<a href="releases/transmittal_stable.html">
|
||||
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></svg>
|
||||
Transmittal Creator
|
||||
</a>
|
||||
<a href="releases/classifier_stable.html">
|
||||
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></svg>
|
||||
Document Classifier
|
||||
</a>
|
||||
<a href="releases/mdedit_stable.html">
|
||||
<svg class="dropdown-menu-icon" viewBox="0 0 24 24"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a1 1 0 000-1.41l-2.34-2.34a1 1 0 00-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></svg>
|
||||
Markdown Editor
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<a href="reference.html" class="nav-link">Docs</a>
|
||||
<a href="releases/" class="nav-link">Releases</a>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Hero -->
|
||||
<section class="hero">
|
||||
<div class="container">
|
||||
<h1>Zero Day Document Control</h1>
|
||||
<p class="hero-subtitle">A file-naming convention and a small set of single-file HTML tools for managing project deliverables. Self-contained, offline-capable, dependency-free.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<main class="container" style="margin-bottom: var(--spacing-2xl);">
|
||||
|
||||
<section style="margin-top: var(--spacing-xl);">
|
||||
<h2>What is it?</h2>
|
||||
<p>ZDDC is a convention, not a platform. Every deliverable's filename encodes its tracking number, revision, status, and title; every transmittal folder is date-prefixed and self-describing. A plain shared folder becomes a fully searchable, auditable information-management system — no server, no database, no software required to read the archive.</p>
|
||||
<p>The four tools below are <em>optional</em> interfaces around this structure. Each is a single self-contained HTML file that works two ways: open it locally and point it at a folder on your disk, or put it behind any web server (including the optional <code class="inline">zddc-server</code> described below) and use it over the network. Same on-disk layout either way.</p>
|
||||
<p style="margin-top: var(--spacing-md);"><a href="reference.html">Read the full specification →</a></p>
|
||||
</section>
|
||||
|
||||
<section style="margin-top: var(--spacing-2xl);">
|
||||
<h2>Try the tools</h2>
|
||||
<p>Each tool is published in three channels. <strong>Stable</strong> is versioned and immutable; <strong>beta</strong> and <strong>alpha</strong> are mutable previews of in-flight work.</p>
|
||||
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--spacing-lg); margin-top: var(--spacing-lg);">
|
||||
|
||||
<div class="tool-card">
|
||||
<div class="tool-card__title">Archive Browser</div>
|
||||
<div class="tool-card__desc">Browse, search, and filter your project folder. Group by transmittal; filter by tracking number, revision, status, or free text. Export selections as ZIP.</div>
|
||||
<div class="channel-row">
|
||||
<a href="releases/archive_stable.html" class="channel-stable">stable</a>
|
||||
<a href="releases/archive_beta.html" class="channel-beta">beta</a>
|
||||
<a href="releases/archive_alpha.html" class="channel-alpha">alpha</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tool-card">
|
||||
<div class="tool-card__title">Transmittal Creator</div>
|
||||
<div class="tool-card__desc">Fill in metadata, drag in files, publish a self-contained HTML transmittal record with SHA-256 checksums. Optional digital signatures. The published file <em>is</em> the transmittal record.</div>
|
||||
<div class="channel-row">
|
||||
<a href="releases/transmittal_stable.html" class="channel-stable">stable</a>
|
||||
<a href="releases/transmittal_beta.html" class="channel-beta">beta</a>
|
||||
<a href="releases/transmittal_alpha.html" class="channel-alpha">alpha</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tool-card">
|
||||
<div class="tool-card__title">Document Classifier</div>
|
||||
<div class="tool-card__desc">Spreadsheet-like interface for bulk-renaming files into ZDDC format. Copy/paste with Excel. Point it at a folder, fill in the columns, save all at once.</div>
|
||||
<div class="channel-row">
|
||||
<a href="releases/classifier_stable.html" class="channel-stable">stable</a>
|
||||
<a href="releases/classifier_beta.html" class="channel-beta">beta</a>
|
||||
<a href="releases/classifier_alpha.html" class="channel-alpha">alpha</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tool-card">
|
||||
<div class="tool-card__title">Markdown Editor</div>
|
||||
<div class="tool-card__desc">Browser-based markdown editor with live preview, YAML front matter, and table of contents. Direct local file access via the File System Access API.</div>
|
||||
<div class="channel-row">
|
||||
<a href="releases/mdedit_stable.html" class="channel-stable">stable</a>
|
||||
<a href="releases/mdedit_beta.html" class="channel-beta">beta</a>
|
||||
<a href="releases/mdedit_alpha.html" class="channel-alpha">alpha</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<p style="margin-top: var(--spacing-lg); color: var(--color-text-muted);">Append <code class="inline">?v=alpha</code> (or <code class="inline">?v=0.0.4</code>, etc.) to any URL to switch versions for a single request — useful for sharing a link to an exact build. Direct local-folder access requires a Chromium-based browser (the File System Access API is unavailable in Firefox / Safari). <a href="releases/">Browse all versions →</a></p>
|
||||
</section>
|
||||
|
||||
<!-- zddc-server (inline, replaces the previous separate page) -->
|
||||
<section style="margin-top: var(--spacing-2xl);">
|
||||
<h2>zddc-server (optional)</h2>
|
||||
<p>The tools work two ways over the same on-disk archive. Pick whichever fits your team:</p>
|
||||
|
||||
<div class="mode-grid">
|
||||
<div class="mode-card">
|
||||
<h3>Local directory mode</h3>
|
||||
<p>Open a tool, click <em>Add Directory</em>, point it at a folder. The tool reads files via the File System Access API. No upload, no server, no account.</p>
|
||||
<p>Enough for individual users and small teams on a shared drive (network share, Dropbox, OneDrive, syncthing).</p>
|
||||
</div>
|
||||
<div class="mode-card">
|
||||
<h3>Online mode</h3>
|
||||
<p>Take the same local directory and put it behind any web server (nginx, Caddy, Apache, or <code class="inline">zddc-server</code>). The Archive Browser tool talks to the server's directory listings instead of the local filesystem — read-only, works in any browser.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p style="margin-top: var(--spacing-md);"><strong><code class="inline">zddc-server</code></strong> is a small Go binary purpose-built to serve ZDDC archives. <em>Any</em> web server gives you online mode; <code class="inline">zddc-server</code> adds things a generic web server can't:</p>
|
||||
|
||||
<ul class="feature-list">
|
||||
<li><strong>Access control via <code class="inline">.zddc</code> files.</strong> Behind a reverse proxy that authenticates users and sets an <code class="inline">X-Auth-Request-Email</code> request header, <code class="inline">zddc-server</code> consults YAML <code class="inline">.zddc</code> files in directories — cascading bottom-up; deeper rules override. No database, no admin UI.</li>
|
||||
<li><strong>Virtual <code class="inline">.archive</code> URL space.</strong> <code class="inline">GET /Project/.archive/123-XYZ.html</code> resolves to the canonical revision file at request time. Computed from filenames; no cache, no separate index file.</li>
|
||||
<li><strong>Per-request access logging</strong> keyed to the authenticated user.</li>
|
||||
<li><strong>TLS, ETags, conditional GET, CORS, autoindex.</strong> The mundane glue.</li>
|
||||
</ul>
|
||||
|
||||
<p style="margin-top: var(--spacing-md);">The on-disk layout is the same in both modes. Stop the server and the directory is still a perfectly valid ZDDC archive that opens in local-directory mode. <strong>The server is convenience, not lock-in.</strong></p>
|
||||
|
||||
<p style="margin-top: var(--spacing-md);">Source, environment-variable contract, and ACL syntax: <a href="https://codeberg.org/VARASYS/ZDDC/src/branch/main/zddc">codeberg.org/VARASYS/ZDDC <code class="inline">zddc/</code></a>. Pre-built binaries are published as Codeberg release assets; example Helm charts (production + dev) live under <code class="inline">helm/</code> in the repo and compile from source at deploy time.</p>
|
||||
</section>
|
||||
|
||||
<section style="margin-top: var(--spacing-2xl);">
|
||||
<h2>Install on your server</h2>
|
||||
<p>Two paths, no install scripts. The server has built-in fetch-and-cache for the tool HTMLs; the local-file path needs nothing more than a download.</p>
|
||||
|
||||
<div class="install-grid">
|
||||
<div class="install-card">
|
||||
<h3>Server: just run zddc-server</h3>
|
||||
<p class="when">The binary has the current-stable build of all five tools baked in at compile time. They appear automatically at the right paths under <code class="inline">ZDDC_ROOT</code>:</p>
|
||||
<ul class="install-points">
|
||||
<li><strong>archive.html</strong> at every level (root, project, archive, vendor)</li>
|
||||
<li><strong>classifier.html</strong> in any <code class="inline">Incoming</code>, <code class="inline">Working</code>, or <code class="inline">Staging</code> directory and its subtree</li>
|
||||
<li><strong>mdedit.html</strong> in any <code class="inline">Working</code> directory and its subtree</li>
|
||||
<li><strong>transmittal.html</strong> in any <code class="inline">Staging</code> directory and its subtree</li>
|
||||
<li><strong>index.html</strong> (the project picker) at the deployment root</li>
|
||||
</ul>
|
||||
<pre><code>ZDDC_ROOT=/srv/zddc ./zddc-server</code></pre>
|
||||
<p class="when" style="margin-top: 0.6rem;"><strong>To override a tool</strong> at any path: drop a real <code class="inline">.html</code> file there — that file wins over the baked-in version. <strong>To pin a different version</strong>, write an <code class="inline">apps:</code> entry in any <code class="inline">.zddc</code> file along the path:</p>
|
||||
<pre><code># <project>/.zddc
|
||||
apps:
|
||||
classifier: stable # or beta / alpha / v0.0.4 / v0.0 / v0
|
||||
archive: https://my-fork.example/archive.html</code></pre>
|
||||
<p class="when" style="margin-top: 0.6rem;">URL sources are fetched once and cached in <code class="inline"><ZDDC_ROOT>/_app/</code>. To force a re-fetch, delete the cache file. Closer-to-leaf <code class="inline">.zddc</code> entries override parent ones.</p>
|
||||
</div>
|
||||
|
||||
<div class="install-card">
|
||||
<h3>Local: just download the .html file</h3>
|
||||
<p class="when">No server, no install — open in any modern browser.</p>
|
||||
<ul class="install-points">
|
||||
<li><a href="releases/archive_stable.html">archive.html</a></li>
|
||||
<li><a href="releases/transmittal_stable.html">transmittal.html</a></li>
|
||||
<li><a href="releases/classifier_stable.html">classifier.html</a></li>
|
||||
<li><a href="releases/mdedit_stable.html">mdedit.html</a></li>
|
||||
</ul>
|
||||
<p class="when" style="margin-top: 0.6rem;">Right-click → Save As. Each tool is a self-contained HTML file with everything inlined; works from <code class="inline">file://</code> or any static host.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section style="margin-top: var(--spacing-2xl);">
|
||||
<h2>Learn more</h2>
|
||||
<ul style="line-height: 1.9;">
|
||||
<li><a href="reference.html">Technical Reference</a> — the full ZDDC convention: filename format, tracking numbers, revisions, status codes, folder naming, transmittal workflow.</li>
|
||||
<li><a href="releases/">All releases</a> — every version and channel build of every tool, with per-version pin URLs.</li>
|
||||
<li><a href="https://codeberg.org/VARASYS/ZDDC">codeberg.org/VARASYS/ZDDC</a> — source code, issue tracker, contributor docs.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-content">
|
||||
<span>ZDDC is open source — <a href="https://codeberg.org/VARASYS/ZDDC">codeberg.org/VARASYS/ZDDC</a></span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="js/layout.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
// Simple tab switching for ZDDC site
|
||||
// Include via <script src="/js/layout.js"></script> at end of <body>
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
// Theme system
|
||||
const themeKey = 'zddc-theme';
|
||||
const themes = ['system', 'light', 'dark'];
|
||||
let currentThemeIndex = 0;
|
||||
|
||||
// SVG icons for theme toggle
|
||||
const icons = {
|
||||
system: '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><polyline points="8 21 12 17 16 21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>',
|
||||
light: '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg>',
|
||||
dark: '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>'
|
||||
};
|
||||
|
||||
function getStoredTheme() {
|
||||
const stored = localStorage.getItem(themeKey);
|
||||
if (stored && themes.includes(stored)) {
|
||||
return stored;
|
||||
}
|
||||
return 'system';
|
||||
}
|
||||
|
||||
function setThemeIndex(index) {
|
||||
currentThemeIndex = index;
|
||||
const theme = themes[index];
|
||||
applyTheme(theme);
|
||||
}
|
||||
|
||||
function applyTheme(theme) {
|
||||
if (theme === 'light') {
|
||||
document.documentElement.setAttribute('data-theme', 'light');
|
||||
} else if (theme === 'dark') {
|
||||
document.documentElement.setAttribute('data-theme', 'dark');
|
||||
} else {
|
||||
document.documentElement.removeAttribute('data-theme');
|
||||
}
|
||||
localStorage.setItem(themeKey, theme);
|
||||
updateToggleIcon();
|
||||
}
|
||||
|
||||
function updateToggleIcon() {
|
||||
const btn = document.querySelector('.theme-toggle');
|
||||
if (!btn) return;
|
||||
const theme = themes[currentThemeIndex];
|
||||
btn.innerHTML = icons[theme];
|
||||
btn.setAttribute('aria-label', 'Toggle theme (current: ' + theme + ')');
|
||||
}
|
||||
|
||||
function cycleTheme() {
|
||||
currentThemeIndex = (currentThemeIndex + 1) % themes.length;
|
||||
setThemeIndex(currentThemeIndex);
|
||||
}
|
||||
|
||||
function createToggle() {
|
||||
const toggle = document.createElement('button');
|
||||
toggle.className = 'theme-toggle';
|
||||
toggle.setAttribute('aria-label', 'Toggle theme');
|
||||
toggle.onclick = cycleTheme;
|
||||
return toggle;
|
||||
}
|
||||
|
||||
// Apply stored theme early (before DOM queries)
|
||||
const storedTheme = getStoredTheme();
|
||||
currentThemeIndex = themes.indexOf(storedTheme);
|
||||
if (currentThemeIndex === -1) currentThemeIndex = 0;
|
||||
applyTheme(storedTheme);
|
||||
|
||||
// Create and inject toggle button after DOM ready
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const toggle = createToggle();
|
||||
const headerNav = document.querySelector('.header-nav');
|
||||
|
||||
if (headerNav) {
|
||||
// Priority 1: .header-nav — append as last child (after Docs link)
|
||||
headerNav.appendChild(toggle);
|
||||
} else {
|
||||
const navTabs = document.querySelector('.nav-tabs');
|
||||
if (navTabs) {
|
||||
// Priority 2: .nav-tabs — insert as sibling AFTER .nav-tabs
|
||||
navTabs.parentNode.insertBefore(toggle, navTabs.nextSibling);
|
||||
} else {
|
||||
const headerContent = document.querySelector('.header-content');
|
||||
if (headerContent) {
|
||||
// Priority 3: .header-content — append as last child
|
||||
headerContent.appendChild(toggle);
|
||||
}
|
||||
}
|
||||
}
|
||||
updateToggleIcon();
|
||||
});
|
||||
|
||||
// Dropdown: click toggle for touch devices (CSS :hover handles desktop)
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
document.querySelectorAll('.dropdown-toggle').forEach(function (btn) {
|
||||
btn.addEventListener('click', function (e) {
|
||||
e.stopPropagation();
|
||||
var menu = btn.closest('.dropdown').querySelector('.dropdown-menu');
|
||||
if (menu) menu.classList.toggle('show');
|
||||
});
|
||||
});
|
||||
document.addEventListener('click', function () {
|
||||
document.querySelectorAll('.dropdown-menu.show').forEach(function (m) {
|
||||
m.classList.remove('show');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Tab switching (unchanged)
|
||||
document.querySelectorAll('button[data-tab]').forEach(btn => {
|
||||
btn.addEventListener('click', () => {
|
||||
document.querySelectorAll('button[data-tab]').forEach(b => b.classList.remove('active'));
|
||||
btn.classList.add('active');
|
||||
|
||||
const tab = btn.dataset.tab;
|
||||
if (tab === 'reference') {
|
||||
if (window.location.pathname.endsWith('index.html')) {
|
||||
window.location.hash = '';
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
})();
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1 +0,0 @@
|
|||
archive_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
archive_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
archive_v0.0.8.html
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1 +0,0 @@
|
|||
archive_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
archive_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
classifier_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
classifier_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
classifier_v0.0.8.html
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1 +0,0 @@
|
|||
classifier_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
classifier_v0.0.8.html
|
||||
|
|
@ -1,259 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Download ZDDC</title>
|
||||
<meta name="description" content="Self-host the ZDDC server, or download individual tools. Pin a version your project trusts; your archive's tools are yours.">
|
||||
<meta name="theme-color" content="#2a5a8a">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<div class="container header-content">
|
||||
<a href="/" class="brand">
|
||||
<svg class="brand-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" aria-hidden="true">
|
||||
<rect width="64" height="64" rx="12" fill="#1e3a5f"/>
|
||||
<g fill="#fff">
|
||||
<rect x="14" y="18" width="36" height="7"/>
|
||||
<polygon points="43,25 50,25 21,43 14,43"/>
|
||||
<rect x="14" y="43" width="36" height="7"/>
|
||||
</g>
|
||||
</svg>
|
||||
<span class="brand-name">ZDDC</span>
|
||||
</a>
|
||||
<nav class="header-nav">
|
||||
<a href="/" class="nav-link">Home</a>
|
||||
<a href="../reference.html" class="nav-link">Docs</a>
|
||||
<a href="index.html" class="nav-link active">Download</a>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section class="hero">
|
||||
<div class="container">
|
||||
<h1>Download ZDDC</h1>
|
||||
<p class="hero-subtitle">Pick how you want to use it. Pick the version you want. Every link below points at a real, immutable file you can save into your archive — your tools, your version, forever.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<main class="container" style="margin-bottom: var(--spacing-2xl);">
|
||||
<div class="version-picker-bar">
|
||||
<label for="version-picker">Showing</label>
|
||||
<select id="version-picker">
|
||||
<optgroup label="Channels (mutable URLs)">
|
||||
<option value="stable" selected>stable — currently v0.0.8</option>
|
||||
<option value="beta">beta — tracks stable</option>
|
||||
<option value="alpha">alpha — tracks stable</option>
|
||||
</optgroup>
|
||||
<optgroup label="Pinned versions (immutable URLs)">
|
||||
<option value="v0.0.8">v0.0.8</option>
|
||||
<option value="v0.0.2">v0.0.2</option>
|
||||
<option value="v0.0.1">v0.0.1</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
<span class="picker-hint">Changes every download link below.</span>
|
||||
</div>
|
||||
|
||||
<!-- ───────────── Path A — Self-host the server ───────────── -->
|
||||
<section class="card" style="background: var(--color-bg-subtle); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--spacing-lg) var(--spacing-xl); margin-top: var(--spacing-lg);">
|
||||
<h2 style="margin-top:0;">Path A — Self-host the server</h2>
|
||||
<p>One small Go binary. <strong>All five tools are baked in</strong> via <code>//go:embed</code>; the server picks the right one for each folder of your archive. Adds ACL via <code>.zddc</code> files, the virtual <code>.archive</code> document index, and SSO header passthrough. Stop the server and the directory is still a perfectly valid ZDDC archive — the server is convenience, not lock-in.</p>
|
||||
<a class="dl-primary"
|
||||
data-tool="zddc-server"
|
||||
data-platform="linux-amd64"
|
||||
href="zddc-server_stable_linux-amd64"
|
||||
id="dl-primary-binary">
|
||||
<span class="dl-icon">⬇</span>
|
||||
<span>Download <span id="dl-primary-platlabel">for Linux (x86_64)</span></span>
|
||||
</a>
|
||||
<span class="dl-primary-meta" id="dl-primary-meta">zddc-server_stable_linux-amd64</span>
|
||||
<div class="dl-secondary-row" id="dl-others">
|
||||
<span>Other platforms:</span>
|
||||
<a data-tool="zddc-server" data-platform="linux-amd64" href="zddc-server_stable_linux-amd64">Linux (x86_64)</a>
|
||||
<a data-tool="zddc-server" data-platform="darwin-amd64" href="zddc-server_stable_darwin-amd64">macOS (Intel)</a>
|
||||
<a data-tool="zddc-server" data-platform="darwin-arm64" href="zddc-server_stable_darwin-arm64">macOS (Apple Silicon)</a>
|
||||
<a data-tool="zddc-server" data-platform="windows-amd64" href="zddc-server_stable_windows-amd64.exe">Windows (x86_64)</a>
|
||||
</div>
|
||||
<p style="margin-top: var(--spacing-md); font-size: 0.92rem; color: var(--color-text-muted);">
|
||||
After download: <code>chmod +x</code> the file, set <code>ZDDC_ROOT=/path/to/archive</code>, run.
|
||||
Need a different platform? <a href="https://codeberg.org/VARASYS/ZDDC">Build from source</a> at the matching tag.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<!-- ───────────── Path B — Standalone tool HTMLs ───────────── -->
|
||||
<section class="card" style="border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--spacing-lg) var(--spacing-xl); margin-top: var(--spacing-xl);">
|
||||
<h2 style="margin-top:0;">Path B — Standalone tools</h2>
|
||||
<p>Every tool is a single self-contained HTML file. <strong>Open it locally and point it at a folder on your disk</strong> — no install, no server, no account. Same on-disk layout the server uses. Use one tool, use all five, mix and match — there is no orchestration to set up.</p>
|
||||
<div class="grid-4" style="margin-top: var(--spacing-md);">
|
||||
<a class="tool-card" data-tool="archive" href="archive_stable.html">
|
||||
<span class="tool-card__title">Archive Browser</span>
|
||||
<span class="tool-card__desc">Browse and download from a ZDDC archive.</span>
|
||||
<span class="tool-card__link">Download →</span>
|
||||
</a>
|
||||
<a class="tool-card" data-tool="transmittal" href="transmittal_stable.html">
|
||||
<span class="tool-card__title">Transmittal Creator</span>
|
||||
<span class="tool-card__desc">Build, sign, and verify transmittal packages.</span>
|
||||
<span class="tool-card__link">Download →</span>
|
||||
</a>
|
||||
<a class="tool-card" data-tool="classifier" href="classifier_stable.html">
|
||||
<span class="tool-card__title">Classifier</span>
|
||||
<span class="tool-card__desc">Rename loose files to ZDDC convention.</span>
|
||||
<span class="tool-card__link">Download →</span>
|
||||
</a>
|
||||
<a class="tool-card" data-tool="mdedit" href="mdedit_stable.html">
|
||||
<span class="tool-card__title">Markdown Editor</span>
|
||||
<span class="tool-card__desc">Edit project markdown files in place.</span>
|
||||
<span class="tool-card__link">Download →</span>
|
||||
</a>
|
||||
<a class="tool-card" data-tool="landing" href="landing_stable.html">
|
||||
<span class="tool-card__title">Landing</span>
|
||||
<span class="tool-card__desc">Project picker for multi-project servers.</span>
|
||||
<span class="tool-card__link">Download →</span>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ───────────── Pinning empowerment narrative ───────────── -->
|
||||
<section class="card" style="border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--spacing-lg) var(--spacing-xl); margin-top: var(--spacing-xl);">
|
||||
<h2 style="margin-top:0;">Your version, forever</h2>
|
||||
<p>Your server may run v0.0.8 next month and v0.1.0 the month after. <strong>Your project doesn't have to follow.</strong> If you depend on a specific behavior in <code>archive</code> v0.0.5, save that version into your archive — the next server upgrade can't take it away from you. Two ways to do it:</p>
|
||||
<div class="grid-2" style="margin-top: var(--spacing-md);">
|
||||
<div class="pin-card">
|
||||
<h3>Drop a copy into your archive</h3>
|
||||
<p>Save the tool's HTML at the path the server would serve it from. The server's resolution order picks up real files <em>first</em> — before any cascade or embedded fallback.</p>
|
||||
<pre>curl -o MyProject/archive.html \
|
||||
https://zddc.varasys.io/releases/archive_v0.0.8.html</pre>
|
||||
<p>Now <code>MyProject/archive.html</code> is yours. The server serves your bytes; nothing about a future <code>--release</code> can change them.</p>
|
||||
</div>
|
||||
<div class="pin-card">
|
||||
<h3>Pin via <code>.zddc</code></h3>
|
||||
<p>Less invasive — no copies in your archive, just a small config entry telling the server which version to fetch and cache. Closer-to-leaf wins, so subprojects can pin further.</p>
|
||||
<pre># MyProject/.zddc
|
||||
apps:
|
||||
archive: v0.0.8</pre>
|
||||
<p>Server fetches once on first hit, caches under <code>_app/</code>, falls through to the embedded copy if the fetch fails.</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="pin-note">Your archive's tools are <strong>yours</strong>. The server is convenience; deletion of the server doesn't break your archive — every per-version download above is a real, immutable static file. Save what you trust.</p>
|
||||
</section>
|
||||
|
||||
<!-- ───────────── Channels explainer ───────────── -->
|
||||
<section class="card" style="border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--spacing-lg) var(--spacing-xl); margin-top: var(--spacing-xl); margin-bottom: var(--spacing-xl);">
|
||||
<h2 style="margin-top:0;">Channels</h2>
|
||||
<p>Three channels, applied in lockstep across all tools. Pre-release channels exist to soak changes; <strong>stable</strong> is what production runs.</p>
|
||||
<div class="channel-explainer">
|
||||
<div>
|
||||
<h4 class="alpha">alpha</h4>
|
||||
<p>Active dev iteration. Rebuilds without notice. Look here for the very latest.</p>
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="beta">beta</h4>
|
||||
<p>Ready for general testing. Has soaked through alpha. Still mutable — pin to a versioned URL for reproducibility.</p>
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="stable">stable</h4>
|
||||
<p>Ready to ship. Every per-version file is immutable; <code>_stable</code> follows the latest cut. Channel cuts cascade: stable cut resets beta and alpha to track stable.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container footer-content">
|
||||
<span>ZDDC is open source — <a href="https://codeberg.org/VARASYS/ZDDC">codeberg.org/VARASYS/ZDDC</a></span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
// Platform auto-detect: choose the most likely binary for this user's
|
||||
// OS on first paint. Promotes that platform to the primary CTA; the
|
||||
// other three render in the secondary row. UA-sniffing is good
|
||||
// enough — wrong guesses fall through to the always-visible
|
||||
// "Other platforms" row below.
|
||||
var ua = navigator.userAgent || '';
|
||||
var detected = 'linux-amd64'; // sensible default
|
||||
var platLabel = 'Linux (x86_64)';
|
||||
if (/Macintosh|Mac OS X/.test(ua)) {
|
||||
// Apple Silicon vs Intel — UA hints aren't reliable, prefer arm64
|
||||
// since modern Macs are predominantly arm64. Users on Intel can
|
||||
// pick from "Other platforms".
|
||||
detected = 'darwin-arm64';
|
||||
platLabel = 'macOS (Apple Silicon)';
|
||||
} else if (/Windows/.test(ua)) {
|
||||
detected = 'windows-amd64';
|
||||
platLabel = 'Windows (x86_64)';
|
||||
}
|
||||
|
||||
var primary = document.getElementById('dl-primary-binary');
|
||||
var primaryLabel = document.getElementById('dl-primary-platlabel');
|
||||
var primaryMeta = document.getElementById('dl-primary-meta');
|
||||
var others = document.getElementById('dl-others');
|
||||
|
||||
function isChannel(v) {
|
||||
return v === 'stable' || v === 'beta' || v === 'alpha';
|
||||
}
|
||||
function platBinaryName(slug, plat) {
|
||||
// slug is a channel name ("stable") or a pinned version ("v0.0.8").
|
||||
// The on-disk name uses the slug as-is in both cases since the
|
||||
// channel-mirror filenames are zddc-server_<channel>_<plat> and
|
||||
// per-version are zddc-server_v<X.Y.Z>_<plat>.
|
||||
var suf = (plat.indexOf('windows') === 0) ? '.exe' : '';
|
||||
return 'zddc-server_' + slug + '_' + plat + suf;
|
||||
}
|
||||
function htmlAssetName(tool, slug) {
|
||||
return tool + '_' + slug + '.html';
|
||||
}
|
||||
|
||||
// Promote the detected platform to the primary CTA. The secondary
|
||||
// row keeps all four; the matching one is hidden to avoid showing
|
||||
// the same download twice.
|
||||
if (primary) {
|
||||
primary.dataset.platform = detected;
|
||||
if (primaryLabel) primaryLabel.textContent = 'for ' + platLabel;
|
||||
}
|
||||
if (others) {
|
||||
others.querySelectorAll('a[data-platform="' + detected + '"]').forEach(function(a) {
|
||||
a.style.display = 'none';
|
||||
});
|
||||
}
|
||||
|
||||
// Single source of truth: the dropdown's current value drives every
|
||||
// download link's href. Static markup ships with the stable-channel
|
||||
// mirror (`<tool>_stable.html`, `zddc-server_stable_<plat>`) so the
|
||||
// page works fully without JS — the JS just keeps things in sync
|
||||
// when the user picks a different channel or pins a version.
|
||||
var picker = document.getElementById('version-picker');
|
||||
if (!picker) return;
|
||||
|
||||
function rewire(slug) {
|
||||
// slug ∈ {"stable", "beta", "alpha"} | "v<X.Y.Z>". Every link with
|
||||
// a data-tool attribute is a download URL the dropdown owns.
|
||||
document.querySelectorAll('[data-tool]').forEach(function(a) {
|
||||
var tool = a.dataset.tool;
|
||||
var plat = a.dataset.platform || '';
|
||||
if (tool === 'zddc-server') {
|
||||
a.href = plat ? platBinaryName(slug, plat) : ('zddc-server_' + slug + '.html');
|
||||
} else {
|
||||
a.href = htmlAssetName(tool, slug);
|
||||
}
|
||||
});
|
||||
if (primary && primaryMeta) {
|
||||
primaryMeta.textContent = primary.getAttribute('href');
|
||||
}
|
||||
}
|
||||
|
||||
picker.addEventListener('change', function() { rewire(picker.value); });
|
||||
|
||||
// Run rewire once on load to apply the platform-detection result
|
||||
// (the static href for the primary button is for linux-amd64; on a
|
||||
// non-linux client, that needs to flip to the detected platform).
|
||||
rewire(picker.value);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1 +0,0 @@
|
|||
landing_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
landing_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
landing_v0.0.8.html
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1 +0,0 @@
|
|||
landing_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
landing_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
mdedit_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
mdedit_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
mdedit_v0.0.8.html
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
mdedit_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
mdedit_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
transmittal_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
transmittal_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
transmittal_v0.0.8.html
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1 +0,0 @@
|
|||
transmittal_v0.0.8.html
|
||||
|
|
@ -1 +0,0 @@
|
|||
transmittal_v0.0.8.html
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>zddc-server alpha channel — ZDDC</title>
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
<style>
|
||||
.dl-table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
|
||||
.dl-table th, .dl-table td { text-align: left; padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--color-border); }
|
||||
.dl-table a { color: var(--color-primary); text-decoration: none; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9rem; }
|
||||
.dl-table a:hover { text-decoration: underline; }
|
||||
.breadcrumb { color: var(--color-text-muted); margin-bottom: 1rem; font-size: 0.9rem; }
|
||||
.breadcrumb a { color: var(--color-text-muted); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main class="container" style="max-width: 720px; margin: 2rem auto;">
|
||||
<p class="breadcrumb"><a href="/">home</a> / <a href="index.html">releases</a> / zddc-server alpha channel</p>
|
||||
<h1>zddc-server — alpha channel</h1>
|
||||
<p>Cross-compiled binaries. Download for your platform, mark executable, and run with <code>ZDDC_ROOT=/path/to/archive ./zddc-server</code>.</p>
|
||||
<table class="dl-table">
|
||||
<thead><tr><th>Platform</th><th>Download</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Linux (x86_64)</td><td><a href="zddc-server_alpha_linux-amd64">zddc-server_alpha_linux-amd64</a></td></tr>
|
||||
<tr><td>macOS (Intel)</td><td><a href="zddc-server_alpha_darwin-amd64">zddc-server_alpha_darwin-amd64</a></td></tr>
|
||||
<tr><td>macOS (Apple Silicon)</td><td><a href="zddc-server_alpha_darwin-arm64">zddc-server_alpha_darwin-arm64</a></td></tr>
|
||||
<tr><td>Windows (x86_64)</td><td><a href="zddc-server_alpha_windows-amd64.exe">zddc-server_alpha_windows-amd64.exe</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="font-size: 0.9rem; color: var(--color-text-muted);">Need a different platform? Build from source: <code>(cd zddc && go build -o zddc-server ./cmd/zddc-server)</code> from the repo at the matching tag.</p>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-arm64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_linux-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_windows-amd64.exe
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>zddc-server beta channel — ZDDC</title>
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
<style>
|
||||
.dl-table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
|
||||
.dl-table th, .dl-table td { text-align: left; padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--color-border); }
|
||||
.dl-table a { color: var(--color-primary); text-decoration: none; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9rem; }
|
||||
.dl-table a:hover { text-decoration: underline; }
|
||||
.breadcrumb { color: var(--color-text-muted); margin-bottom: 1rem; font-size: 0.9rem; }
|
||||
.breadcrumb a { color: var(--color-text-muted); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main class="container" style="max-width: 720px; margin: 2rem auto;">
|
||||
<p class="breadcrumb"><a href="/">home</a> / <a href="index.html">releases</a> / zddc-server beta channel</p>
|
||||
<h1>zddc-server — beta channel</h1>
|
||||
<p>Cross-compiled binaries. Download for your platform, mark executable, and run with <code>ZDDC_ROOT=/path/to/archive ./zddc-server</code>.</p>
|
||||
<table class="dl-table">
|
||||
<thead><tr><th>Platform</th><th>Download</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Linux (x86_64)</td><td><a href="zddc-server_beta_linux-amd64">zddc-server_beta_linux-amd64</a></td></tr>
|
||||
<tr><td>macOS (Intel)</td><td><a href="zddc-server_beta_darwin-amd64">zddc-server_beta_darwin-amd64</a></td></tr>
|
||||
<tr><td>macOS (Apple Silicon)</td><td><a href="zddc-server_beta_darwin-arm64">zddc-server_beta_darwin-arm64</a></td></tr>
|
||||
<tr><td>Windows (x86_64)</td><td><a href="zddc-server_beta_windows-amd64.exe">zddc-server_beta_windows-amd64.exe</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="font-size: 0.9rem; color: var(--color-text-muted);">Need a different platform? Build from source: <code>(cd zddc && go build -o zddc-server ./cmd/zddc-server)</code> from the repo at the matching tag.</p>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-arm64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_linux-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_windows-amd64.exe
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>zddc-server stable channel — ZDDC</title>
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
<style>
|
||||
.dl-table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
|
||||
.dl-table th, .dl-table td { text-align: left; padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--color-border); }
|
||||
.dl-table a { color: var(--color-primary); text-decoration: none; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9rem; }
|
||||
.dl-table a:hover { text-decoration: underline; }
|
||||
.breadcrumb { color: var(--color-text-muted); margin-bottom: 1rem; font-size: 0.9rem; }
|
||||
.breadcrumb a { color: var(--color-text-muted); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main class="container" style="max-width: 720px; margin: 2rem auto;">
|
||||
<p class="breadcrumb"><a href="/">home</a> / <a href="index.html">releases</a> / zddc-server stable channel</p>
|
||||
<h1>zddc-server — stable channel</h1>
|
||||
<p>Cross-compiled binaries. Download for your platform, mark executable, and run with <code>ZDDC_ROOT=/path/to/archive ./zddc-server</code>.</p>
|
||||
<table class="dl-table">
|
||||
<thead><tr><th>Platform</th><th>Download</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Linux (x86_64)</td><td><a href="zddc-server_stable_linux-amd64">zddc-server_stable_linux-amd64</a></td></tr>
|
||||
<tr><td>macOS (Intel)</td><td><a href="zddc-server_stable_darwin-amd64">zddc-server_stable_darwin-amd64</a></td></tr>
|
||||
<tr><td>macOS (Apple Silicon)</td><td><a href="zddc-server_stable_darwin-arm64">zddc-server_stable_darwin-arm64</a></td></tr>
|
||||
<tr><td>Windows (x86_64)</td><td><a href="zddc-server_stable_windows-amd64.exe">zddc-server_stable_windows-amd64.exe</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="font-size: 0.9rem; color: var(--color-text-muted);">Need a different platform? Build from source: <code>(cd zddc && go build -o zddc-server ./cmd/zddc-server)</code> from the repo at the matching tag.</p>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-arm64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_linux-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_windows-amd64.exe
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>zddc-server v0.0.8 — ZDDC</title>
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
<style>
|
||||
.dl-table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
|
||||
.dl-table th, .dl-table td { text-align: left; padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--color-border); }
|
||||
.dl-table a { color: var(--color-primary); text-decoration: none; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9rem; }
|
||||
.dl-table a:hover { text-decoration: underline; }
|
||||
.breadcrumb { color: var(--color-text-muted); margin-bottom: 1rem; font-size: 0.9rem; }
|
||||
.breadcrumb a { color: var(--color-text-muted); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main class="container" style="max-width: 720px; margin: 2rem auto;">
|
||||
<p class="breadcrumb"><a href="/">home</a> / <a href="index.html">releases</a> / zddc-server v0.0.8</p>
|
||||
<h1>zddc-server — v0.0.8</h1>
|
||||
<p>Cross-compiled binaries. Download for your platform, mark executable, and run with <code>ZDDC_ROOT=/path/to/archive ./zddc-server</code>.</p>
|
||||
<table class="dl-table">
|
||||
<thead><tr><th>Platform</th><th>Download</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Linux (x86_64)</td><td><a href="zddc-server_v0.0.8_linux-amd64">zddc-server_v0.0.8_linux-amd64</a></td></tr>
|
||||
<tr><td>macOS (Intel)</td><td><a href="zddc-server_v0.0.8_darwin-amd64">zddc-server_v0.0.8_darwin-amd64</a></td></tr>
|
||||
<tr><td>macOS (Apple Silicon)</td><td><a href="zddc-server_v0.0.8_darwin-arm64">zddc-server_v0.0.8_darwin-arm64</a></td></tr>
|
||||
<tr><td>Windows (x86_64)</td><td><a href="zddc-server_v0.0.8_windows-amd64.exe">zddc-server_v0.0.8_windows-amd64.exe</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="font-size: 0.9rem; color: var(--color-text-muted);">Need a different platform? Build from source: <code>(cd zddc && go build -o zddc-server ./cmd/zddc-server)</code> from the repo at the matching tag.</p>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,34 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>zddc-server v0.0 — ZDDC</title>
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
<style>
|
||||
.dl-table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
|
||||
.dl-table th, .dl-table td { text-align: left; padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--color-border); }
|
||||
.dl-table a { color: var(--color-primary); text-decoration: none; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9rem; }
|
||||
.dl-table a:hover { text-decoration: underline; }
|
||||
.breadcrumb { color: var(--color-text-muted); margin-bottom: 1rem; font-size: 0.9rem; }
|
||||
.breadcrumb a { color: var(--color-text-muted); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main class="container" style="max-width: 720px; margin: 2rem auto;">
|
||||
<p class="breadcrumb"><a href="/">home</a> / <a href="index.html">releases</a> / zddc-server v0.0</p>
|
||||
<h1>zddc-server — v0.0</h1>
|
||||
<p>Cross-compiled binaries. Download for your platform, mark executable, and run with <code>ZDDC_ROOT=/path/to/archive ./zddc-server</code>.</p>
|
||||
<table class="dl-table">
|
||||
<thead><tr><th>Platform</th><th>Download</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Linux (x86_64)</td><td><a href="zddc-server_v0.0_linux-amd64">zddc-server_v0.0_linux-amd64</a></td></tr>
|
||||
<tr><td>macOS (Intel)</td><td><a href="zddc-server_v0.0_darwin-amd64">zddc-server_v0.0_darwin-amd64</a></td></tr>
|
||||
<tr><td>macOS (Apple Silicon)</td><td><a href="zddc-server_v0.0_darwin-arm64">zddc-server_v0.0_darwin-arm64</a></td></tr>
|
||||
<tr><td>Windows (x86_64)</td><td><a href="zddc-server_v0.0_windows-amd64.exe">zddc-server_v0.0_windows-amd64.exe</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="font-size: 0.9rem; color: var(--color-text-muted);">Need a different platform? Build from source: <code>(cd zddc && go build -o zddc-server ./cmd/zddc-server)</code> from the repo at the matching tag.</p>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-arm64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_linux-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_windows-amd64.exe
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>zddc-server v0 — ZDDC</title>
|
||||
<link rel="stylesheet" href="../css/style.css">
|
||||
<style>
|
||||
.dl-table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
|
||||
.dl-table th, .dl-table td { text-align: left; padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--color-border); }
|
||||
.dl-table a { color: var(--color-primary); text-decoration: none; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9rem; }
|
||||
.dl-table a:hover { text-decoration: underline; }
|
||||
.breadcrumb { color: var(--color-text-muted); margin-bottom: 1rem; font-size: 0.9rem; }
|
||||
.breadcrumb a { color: var(--color-text-muted); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<main class="container" style="max-width: 720px; margin: 2rem auto;">
|
||||
<p class="breadcrumb"><a href="/">home</a> / <a href="index.html">releases</a> / zddc-server v0</p>
|
||||
<h1>zddc-server — v0</h1>
|
||||
<p>Cross-compiled binaries. Download for your platform, mark executable, and run with <code>ZDDC_ROOT=/path/to/archive ./zddc-server</code>.</p>
|
||||
<table class="dl-table">
|
||||
<thead><tr><th>Platform</th><th>Download</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>Linux (x86_64)</td><td><a href="zddc-server_v0_linux-amd64">zddc-server_v0_linux-amd64</a></td></tr>
|
||||
<tr><td>macOS (Intel)</td><td><a href="zddc-server_v0_darwin-amd64">zddc-server_v0_darwin-amd64</a></td></tr>
|
||||
<tr><td>macOS (Apple Silicon)</td><td><a href="zddc-server_v0_darwin-arm64">zddc-server_v0_darwin-arm64</a></td></tr>
|
||||
<tr><td>Windows (x86_64)</td><td><a href="zddc-server_v0_windows-amd64.exe">zddc-server_v0_windows-amd64.exe</a></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="font-size: 0.9rem; color: var(--color-text-muted);">Need a different platform? Build from source: <code>(cd zddc && go build -o zddc-server ./cmd/zddc-server)</code> from the repo at the matching tag.</p>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_darwin-arm64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_linux-amd64
|
||||
|
|
@ -1 +0,0 @@
|
|||
zddc-server_v0.0.8_windows-amd64.exe
|
||||
|
|
@ -2113,7 +2113,7 @@ td[data-field="trackingNumber"] {
|
|||
</svg>
|
||||
<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.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty</span></span>
|
||||
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.9-alpha · 2026-05-02 12:47:59 · d688e20-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>
|
||||
|
|
|
|||
|
|
@ -1376,7 +1376,7 @@ body.help-open .app-header {
|
|||
</svg>
|
||||
<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.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty</span></span>
|
||||
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.9-alpha · 2026-05-02 12:47:59 · d688e20-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>
|
||||
|
|
|
|||
|
|
@ -866,7 +866,7 @@ body {
|
|||
</g>
|
||||
</svg>
|
||||
<span class="app-header__title">ZDDC Archive</span>
|
||||
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty</span></span>
|
||||
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.9-alpha · 2026-05-02 12:47:59 · d688e20-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>
|
||||
|
|
|
|||
|
|
@ -1774,7 +1774,7 @@ body.help-open .app-header {
|
|||
</svg>
|
||||
<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.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty</span></span>
|
||||
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.9-alpha · 2026-05-02 12:47:59 · d688e20-dirty</span></span>
|
||||
</div>
|
||||
<button id="select-directory" class="btn btn-primary" title="Select a Directory">Select Directory</button>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2210,7 +2210,7 @@ dialog.modal--narrow {
|
|||
</svg>
|
||||
<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.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty</span></span>
|
||||
<span class="build-timestamp"><span style="color:red;font-weight:bold">v0.0.9-alpha · 2026-05-02 12:47:58 · d688e20-dirty</span></span>
|
||||
</div>
|
||||
<div class="app-header__spacer"></div>
|
||||
<div class="app-header__icons">
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Generated by build.sh — do not edit. One <app>=<build label> per line.
|
||||
archive=v0.0.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty
|
||||
transmittal=v0.0.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty
|
||||
classifier=v0.0.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty
|
||||
mdedit=v0.0.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty
|
||||
landing=v0.0.9-alpha · 2026-05-02 02:15:56 · 8c2e65e-dirty
|
||||
archive=v0.0.9-alpha · 2026-05-02 12:47:59 · d688e20-dirty
|
||||
transmittal=v0.0.9-alpha · 2026-05-02 12:47:58 · d688e20-dirty
|
||||
classifier=v0.0.9-alpha · 2026-05-02 12:47:59 · d688e20-dirty
|
||||
mdedit=v0.0.9-alpha · 2026-05-02 12:47:59 · d688e20-dirty
|
||||
landing=v0.0.9-alpha · 2026-05-02 12:47:59 · d688e20-dirty
|
||||
|
|
|
|||
Loading…
Reference in a new issue