Cloudflare Pages projects — domain mapping
Last updated: 2026-05-17 UTC — #653 (support.raxx.app infra)
Project inventory
| CF Pages project | Custom domain | Audience | CF Access gate | Deploy workflow |
|---|---|---|---|---|
getraxx |
getraxx.com + www.getraxx.com |
Public (marketing) | None — public | deploy-getraxx.yml |
raxx-docs |
docs.raxx.app |
Public (customers) | None — public | deploy-customer-docs.yml |
raxx-internal-docs |
internal-docs.raxx.app |
Operator only | Email allowlist (kris@moosequest.net) |
deploy-internal-docs.yml |
raxx-mockups |
raxx-mockups.pages.dev (no custom domain) |
Operator only | CF Access (pages.dev gate) | deploy-mockups.yml |
raxx-antlers |
app.raxx.app |
Public (customers) | None — public | deploy-antlers.yml |
raxx-console |
console.raxx.app |
Operator only | CF Access | deploy-console.yml |
raxx-console-shim |
console-staging.raxx.app |
Operator only | CF Access | deploy-console-shim.yml |
raxx-status |
status.raxx.app |
Public | None | deploy-status-page.yml |
raxx-support |
support.raxx.app |
Public (customer-auth-gated for /tickets/*) |
None — public edge; app-level auth | deploy-support.yml |
History
2026-04-29 — cohabitation (Option B)
internal-docs.raxx.app was attached to the raxx-mockups project as a custom
domain. The mockups build script (mockups-site/build.sh) was extended to also
build dist/internal-docs/ by running scripts/build-internal-docs.py. CF Pages
_redirects rules rewrote internal-docs.raxx.app/* to /internal-docs/:splat
so that visiting the docs domain did not land on the mockups root index.
2026-05-08 — split (fixes #1367)
The cohabitation approach caused user-facing confusion: internal-docs.raxx.app/
showed the mockups gallery, not the docs, whenever CF Pages served the project
root instead of applying the redirect. The fix:
- New CF Pages project
raxx-internal-docscreated for internal docs only. deploy-internal-docs.ymlupdated to deploydist/internal-docs/(notdist/) toraxx-internal-docs.deploy-mockups.ymlcreated to owndist/→raxx-mockupsdeploys.- DNS CNAME
internal-docs.raxx.appupdated fromraxx-mockups.pages.devtoraxx-internal-docs.pages.dev(idempotent via CF API in the workflow). - CF Access policy applied to
raxx-internal-docsmatching the existing email-allowlist policy (kris@moosequest.net). - The
_redirectsrules inmockups-site/_redirectsthat rewroteinternal-docs.raxx.app/*requests are no longer needed; the file is retained with the rules removed.
2026-05-08 — getraxx.com landing page (fixes #1369)
Resolved the 403 reported in #1368 (RCA: CF Pages project named getraxx did not
exist; DNS CNAME pointed to getraxx.pages.dev with no matching project).
- New standalone project
frontend/getraxx-landing/extracted fromfeature/brand-tokens-getraxx-landingcommita837db0. Uses Vite + React, not the Antlers CRA shell. - CF Pages project
getraxxcreated on first workflow run. getraxx.com(apex, canonical) andwww.getraxx.comboth attached.www.getraxx.com→getraxx.com301 redirect via_redirectsrule.CLOUDFLARE_EDIT_DNStoken must cover thegetraxx.comzone (Zone ID0bdcee38d1da2d021eb6166f0bd6204f) — operator prerequisite for the DNS bootstrap step.
2026-05-15 — SC-D1: raxx-docs builder bootstrap verified (#2169)
Confirmed the raxx-docs CF Pages binding for docs.raxx.app:
scripts/build-customer-docs.pyexits 0 locally; producesdist-customer-docs/containingindex.html,customer/*.html,customer-docs-theme.css, andbuild-manifest.txt.dist-customer-docs/confirmed in.gitignore— build artifacts never committed.- Deploy workflow
.github/workflows/deploy-customer-docs.ymlreferences project nameraxx-docsand deploysdist-customer-docs/via wrangler. docs/customer/index.mdlanding-page placeholder added (H1 + one paragraph).- All 21 builder smoke tests passing (
scripts/build-customer-docs/test_smoke.py). - Broker-name lint: zero hits across all build inputs and output HTML.
- DNS CNAME and custom-domain attach handled idempotently by the workflow.
2026-05-15 — SC-D2: docs.raxx.app DNS + CF Pages custom domain confirmed (#2174)
Confirmed the DNS CNAME and CF Pages custom domain binding for docs.raxx.app:
- CNAME record
docs.raxx.app→raxx-docs.pages.devdeclared interraform/cf-pages-docs-customer/dns.tf(proxied = true, TTL automatic). The deploy workflow (Ensure docs.raxx.app DNS CNAMEstep) creates this idempotently on every run if it does not exist. cloudflare_pages_domainresource interraform/cf-pages-docs-customer/main.tfattachesdocs.raxx.appto theraxx-docsPages project. The deploy workflow also attaches idempotently viaEnsure CF Pages custom domainstep.terraform/cf-pages-docs-customer/terraform.tfvars.exampleadded (#2174) with zone IDf12dbb5cac57d5591a5058874498a6d1and account ID pre-filled.- Verification script:
scripts/ops/verify-docs-domain.sh— checks CNAME via CF DNS API, domain attachment status, TLS handshake, and HTTP response. - TLS: CF-managed certificate auto-issued when
docs.raxx.appdomain is inactivestate; no manual cert provisioning required. - DNS provider: Cloudflare (raxx.app zone). Not Dyn — Dyn manages moosequest.net only (see memory: feedback_dyndns_stays).
- Token used for DNS record:
CLOUDFLARE_EDIT_DNS(DNS:Edit scope on raxx.app zone) — NOTCLOUDFLARE_RAXX_AUTOMATION_API_TOKENwhich lacks DNS edit scope.
2026-05-17 — #653: support.raxx.app infra shell
Wired the deploy infrastructure for the customer support portal:
- New standalone project
frontend/support/(Vite + React SPA shell; full portal UI is card 4). - CF Pages project
raxx-support— created on first workflow run via idempotent wrangler call. - DNS CNAME
support.raxx.app→raxx-support.pages.dev(proxied); created idempotently by the workflow. support.raxx.appcustom domain attached toraxx-supportvia CF API (idempotent).robots.txt: allows/and/sign-in; disallows/tickets/(RFC-9309 prefix form, covers path + descendants)._headers: CSP, X-Frame-Options: DENY, X-Content-Type-Options, HSTS, Referrer-Policy, Permissions-Policy.- Terraform stack:
terraform/cf-pages-support/(mirrorscf-pages-docs-customerpattern). - Deploy workflow:
.github/workflows/deploy-support.yml— triggers on push tomainforfrontend/support/**. - No CF Access gate at the edge; authentication for
/tickets/*is app-level (card 3).
Token usage
| Token (vault key) | Scope | Used for |
|---|---|---|
CF_PAGES_DEPLOY_TOKEN |
Pages:Edit | wrangler pages deploy, project create, custom domain attach |
CLOUDFLARE_EDIT_DNS |
DNS:Edit on raxx.app zone and getraxx.com zone (pending operator action) |
DNS CNAME bootstrap steps in deploy workflows |
CLOUDFLARE_ACCESS_MGMT_TOKEN |
Zero Trust Access:Edit | CF Access app create/lookup |
The CLOUDFLARE_RAXX_AUTOMATION_API_TOKEN token is NOT used for DNS edits.
See reference_cloudflare_tokens.md for the full scope breakdown.
Zone IDs
raxx.app zone: f12dbb5cac57d5591a5058874498a6d1
getraxx.com zone: 0bdcee38d1da2d021eb6166f0bd6204f