Questions: Ask the user through the environment's question tool — never as plain-text prose. One question at a time, 2–4 tappable options, wait for the answer. If the environment has no question tool, ask in prose with the same options, one at a time.
Pre-launch audit and setup workflow for shipping a new website. Opinionated for Cloudflare DNS + Vercel hosting + PostHog + Legal context.
This skill is intentionally interactive. Ask aggressively instead of assuming. The user will tap, not type.
Always ask these questions at the start of a run (one at a time, in this order):
doc-site | marketing/lead-gen | SaaS-app | training/paid-course | personal-portfoliogreenfield-new-domain | migration-need-301-redirects | replacing-existing-on-same-domainsingle-locale | en | fr+en | other-multihogpost.samber.dev | set-up-new-proxy | skip-PostHoguse-default-for-site-type | customize-per-bot | block-allclaude-chrome-extension | playwright | neither-skip-browser-checksAsk again at every decision point throughout the phases, including:
customize-per-botstrict-default-src-none | balanced-allow-self | permissive-for-marketingNever proceed past a decision point without explicit user input. Verbose checklists without checkpoints are not the goal.
Never install any MCP server or skill without explicit user confirmation. Always ask via the question tool before running npx skills add, claude mcp add, or any equivalent install command — even when the skill selection workflow proposes a curated subset.
Six skill packs are useful for site launches. Never install full multi-skill packs. The actual subset to install is decided at invocation time based on the site type the user confirms.
PackWhat it coversTypically useful forAgriciDaniel/claude-seoSEO + GEO + schema + hreflang + sitemaps audits, parallel sub-agentsAll site typesaddyosmani/web-quality-skillsLighthouse, Core Web Vitals, accessibility, performance, best practicesAll site typestrailofbits/skillsSecurity audit (OWASP, headers, dependencies)All site typesaaron-he-zhu/seo-geo-claude-skills20 SEO+GEO skills, CORE-EEAT + CITE frameworks, /seo: slash commandsContent-heavy sites, competitive nichescoreyhaines31/marketingskills~30 marketing skills (CRO, copywriting, ads, popups, email, paywalls, etc.)marketing/lead-gen, SaaS-app, training/paid-course``jonathimer/devmarketing-skills33 developer-marketing skills (persona, docs-as-marketing, technical tutorials, etc.)doc-site, SaaS-app for developers
After the user confirms site type, for each pack relevant to that site type:
npx skills add owner/repo --listinstall-as-proposed | let-me-modify | skip-this-pack) otherwise.npx skills add owner/repo --skill A B CRules:
--list for the current state. Pack contents change.npx skills add owner/repo without --skill (that installs everything).doc-site: claude-seo, web-quality-skills, trailofbits, seo-geo-claude-skills, devmarketing-skillsmarketing/lead-gen: claude-seo, web-quality-skills, trailofbits, seo-geo-claude-skills, marketingskillsSaaS-app: all sixtraining/paid-course: claude-seo, web-quality-skills, trailofbits, marketingskillspersonal-portfolio: claude-seo, web-quality-skills, trailofbits, seo-geo-claude-skills (lightweight subset)This avoids importing 80+ skills the user does not need, avoids going stale on sub-skill names, and avoids overfitting to a single pack version.
When delegating during a phase, do not duplicate work this skill orchestrates. Call the specialist with a narrow scope (e.g., "run only the security headers sub-audit on URL X").
Every site has visible marketing copy (hero, features, CTAs, meta descriptions, OG descriptions, blog posts, 404 page text). Two layers of polish are mandatory before launch:
TONE.md once per site#Ask the user: "Does this site already have a TONE.md?" ( yes-already-exists | no-create-from-template | skip-use-default).
If creating: write it to .agents/TONE.md or repo root TONE.md. See references/templates.md (section "TONE.md template") for the structure.
TONE.md specifies: voice (terse, contrarian, etc.), forbidden patterns (e.g., "delve", "crucial", em dashes, AI-sounding openers), sentence length preference, audience reading level, examples of good and bad sentences from the user's own writing.
After every drafting step (whether by a copywriting skill, by hand, or by Claude directly), run a humanizer to strip AI patterns.
Ask the user for the site's primary audience language at the start of the session if not already known:
english-global → npx skills add https://github.com/blader/humanizer --skill humanizerfrench → use samber/humaniseur-fr (custom French humanizer) or equivalent French-tuned skillother → install matching humanizer if available; otherwise the skill writes a short language-specific anti-pattern checklist inlineApply the humanizer to: hero copy, feature descriptions, CTA buttons, meta descriptions, OG/Twitter card descriptions, blog posts, email signup confirmations, 404 page text. Skip for legal pages (mentions légales, CGV) since they have rigid wording requirements.
When delegating to any copywriting or content-writing sub-skill (selected at invocation per the skill selection workflow), include TONE.md in the prompt context. Pass voice constraints explicitly: "Follow .agents/TONE.md. Avoid the listed patterns. Apply the humanizer after drafting."
Many checks require a real browser (Lighthouse runs, securityheaders.com scan, opengraph.xyz validation, Twitter card validator, mobile viewport, screen reader smoke, Network tab inspection).
Always prefer the Claude Chrome extension. Fall back to Playwright only if the Chrome extension is unavailable. If neither is available, ask the user whether to skip browser checks entirely or wait until they enable one.
Most checks are doable from the command line without third-party services. Use these tools inline at every phase. Don't trust panels in Cloudflare/Vercel/Google dashboards alone, verify with curl.
DNS (Phase 1):
bash
dig +short A example.com # A record
dig +short AAAA example.com # AAAA (IPv6)
dig +short MX example.com # MX (mail)
dig +short TXT example.com # SPF + verification TXT
dig +short TXT _dmarc.example.com # DMARC
dig +short TXT default._domainkey.example.com # DKIM (selector varies)
dig +short CAA example.com # CAA
dig +dnssec example.com | grep RRSIG # DNSSEC active
TLS / HTTPS (Phase 1):
bash
curl -sIL https://example.com | head # follow redirects
curl -sI https://www.example.com # check www handling
openssl s_client -showcerts -connect example.com:443 < /dev/null 2>/dev/null | openssl x509 -noout -dates
Headers (Phase 4):
bash
curl -sI https://example.com | grep -iE 'content-security-policy|strict-transport-security|x-frame-options|x-content-type-options|referrer-policy|permissions-policy'
# Full header dump:
curl -sI https://example.com
# External graders:
curl -s "https://api.securityheaders.com/?q=https://example.com&followRedirects=on&hide=on" -I | grep -i 'x-grade'
SEO files (Phase 5):
bash
curl -s https://example.com/robots.txt
curl -sI https://example.com/sitemap.xml
curl -s https://example.com/sitemap.xml | head -40
curl -s https://example.com/llms.txt
# Schema (JSON-LD):
curl -s https://example.com/ | grep -A 50 'application/ld+json'
# hreflang:
curl -s https://example.com/ | grep -i hreflang
Open Graph & social (Phase 6):
bash
curl -s https://example.com/page | grep -iE 'og:|twitter:|<title|name="description"'
Favicons & manifest (Phase 7):
bash
curl -sI https://example.com/favicon.ico
curl -sI https://example.com/favicon.svg
curl -sI https://example.com/apple-touch-icon.png
curl -s https://example.com/manifest.json | jq .
404 / 500 / redirects:
bash
curl -sI https://example.com/this-does-not-exist
curl -sIL https://example.com/old-url # verify 301 chain
Always run the relevant command, paste the output to the user when reporting, then ask whether to fix immediately or queue.
Most of this is one-click via Cloudflare's dashboard if the domain is on Cloudflare.
Ask first: "Is the domain already on Cloudflare with the standard config from previous launches?" ( yes-standard | yes-needs-review | no-fresh-setup)
Checklist:
dig +short A example.com)dig +short MX example.com)dig +short CAA example.com)dig +dnssec)curl -sIL https://www.example.com)curl -sI https://example.com/does-not-exist)curl -sIL per URL)If you don't configure backups at launch, you never will. Do it now.
Ask the user: "Which data stores does this app write to?" ( database-only | database-plus-file-storage | file-storage-only | stateless-no-persistent-data). If stateless-no-persistent-data, skip this section.
Database:
File storage (if applicable — S3, R2, GCS, Cloudflare Images):
rclone to sync from S3/R2/GCS → B2 on a daily cron.Secrets / environment variables:
.env file on someone's laptop.Monitoring:
Most third-party integrations are one-click via Cloudflare or Vercel.
For the conditional tools (Crisp, Sentry, BetterStack), ask the user to confirm per site type. See references/decisions.md for the observability tier matrix.
Always-on:
Google Analytics 4: property created, measurement ID embedded, gated behind CNIL consent
PostHog: based on user's earlier answer:
hogpost.samber.dev: configure client with api_host: "https://hogpost.samber.dev" and verify CORS allows the new domain (test with browser console or curl -H "Origin: https://newsite.com" -I https://hogpost.samber.dev/decide)set-up-new-proxy: add path rewrite in next.config.js to us.i.posthog.com and us-assets.i.posthog.com, init client with api_host: "/ingest"skip-PostHog: skipGoogle Search Console: site verified (DNS TXT or HTML file), sitemap submitted
Bing Webmaster Tools: site verified, sitemap submitted, IndexNow key file at /{key}.txt on root (verify with curl -sI https://example.com/{key}.txt)
Ahrefs: site added to dashboard for tracking
Add the site to the internal stats spreadsheet (PostHog properties registry + GitHub Sponsors tracking sheet if applicable)
Brand monitoring (Google Alerts):
For each alert, use these settings: Frequency: once a day | Sources: Automatic | How many: All results | Region: Any region
Set up one alert per keyword via alerts.google.com:
example.com)"My Brand")yes-monitor-competitors | skip)Ask the user: "Which additional keywords to monitor?" ( product-name-only | domain-plus-brand | full-set-with-competitors | custom-list)
Developer community monitoring (F5bot) — for doc-site and SaaS-app targeting developers:
F5bot (f5bot.com) monitors Reddit, Hacker News, and Lobste.rs for keyword mentions and sends email alerts. Free, no API required.
Set up one keyword per line at f5bot.com/add:
Competitor analysis ( marketing/lead-gen, SaaS-app, training/paid-course only):
Before writing copy, setting up ads, or planning content, run a competitor analysis to understand what is already working in the market — positioning, messaging angles, CTA patterns, pricing presentation, and content strategy.
Use a deep research tool or a competitor analysis skill if one is available in the toolchain. Ask:
yes-provide-list | no-discover-for-me | skip)yes-provide-list: ask the user to paste 2-5 names or URLs (free text)positioning-and-messaging | pricing-strategy | content-and-seo | full-spectrum)Feed the output into:
TONE.md voice calibration (deliberately differentiate from the dominant tone in the category)Conditional (ask user, default per site type from references/decisions.md):
Ask first: "Is this site subject to French law?" ( yes-FR-operator-or-audience | no-EU-only | no-non-EU). If no, ask whether GDPR or equivalent applies and adjust.
For FR sites:
Delegate the deep audit to trailofbits/skills. The items below are the must-pass checklist.
Ask first: CSP tightness level ( strict-default-src-none | balanced-allow-self | permissive-for-marketing). See references/templates.md for the CSP template per level.
'unsafe-inline' for scripts (use nonces). Verify with curl -sI ... | grep -i content-security-policy.max-age=31536000; includeSubDomains; preload. Submit to hstspreload.org. Verify with curl -sI ... | grep -i strict-transport.DENYnosniffstrict-origin-when-cross-origincurl -sI https://example.com | grep -iE 'content-security|strict-transport|x-frame|x-content-type|referrer-policy|permissions-policy'curl https://securityheaders.com/?q=URL and parse)trailofbits/skills security audit on the codebasesk_, pk_, AKIA, ghp_, BearerDelegate the full audit to AgriciDaniel/claude-seo. The items below are the orchestration list.
See references/templates.md for robots.txt, llms.txt, and manifest.json templates. See references/decisions.md for the AI scraper policy matrix by site type.
/robots.txt present, references sitemap (verify with curl -s https://example.com/robots.txt)
/sitemap.xml present, valid (verify with curl -s https://example.com/sitemap.xml | head -40). Sitemap-index with per-language sitemaps if multilingual.
/llms.txt present (per llmstxt.org spec, verify with curl -s https://example.com/llms.txt)
AI scraper policy encoded in robots.txt. Apply the matrix from references/decisions.md based on site type, then ask via the question tool to confirm each non-default decision — this ships in a public file, get it right before it's crawled.
Schema markup (JSON-LD): Organization + WebSite + BreadcrumbList site-wide; per-page types where applicable ( SoftwareApplication for lib homepages, Article for blog posts, FAQPage for FAQs, Person for author bio). Verify with curl -s URL | grep -A 50 'application/ld+json'. Validate structured data via Google Rich Results Test ( https://search.google.com/test/rich-results) and Schema.org Validator ( https://validator.schema.org) — Rich Results Test checks eligibility for rich snippets; Schema.org Validator catches spec violations that Google may silently ignore.
Meta tags per page: unique <title> (50-60 chars), unique <meta description> (150-160 chars), <link rel="canonical">, <meta name="robots"> if needed
hreflang tags on every page if multilingual (every language version declares all alternates including self). Verify with curl -s URL | grep -i hreflang.
Keyword analysis using both Google Trends and Ahrefs (they answer different questions, not interchangeable):
AI visibility audit via productrank.ai: open productrank.ai in a browser, submit multiple category or product searches, run the full AI SEO report. It audits how the site appears in AI-generated answers (ChatGPT, Perplexity, Gemini, Claude). Flag any zero-visibility categories and surface content gaps the AI graders identify.
Typo and grammar pass on all visible text content
Backlink profile audit: run Ahrefs Backlink Checker and Moz Link Explorer to assess domain authority and surface toxic or broken inbound links before launch — especially critical on migrations to ensure old-domain equity transfers correctly
Internal linking audit: every important page reachable in ≤3 clicks from the homepage
Verify all OG and Twitter tags with: curl -s URL | grep -iE 'og:|twitter:'
og:title, og:description, og:url, og:type, og:site_nameog:image 1200×630px, absolute URL, og:image:width and og:image:height declared, og:image:alt setog:image, not one global. For doc sites: generate dynamically from page title. For blog posts: per-article custom image.og:locale + og:locale:alternate for each language if multilingualtwitter:card=summary_large_image, twitter:title, twitter:description, twitter:image, twitter:site (handle)See references/templates.md for the manifest.json template.
Generate from a single 1024×1024 source PNG using realfavicongenerator.net or favicon.io.
Minimum modern set:
/favicon.ico (multi-res 16/32/48). Verify with curl -sI https://example.com/favicon.ico./favicon.svg with embedded <style>@media (prefers-color-scheme: dark) { ... }</style> for dark mode. Verify with curl -sI https://example.com/favicon.svg./favicon-96x96.png (PNG fallback)/apple-touch-icon.png 180×180px, no transparency, opaque background. Verify with curl -sI./web-app-manifest-192x192.png (Android PWA icon)/web-app-manifest-512x512.png (Android splash)/manifest.json referencing both PNGs, with theme_color, background_color, name, short_name, display. Verify with curl -s https://example.com/manifest.json | jq ..Skip (deprecated):
mstile-*.png (Windows tiles)safari-pinned-tab.svg (deprecated since macOS Big Sur)favicon-16x16.png / favicon-32x32.png (covered by .ico and .svg)HTML head verification:
bash
curl -s https://example.com/ | grep -iE 'rel="icon"|rel="apple-touch-icon"|rel="manifest"'
Delegate to addyosmani/web-quality-skills. The skill covers 150+ Lighthouse audits across performance, accessibility, SEO, and best practices.
npx unlighthouse --site {site} — crawls all pages and runs Lighthouse on each. Surface pages below 90 on any axis before the per-URL checks.web-quality-skills): keyboard nav works for every interactive element, focus rings visible, color contrast ≥4.5:1 for text, all images have alt, heading hierarchy is monotonic (H1 → H2 → H3), ARIA labels on icon-only buttonsInternal cross-linking between owned properties. High-leverage SEO action for any multi-domain owner.
Ask the user: "List the other domains in your ecosystem that are topically relevant to this new site." Then for each one:
Do not over-link. Only cross-link where topically relevant. A doc site for a logging lib should not link to a personal blog about cycling.
After launch, set up a scheduled background agent, such as Hermes or Claude Cowork Routine, that runs weekly to monitor SEO health and surface action items.
See references/weekly-seo-agent.md for the full agent definition, with a concrete equivalent for each harness — copy the block matching your environment into the location it specifies, in the site's repo (or a dedicated ops repo). The agent uses these MCP connectors (or their equivalent API calls):
curl with service account credentials)Ask via the question tool before creating the file: "Set up the weekly SEO agent now?" ( yes-create-agent-file | yes-but-defer | skip-for-now).
When MCP are not available, use Claude for Chrome extension.
At the end of a full run, output a status report grouped by phase:
text
Phase 1: Domain & Infrastructure [9/10 pass]
✓ Cloudflare proxy on
✓ DNS records configured
...
✗ DMARC missing. Fix: add TXT record at _dmarc.example.com with policy v=DMARC1; p=quarantine;...
Phase 2: Analytics & Observability [6/7 pass]
...
Followed by three lists, in order:
End by asking: "Which list do you want to tackle next?" ( blockers | recommended | optional | done-for-now).
references/decisions.md: AI scraper policy matrix by site type, observability tier matrixreferences/templates.md: robots.txt, llms.txt, manifest.json, CSP templates per tightness level, security headers referencereferences/weekly-seo-agent.md: Full definition of the weekly SEO maintenance sub-agent (MCPs, tasks, output format)assets/weekly-seo-*.md, assets/weekly-seo-vibe.toml: per-harness agent-definition files linked from references/weekly-seo-agent.md — copy the one matching your harness