Full Browser Rendering at the Edge
SPAs, React apps, and JS-heavy sites become instantly readable by search bots. A real headless browser renders your pages into complete HTML -- automatically cached and served at the edge.
Works with
GooglebotBingbotGoogle-InspectionToolYandexDuckDuckBotBaiduspiderRender and control every detail
Full browser rendering with per-domain configuration and custom script injection.
Feature 01
Browser Rendering Engine
Wrenda launches a real headless browser at the edge. Your SPA boots, JavaScript executes, APIs resolve, and the fully rendered DOM is captured as static HTML. Every configurable detail -- device type, viewport, wait strategy -- is tunable per domain.
- Real Chromium-based browser at 300+ edge locations
- Configurable device: mobile (375x812) or desktop (1920x1080)
- Wait strategies: networkidle0, networkidle2, domcontentloaded
- Adjustable wait time, timeout, and script stripping
- Results cached in KV with configurable TTL
Per-domain configuration
{
"device": "mobile",
"viewport_width": 375,
"viewport_height": 812,
"wait_until": "networkidle2",
"wait_time": 3000,
"timeout": 30000,
"strip_scripts": true
}Before vs after rendering
What bots see (no pre-rendering)
<div id="root"></div> <script src="/bundle.js"></script> <script src="/vendor.chunk.js"></script> <script src="/app.chunk.js"></script> <!-- That's it. No content. --> <!-- Googlebot sees an empty page --> <!-- Your rankings suffer silently -->
What bots see (with Wrenda)
<!DOCTYPE html>
<html lang="en">
<head>
<title>Marathon Shoes | AcmeSport</title>
<meta name="description" content="...">
</head>
<body>
<h1>Marathon Running Shoes</h1>
<nav>Home > Shoes > Marathon</nav>
<div class="product-grid">
<article class="product-card">
<h2>Apex Pro</h2>
<p>Carbon fiber plate, 6.8oz</p>
<span class="price">$189.99</span>
</article>
<!-- Full rendered DOM -->
</div>
</body>
</html>Feature 02
Pre-render Scripts -- Custom JS Injection
Dismiss cookie banners
// Runs inside the headless browser before capture
const banner = document.querySelector(
'[class*="cookie"], [id*="consent"]'
);
if (banner) {
const btn = banner.querySelector(
'button[class*="accept"], button[class*="agree"]'
);
if (btn) btn.click();
else banner.remove();
}Expand collapsed content
// Expand all accordions and details elements
document.querySelectorAll('details')
.forEach(d => d.open = true);
document.querySelectorAll('[aria-expanded="false"]')
.forEach(el => el.click());
// Wait for animations to complete
await new Promise(r => setTimeout(r, 500));Pre-render scripts are custom JavaScript snippets that run inside the headless browser instance before the DOM is captured. They let you manipulate the page exactly the way you need it -- dismissing overlays, expanding hidden content, triggering lazy loads, or removing elements you don't want crawlers to see.
Common use cases
- Cookie Banner Dismissal -- Auto-accept or remove GDPR/CCPA consent popups
- Accordion Expansion -- Open all collapsed sections so content is visible
- Lazy Load Triggers -- Scroll or click to force images and content to load
- Element Removal -- Strip chat widgets, modals, or interstitials before capture
Scripts run per domain, in order
Script 1: dismiss-cookies.js (priority: 1) Script 2: expand-accordions.js (priority: 2) Script 3: remove-chat-widget.js (priority: 3) # All execute before DOM capture # Configurable per domain in dashboard
Four steps, fully automatic
From bot detection to cached HTML -- the entire pipeline runs at the edge.
Step 01
Search bot detected
Incoming requests are fingerprinted by user agent. Googlebot, Bingbot, Google-InspectionTool, and other traditional crawlers are identified instantly -- human visitors are never affected.
Step 02
Headless browser launches at the edge
A headless Chromium instance spins up on the global edge network. Your page loads with the configured viewport, device emulation, and wait strategy -- exactly as a real browser would render it.
Step 03
Page rendered with scripts
JavaScript executes, APIs resolve, SPAs hydrate. Pre-render scripts run to dismiss cookie banners, expand accordions, and trigger lazy loads. The full DOM is captured as clean, static HTML.
Step 04
HTML cached and served
The rendered HTML is cached at the edge with your configured TTL. Subsequent requests for the same URL are served instantly from cache -- no browser needed until the cache expires.
Built for JavaScript-heavy sites
If your site relies on client-side rendering, search bots are missing your content.
SPAs & React Apps
Single-page applications built with React, Vue, Angular, or Svelte render empty divs without JavaScript. Wrenda serves fully hydrated HTML to every crawler.
- React, Next.js, Vue, Nuxt, Angular, Svelte
- Client-side routing fully resolved
- Dynamic imports and code splitting handled
Dynamic Dashboards
Admin panels, analytics dashboards, and data-heavy UIs that load content via APIs. Bots see the complete rendered state, not loading spinners.
- API-driven content fully resolved
- Charts and tables rendered as HTML
- Authentication-gated content supported
JS-Heavy Marketing Sites
Marketing sites with animations, carousels, lazy-loaded images, and interactive elements. Every piece of content is visible to crawlers.
- Lazy images and videos loaded
- Scroll-triggered content captured
- Third-party widget content included
Verify it instantly
One curl command. Full rendered HTML with confirmation headers.
# Request as Googlebot curl -I -H "User-Agent: Googlebot/2.1" \ https://yoursite.com/products/shoes # Response headers HTTP/2 200 content-type: text/html; charset=utf-8 x-pre-rendered: true x-crawler-action: pre-render x-render-device: mobile x-render-viewport: 375x812 cache-control: public, max-age=3600 # Full rendered HTML body follows # SPAs fully hydrated, JS executed, scripts applied <!DOCTYPE html> <html lang="en"> <head><title>Marathon Shoes | AcmeSport</title></head> <body> <h1>Marathon Running Shoes</h1> <div class="product-grid">...</div> </body> </html>
<3s
Cold render time
<5ms
Cached response time
300+
Edge locations
Pre-Rendering FAQs
How JavaScript-heavy sites get rendered for crawlers without impacting human users.
If your site uses React, Vue, Angular or any client-rendered framework, search bots and AI crawlers may see a near-empty HTML shell instead of your actual content. Pre-rendering executes the JavaScript on a headless browser and serves the fully-rendered HTML to crawlers. Result: every word, link and schema tag is in the source where Googlebot, Bingbot and AI engines can read it.
SSR runs on every request to your origin and adds latency for human users. Pre-rendering runs only when a search bot or AI crawler is detected, on demand, on the edge — humans still get your fast client-rendered app. There's no code change to your site; you just point your domain at Wrenda.
Pre-rendered HTML is cached in the edge KV for a configurable TTL (default 1 hour). When the cache expires, the next crawler request triggers a fresh render. You can purge the cache for any path manually from the dashboard.
No. Pre-rendering is an officially supported technique — Google's own dynamic-rendering documentation describes the same pattern. We serve the same content humans would see if their browser executed the JavaScript; we just do the execution upstream so the bot doesn't have to.
Any URL that depends on client-side JavaScript to display its main content: SPAs, dashboard-style apps with public content, e-commerce product pages with dynamic loading, blog posts hydrated from a headless CMS. Static HTML pages don't need it — they should pass through.
Per-domain settings let you set device profile (mobile/desktop), viewport size, network-idle wait, max wait time and JavaScript execution toggles. You can also inject custom JS to dismiss cookie banners, log in, or trigger lazy-loaded content before the snapshot.
Get Started
Stop losing rankings to blank pages
Enable pre-rendering in minutes. No SSR migration, no infrastructure changes -- just point your domain and go.
Enable Pre-rendering14-day free trial -- No credit card required