From 809d9ff41ee9bbade8281d8bd1a1186465d64e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D0=B8=D1=8F?= Date: Sun, 31 May 2026 15:07:24 +0300 Subject: [PATCH] chore(landing): configure render static deployments Configure landing and docs for separate Render Static Site deployments. --- landing/README.md | 25 +++++++++++++++++++++++ landing/nuxt.config.ts | 3 ++- landing/product-docs/.vitepress/config.ts | 25 +++++++++++++++-------- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/landing/README.md b/landing/README.md index fb679a08..7e21d2be 100644 --- a/landing/README.md +++ b/landing/README.md @@ -14,7 +14,32 @@ pnpm generate pnpm preview ``` +## Render static sites + +Landing and docs are deployed as separate Render Static Sites from the `main` branch. + +Landing: + +```bash +corepack enable && pnpm install --frozen-lockfile --ignore-scripts && NUXT_PUBLIC_SITE_URL=$RENDER_EXTERNAL_URL NUXT_PUBLIC_ROBOTS="index, follow" pnpm --filter agent-teams-landing generate +``` + +Publish path: `landing/.output/public` + +Docs: + +```bash +corepack enable && pnpm install --frozen-lockfile --ignore-scripts && VITEPRESS_BASE=/ VITEPRESS_SITE_URL=$RENDER_EXTERNAL_URL VITEPRESS_LANDING_SITE_URL=https://agent-teams-ai-landing.onrender.com pnpm --filter agent-teams-landing docs:build +``` + +Publish path: `landing/product-docs/.vitepress/dist` + +Both sites set `NODE_VERSION=24.16.0` and `SKIP_INSTALL_DEPS=true`; the build command runs the pnpm install step explicitly with `--ignore-scripts`. + +When a custom landing domain is attached, update `VITEPRESS_LANDING_SITE_URL` on the docs site. When a custom docs domain is attached, `VITEPRESS_SITE_URL=$RENDER_EXTERNAL_URL` can stay unchanged for the Render preview URL or be replaced with the custom domain for canonical SEO. + ## Notes + - Static-first (SSG) by design. - Locale auto-detection: cookie -> browser settings -> fallback `en`. - Theme auto-detection: localStorage -> system preference -> fallback `light`. diff --git a/landing/nuxt.config.ts b/landing/nuxt.config.ts index d6219bed..2b23c57b 100644 --- a/landing/nuxt.config.ts +++ b/landing/nuxt.config.ts @@ -18,6 +18,7 @@ const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const defaultSeoTitle = "Agent Teams - AI Agent Orchestration for Developers"; const defaultSeoDescription = "Free, open-source desktop app for AI agent teams. Start with a free model with no auth, then connect Claude, Codex, or OpenCode when you need more models."; const defaultSeoImage = `${siteUrl.replace(/\/+$/, "")}/og-image-agent-teams-v6.png`; +const robots = process.env.NUXT_PUBLIC_ROBOTS || "noindex, nofollow"; export default defineNuxtConfig({ compatibilityDate: "2026-01-19", @@ -29,7 +30,7 @@ export default defineNuxtConfig({ title: defaultSeoTitle, meta: [ { name: "description", content: defaultSeoDescription }, - { name: "robots", content: "noindex, nofollow" }, + { name: "robots", content: robots }, { property: "og:title", content: defaultSeoTitle }, { property: "og:description", content: defaultSeoDescription }, { property: "og:type", content: "website" }, diff --git a/landing/product-docs/.vitepress/config.ts b/landing/product-docs/.vitepress/config.ts index 02bed4f2..7815fcf6 100644 --- a/landing/product-docs/.vitepress/config.ts +++ b/landing/product-docs/.vitepress/config.ts @@ -21,15 +21,20 @@ const normalizeBase = (value: string) => { const withTrailingSlash = (value: string) => `${trimTrailingSlash(value)}/`; const appBase = normalizeBase(process.env.NUXT_APP_BASE_URL || "/"); -const base = appBase === "/" ? "/docs/" : `${appBase}docs/`; -const siteUrl = trimTrailingSlash( - process.env.NUXT_PUBLIC_SITE_URL || "https://777genius.github.io/agent-teams-ai" +const embeddedDocsBase = appBase === "/" ? "/docs/" : `${appBase}docs/`; +const base = process.env.VITEPRESS_BASE ? normalizeBase(process.env.VITEPRESS_BASE) : embeddedDocsBase; +const landingSiteUrl = trimTrailingSlash( + process.env.VITEPRESS_LANDING_SITE_URL || + process.env.NUXT_PUBLIC_SITE_URL || + "https://777genius.github.io/agent-teams-ai" ); const publicBaseUrl = - appBase === "/" || siteUrl.endsWith(trimTrailingSlash(appBase)) - ? withTrailingSlash(siteUrl) - : `${withTrailingSlash(siteUrl)}${appBase.replace(/^\/+/, "")}`; -const docsUrl = `${publicBaseUrl}docs/`; + appBase === "/" || landingSiteUrl.endsWith(trimTrailingSlash(appBase)) + ? withTrailingSlash(landingSiteUrl) + : `${withTrailingSlash(landingSiteUrl)}${appBase.replace(/^\/+/, "")}`; +const docsUrl = process.env.VITEPRESS_SITE_URL + ? withTrailingSlash(process.env.VITEPRESS_SITE_URL) + : `${publicBaseUrl}docs/`; const downloadUrl = `${publicBaseUrl}download/`; const ruDownloadUrl = `${publicBaseUrl}ru/download/`; const ogImageUrl = `${publicBaseUrl}og-image-agent-teams-v6.png`; @@ -130,7 +135,11 @@ const ruGuide: DefaultTheme.SidebarItem[] = [ ]; const rootNav: DefaultTheme.NavItem[] = [ - { text: "Guide", link: "/guide/beginner-workflow", activeMatch: "^/guide/(?!troubleshooting(?:/|$))" }, + { + text: "Guide", + link: "/guide/beginner-workflow", + activeMatch: "^/guide/(?!troubleshooting(?:/|$))" + }, { text: "Developers", link: "/developers/", activeMatch: "^/developers/" }, { text: "Reference", link: "/reference/concepts", activeMatch: "^/reference/" }, {