Landing page deploy
How the Astro landing page deploys to Cloudflare Pages.
Landing page deploy
The marketing site (apps/landing-page-astro) is a static Astro export
deployed to Cloudflare Pages at codevetter.com.
Trigger
deploy-landing.yml runs on workflow_dispatch (manual). It is not
auto-triggered on push to main — landing deploys are intentional.
Steps
pnpm install --frozen-lockfile(root).npm run buildinapps/landing-page-astro→dist/.- Verify required static routes exist:
dist/index.htmldist/privacy.htmldist/download.htmldist/sitemap-index.xmldist/robots.txt
- Check
CLOUDFLARE_API_TOKENsecret is present. - Deploy to the Cloudflare Pages project
codevetterviawrangler pages deploy.
Required secret
CLOUDFLARE_API_TOKEN— GitHub Actions secret, scoped to the Pages project. Do not commit it. The desktop app does not use this token.
Local build
cd apps/landing-page-astro
pnpm install
pnpm build # → dist/
pnpm preview # local preview of the static export
Agent indexing surfaces
The landing page (and its proxy worker) serve agent-discovery surfaces:
llms.txt, llms-full, /api/ai, robots.txt, IndexNow key, and
FAQPage JSON-LD. These are part of the static export — do not strip them
when modifying the site. See
knowledge/learnings/new-things.md
(GEO entry).
Gotchas
outvsdist: the desktop Vite config usesoutDir: "out", but the Astro site usesdist. The May-2026 CF Pages reconfig failed because the Pagesdestination_dirwas set todistwhile the desktop build wrote toout. The Astro site is the only thing deployed to Pages now — keepdestination_dir: distand don’t point Pages atapps/desktop.- Single lockfile: Pages must use
pnpm install --frozen-lockfileagainst the rootpnpm-lock.yaml. Do not let apackage-lock.jsonreappear.
See runbooks/deploy-landing.md for the manual runbook.