prestruct v1.2.0 (draft)

prestruct is a build-time SEO prerender tool for Vite + React apps. v1.2.0 is a verification release on top of the 1.1.0 pipeline: the build now verifies its own output through the new prestruct audit verb, every URL seam honors a trailing-slash siteUrl, and the optional render proxy pair ships hardened against the two failure classes its first lives found. Everything below is cumulative on the four-stage pipeline (validate, vite build, inject-brand, prerender) described in the v1.0.0 and v1.1.0 announcements. It will be on npm at tag time:

npm i -D prestruct

No config changes are required to upgrade from v1.1.0. Rows that ask something of an upgrader are marked at the bottom, per changelog contract.

prestruct audit – the baked output verifies itself

A new engine module and CLI verb reads the baked dist/ without touching it and grades every prerendered page:

prestruct audit            # FAIL/WARN ladder; FAIL rows exit 1
prestruct audit --json     # machine digest (fails/warns/pages/sitemapLocs)
prestruct audit --external # HEAD-check external hrefs (warn-grade)
prestruct audit --internal # unresolved internal hrefs (warn-grade)

FAIL rows cover the head-hygiene contract: missing title/description, non-absolute canonical, duplicate head tags, missing og/twitter core, SVG og:image, unparseable JSON-LD, a 404 without noindex, and sitemap/robots gaps. WARN rows never fail a build: length bands, companion tags, disk ranges, h1 hygiene. The scaffolded build pipeline now ends in the audit, so a regression fails the build instead of shipping quietly.

Every URL seam honors the trailing slash

siteUrl: 'https://example.com/' produced https://example.com// interpretations in canonical tags, sitemap locs, prerendered metas, and the usePageMeta base. The slash is now stripped at every seam; a trailing-slash siteUrl is simply correct. No config change needed.

The proxy pair points hardening

The template’s two proxy runtimes stay separate files, but this pass hardened both the same way their first production lives pointed at:

The hardening is adversarially covered by the pack that ships in the repo, not narrated by it: 54-row ledger, 0 exploited at harness 1.1.0.

Smaller, honest fixes

Upgrader actions (v1.1.0 -> v1.2.0)