Skills
Launch check
Run this against a site before it goes public and it tells you what would stop it being found: a missing description, a redirect that loops, a sitemap that lists a 404.
When do you reach for Launch check?
Runs the day before a launch and again the hour after the domain is attached, because the second run is the one that catches the host. It reads the pages your build produced, so it works on any framework that outputs HTML, and it probes the live URL with plain requests, so it works on any host. Pair it with the schema audit when the structured data itself needs rewriting rather than checking.
What does it check?
Six things per page and four things about the site, all of them read from what actually ships rather than from the source that was meant to produce it. That distinction is the whole point. On this site, fourteen entry pages passed typecheck, lint and build for a week with no description of their own, because nothing looked at the HTML.
- Per page: one unique title, a hand-written description of 140-160 characters that no other page repeats, an absolute canonical, exactly one H1, an absolute og:image, and a JSON-LD graph with a node whose @id is the page's own URL.
- Site files: robots.txt allows crawling and names the sitemap, every sitemap URL answers 200 on the canonical host with a real last-modified date, llms.txt lists the same pages, and an unknown path returns a real 404 status.
- The host: the canonical URL answers 200, the apex or www twin and every preview host redirect to it in one hop, http goes to https, and no live response still carries a noindex header left over from the build phase.
- Structured data: every block parses, the site declares Organization and WebSite once, every page below the home carries a BreadcrumbList, no @id is defined twice, and nothing emits Review or AggregateRating for ratings that do not exist.
What does it give back?
A list, worst first, in three grades. Blocking is anything that keeps a page out of the index or sends a visitor somewhere wrong. Fix before launch is the rest of the per-page set. Noted is what is fine today and will not be after the first change, such as a slug with no redirect map behind it. Every line names the route, the fault and what it costs in one sentence, so the person fixing it does not need to know the vocabulary.
Why does it end by writing a script?
A check that runs once is a check that gets skipped on the next launch. The last step turns the per-page rules into a small script in the project's own language that reads the build output and fails with a list, and puts it in CI after the build. The rule that goes with it: when a page fails, fix the page. Widening the rule so the build goes green is how a gate stops meaning anything.
What you copy
One block, ready to paste. Nothing else to install unless the block says so.
1---2name: launch-check3description: Check a site before it goes public, the way a crawler will see it.4 Reads the built pages for title, description, canonical, H1, og:image and5 JSON-LD, probes the live host for redirects and stray noindex headers, and6 checks robots, sitemap and llms.txt against each other. Use the day before a7 launch and again once the domain is attached.8---910# Launch check1112Read what ships, never what was meant to ship. Passing typecheck, lint and13build says nothing about the HTML a crawler receives. Every check below runs14against built output or a live URL.1516## 1. Establish what is supposed to exist1718Before checking anything, find out:1920- the canonical origin, including the www or apex decision (one constant in21 the code, a config value, or ask). Every absolute URL below is checked22 against it23- the list of public routes: the sitemap if there is one, otherwise the24 route files or the content data. Note routes that are deliberately kept25 out of the index and why (a redirector, an internal asset page, the 404)26- whether the site is live yet, because a pre-launch site is allowed to27 carry a noindex header and a live one is not2829Say which of these you had to guess. A wrong canonical host makes every30other result wrong.3132## 2. Check every route from the built HTML3334Read the build output (`.next/server/app` for Next.js, `dist/` for Astro,35`out/` or `build/` elsewhere), or fetch each live URL. Per page:3637| Check | Pass |38|---|---|39| `<title>` | present, unique across the site, the page's subject in the first words |40| `meta description` | present, 140-160 characters, hand-written, not repeated on any other page, not the same text as the visible summary |41| `link rel=canonical` | present, absolute, on the canonical origin, points at this page |42| `<h1>` | exactly one |43| `og:image` | present, absolute, returns 200 |44| JSON-LD | every block parses; see step 5 |45| Links | at least one internal link in from another page, one out |4647Routes kept out of the index still need a title and one H1, and are exempt48from the rest. A description of 36 characters is a failure, not a partial49pass. A description that falls back to the summary already on the page is a50failure that the page's author has to fix by writing one.5152## 3. Check the site files against each other5354- `robots.txt`: allows crawling, names the sitemap with an absolute URL,55 disallows only what is meant to be disallowed. If AI crawlers are56 blocked, confirm that was a decision and not a default57- `sitemap.xml`: every URL is absolute, on the canonical origin, answers58 200 without a redirect, and carries a last-modified date that is the day59 the content changed, not the build time. Every public route is in it.60 Nothing that is noindex is in it61- `llms.txt`, if the site has one: lists the same pages the sitemap does62- a made-up path returns HTTP 404, not a 200 page that says "not found"6364The sitemap and llms.txt should be generated from the same list the pages65come from. If they are maintained by hand, say so in the report: that is the66fault that lets a new page ship without being in either.6768## 4. Probe the host6970Run these against the live site and record the status line and the headers71that matter. Replace the host.7273```sh74for url in \75 https://www.example.com/ \76 https://example.com/ \77 http://www.example.com/ \78 http://example.com/ \79 https://example-project.vercel.app/ ; do80 printf '%s\n' "$url"81 curl -sI -o /dev/null -w ' %{http_code} -> %{redirect_url}\n' "$url"82done8384curl -sI https://www.example.com/ | grep -i -E 'x-robots-tag|content-type|strict-transport'85curl -sI https://www.example.com/no-such-page | head -186curl -sI https://www.example.com/sitemap.xml | head -187```8889Pass:9091- the canonical origin answers 20092- the twin host (apex when www is canonical, or the reverse), both http93 variants and every preview or platform host answer 301 or 308 straight to94 the canonical URL, in one hop, keeping the path95- no live response carries `x-robots-tag: noindex`. A launch flag or96 middleware that added this before launch has to be off on the production97 deployment, not just in the code98- the unknown path is a 404 and the sitemap is a 20099100A redirect chain of two hops is a fail. A preview host that serves the site101with a 200 is a fail: it is a duplicate of every page under a second origin.102103## 5. Check the structured data104105Parse every `application/ld+json` block on every route.106107- every block parses, and the page has at least one108- `Organization` and `WebSite` appear once, declared with stable `@id`s,109 and nothing restates them on a lower page110- every page below the home has a `BreadcrumbList`111- one node's `@id` is the page's canonical URL. Without it the page has the112 site's graph and none of its own113- no `@id` is defined twice114- no `Review` or `AggregateRating` unless real ratings exist and a visitor115 can see them on the page116- articles: `author` is a reference to a `Person` node, not a string, and117 `datePublished` plus `dateModified` match the visible dates118119For one URL per page type, run the Rich Results Test and the Schema.org120validator and quote what they said. If the markup itself needs rewriting,121hand over to the schema-audit skill rather than patching it here.122123## 6. Report, worst first124125Three grades, in this order:1261271. **Blocking** - keeps a page out of the index or sends a visitor to the128 wrong place: a live noindex header, a preview host serving 200, a129 sitemap URL that 404s, a canonical on the wrong origin, a redirect loop1302. **Fix before launch** - the per-page set from step 2 and the graph131 rules from step 51323. **Noted** - fine today, wrong after the first change: slugs with no133 redirect map, sitemap dates that equal the build time, a hand-maintained134 route list135136Each line: the route, the fault, and what it costs in one sentence a137non-specialist can act on. "No canonical" is not a reason. "Without a138canonical, the www and apex copies of this page compete with each other" is.139140## 7. Leave a gate behind141142Turn step 2 and step 5 into a script in the project's own language that143reads the build output and exits non-zero with the list. Put it in CI after144the build. It should fail on: no title, duplicate title, description outside145140-160 or repeated, missing or relative canonical, H1 count other than one,146missing og:image, JSON-LD that does not parse, no node at the page's own URL,147any rating markup.148149When a page fails the gate, the fix is the page. Never widen the rule to get150a green build.151
Free to use in your own work, paid work included, no attribution required. Not for repackaging into a product you sell. Full terms.
More in skills
Back to every skills entry.