SvelteKit sites often mix prerendered pages, server-rendered routes, endpoints, and client navigation. That flexibility is useful, but it also means a route can fail in more than one layer. A QA checklist should make those layers visible.

SvelteKit route inventory starter

A simple file-based route inventory can catch missing pages before a deeper crawl.

import { readdirSync, statSync } from "node:fs";
import { join } from "node:path";

function routeFiles(dir, prefix = "") {
  return readdirSync(dir).flatMap((name) => {
    const full = join(dir, name);
    const next = join(prefix, name);
    if (statSync(full).isDirectory()) return routeFiles(full, next);
    return name.startsWith("+page.") ? ["/" + prefix.replace(/\\/g, "/")] : [];
  });
}

console.log(routeFiles("src/routes").sort());

SvelteKit-Relevant Workflow

Static pass for prerendered routesUse the static crawler for HTML-first SvelteKit surfaces and documentation-style pages.Open full image
Browser pass for hydrated routesUse the JavaScript crawler when route health depends on client navigation, load data, or authenticated state.Open full image

Checklist

  • crawl prerendered public routes and confirm canonical output
  • test dynamic routes with missing or retired slugs
  • watch for load-function errors that render partial pages
  • confirm old migration URLs redirect or return clean 404s
  • run a browser pass for client navigation and authenticated surfaces

Why SvelteKit needs both checks

A static pass is fast and useful for public route coverage. A browser pass catches the failures that only appear after hydration, navigation, or data loading.

That split mirrors the broader rule for modern frameworks: use the simplest crawler that can see the failure mode you care about.

Related Resources