Skip to content

FAQ ​

Do I still need prerendering if Google renders JavaScript? ​

Googlebot renders most JavaScript, but on a delay and not for every page. Other search engines and, crucially, social media scrapers (Facebook, X, LinkedIn, Slack, WhatsApp, Discord) do not run JavaScript at all. If you need reliable indexing on non-Google engines, or working link previews, prerendering still helps. If you can adopt SSR or static generation, that is the better long-term choice.

Will this hurt my SEO / is it cloaking? ​

Serving crawlers a rendered version of the same content a user sees is dynamic rendering, not cloaking. Cloaking is showing different content. Keep the prerendered HTML faithful to the user experience.

Does my app need any code changes? ​

No. The renderer loads your app in a real browser exactly as a user would. You may optionally tune extraWaitMs or add a readiness flag for pages that render late.

How do I return a real 404 for unknown routes? ​

An SPA typically serves index.html with 200 for every path. Render a <meta name="prerender-status-code" content="404"> tag in your not-found route and have your reverse proxy read it, or serve those routes from the server with the correct status.

The rendered HTML is missing content that appears in a browser ​

Usually the content renders after the renderer captures the page. Options:

  • Increase --extra-wait / extraWaitMs.
  • Switch --wait-until to networkidle0.
  • Increase --timeout if the page is slow.
  • Check that you are not blocking a resource type the page needs (do not block script or xhr/fetch).

How much memory does it use? ​

A single render can briefly use a few hundred MB. Run it with a memory limit (1 GB is a safe start for low concurrency) and restart the process periodically to reclaim memory.

Can it handle many requests at once? ​

Renderer opens one browser tab per render() call against a shared browser, so concurrency works, but each tab costs memory and CPU. Put a concurrency limit in your proxy and enable caching.

Does it execute the page's JavaScript? Is that safe? ​

Yes, it runs the page like a browser. Only render pages you trust - set allowedOrigins to your own site. See Security.

Can I use my system Chrome instead of the bundled one? ​

Yes. Set PUPPETEER_EXECUTABLE_PATH or pass --executable-path. To skip the download at install time, set PUPPETEER_SKIP_DOWNLOAD=1.

Does it work on serverless / Lambda? ​

It needs a Chromium binary and enough memory and execution time. It is possible with a Chromium layer built for the platform, but a long-running container is simpler and more predictable. See Docker.

What Node.js versions are supported? ​

Node.js 20 and newer.

Is there a "wait for selector" option? ​

Not built in. Use extraWaitMs, choose a stricter waitUntil, or wrap the Renderer in your own retry logic.

How do I cache rendered pages? ​

Use --cache-ttl for the built-in in-memory cache, or cache the response at your proxy/CDN. See Caching.

Released under the MIT License.