Reference

Tooling Matrix

Per-site setup checklist derived from ActiveWizards + Arizen production deployments.


Tool Matrix

ToolPurposePrioritySetup Steps

CF PagesStatic hostingMust have1. npx wrangler pages project create 2. Deploy with npx wrangler pages deploy dist --project-name= --branch=main 3. Verify at .pages.dev
CF DNSDomain managementMust have1. Add site in CF dashboard 2. Update nameservers at registrar 3. Add DNS records (A/CNAME) 4. Enable proxy (orange cloud)
Custom domainProduction URLMust have1. CF Pages -> Custom domains -> Add 2. For subdomain: CNAME to .pages.dev 3. For root: CF auto-creates record
robots.txtCrawl controlMust haveCreate public/robots.txt: User-agent: * / Allow: / / Sitemap: https://example.com/sitemap-index.xml
@astrojs/sitemapXML sitemapMust have1. npm i @astrojs/sitemap 2. Add to astro.config.mjs integrations 3. Set site: in config 4. Verify at /sitemap-index.xml after build
GA4AnalyticsMust have1. Create property at analytics.google.com 2. Get Measurement ID (G-XXXXXXXX) 3. Add gtag snippet to in BaseLayout 4. Verify real-time data
GSCSearch performanceMust have1. Add property at search.google.com 2. Verify via DNS TXT record (easiest with CF DNS) 3. Submit sitemap URL 4. Wait 2-3 days for initial data
OG ImageSocial previewsMust have1. Create default 1200x630 image in public/og/ 2. Add to SEO component 3. Per-page overrides via frontmatter ogImage field 4. Test with opengraph.xyz
MailgunTransactional emailIf contact form1. Verify sending domain at mailgun.com 2. Add DNS records (SPF, DKIM, MX) 3. Get API key 4. npx wrangler pages secret put MAILGUN_API_KEY 5. Create Pages Function handler
CF Web AnalyticsPrivacy-first analyticsNice to have1. CF Dashboard -> Account -> Web Analytics 2. Add site 3. Toggle on (free, no JS needed if proxied). Alternative: add JS beacon for non-proxied sites
IndexNowInstant indexingNice to have1. Generate API key 2. Create public/.txt with key inside 3. POST to https://api.indexnow.org/indexnow on publish: { url, key, keyLocation }
Lighthouse CIPerformance monitoringNice to have1. Install @lhci/cli 2. Add lighthouserc.json with assertions 3. Run lhci autorun in CI or manually 4. Target: Performance >90, Accessibility >95
SentryError trackingIf JS-heavy1. Create project at sentry.io 2. npm i @sentry/browser 3. Init in client-side script with DSN 4. Add source maps for debugging
astro-pagefindSite searchNice to have1. npm i astro-pagefind 2. Add to integrations 3. Add component to nav 4. Indexes all pages at build time
astro-compressAsset compressionNice to have1. npm i astro-compress 2. Add as LAST integration 3. Compresses HTML/CSS/JS/images on build
UmamiSelf-hosted analyticsFutureDeploy when traffic justifies it. Docker on any VPS. Alternative to GA4 without Google dependency


New Site Launch — Sequential Checklist

Execute in this order. Each step depends on the ones before it.

Phase 1: Foundation (Day 1)

  • [ ] 1. Initialize Astro project
  npm create astro@latest -- --template minimal

cd my-site && npm install
  • [ ] 2. Install core dependencies
  npm i @astrojs/sitemap astro-robots-txt astro-compress @tailwindcss/vite

  • [ ] 3. Configure astro.config.mjs
- Set site: 'https://yourdomain.com'

- Add Tailwind vite plugin

- Add integrations: sitemap, robotsTxt, compress (last)

  • [ ] 4. Create public/robots.txt
  User-agent: *

Allow: /

Sitemap: https://yourdomain.com/sitemap-index.xml

  • [ ] 5. Create BaseLayout with SEO
- Canonical URL, meta description, OG tags, favicon

- GA4 script placeholder (fill in after property creation)

  • [ ] 6. Create default OG image (public/og/default.png, 1200x630)
  • [ ] 7. Set up content collections in src/content.config.ts
  • [ ] 8. Build and test locally: npm run build && npm run preview

Phase 2: Hosting & Domain (Day 1-2)

  • [ ] 9. Create CF Pages project
  npx wrangler pages project create my-site

  • [ ] 10. Deploy to staging
  npx wrangler pages deploy dist --project-name=my-site --branch=staging

  • [ ] 11. Verify staging URL works: staging.my-site.pages.dev
  • [ ] 12. Set up CF DNS (if new domain)
- Add site in CF dashboard

- Update nameservers at registrar

- Wait for propagation (up to 24h, usually <1h)

  • [ ] 13. Add custom domain in CF Pages -> Custom domains
  • [ ] 14. Verify HTTPS is working on custom domain
  • [ ] 15. Create deploy.sh script for repeatable deployments

Phase 3: Analytics & Search (Day 2-3)

  • [ ] 16. Create GA4 property
- analytics.google.com -> Admin -> Create Property

- Get Measurement ID

- Add gtag snippet to BaseLayout

  • [ ] 17. Verify GA4: Check real-time report while browsing staging
  • [ ] 18. Add site to GSC
- search.google.com -> Add Property -> Domain

- Verify via DNS TXT record in CF DNS

  • [ ] 19. Submit sitemap in GSC: https://yourdomain.com/sitemap-index.xml
  • [ ] 20. Enable CF Web Analytics (optional, free, toggle in dashboard)

Phase 4: Contact & Email (Day 3-4, if needed)

  • [ ] 21. Set up Mailgun
- Verify sending domain

- Add DNS records (SPF, DKIM)

- Get API key

  • [ ] 22. Create Pages Function (functions/api/contact.ts)
- Freemail filtering

- Honeypot spam protection

- Dual response (JSON for fetch, redirect for form)

  • [ ] 23. Set CF Pages secrets
  npx wrangler pages secret put MAILGUN_API_KEY

npx wrangler pages secret put MAILGUN_DOMAIN npx wrangler pages secret put NOTIFICATION_EMAIL
  • [ ] 24. Test contact form end-to-end (staging first, then production)

Phase 5: Production Launch (Day 4-5)

  • [ ] 25. Content review: All pages have meta titles, descriptions, OG images
  • [ ] 26. Lighthouse audit: Target Performance >90, Accessibility >95, SEO 100
  • [ ] 27. Test OG images: Use opengraph.xyz or Twitter card validator
  • [ ] 28. Set up redirects if migrating from old site (public/_redirects)
  • [ ] 29. Deploy to production
  npx wrangler pages deploy dist --project-name=my-site --branch=main

  • [ ] 30. Verify production domain resolves correctly
  • [ ] 31. Submit to IndexNow (optional, for fast Bing/Yandex indexing)
  • [ ] 32. Monitor GSC for crawl errors over next 7 days

Phase 6: Post-Launch (Week 1-2)

  • [ ] 33. Check GSC coverage: Fix any crawl errors or excluded pages
  • [ ] 34. Verify GA4 data is flowing correctly (pageviews, events)
  • [ ] 35. Set up Lighthouse CI or schedule manual audits monthly
  • [ ] 36. Add search (astro-pagefind) if >20 pages
  • [ ] 37. Add Sentry if site has significant client-side JavaScript


Environment Variables Checklist

VariableWhereRequired

siteastro.config.mjsAlways
PUBLIC_GA_ID.env / CF env varsIf GA4
MAILGUN_API_KEYCF Pages secretIf contact form
MAILGUN_DOMAINCF Pages secretIf contact form
NOTIFICATION_EMAILCF Pages secretIf contact form
CLOUDFLARE_API_TOKENLocal .envFor wrangler CLI
NODE_VERSIONCF Pages env varSet to 20


Quick Verification Commands

# Check build output
npx astro build && ls -la dist/

# Verify sitemap exists
curl -s https://yourdomain.com/sitemap-index.xml | head -20

# Test redirects
curl -I https://yourdomain.com/old-url

# Check response headers
curl -I https://yourdomain.com/

# Lighthouse (local)
npx lighthouse https://yourdomain.com --output=json --quiet | jq '.categories | to_entries[] | {(.key): .value.score}'

# Test contact function
curl -X POST https://yourdomain.com/api/contact \
  -H "Accept: application/json" \
  -F "name=Test" -F "email=test@company.com" \
  -F "company=TestCo" -F "project_type=AI" -F "message=Test message"