Open source / MIT
Your React app,
visible to search engines.
Search engines crawl HTML. React apps serve an empty shell. Prestruct fixes that: rendering each route to static HTML at build time with correct SEO meta tags, Open Graph, schema.org, and caching headers. No framework migration, no edge runtime, just a smarter build step.
Build pipeline
vite build
Hashed JS + CSS bundles to dist/
inject-brand.js
Global SEO meta into index.html
prerender.js
Each route rendered to static HTML
CF Pages deploy
Globally cached, correct HTTP status
What you gain
The Prestruct engine is a purpose built tool, that delivers SEO server side rendering (for crawlers), while being completely serverless on Cloudflare Pages.
rank
Crawlable content
Every route serves full HTML to bots. No JavaScript execution required. Googlebot, Bingbot, and social crawlers see exactly what a user sees. Your words are in the code that bots see.
CTR
Rich search previews
Per-route title, description, and canonical baked into HTML. Your search result shows the right snippet for each page, not a generic site-wide fallback.
share
Social cards that work
og:title, og:description, og:url, og:image correct on every route. When someone shares your /features page, the card shows features content, not just your homepage organization.
trust
Structured data
JSON-LD injected from your config into every page head. Organization, WebSite, Product, Article: whatever your app needs to earn rich results.
speed
Correct cache headers
Hashed JS/CSS assets cached immutably. HTML revalidates on every request. Users always get fresh content, browsers never re-download unchanged bundles.
zero cost
No infrastructure change
Prestruct deploys to Cloudflare Pages as static files. No server, no edge worker, no new runtime dependencies. The tradeoff: Build time goes up by about 2 seconds for every 10 prerendered routes.
Verify it yourself
Every tool below accepts a URL and reports what it finds. Use them on this site or on your own, after integrating Prestruct.
Dynamic islands
Prerendered HTML is the same for every visitor. Islands punch holes through it for content that isn't: cart state, recently viewed items, logged-in user widgets. Each island mounts its own React root after hydration. Crawlers see a fallback. Humans see live data.
Immediate
Mounts right after hydration. For above-the-fold widgets that need to be interactive as soon as possible.
On scroll
Mounts via IntersectionObserver when the element enters the viewport. Nothing loads until the user reaches it.
Background
Mounts via requestIdleCallback during browser downtime. No competition with paint or interaction.
This site is the proof
fetching...