// the find
stereobooster/react-snap
👻 Zero-configuration framework-agnostic static prerendering for SPAs
react-snap prerenders a client-rendered SPA into static HTML by crawling it with headless Chrome, so you get real HTML for SEO and social previews without rewriting your app for SSR. It's aimed at people with a create-react-app or similar build who want static output as a postbuild step, and it also works with Vue since it doesn't depend on React internals.
Genuinely zero-config for the CRA case — add the postbuild script, swap render for hydrate, done, no server-rendering code to write or maintain. Using a real browser instead of a JS-only renderer means you don't hit the usual SSR gaps around WebGL, Blobs, or other browser-only APIs. The npm package ships uncompiled, so forking it and pointing package.json at a GitHub URL is a real escape hatch, not just a suggestion. It also does actual load-performance work (critical CSS inlining via minimalcss, AJAX response caching) rather than just dumping static markup.
The caveats section is longer than the usage docs — async/code-split components, Redux state, service worker fallback URLs, JSS rehydration, and even Semantic UI's class-name sorting all need manual hacks to work right, which means 'zero configuration' only holds for fairly simple apps. It depends on Puppeteer, which is a heavy, sometimes flaky dependency in CI and containers (there's a whole subsection on sandboxing workarounds for Docker/Alpine and a Heroku-specific buildpack chain). The project's reference points — Travis CI, create-react-app, loadable-components 2.2.3 — all read as pre-2020, and the approach it solves for has largely been absorbed into framework-native SSG/SSR (Next.js, Astro, Vite plugins), so you're adopting a workaround for a problem most current stacks don't have anymore. The README itself admits the config surface outruns the docs ('not all options are documented yet, check defaultOptions in index.js').