commit d9204a6e301d8ac1774fac6c51a53edfefa1d63d
parent 48d805caf7fdf93451b78d0bb28bc7091db779bf
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Mon, 28 Sep 2026 02:04:04 -0400
editor, common: `pnpm archilyzer`; the Docker build mode is not "a follow-up"
The root `archilyzer` script is the short form of `pnpm --filter
yt-dlp-transcript-common exec tsx bin/archilyzer.ts`. pnpm prints its `$ …`
line on stderr, so `pnpm -C "$PWD" archilyzer mcp` keeps stdout pure
JSON-RPC (checked with an initialize handshake). ENVIRONMENT.md's
regenerate line says `pnpm archilyzer docs env`.
Settings → Build pipeline said Docker "will run" isolated builds and that
"the container pipeline is a follow-up, so Docker currently falls back to a
basic build"; the option read "(follow-up)". The pipeline has shipped since
the editor's first Docker build mode: the copy and the option now say what
it does, as do `settingsSchema.ts`'s buildPipeline description (SETTINGS.md
regenerated) and its BuildMode comment. build.ts's R2-credentials refusal
and three comments name PUBLISH.md instead of the two docs it replaces.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
7 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/ENVIRONMENT.md b/ENVIRONMENT.md
@@ -4,7 +4,7 @@
Every environment variable the repo's code reads, by who it is for. The list is code (`common/lib/envVars.ts`), and a test fails when the code reads a variable the list does not declare, or the list declares one nothing reads. umtool's own knobs are documented in [umtool/docs](umtool/docs/README.md).
-Regenerate this file with `pnpm --filter yt-dlp-transcript-common exec tsx bin/archilyzer.ts docs env`. `archilyzer doctor` prints which of the paths overrides are set on this machine.
+Regenerate this file with `pnpm archilyzer docs env`. `pnpm archilyzer doctor` prints which of the paths overrides are set on this machine.
## Paths and binaries
diff --git a/SETTINGS.md b/SETTINGS.md
@@ -556,7 +556,7 @@ Default:
## `buildPipeline`
-How the static export is built: "basic" reuses the single export/ tree and serializes builds on one queue (the long-standing behavior); "docker" runs each site's build in an isolated container for safe parallelism. The Docker pipeline itself is a follow-up; this block persists the chosen mode plus the container/concurrency knobs the deploy page and the future orchestrator read.
+How the static export is built: "basic" reuses the single export/ tree and serializes builds on one queue (the long-standing behavior); "docker" builds every site at once, each in its own container (Dockerfile.build), then deploys them serially, and falls back to the basic build when no container engine answers — see PUBLISH.md. This block persists the chosen mode plus the image and concurrency knobs that pipeline reads.
#### `buildPipeline`
diff --git a/common/lib/envVars.ts b/common/lib/envVars.ts
@@ -210,7 +210,7 @@ export function renderEnvironmentMarkdown(): string {
"",
"Every environment variable the repo's code reads, by who it is for. The list is code (`common/lib/envVars.ts`), and a test fails when the code reads a variable the list does not declare, or the list declares one nothing reads. umtool's own knobs are documented in [umtool/docs](umtool/docs/README.md).",
"",
- "Regenerate this file with `pnpm --filter yt-dlp-transcript-common exec tsx bin/archilyzer.ts docs env`. `archilyzer doctor` prints which of the paths overrides are set on this machine.",
+ "Regenerate this file with `pnpm archilyzer docs env`. `pnpm archilyzer doctor` prints which of the paths overrides are set on this machine.",
"",
];
for (const a of ENV_AUDIENCES) {
diff --git a/common/lib/settingsSchema.ts b/common/lib/settingsSchema.ts
@@ -416,8 +416,9 @@ export const DIGEST_SETTINGS_FIELD_DOCS: FieldDocs<DigestSettings> = {
// "basic" — `pnpm run build` in export/, serialized on the build queue (shared
// output tree → no safe parallelism).
-// "docker" — isolated per-site container builds (follow-up); enables real
-// parallel multi-site builds capped by maxParallelBuilds.
+// "docker" — isolated per-site container builds (publish/build.ts,
+// runDockerBuildAllPhase): real parallel multi-site builds capped by
+// maxParallelBuilds.
export type BuildMode = "basic" | "docker";
// Each field is documented in BUILD_PIPELINE_SETTINGS_FIELD_DOCS below (rendered into SETTINGS.md).
@@ -1524,7 +1525,7 @@ export const siteSettingsSchema = z.object({
"Where a channel's downloaded media goes when it is relocated off the corpus disk. A DEFAULT ONLY: the relocate controller never reads it and always takes an explicit root, so this is the value the per-channel Storage panel prefills and the /channels bulk move falls back to. Blank = no default. See StorageSettings.",
),
buildPipeline: settingsField((v): BuildPipelineSettings => sanitizeBuildPipeline(v)).describe(
- "How the static export is built: \"basic\" reuses the single export/ tree and serializes builds on one queue (the long-standing behavior); \"docker\" runs each site's build in an isolated container for safe parallelism. The Docker pipeline itself is a follow-up; this block persists the chosen mode plus the container/concurrency knobs the deploy page and the future orchestrator read.",
+ "How the static export is built: \"basic\" reuses the single export/ tree and serializes builds on one queue (the long-standing behavior); \"docker\" builds every site at once, each in its own container (Dockerfile.build), then deploys them serially, and falls back to the basic build when no container engine answers — see PUBLISH.md. This block persists the chosen mode plus the image and concurrency knobs that pipeline reads.",
),
digest: settingsField((v): DigestSettings => sanitizeDigest(v)).describe(
"AI digest generation (chapters + topic tags over the existing transcripts). Local-first: the metered lane is off by default. See DigestSettings.",
diff --git a/common/publish/build.ts b/common/publish/build.ts
@@ -177,7 +177,7 @@ export const PREVIEW_SHARES_ARCHIVES_NOTICE =
// Cache-Control set on every uploaded archive. Served through a Cloudflare custom
// domain, this lets the CDN absorb repeated/abusive downloads at the edge instead
// of hitting R2 (each origin GET is a billable Class B op), which is the main cost
-// defense for public archives — see DEPLOY_CLOUDFLARE.md. 1h balances flood
+// defense for public archives — see PUBLISH.md. 1h balances flood
// absorption against re-deployed archives (stable filenames, overwritten in place)
// going stale; raise it if your archives rarely change.
const ARCHIVE_CACHE_CONTROL = "public, max-age=3600";
@@ -230,7 +230,7 @@ export async function runArchiveUploadIntoLog(
`[archives] ${files.length} oversize archive(s) need uploading to R2 bucket ` +
`"${bucket}", but R2 S3 credentials are missing. Set R2_ACCESS_KEY_ID, ` +
`R2_SECRET_ACCESS_KEY, and CLOUDFLARE_ACCOUNT_ID in the environment — see ` +
- `DEPLOY_CLOUDFLARE.md. Aborting before deploy so the site never links to ` +
+ `PUBLISH.md ("Download archives and R2"). Aborting before deploy so the site never links to ` +
`missing files.\n`,
);
return 1;
@@ -377,7 +377,7 @@ export async function runDeployIntoLog(
// ---------------------------------------------------------------------------
// Docker export pipeline (buildPipeline.mode = "docker")
//
-// Three ordered phases (see DEPLOY_DOCKER.md):
+// Three ordered phases (see PUBLISH.md, "Building every site in containers"):
// A) HOST, serial: build:data (shared LMDB + .export-index) then build:archives
// (warm the shared archive cache). One writer of the shared state.
// B) CONTAINERS, parallel (cap maxParallelBuilds): each site's compose + next
@@ -473,7 +473,7 @@ async function runDockerBuildOne(
const gid = typeof process.getgid === "function" ? process.getgid() : null;
if (uid !== null && gid !== null) args.push("-u", `${uid}:${gid}`);
// Optional resource caps so N parallel builds (each next build can use ~8 GB)
- // don't OOM the host. Sized by the operator; see DEPLOY_DOCKER.md.
+ // don't OOM the host. Sized by the operator; see PUBLISH.md.
const mem = process.env.DOCKER_BUILD_MEMORY?.trim();
const cpus = process.env.DOCKER_BUILD_CPUS?.trim();
if (mem) args.push("--memory", mem);
diff --git a/editor/app/settings/components/SettingsForm.tsx b/editor/app/settings/components/SettingsForm.tsx
@@ -300,10 +300,10 @@ export function SettingsForm({ initial }: Props) {
<p className="text-xs text-muted-foreground">
How the static export is built. <strong>Basic</strong> runs the build
in <code>export/</code> and serializes builds on one queue.{" "}
- <strong>Docker</strong> will run each site's build in an isolated
- container for safe parallel multi-site builds — the container pipeline
- is a follow-up, so Docker currently falls back to a basic build. The
- mode can also be toggled on the{" "}
+ <strong>Docker</strong> builds every site at once, each in its own
+ container (capped by Max parallel builds), then deploys them one by
+ one; with no container engine it falls back to the basic build. See
+ PUBLISH.md. The mode can also be toggled on the{" "}
<a href="/sites" className="underline">
Sites
</a>{" "}
@@ -317,9 +317,7 @@ export function SettingsForm({ initial }: Props) {
className="rounded border border-border bg-card px-2 py-1 text-sm"
>
<option value="basic">Basic — serial build queue</option>
- <option value="docker">
- Docker — isolated parallel builds (follow-up)
- </option>
+ <option value="docker">Docker — isolated parallel builds</option>
</select>
</label>
<Field
diff --git a/package.json b/package.json
@@ -5,6 +5,7 @@
"license": "MIT",
"type": "module",
"scripts": {
+ "archilyzer": "pnpm --filter yt-dlp-transcript-common exec tsx bin/archilyzer.ts",
"build:index": "pnpm --filter yt-dlp-transcript-common exec tsx bin/archilyzer.ts index",
"sync:tick": "pnpm --filter yt-dlp-transcript-common exec tsx bin/archilyzer.ts sync tick",
"build:export": "pnpm --filter export run build",