diff --git a/AGENTS.md b/AGENTS.md index 65ecf00..e4169f1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -61,10 +61,11 @@ website/ _stable.html -> ... symlink to current stable (highest semver) _alpha.html mutable; overwritten by --release alpha _beta.html mutable; overwritten by --release beta - install.zip drop-in self-contained install (5 stable HTMLs + _template/ stubs) - track-stable.zip level-2 stubs that track the current-stable channel - track-alpha.zip level-2 stubs that track the alpha channel - track-beta.zip level-2 stubs that track the beta channel + bootstrap/ + level1/.html same-origin level-1 stubs (4 tools, no landing) + track-stable/.html level-2 stubs that track the current-stable channel + track-alpha/.html level-2 stubs that track the alpha channel + track-beta/.html level-2 stubs that track the beta channel bootstrap/ level1.html.tmpl per-project bootstrap template (relative ../.html) @@ -209,12 +210,14 @@ The on-page label of the freshened build is ` · · .html` — 4 same-origin level-1 stubs (archive, transmittal, classifier, mdedit; landing has no level-1 stub since it only lives at deployment root). +- `bootstrap/track-{alpha,beta,stable}/.html` — 5 level-2 stubs per channel, hardcoded to fetch the named channel from `zddc.varasys.io/releases/`. + +End users install via copy-paste shell snippets on the home page's "Install on your server" section — each snippet `curl`s the relevant stubs (or stable HTMLs, for the self-contained option) into the operator's deployment directory. See `bootstrap/README.md` for the install / pin / audit story. @@ -308,4 +311,4 @@ path that fails loudly and visibly on the developer's terminal. - Every folder exposes a `.archive` virtual directory backed by the same global index — the depth in the URL only matters so HTML produced for offline use can reach `.archive/` via `../.archive/` relative links and have the browser resolve them before the request hits the server. The flat listing emits two redirect entries per tracking number: `.html` (highest base rev) and `_.html` (each specific base rev). Both redirect to the first chronologically received copy of the named revision. Modifier files (`_+C1.html` etc.) remain reachable via the resolver but are not surfaced in the listing — they're return traffic, not primary documents. ACL is the only filter: the listing endpoint is gated by the contextPath's `.zddc` chain, and each entry is then filtered against the ACL of its resolved file's directory; per-target denials return 404 rather than 403 to avoid leaking that the tracking number exists in another subtree - ACL is enforced via cascading `.zddc` YAML files; authentication is delegated to the upstream proxy via the `X-Auth-Request-Email` header (configurable with `ZDDC_EMAIL_HEADER`) - `.zddc` schema also supports a top-level `admins:` glob list, peer to `acl.allow`/`acl.deny`. Honored **only** at the root `.zddc` (subdir `admins` entries are ignored to prevent privilege escalation via subtree write access). Drives the built-in debug dashboard at `/.admin/` (sub-routes: `/whoami`, `/config`, `/logs`); non-admin requests get 404 so the page is invisible. See `zddc/README.md` § "Admin Debug Page". -- **Reserved entry prefixes** under `ZDDC_ROOT`: `.`-prefixed entries are excluded from listings AND 404 on direct fetch (only `.archive` and `.admin` are exempt) — for invisible side-state like dev-shell home dirs. `_`-prefixed entries are excluded from listings only — for operator scaffolding like install.zip's `_template/` that's still reachable by direct URL. Drop side-state under `_` if it should be linkable; under `.` if it should be unreachable. +- **Reserved entry prefixes** under `ZDDC_ROOT`: `.`-prefixed entries are excluded from listings AND 404 on direct fetch (only `.archive` and `.admin` are exempt) — for invisible side-state like dev-shell home dirs. `_`-prefixed entries are excluded from listings only — for operator scaffolding like the `_template/` directory created by the self-contained install snippet, still reachable by direct URL. Drop side-state under `_` if it should be linkable; under `.` if it should be unreachable. diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 6366d44..89c4ebe 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -43,8 +43,9 @@ website/ _stable.html -> ... # symlink to the highest-versioned stable _alpha.html # mutable: overwritten on every --release alpha _beta.html # mutable: overwritten on every --release beta - install.zip # current-stable HTMLs + project bootstrap stubs - track-{alpha,beta,stable}.zip # level-2 channel-tracking stubs + bootstrap/ + level1/.html # same-origin stubs for project subdirectories + track-{alpha,beta,stable}/ # per-channel level-2 stubs (5 tools each) ``` 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. @@ -59,16 +60,16 @@ Each topic has exactly one authoritative home; everything else links to it. | Topic | Single home | Linked from | |---|---|---| -| What ZDDC is + tool channel links + dual-mode (local/server) overview + install bundles | `website/index.html` (hand-edited intro for `zddc.varasys.io/`) | repo `README.md`, `bootstrap/README.md` | +| 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`, `bootstrap/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 | -| Customer-deployment install (install.zip, level-1/2 stubs, `?v=`, audit) | `bootstrap/README.md` | website intro, `zddc/README.md` | +| Customer-deployment install (copy-paste shell snippets, level-1/2 stubs, `?v=`, audit) | `bootstrap/README.md` | website intro, `zddc/README.md` | | zddc-server operations: env vars, ACL syntax, `.archive` URLs, container vs binary | `zddc/README.md` | `AGENTS.md`, `bootstrap/README.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 | `/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 landing tool ships only via `website/releases/landing_v.html` and `install.zip` — `install.zip` copies `landing_stable.html` to `/index.html` for customer sites where the project picker UI is actually useful (it queries `zddc-server` for the project list). The public website at `zddc.varasys.io/` has nothing to pick, so its root URL is the introduction page. +`website/index.html` is **hand-edited static content** (analogous to `reference.html`), not the landing-tool output. The landing tool ships only via `website/releases/landing_v.html` — the self-contained install snippet copies `landing_stable.html` to `/index.html` for customer sites where the project picker UI is actually useful (it queries `zddc-server` for the project list). The public website at `zddc.varasys.io/` has nothing to pick, so its root URL is the introduction page. 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. @@ -86,7 +87,7 @@ Each tool's `build.sh`: 4. Writes the result to `dist/tool.html` 5. If `--release ` was passed, calls `promote_release` to write the appropriate file under `website/releases/` -The top-level `build.sh` at the repository root calls all five tool build scripts in sequence and then regenerates the bootstrap zips (`install.zip`, `track-{alpha,beta,stable}.zip`) so they always match what's in `releases/`. +The top-level `build.sh` at the repository root calls all five tool build scripts in sequence and then regenerates `website/bootstrap/` (level-1 stubs and per-channel level-2 stubs) so they always match what's in `releases/`. ### Channels @@ -116,7 +117,7 @@ Customer deployments under `zddc-server` use a two-level bootstrap pattern that `document.write()` chains across both levels; origin stays at the deployment domain throughout. CORS only matters at level 2 (cross-origin to `zddc.varasys.io`); level 1 is same-origin. -The stubs are generated from `bootstrap/level{1,2}.html.tmpl` by the root `build.sh` and packaged into `install.zip` and `track-.zip`. +The stubs are generated from `bootstrap/level{1,2}.html.tmpl` by the root `build.sh` and published as standalone files under `website/bootstrap/level1/` and `website/bootstrap/track-/`. The home page's "Install on your server" section prints copy-paste shell snippets that `curl` these into the operator's deployment directory. ### Build Script Requirements diff --git a/CLAUDE.md b/CLAUDE.md index ba9f1d9..2c5764a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,7 +18,7 @@ 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, podman/podman-compose; Go 1.24+). Serves `ZDDC_ROOT/index.html` at `GET /` as the landing page; `Accept: application/json` on `/` returns the ACL-filtered project list. - `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`) -- `website/` — published artifacts: `index.html` (root URL), `releases/_v.html` (immutable stable archives), `releases/_stable.html` (symlink to current stable), `releases/_{alpha,beta}.html` (mutable channel files), plus bootstrap zips (`install.zip`, `track-{alpha,beta,stable}.zip`). `--release` is the only path to publishing — there is no `website/dev/`. +- `website/` — published artifacts: `index.html` (root URL), `releases/_v.html` (immutable stable archives), `releases/_stable.html` (symlink to current stable), `releases/_{alpha,beta}.html` (mutable channel files), and `bootstrap/{level1,track-stable,track-beta,track-alpha}/.html` (per-channel level-2 stubs + same-origin level-1 stubs that the home-page install snippets curl into the operator's deployment dir). `--release` is the only path to publishing `releases/`; `bootstrap/` is regenerated by every plain `sh build.sh`. There is no `website/dev/`. - `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) ## Most-used commands diff --git a/README.md b/README.md index 3a58f0b..1fce5c8 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ZDDC is an information management convention plus a small set of single-file HTM The name "Zero Day Document Control" comes from the convention itself — adopt it on day zero of a project, with no setup time. The tools are *optional* interfaces around the structure; the structure works without them. -> **For end users**: introduces the project, links to all tool channels (stable / beta / alpha), and offers `install.zip` for self-hosted deployments. +> **For end users**: introduces the project, links to all tool channels (stable / beta / alpha), and prints copy-paste shell snippets to install on a self-hosted deployment. ## Tools diff --git a/bootstrap/README.md b/bootstrap/README.md index 2a91813..de6a3ea 100644 --- a/bootstrap/README.md +++ b/bootstrap/README.md @@ -4,6 +4,20 @@ ZDDC tools (archive, transmittal, classifier, mdedit, landing) are single-file HTML bundles. The bootstrap pattern lets you install once on a deployment and update by editing a few lines, without re-uploading multi-megabyte HTML files. +End users install via a short copy-paste shell snippet from the home page's +"Install on your server" section. The snippet uses `curl` to fetch either +the current stable HTMLs (self-contained) or tiny level-2 stubs (channel +trackers) into the deployment directory. The published stubs live under +`https://zddc.varasys.io/bootstrap/`: + +- `bootstrap/level1/.html` — same-origin level-1 stubs (4 tools, no + landing — landing only lives at deployment root). +- `bootstrap/track-{stable,beta,alpha}/.html` — per-channel level-2 + stubs (5 tools each). + +Both directories are produced by the project's top-level `build.sh` from +`bootstrap/level{1,2}.html.tmpl`. + ## The two-level model A typical `zddc-server` deployment looks like this: @@ -35,11 +49,11 @@ A typical `zddc-server` deployment looks like this: - a level-2 bootstrap — fetches a specific channel or pinned version from `https://zddc.varasys.io/releases/_.html`. -The site administrator switches the whole site to a channel by replacing -the file at `/.html` with the matching level-2 stub from -`track-.zip`. A single project can override one tool by editing -just `/.html` (replace the relative `upstream` URL with an -absolute zddc.varasys.io URL). +The site administrator switches the whole site to a channel by re-running +the `track-` install snippet from the home page — that overwrites +the root `.html` files with the matching level-2 stubs. A single +project can override one tool by editing just `/.html` +(replace the relative `upstream` URL with an absolute zddc.varasys.io URL). ## Why two levels @@ -121,5 +135,6 @@ Level-1 fetches are same-origin so no CORS is involved. `level1.html.tmpl` and `level2.html.tmpl` are the source of truth. The project's top-level `build.sh` substitutes `{{TOOL}}`, `{{TOOL_TITLE}}`, -and `{{CHANNEL}}` to produce the per-tool stubs that ship in -`install.zip` and `track-.zip`. +`{{CHANNEL}}`, and `{{FAVICON}}` to produce the per-tool stubs published +under `website/bootstrap/level1/` and `website/bootstrap/track-/`, +which the install snippets curl from `https://zddc.varasys.io/bootstrap/`. diff --git a/build.sh b/build.sh index 182e64a..23c4365 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ set -eu # Top-level build script — builds all ZDDC HTML tools, the zddc-server -# binaries, and the downloadable bundles (install.zip and track-*.zip). +# binaries, and the bootstrap stubs published under website/bootstrap/. SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) @@ -42,19 +42,18 @@ else echo " release path builds its own copy via Containerfile.)" fi -# ─── Bootstrap zips ────────────────────────────────────────────────────────── -# Generated from bootstrap/level{1,2}.html.tmpl on every build so they are -# always in sync with the current bootstrap pattern. +# ─── Bootstrap stubs ───────────────────────────────────────────────────────── +# Generated from bootstrap/level{1,2}.html.tmpl on every build and published +# as standalone files under website/bootstrap/. The website's "Install on +# your server" section prints copy-pasteable shell snippets that curl these +# files into the operator's deployment directory. # -# install.zip — drop into deployment root for self-contained install. -# Contains the 5 current-stable HTMLs at root plus a -# _template/ directory with 4 level-1 stubs that -# projects can use as their starting layout. -# track-.zip — drop the level-2 stubs over deployment root to make -# the whole site track from zddc.varasys.io. -# -# install.zip needs at least one stable release to exist under -# website/releases/; if none exist yet, that zip is skipped with a warning. +# bootstrap/level1/.html — same-origin stubs for +# /.html (4 tools; +# landing only lives at root) +# bootstrap/track-/.html — level-2 stubs that fetch the +# named channel from upstream +# (5 tools × 3 channels = 15) WEBSITE_DIR="$SCRIPT_DIR/website" RELEASES_DIR="$WEBSITE_DIR/releases" @@ -84,61 +83,37 @@ render_stub() { "$1" > "$5" } -build_install_zip() { - # Verify a stable release exists for every tool before staging. - _missing="" - while IFS='|' read -r _tool _file _title; do - [ -e "$RELEASES_DIR/${_tool}_stable.html" ] || _missing="$_missing $_tool" - done </.html fetches ../.html. + # Landing has no level-1 stub — landing only lives at deployment root. while IFS='|' read -r _tool _file _title; do - cp "$RELEASES_DIR/${_tool}_stable.html" "$_staging/$_file" - done <.html — same-origin stubs for project subdirs" +echo " track-{alpha,beta,stable}/ — level-2 stubs for each channel" +echo "" +echo "The home page's 'Install on your server' section prints copy-pasteable" +echo "shell snippets that curl these files into the operator's deployment dir." diff --git a/landing/build.sh b/landing/build.sh index 51e6f76..2e2f9e0 100755 --- a/landing/build.sh +++ b/landing/build.sh @@ -72,10 +72,11 @@ if [ "$is_release" = "1" ]; then promote_release "landing" # NOTE: website/index.html is a hand-edited intro page for # zddc.varasys.io, not the landing tool. The landing tool ships - # only via website/releases/ and install.zip — install.zip puts - # landing_stable.html at the customer deployment root, where the - # project picker UI is useful (it queries zddc-server for the - # project list). See AGENTS.md "Releasing — channels and layout". + # only via website/releases/ — the self-contained install snippet + # on the home page copies landing_stable.html to / + # index.html, where the project picker UI is useful (it queries + # zddc-server for the project list). See AGENTS.md "Releasing — + # channels and layout". else update_alpha "landing" fi diff --git a/website/bootstrap/level1/archive.html b/website/bootstrap/level1/archive.html new file mode 100644 index 0000000..5c24397 --- /dev/null +++ b/website/bootstrap/level1/archive.html @@ -0,0 +1,74 @@ + + + + + + Loading Archive… + + + + + Loading… + + + diff --git a/website/bootstrap/level1/classifier.html b/website/bootstrap/level1/classifier.html new file mode 100644 index 0000000..807ffb2 --- /dev/null +++ b/website/bootstrap/level1/classifier.html @@ -0,0 +1,74 @@ + + + + + + Loading Classifier… + + + + + Loading… + + + diff --git a/website/bootstrap/level1/mdedit.html b/website/bootstrap/level1/mdedit.html new file mode 100644 index 0000000..22716f6 --- /dev/null +++ b/website/bootstrap/level1/mdedit.html @@ -0,0 +1,74 @@ + + + + + + Loading Markdown Editor… + + + + + Loading… + + + diff --git a/website/bootstrap/level1/transmittal.html b/website/bootstrap/level1/transmittal.html new file mode 100644 index 0000000..751827f --- /dev/null +++ b/website/bootstrap/level1/transmittal.html @@ -0,0 +1,74 @@ + + + + + + Loading Transmittal… + + + + + Loading… + + + diff --git a/website/bootstrap/track-alpha/archive.html b/website/bootstrap/track-alpha/archive.html new file mode 100644 index 0000000..03efc3f --- /dev/null +++ b/website/bootstrap/track-alpha/archive.html @@ -0,0 +1,51 @@ + + + + + + Loading Archive… + + + + + Loading… + + + diff --git a/website/bootstrap/track-alpha/classifier.html b/website/bootstrap/track-alpha/classifier.html new file mode 100644 index 0000000..464f8f2 --- /dev/null +++ b/website/bootstrap/track-alpha/classifier.html @@ -0,0 +1,51 @@ + + + + + + Loading Classifier… + + + + + Loading… + + + diff --git a/website/bootstrap/track-alpha/index.html b/website/bootstrap/track-alpha/index.html new file mode 100644 index 0000000..b3f43d8 --- /dev/null +++ b/website/bootstrap/track-alpha/index.html @@ -0,0 +1,51 @@ + + + + + + Loading ZDDC… + + + + + Loading… + + + diff --git a/website/bootstrap/track-alpha/mdedit.html b/website/bootstrap/track-alpha/mdedit.html new file mode 100644 index 0000000..0582c4d --- /dev/null +++ b/website/bootstrap/track-alpha/mdedit.html @@ -0,0 +1,51 @@ + + + + + + Loading Markdown Editor… + + + + + Loading… + + + diff --git a/website/bootstrap/track-alpha/transmittal.html b/website/bootstrap/track-alpha/transmittal.html new file mode 100644 index 0000000..288841a --- /dev/null +++ b/website/bootstrap/track-alpha/transmittal.html @@ -0,0 +1,51 @@ + + + + + + Loading Transmittal… + + + + + Loading… + + + diff --git a/website/bootstrap/track-beta/archive.html b/website/bootstrap/track-beta/archive.html new file mode 100644 index 0000000..f2554f4 --- /dev/null +++ b/website/bootstrap/track-beta/archive.html @@ -0,0 +1,51 @@ + + + + + + Loading Archive… + + + + + Loading… + + + diff --git a/website/bootstrap/track-beta/classifier.html b/website/bootstrap/track-beta/classifier.html new file mode 100644 index 0000000..8a9f76b --- /dev/null +++ b/website/bootstrap/track-beta/classifier.html @@ -0,0 +1,51 @@ + + + + + + Loading Classifier… + + + + + Loading… + + + diff --git a/website/bootstrap/track-beta/index.html b/website/bootstrap/track-beta/index.html new file mode 100644 index 0000000..499461e --- /dev/null +++ b/website/bootstrap/track-beta/index.html @@ -0,0 +1,51 @@ + + + + + + Loading ZDDC… + + + + + Loading… + + + diff --git a/website/bootstrap/track-beta/mdedit.html b/website/bootstrap/track-beta/mdedit.html new file mode 100644 index 0000000..056a6d7 --- /dev/null +++ b/website/bootstrap/track-beta/mdedit.html @@ -0,0 +1,51 @@ + + + + + + Loading Markdown Editor… + + + + + Loading… + + + diff --git a/website/bootstrap/track-beta/transmittal.html b/website/bootstrap/track-beta/transmittal.html new file mode 100644 index 0000000..4afa7b7 --- /dev/null +++ b/website/bootstrap/track-beta/transmittal.html @@ -0,0 +1,51 @@ + + + + + + Loading Transmittal… + + + + + Loading… + + + diff --git a/website/bootstrap/track-stable/archive.html b/website/bootstrap/track-stable/archive.html new file mode 100644 index 0000000..8266253 --- /dev/null +++ b/website/bootstrap/track-stable/archive.html @@ -0,0 +1,51 @@ + + + + + + Loading Archive… + + + + + Loading… + + + diff --git a/website/bootstrap/track-stable/classifier.html b/website/bootstrap/track-stable/classifier.html new file mode 100644 index 0000000..ef507d1 --- /dev/null +++ b/website/bootstrap/track-stable/classifier.html @@ -0,0 +1,51 @@ + + + + + + Loading Classifier… + + + + + Loading… + + + diff --git a/website/bootstrap/track-stable/index.html b/website/bootstrap/track-stable/index.html new file mode 100644 index 0000000..0e5393b --- /dev/null +++ b/website/bootstrap/track-stable/index.html @@ -0,0 +1,51 @@ + + + + + + Loading ZDDC… + + + + + Loading… + + + diff --git a/website/bootstrap/track-stable/mdedit.html b/website/bootstrap/track-stable/mdedit.html new file mode 100644 index 0000000..0621b83 --- /dev/null +++ b/website/bootstrap/track-stable/mdedit.html @@ -0,0 +1,51 @@ + + + + + + Loading Markdown Editor… + + + + + Loading… + + + diff --git a/website/bootstrap/track-stable/transmittal.html b/website/bootstrap/track-stable/transmittal.html new file mode 100644 index 0000000..b21daa9 --- /dev/null +++ b/website/bootstrap/track-stable/transmittal.html @@ -0,0 +1,51 @@ + + + + + + Loading Transmittal… + + + + + Loading… + + + diff --git a/website/index.html b/website/index.html index 7c315b6..43be5a1 100644 --- a/website/index.html +++ b/website/index.html @@ -21,9 +21,11 @@ .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); } - @media (min-width: 720px) { .install-grid { grid-template-columns: repeat(2, 1fr); } } .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; } + .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; } .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; } @@ -181,32 +183,53 @@

Install on your server

-

For a self-contained deployment with no dependency on this site at runtime, download install.zip and extract it into the document root of your file server. To make a deployment auto-track a published channel from this site, use one of the track-*.zip bundles instead — each contains five tiny bootstrap stubs that fetch the named channel on every page load.

+

Each option below is a short shell snippet. cd into your deployment directory, copy-paste one of the four blocks into your terminal, and the files land in CWD. All four use curl; nothing else to install.

-

Self-contained

-

Bundled stable tools + sample project bootstrap directory. No external dependencies after install.

-

install.zip →

+

Self-contained install

+

Use when: you want a deployment that does not depend on zddc.varasys.io after install. Downloads the five current-stable tool HTMLs (~1.8 MB total) plus a _template/ directory with level-1 stubs to copy into project subdirectories. Re-run to update.

+
set -eu
+B=https://zddc.varasys.io
+for t in archive transmittal classifier mdedit; do
+  curl -fsSL "$B/releases/${t}_stable.html" -o "${t}.html"
+done
+curl -fsSL "$B/releases/landing_stable.html" -o index.html
+mkdir -p _template
+for t in archive transmittal classifier mdedit; do
+  curl -fsSL "$B/bootstrap/level1/${t}.html" -o "_template/${t}.html"
+done
-

Track stable

-

Five level-2 bootstrap stubs. Drop over the deployment root to auto-track latest stable.

-

track-stable.zip →

+

Track stable channel

+

Use when: you want auto-updates whenever stable advances. Installs five tiny stubs (~10 KB total) that fetch zddc.varasys.io on every page load — visitors need network access. Switch channels later by re-running with track-beta or track-alpha.

+
set -eu
+B=https://zddc.varasys.io/bootstrap/track-stable
+for f in archive transmittal classifier mdedit index; do
+  curl -fsSL "$B/${f}.html" -o "${f}.html"
+done
-

Track beta

-

Five level-2 bootstrap stubs that fetch the beta channel.

-

track-beta.zip →

+

Track beta channel

+

Use when: you want to soak the next release before it goes stable. Same shape as the stable tracker, fetching the beta channel. Beta is overwritten in place; expect occasional updates.

+
set -eu
+B=https://zddc.varasys.io/bootstrap/track-beta
+for f in archive transmittal classifier mdedit index; do
+  curl -fsSL "$B/${f}.html" -o "${f}.html"
+done
-

Track alpha

-

Five level-2 bootstrap stubs that fetch the alpha channel.

-

track-alpha.zip →

+

Track alpha channel

+

Use when: you want bleeding-edge work. Alpha is rebuilt without notice, sometimes daily, and may break — fine for a personal sandbox or to verify a fix you're tracking, not for shared deployments.

+
set -eu
+B=https://zddc.varasys.io/bootstrap/track-alpha
+for f in archive transmittal classifier mdedit index; do
+  curl -fsSL "$B/${f}.html" -o "${f}.html"
+done
-

See bootstrap/README.md for the install model, the per-project / per-tool override pattern, and the audit grep that lets you see what every project on a deployment is pointing at.

+

See bootstrap/README.md for the level-1 / level-2 model, the per-project / per-tool override pattern, and the audit grep that lets you see what every project on a deployment is pointing at.

diff --git a/website/install.zip b/website/install.zip deleted file mode 100644 index ae3c2c4..0000000 Binary files a/website/install.zip and /dev/null differ diff --git a/website/releases/archive_alpha.html b/website/releases/archive_alpha.html index 4f4a2b1..d735a04 100644 --- a/website/releases/archive_alpha.html +++ b/website/releases/archive_alpha.html @@ -2095,7 +2095,7 @@ td[data-field="trackingNumber"] {
ZDDC Archive - alpha · 2026-04-29 · c95f079 + alpha · 2026-04-29 18:29:14 · 4d6e497-dirty
diff --git a/website/releases/classifier_alpha.html b/website/releases/classifier_alpha.html index e019293..53188e1 100644 --- a/website/releases/classifier_alpha.html +++ b/website/releases/classifier_alpha.html @@ -1358,7 +1358,7 @@ body.help-open .app-header {
ZDDC Classifier - alpha · 2026-04-29 · c95f079 + alpha · 2026-04-29 18:29:14 · 4d6e497-dirty
diff --git a/website/releases/index.html b/website/releases/index.html index f638e74..4f27636 100644 --- a/website/releases/index.html +++ b/website/releases/index.html @@ -57,9 +57,10 @@ alpha
Pin to version: + v0.0.2 v0.0.1
-
stable currently → archive_v0.0.1.html
+
stable currently → archive_v0.0.2.html

Transmittal

@@ -69,9 +70,10 @@ alpha
Pin to version: + v0.0.2 v0.0.1
-
stable currently → transmittal_v0.0.1.html
+
stable currently → transmittal_v0.0.2.html

Classifier

@@ -81,9 +83,10 @@ alpha
Pin to version: + v0.0.2 v0.0.1
-
stable currently → classifier_v0.0.1.html
+
stable currently → classifier_v0.0.2.html

Markdown Editor

@@ -93,9 +96,10 @@ alpha
Pin to version: + v0.0.2 v0.0.1
-
stable currently → mdedit_v0.0.1.html
+
stable currently → mdedit_v0.0.2.html

ZDDC

@@ -105,9 +109,10 @@ alpha
Pin to version: + v0.0.2 v0.0.1
-
stable currently → landing_v0.0.1.html
+
stable currently → landing_v0.0.2.html
diff --git a/website/releases/landing_alpha.html b/website/releases/landing_alpha.html index 3662d8e..4650ddf 100644 --- a/website/releases/landing_alpha.html +++ b/website/releases/landing_alpha.html @@ -884,7 +884,7 @@ body {
ZDDC Archive - alpha · 2026-04-29 · c95f079 + alpha · 2026-04-29 18:29:14 · 4d6e497-dirty
diff --git a/website/releases/mdedit_alpha.html b/website/releases/mdedit_alpha.html index 5c746cc..4bf06c5 100644 --- a/website/releases/mdedit_alpha.html +++ b/website/releases/mdedit_alpha.html @@ -1650,7 +1650,7 @@ body.help-open .app-header {
ZDDC Markdown - alpha · 2026-04-29 · c95f079 + alpha · 2026-04-29 18:29:14 · 4d6e497-dirty
diff --git a/website/releases/transmittal_alpha.html b/website/releases/transmittal_alpha.html index 2257a96..122972d 100644 --- a/website/releases/transmittal_alpha.html +++ b/website/releases/transmittal_alpha.html @@ -2192,7 +2192,7 @@ dialog.modal--narrow { JavaScript not available
ZDDC Transmittal - alpha · 2026-04-29 · c95f079 + alpha · 2026-04-29 18:29:14 · 4d6e497-dirty
diff --git a/website/track-alpha.zip b/website/track-alpha.zip deleted file mode 100644 index d5b4003..0000000 Binary files a/website/track-alpha.zip and /dev/null differ diff --git a/website/track-beta.zip b/website/track-beta.zip deleted file mode 100644 index 928fec0..0000000 Binary files a/website/track-beta.zip and /dev/null differ diff --git a/website/track-stable.zip b/website/track-stable.zip deleted file mode 100644 index 0b64e5e..0000000 Binary files a/website/track-stable.zip and /dev/null differ diff --git a/zddc/README.md b/zddc/README.md index 5687b7b..5335199 100644 --- a/zddc/README.md +++ b/zddc/README.md @@ -173,9 +173,10 @@ Two prefixes are filtered from listings under `ZDDC_ROOT`: side-state (caches, dev-shell home dirs, snapshot staging) on the same volume that's served, without exposing it. - **`_`-prefixed** (e.g. `/_template/`) — excluded from listings only. Direct URL - access still works, so install.zip's `_template/` directory of bootstrap stubs - is reachable but doesn't clutter the project picker. Use this for operator- - managed scaffolding the user shouldn't browse to but might link to. + access still works, so the `_template/` directory of bootstrap stubs created + by the install snippet is reachable but doesn't clutter the project picker. + Use this for operator-managed scaffolding the user shouldn't browse to but + might link to. ## Admin Debug Page @@ -229,17 +230,27 @@ callers. ## Landing Page and Tool Install -The recommended install drops `install.zip` (downloaded from -`https://zddc.varasys.io/install.zip`) into `ZDDC_ROOT/`: +The recommended install is a short shell snippet copy-pasted from the +"Install on your server" section of `https://zddc.varasys.io/`. There +are four snippets, all of which `cd`-and-curl into `ZDDC_ROOT/`: + +- **Self-contained** — fetches the five current-stable tool HTMLs and + populates a `_template/` directory of level-1 bootstrap stubs. No + runtime dependency on `zddc.varasys.io`. Re-run to update. +- **Track stable / beta / alpha** — fetches five tiny level-2 stubs + (~10 KB total) that fetch the named channel from `zddc.varasys.io` + on every page load. + +After running one of the snippets, the deployment looks like: ``` ZDDC_ROOT/ - index.html ← landing page (current stable) - archive.html ← archive browser + index.html ← landing page (current stable, or level-2 stub) + archive.html ← archive browser (likewise) transmittal.html classifier.html mdedit.html - _template/ ← template directory of level-1 bootstrap stubs; + _template/ ← level-1 bootstrap stubs (self-contained snippet only); rename a copy to / for each project Project-001/ archive.html ← level-1 stub: fetches ../archive.html @@ -250,16 +261,10 @@ ZDDC_ROOT/ … ``` -This is fully self-contained — no external dependencies. To make the -deployment auto-track a published channel from `zddc.varasys.io`, drop -`track-alpha.zip` / `track-beta.zip` / `track-stable.zip` (also at -`https://zddc.varasys.io/`) over `ZDDC_ROOT/`: those replace the root -`.html` files with level-2 bootstrap stubs that fetch the named -channel from `zddc.varasys.io` on each page load. See +The level-2 stubs require `zddc-server` to accept cross-origin requests +from `zddc.varasys.io`, controlled via `ZDDC_CORS_ORIGIN`. See [`bootstrap/README.md`](../bootstrap/README.md) for the full install -guide, the `?v=…` URL parameter for per-request version selection, and -the `ZDDC_CORS_ORIGIN` env var that lets `zddc-server` accept -cross-origin calls from the level-2 source. +guide and the `?v=…` URL parameter for per-request version selection. The landing page fetches `GET /` (with `Accept: application/json`) to retrieve the list of top-level project directories the requesting user has access to. It renders checkboxes @@ -352,9 +357,9 @@ returns JSON directory listings in exactly the same format as Caddy's `file-serv — no changes to `archive/js/source.js` are needed. To use: install `archive.html` at `ZDDC_ROOT/archive.html` (or any subdirectory) — either -the actual built tool from `install.zip`, or a level-1/level-2 bootstrap stub that fetches -it. Then open it via the zddc-server URL; the app will auto-connect and scan the directory -tree. +the actual built tool fetched by the self-contained install snippet, or a +level-1/level-2 bootstrap stub that fetches it. Then open it via the zddc-server URL; +the app will auto-connect and scan the directory tree. ## Container image