Release history for prestruct. Commit history is the detailed source
(git log --oneline); the npm package sits at 1.1.0 (published from
the v1.1.0 tag via the Trusted-Publisher workflow, provenance-attested),
and main carries the next release’s pins.
Unreleased (1.2.0 on the ladder; npm stays at the v1.1.0 tag)
- Peer ranges are bounded to the proven matrix (#58):
react >=18 <19,react-dom >=18 <19,react-router-dom >=6 <8,vite >=5 <8. The proven set is vite 6.4.5, react 18.3.1, and router majors 6 and 7 (7.18.4 baked the example 8/8 pages in CI); an install of vite 8 or react 19 now refuses cleanly at ERESOLVE instead of shipping ungraded. Ceilings move only when the next proof lands: vite 7 cleared its lane first (example bake 8/8 byte-equivalent to the vite 6 output modulo asset hashes, audit clean, no ssrLoadModule deprecation noise), so the example lane itself now runsvite ^7.3.7while the init template stays on 6. prestruct auditjoins the CLI (ported/remapped from the family audit engine): grades the BAKEDdist/– FAIL rows exit 1 (missing title/description, non-absolute canonical, duplicate head tags, missing og/twitter core, SVG og:image, unparseable JSON-LD, 404 without noindex, sitemap/robots); WARN rows report-grade. Flags:--json,--external(HEAD-checks external hrefs, warn-grade),--internal(unresolved internal hrefs, warn-grade). Scaffolded builds now END in the audit, so a regression fails the build. Cherry-pickers: drop inscripts/audit.js+ add&& node scripts/audit.jsto the build script.- Honest sitemap lastmod + XML loud-fail: per-route lastmod from the
dist file’s own preserved mtime (byte-identical rebuilds skip the
write); sitemap values survive
assertXmlSafe– a control character fails the build instead of shipping a corrupt sitemap. - 404 head tags rebuilt from capture groups (#33): the four 404-page
OG/twitter/description/canonical tags no longer ship literal
$1/$2garbage (function replacers use the returned string literally). - Trailing-slash
siteUrlno longer doubles the canonical (#53): stripped at every URL seam (canonical/og, prerender metas, sitemap, 404, the usePageMeta base). No config change needed. - CLI refuses unknown dash-word flags (#54) (
prestruct build --Forcefails loud instead of riding as an unrelated flag) and unknown config keys print warnings (#52) (diagnostics, never a gate). - Structured
ogImageobject form{ url, width, height, alt, type }emits the og:image companion tags; object shape graded by validate-config (proposal #38). - Proxy pair hardening (template scripts): VPS eviction touches only
cache-shaped files (an operator’s mounted files survive; cap is
PRESTRUCT_CACHE_MAX_MB, default 500); Worker KV keys over the 512-byte cap fall back toprestruct:sha256:<hex>(a long query used to reject the KV put/get AFTER a successful render, turning the response path into a 500). The in-repo crashtest pack (v0.4.0) seeds an oversized variant under both key shapes with an opposed marker, so a fallback regression fails CI.
1.1.0 (released from the v1.1.0 tag)
- Deep engine imports join the package contract:
prestruct/hooks,prestruct/islands, and aprestruct/engine/*passthrough (previouslyMissing specifierfor any non-mapped path). Docs still recommend the scaffold-relative import for template users. status.jsonmoves out ofdist/: build telemetry now lands in PROJECT-ROOT.prestruct/status.jsonbeside the route cache, and the wall-clockgeneratedAtfield is dropped. Anything insidedist/deploys to a public URL (issue 23) and a timestamp inside it broke byte-identical build parity. Action for upgraders: re-point any CI step readingdist/.prestruct/status.jsonat the project root.- Release archive (GitHub zip) now ships a working test battery: imports
remapped to the template layout, test-only devDependencies declared, and
the battery runs inside
init/BEFORE the zip is built (136/136). - Release notes list the real archive contents (the v1.0.0 body named
ssr.config.js, which the zip does not contain).
1.0.0 (published)
- npm package shape:
bin/cli.mjs(init/build/validate/clean),engine/single-source scripts synced intoinit/+example/ - CLI realizes
--force/--cleanpass-through (engine already accepted them; the CLI previously dropped both silently) - Incremental prerender cache (
.prestruct/cache/) + opt-inconfig.robotsgeneration - Bot proxy pair (VPS + Worker) with constant-time cache-refresh secret compare and a bounded render-concurrency queue
- 23 guides under
docs/with Pagefind search
v0.2.4 (May 2026)
Changes since v0.2.2:
Core Features
- Islands architecture for dynamic client-only content
- Proxy support for bot rendering (VPS and Worker)
- BrowserRouter isolation pattern
- Prerender pipeline improvements
- ssrLoadModule over vite build –ssr (required for proper StaticRouter context)
- Dynamic islands with client-only rendering
- Proxy cache key using SHA-256 hash
- Fix: 404 pages get noindex meta to prevent crawling
- Fix: usePageMeta adds useLocation to deps for query param navigation
- Fix: inject-brand title falls back to siteName, only injects description if truthy
Docs: Guides
- Docs: prestruct guide set covering getting started to advanced
Docs: UI/UX
- Docs: Pagefind search integration with Cmd+K shortcut
- Docs: Theme - menu system, light/dark mode, mobile improvements
- Docs: PrismJS syntax highlighting with copy buttons
Docs: Infrastructure
- Docs: Jekyll layout fixes
- Docs: GitHub Pages baseurl config
- Docs: Artifact deploy instead of branch deploy (peaceiris bug)
v0.2.2 (Stable)
Initial stable release:
Core
- Vite integration for React SSR
- Prerender pipeline for build-time static generation
- Cloudflare Pages deployment
Architecture
- ssrLoadModule for SSR rendering
- Component islands with lazy mounting
- Build-time prerendering
Guides
- Getting Started, Configuration, Vite Integration
- SEO, Performance, Routing, Architecture
- Troubleshooting, Migration, Advanced Islands
See git log for detailed history:
git log --oneline
Full release notes: https://github.com/dhaupin/prestruct/releases
Next steps
- Roadmap - what is planned next
- Contributing - how to get a change in
- Announcement: v1.0.0 - first stable release notes
- Announcement: v1.1.0 - release notes for the previous tagged version
- Announcement: v1.2.0 - release notes for the current version