Cloudflare MCP & Landing-Page Deploy Pipeline¶
Set up 2026-07-19. Session: landing-page revamp (pricing, testimonials, blog SEO).
Cloudflare MCP (Claude Code can manage Cloudflare directly)¶
Claude Code has the official Cloudflare plugin installed and OAuth-authorized against the Hariandprojects@gmail.com account (d1c23d717393388cf15b570c881e6bb5).
- Install (already done, per-user):
claude plugin marketplace add cloudflare/skillsthenclaude plugin install cloudflare@cloudflare, then/reload-pluginsin the session. - First tool use triggers OAuth in the browser; re-auth the same way if tokens expire.
- The
cloudflare-apiMCP exposes the full REST API viacloudflare.request()— Pages projects/deployments/env vars, DNS records, Workers scripts & routes, zone settings. It can also hit undocumented dashboard endpoints (e.g. Pages deploy hooks under/pages/projects/<name>/deploy_hooks). - Destructive calls (DELETE) and raw
curlto hook URLs get blocked by the permission classifier — expect a confirmation prompt.
Landing page hosting (facts verified via API)¶
- Cloudflare Pages project
landing-page← GitHubastradial/landing-page, branchmaster, buildnpm run build:static→out/(static export;output: "export"). - Domains:
astradial.com,www.astradial.com,landing-page-110.pages.dev. - Env vars (production + preview): Firebase client config,
FIREBASE_SERVICE_ACCOUNT_JSON(secret, used at build time to read Firestore blogs), and nowNEXT_PUBLIC_DEPLOY_HOOK_URL.
Blog auto-deploy pipeline (LIVE, verified end-to-end)¶
Static export means the site only updates on rebuild. The pipeline:
- Dashboard publish (
BlogForm) writes the post to Firestore, then POSTs to the deploy hook:https://api.cloudflare.com/client/v4/pages/webhooks/deploy_hooks/c60fe5af-0e0b-480b-a25f-bf6e7064fdfb(hookfirestore-blog-publish, existed since May, wired up this session viaNEXT_PUBLIC_DEPLOY_HOOK_URLon the project +.env.local). - Cloudflare rebuilds from master (~90 s); build fetches published blogs from Firestore.
- Verified 2026-07-19: hook fired → deployment
d2b89eb1→ post live on astradial.com.
Blog behavior shipped alongside: newest-first ordering (in-code sort, no Firestore composite index), drafts excluded from generateStaticParams, SEO slugs from titles with clash-guard suffix (old ID URLs still build; canonical points at the slug), table content block (script-authored posts only — the dashboard editor can't author tables yet).
SEO baseline added¶
sitemap.xml (app/sitemap.ts, includes every blog slug), public/robots.txt (disallows /dashboard), real root meta description (was "Generated by create next app"), canonical + OpenGraph + Article JSON-LD on blog pages. Manual follow-ups: submit sitemap in Search Console; Google Business Profile for GEO.
Gotcha found: stale Superblog Worker route on www¶
Worker script astra proxies www.astradial.com/blogs* → astradial.superblog.click (dead old blog host) → 404 on www/blogs only; apex works. Fix = delete that Workers route on the astradial.com zone (route id 072a9ce1fd774ef281d6fa329f0cd7e2). Resolved 2026-07-19: route deleted via MCP; www/blogs verified 200.