Spache
Compare rendering approaches
These approaches can all make a JavaScript app’s content available as HTML. The useful comparison is who receives that HTML, where rendering happens, and which parts of freshness and delivery your team operates.
| Approach | Who gets prepared HTML? | Rendering and freshness | What your team owns |
|---|---|---|---|
| Spache | Visitors and crawlers | Spache renders and serves cached routes, then refreshes them using configured cache and validation behavior. | Configure your app origin, routes, cache behavior, and domain. |
| Astro | Visitors and crawlers | Render at build time or on demand, then configure how generated or server-rendered pages stay current. | Choose rendering modes, islands, data loading, deployment, and content freshness. |
| Next.js | Visitors and crawlers | Render in the build or server, with freshness controlled by the app’s caching and revalidation strategy. | Build the server-rendered app and choose route, data-cache, and revalidation behavior. |
| react-snap | Visitors and crawlers | Render routes in a headless browser during the build and deploy the generated HTML files. | Run the browser crawl in CI, ensure routes are found, publish snapshots, and regenerate them when content changes. |
| Prerender.io | Crawlers; visitors use the normal site path | Render crawler requests on cache misses and serve cached HTML to later crawler requests. | Integrate crawler detection and routing, and configure cache expiration or recaching. |
Open a comparison for a closer look at the trade-offs: Astro, Next.js, react-snap, and Prerender.io.
Mid Engine Co: a real Spache case study
Visit midengineco.com, a custom storefront backed by Shopify.
It was built as a plain single-page app with Mithril. During development, no server-side rendering work or SSR framework was added; the app loads its product data in the browser, manages each visitor’s cart there, and sends checkout to Shopify.
The existing Render-hosted app was configured as the Spache origin, then its public domain was connected and pointed through Spache. Spache renders and serves prepared product pages, while the visitor’s SPA still starts normally. Public JSON GET responses are captured automatically for startup replay; the visitor’s cart remains their own live browser session. No SSR conversion or separate static HTML publishing pipeline was needed.
