commit 1b92723509047969a1d7a8982f7e1b2d48cfd694
parent c127b4e017d70166652f2c038ca41882a3ffe401
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Fri, 25 Sep 2026 11:44:32 -0400
(review fix) docs + hints: every deploy path uploads to R2; hub examples name archilyzer-hub
DEPLOY_CLOUDFLARE.md no longer says a raw export deploy only stages archives:
archilyzer deploy site (pnpm run deploy) uploads them as the editor does; a
build alone stages them. The settings homepageUrl hint and homepage.ts's
comments name https://archilyzer-hub.pages.dev / archilyzer-hub (never
archilyzer). archilyzer compose site with no id refuses in one line, exit 2,
like build site and deploy site.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
4 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/DEPLOY_CLOUDFLARE.md b/DEPLOY_CLOUDFLARE.md
@@ -37,9 +37,12 @@ Oversize archives are staged during compose into `export/.r2-staging/<siteId>/ar
**Build & deploy** actions to `<bucket>/<siteId>/archives/<file>.zip` **before** the
Pages deploy runs, so the manifest URLs resolve immediately.
-> **Note:** only the **editor's** deploy actions upload to R2 (that's where the R2
-> credentials live). A raw `pnpm run build` / `pnpm deploy` from the `export`
-> package only *stages* the files — it does not upload them.
+> **Note:** every deploy path uploads oversize archives to R2 before the Pages
+> deploy: the editor's **Deploy** / **Build & deploy**, `pnpm ops deploy-site`, and
+> `archilyzer deploy site <id>` (which `pnpm run deploy` in `export/` runs, with
+> `SITE_ID`). A build alone (`archilyzer build site`, `pnpm run build`) only
+> *stages* them in `export/.r2-staging/`. The bucket is read from `settings.json`;
+> the R2 credentials come from the environment (see "3. Authenticate" below).
Uploads go through R2's **S3 API** (via the AWS SDK's multipart uploader), not
`wrangler r2 object put` — wrangler caps a single upload at **300 MiB**, and real
diff --git a/common/bin/archilyzer.ts b/common/bin/archilyzer.ts
@@ -26,8 +26,10 @@ export const COMMANDS: Command[] = [
path: ["compose", "site"],
usage: "<id> compose one site's export/public (default: SITE_ID)",
maxPositionals: 1,
- run: async ({ positionals }) => {
- await (await import("./compose-site")).main({ siteId: positionals[0] });
+ run: async ({ positionals, env }) => {
+ const siteId = siteIdFrom(positionals, env, "compose site");
+ if (!siteId) return 2;
+ await (await import("./compose-site")).main({ siteId });
return 0;
},
},
diff --git a/common/lib/homepage.ts b/common/lib/homepage.ts
@@ -28,9 +28,10 @@ export type HomepageConfig = {
// SiteSettings.socialLinks; an array (even empty) overrides it. Same semantics
// as Site.socialLinks — resolve with resolveHomepageSocialLinks() at render.
socialLinks?: SocialLink[];
- // Absolute public URL of the deployed hub, e.g. "https://archilyzer.pages.dev".
+ // Absolute public URL of the deployed hub, e.g. "https://archilyzer-hub.pages.dev".
siteUrl?: string;
- // Cloudflare Pages project the hub deploys to.
+ // Cloudflare Pages project the hub deploys to (e.g. "archilyzer-hub"; never
+ // "archilyzer", the homepage's — deployHub refuses it).
cloudflareProject?: string;
// The transcript modal's per-video export controls (Download menu, Copy MD,
// Copy download command) on the hub's Browse and Ask pages — the same switch
diff --git a/editor/app/settings/components/SettingsForm.tsx b/editor/app/settings/components/SettingsForm.tsx
@@ -45,7 +45,7 @@ export function SettingsForm({ initial }: Props) {
name="homepageUrl"
defaultValue={initial.homepageUrl}
type="url"
- hint="Absolute URL of the family hub/homepage (e.g. https://archilyzer.pages.dev). Every export site links back to it. Leave blank for no hub link."
+ hint="Absolute URL of the family hub (e.g. https://archilyzer-hub.pages.dev). Every export site links back to it. Leave blank for no hub link."
/>
<Field
label="Max transcript page bytes"