open-design/docs
lefarcen 7312c64580
ci(landing): split landing deploy into staging gate + manual production (#2994)
* ci(landing): split landing deploy into staging gate + manual production

A merge to `main` previously published the landing page straight to
production (open-design.ai) via `landing-page-deploy`. There was no
buffer to review the rendered site, so a bad merge was live instantly.

Split deploys across two Cloudflare Pages projects so production is only
ever reached by an explicit human action:

- `landing-page-staging` (push to main) -> staging project
  `open-design-landing-staging` -> staging.open-design.ai.
- `landing-page-production` (manual workflow_dispatch only) -> production
  project `open-design-landing` -> open-design.ai. Only this workflow
  names the production project; gate it with required reviewers on the
  `production` GitHub environment.
- `landing-page-ci` now also deploys a per-PR preview into the staging
  project (`--branch=pr-<n>`) for same-repo branches and comments the URL.
  Fork PRs (no secrets / read-only token) skip the deploy and keep just
  the build validation. Path filters already scope this to landing edits.

Decouple search-engine indexing from staging:

- `blog-indexing-on-deploy` now triggers on `landing-page-production`
  (not every main push), so the test environment is never submitted to
  Google/IndexNow.
- It diffs from a new `blog-indexed-prod` tag (the last indexed prod
  commit) instead of `HEAD^`, and force-advances the tag after a
  successful run, so a manual promotion bundling several merged posts
  indexes all of them rather than only the last commit.

Staging and PR-preview builds drop `PUBLIC_GA_MEASUREMENT_ID` so test
traffic does not pollute the production GA property.

* ci(landing): keep staging + PR previews out of the search index

staging.open-design.ai mirrors production and is exposed via cert
transparency logs, so search engines can discover it. Indexing the
mirror competes with open-design.ai for the same content.

Emit `<meta name="robots" content="noindex, nofollow">` whenever
OD_LANDING_NOINDEX=1, and set that flag on the staging and PR-preview
builds (production leaves it unset and stays indexable). noindex is
used rather than a robots.txt Disallow so crawlers can still fetch the
page and read both the tag and the canonical, which already points at
the production origin.

* fix(landing): make staging noindex actually take effect

The previous commit read `process.env.OD_LANDING_NOINDEX` directly in
`seo-head.astro`, but `.astro` frontmatter is transformed by Vite and
does not see process.env, so the meta never rendered. Two fixes:

- Inject the flag as the compile-time constant `__OD_LANDING_NOINDEX__`
  via `vite.define` in astro.config.ts (config runs in Node and can read
  process.env); SeoHead consumes that constant.
- The homepage (`index.astro`) and `og.astro` build their own <head> and
  never use SeoHead, so a per-component meta can miss pages. Add an
  `astro:build:done` integration that appends a catch-all
  `/*  X-Robots-Tag: noindex, nofollow` to the Cloudflare Pages `_headers`
  on staging/preview builds, covering every response (homepage, assets,
  any custom-head page) at the HTTP layer. Production builds leave
  `_headers` untouched.

Verified: build with OD_LANDING_NOINDEX=1 emits the _headers block and
the SeoHead <meta>; build without the flag emits neither; astro check
clean.

* fix(landing): address review — pin prod checkout to main, defer index pointer

Two blockers from review:

- landing-page-production: workflow_dispatch can be launched from any ref
  via the Actions "Use workflow from" dropdown, so an operator could ship
  an arbitrary branch to open-design.ai. Pin the checkout to `ref: main`
  so the deployed artifact always equals reviewed main.

- blog-indexing-on-deploy: the `blog-indexed-prod` pointer was advanced
  right after sitemap submission, before Inspect / Search Analytics /
  Render status / Open status PR. A failure in any of those still moved
  the pointer, so the next production run skipped those posts. Move the
  advance to the very end, gated on `success()`, so a failure leaves the
  tag in place and the range is re-processed next run (submissions are
  idempotent).

* fix(landing): gate production promotion to the main ref only

Follow-up to the production-path review note: pinning checkout to main
fixed the deployed content, but the workflow was still dispatchable from
any ref, which records a non-main production run and would dodge
blog-indexing's `workflow_run` `branches: [main]` filter. Gate the whole
job on `github.ref == 'refs/heads/main'` so a dispatch from any other
branch/tag is skipped outright.
2026-05-26 14:05:04 +00:00
..
adr Centralize daemon startup (#2054) 2026-05-18 17:08:17 +08:00
assets Update docs/assets/github-metrics.svg (#2957) 2026-05-26 06:02:50 +00:00
deployment docs: add Docker deployment guide with verification screenshots (#1851) 2026-05-18 18:00:20 +08:00
examples Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
plans Merge remote-tracking branch 'origin/preview/0.8.0' into preview/v0.8.0 2026-05-14 21:10:03 +08:00
rfc-drafts feat: import existing local folder as project (#597) (#624) 2026-05-07 20:43:31 +08:00
schemas Add i18n metadata for official content (#2692) 2026-05-22 16:39:32 +08:00
screenshots docs: add Docker deployment guide with verification screenshots (#1851) 2026-05-18 18:00:20 +08:00
superpowers/plans Add Linux packaged client parity smoke coverage (#1204) 2026-05-15 16:38:29 +08:00
testing [codex] test(e2e): harden settings and entry regressions (#2578) 2026-05-22 10:04:12 +08:00
agent-adapters.md fix(daemon): run Trae CLI ACP with yolo (#2856) 2026-05-25 04:06:52 +00:00
architecture.md feat(web): add Finalize design package + Continue in CLI buttons (#451) (#974) 2026-05-10 11:44:32 +08:00
atoms.md docs(plugins): add docs/atoms.md (first-party atom catalog reference) 2026-05-09 12:30:22 +00:00
blog-indexing-automation.md ci(landing): split landing deploy into staging gate + manual production (#2994) 2026-05-26 14:05:04 +00:00
blog-indexing-status.json docs(blog): refresh daily indexing status (#2502) 2026-05-21 14:35:50 +08:00
blog-indexing-status.md docs(blog): refresh daily indexing status (#2502) 2026-05-21 14:35:50 +08:00
blog-traffic-digest.md docs(blog): refresh 3-day traffic digest (#2669) 2026-05-22 14:44:47 +08:00
code-review-guidelines.md docs: add repository-wide code review guidelines (#927) 2026-05-08 19:18:39 +08:00
codex-pets.md feat(web): add pet companion with Codex hatch-pet integration (#296) 2026-05-02 23:45:39 +08:00
critique-theater.md feat: Critique Theater wireup (activate the stack, M0 dark-launch by default) (#1338) 2026-05-14 20:37:06 +08:00
design-systems.md Default English resource i18n fallback (#1270) 2026-05-11 20:29:05 +08:00
install-guide.md feat(deploy): add one-click Docker/Podman Compose installer for Linux… (#2414) 2026-05-22 14:04:16 +08:00
modes.md Refactor project name from "Open Claude Design" to "Open Design" (#1) 2026-04-28 16:03:35 +08:00
new-agent-runtime-acp.md docs: document ACP runtime integration (#2232) 2026-05-19 18:03:10 +08:00
notebooklm.md docs: add NotebookLM GitHub export script (#1062) 2026-05-12 15:47:32 +08:00
plugins-spec.md Add i18n metadata for official content (#2692) 2026-05-22 16:39:32 +08:00
plugins-spec.zh-CN.md Add i18n metadata for official content (#2692) 2026-05-22 16:39:32 +08:00
publishing-a-plugin.md Add community and use case blog posts (#2103) 2026-05-19 14:05:16 +08:00
publishing-a-plugin.zh-CN.md feat(plugins): add registry protocol and enhance plugin management features 2026-05-14 08:55:36 +08:00
references.md [codex] Add automation templates and proposal workflows (#2193) 2026-05-19 16:35:28 +08:00
roadmap.md [codex] Add automation templates and proposal workflows (#2193) 2026-05-19 16:35:28 +08:00
self-hosting-a-registry.md feat(plugins): add registry protocol and enhance plugin management features 2026-05-14 08:55:36 +08:00
seo-daily-report.md feat(seo): add GSC report opportunities (#2388) 2026-05-20 16:19:14 +08:00
skills-contributing.md Add i18n metadata for official content (#2692) 2026-05-22 16:39:32 +08:00
skills-protocol.md Add i18n metadata for official content (#2692) 2026-05-22 16:39:32 +08:00
spec.md [codex] Add automation templates and proposal workflows (#2193) 2026-05-19 16:35:28 +08:00
v0.8.0-announcement.md docs: point 0.8.0 preview contributors at main (#1846) 2026-05-15 22:37:04 +08:00
v0.8.0-announcement.zh-CN.md docs: point 0.8.0 preview contributors at main (#1846) 2026-05-15 22:37:04 +08:00
windows-troubleshooting.md refactor(web): rename Execution mode and tighten settings dialog UI (#1568) 2026-05-15 14:35:06 +08:00