Every other framework, rendered.
SvelteKit, Astro, SolidJS, Ember, Lit web components, Backbone, Marionette, Stencil — and the framework you'll be on next year. UpRender is framework-agnostic by design.
Most prerender services were built around a specific framework's quirks. UpRender was built around a different principle: if it runs in a real browser, we can render it. That means Svelte and SvelteKit, Astro islands, Solid's fine-grained reactivity, Ember's run loop, Lit's Shadow DOM, and the legacy Backbone or Marionette app you inherited — all handled by the same edge layer.
The problem every JS framework shares.
Different frameworks have different reactivity models, build outputs, and hydration patterns. The SEO problem they share is identical: the initial HTML the bot receives is incomplete, and most crawlers don't execute JavaScript well enough to fill in the gap.
SvelteKit's adapter-static ships static routes, but anything behind +page.ts load functions that depend on browser is client-rendered. Astro islands are server-rendered shells with client-hydrated JS — fine for Googlebot, problematic for Bingbot timeouts and AI crawlers. SolidJS, Ember, Lit all share the same fundamental shape: an empty (or partial) HTML root that the framework fills in.
Legacy stacks make it worse. Backbone, Marionette, and pre-Angular SPA frameworks have no SSR story at all. Custom-built SPAs from the 2014–2017 era are typically running with <div id="app"> and a giant minified bundle. Replacing them isn't on the roadmap. UpRender doesn't ask you to.
- SvelteKit
+page.tsloadfunctions depending onbrowserare bot-invisible - Astro client-only islands aren't rendered by non-JS crawlers
- SolidJS, Qwik, Ember, Lit all render in-browser by default — same SEO surface as React
- Lit / Web Components: Shadow DOM is opaque to many crawlers without
slotprojection - Legacy Backbone / Marionette / Knockout apps have no SSR option at all
- Custom in-house frameworks — common in older enterprise stacks — get no community fix
One render layer, every framework.
UpRender runs your app in a real headless browser. It doesn't parse your source code, doesn't care about your build tool, doesn't have framework-specific hooks. Whether you've shipped SvelteKit, Astro, Solid, Ember, Lit, Stencil, Backbone, or a hand-rolled framework an ex-engineer wrote in 2016 — UpRender opens the URL, waits for the page to settle, and returns the HTML.
That's the entire trick. Framework-agnostic by design means you get the same SEO outcome regardless of what powers the frontend. It also means UpRender doesn't break the day your team adopts the next framework.
What changes the day you ship.
Framework-agnostic by design
No framework adapters, no version-pinned plugins. If a real browser can render it, UpRender can deliver it.
Legacy stack lifeline
Backbone, Marionette, Knockout, custom in-house SPAs — UpRender makes them indexable without a rewrite.
Shadow DOM aware
Lit, Stencil, and Web Components apps with closed Shadow DOM are rendered with proper light-DOM projection in the snapshot.
Future-proof
When you migrate from React to Solid, or from Angular to Svelte, you don't migrate UpRender. It keeps working.
Static site + island hybrids
Astro, Eleventy + Alpine, Hugo + Lit components — hybrid stacks with client-hydrated islands work cleanly.
Same edge cost
No premium for niche frameworks. The Svelte plan is the React plan is the AngularJS plan.
AI crawler support across every stack
GPTBot, OAI-SearchBot, ClaudeBot, and Claude-SearchBot get fully-rendered HTML regardless of framework. Your content becomes citable in AI search results.
No framework-specific plugins to maintain
Unlike SSR solutions that need framework-specific adapters (SvelteKit adapter-node, Astro adapter-cloudflare), UpRender works the same way for every stack. One edge worker, zero adapters.
Enterprise custom SPAs supported
Large enterprises often run custom-built SPA frameworks with no community SSR solution. UpRender renders them as-is because it operates at the browser level, not the framework level.
Micro-frontend architectures
Module federation, single-spa, and custom micro-frontend setups work cleanly. UpRender renders the composed page regardless of how many frameworks are involved.
Sound familiar?
You maintain a legacy Backbone application with no SSR path
The app was built in 2014. It uses Backbone with hash routing and a custom template engine. Nobody on the current team wrote it, and rewriting isn't in the budget. UpRender makes it indexable today — hash routing, legacy templates, and all — without touching a line of code.
Your Astro site's interactive islands aren't visible to Bing and AI crawlers
Astro server-renders the shell, but your interactive React/Svelte islands (product configurators, pricing calculators, search widgets) only hydrate client-side. Googlebot sees the shell. Bingbot, GPTBot, and social bots see nothing from the islands. UpRender captures the fully-hydrated page, islands included.
Your team is migrating from Ember to SvelteKit
The migration will take two quarters. During the transition, some routes serve Ember and others serve SvelteKit. UpRender handles both frameworks behind the same edge worker — zero SEO regression during the migration, zero framework-specific configuration.
Your design system uses Stencil web components across multiple apps
Your enterprise design system generates Web Components via Stencil. Multiple apps (React, Angular, vanilla JS) consume them. Shadow DOM internals are opaque to crawlers. UpRender captures the composed output with slotted content projected into the snapshot.
What crawlers actually see.
<!DOCTYPE html>
<html lang="en">
<head>
<title>My App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="https://uprender.io/build/bundle.js"></script>
</body>
</html><!DOCTYPE html>
<html lang="en">
<head>
<title>Software Engineering Jobs in Berlin | TechJobs</title>
<meta name="description" content="1,247 open positions..." />
<meta property="og:title" content="Engineering Jobs in Berlin" />
<script type="application/ld+json">
{"@type":"JobPosting","title":"Senior Frontend Engineer","salary":"€85K"}
</script>
</head>
<body>
<div id="app">
<header>TechJobs — Find your next role</header>
<main>
<h1>Software Engineering Jobs in Berlin</h1>
<div class="filters">Remote · Full-time · €60K+</div>
<ul class="job-list">
<li>Senior Frontend Engineer · Startup · €85K</li>
<li>Backend Lead · Scale-up · €95K</li>
<li>DevOps Engineer · Enterprise · €78K</li>
</ul>
</main>
</div>
</body>
</html>Regardless of framework — Svelte, Ember, Backbone, or custom — UpRender delivers fully-rendered HTML with complete meta tags and structured data.
Same edge worker, any framework.
Because UpRender doesn't introspect your framework, the integration is identical across SvelteKit, Astro, Solid, Ember, Lit, and legacy SPAs. Deploy the worker, point bot traffic at UpRender, ship.
// Works for SvelteKit, Astro, Solid, Ember, Lit, Backbone — any framework
const BOT_UAS = [
'googlebot', 'bingbot', 'yandex', 'duckduckbot',
'gptbot', 'chatgpt-user', 'oai-searchbot', 'claudebot', 'claude-user', 'claude-searchbot',
'facebookexternalhit', 'twitterbot', 'linkedinbot',
'whatsapp', 'slackbot', 'discordbot', 'pinterestbot',
];
export default {
async fetch(request, env) {
const ua = (request.headers.get('user-agent') || '').toLowerCase();
if (!BOT_UAS.some((b) => ua.includes(b))) return fetch(request);
return fetch(
'https://render.uprender.io/render?url=' +
encodeURIComponent(request.url),
{ headers: { 'x-uprender-token': env.UPRENDER_TOKEN } },
);
},
};- 1Deploy the worker above to Cloudflare, Fastly, or CloudFront Functions
- 2Set your UpRender token in the worker's environment
- 3For Shadow-DOM-heavy apps (Lit/Stencil), enable
shadowDomMode: 'open'in your UpRender project config - 4For legacy hash routing (Backbone, AngularJS), enable
rewriteHashbang: true - 5Validate with
curl -A 'Googlebot' https://yoursite.com/route— clean HTML, regardless of framework
One Other frameworks integration. Every meta-framework.
SvelteKit
Adapter-node, adapter-static, adapter-cloudflare
Astro
Static + island hydration; React/Vue/Svelte islands
SolidJS / Solid Start
Fine-grained reactivity
Qwik / Qwik City
Resumable apps
Ember
Ember Octane, classic, FastBoot complements
Lit + Web Components
Open / closed Shadow DOM, slotted content
Stencil
Ionic web component projects
Backbone / Marionette
Legacy SPA recovery
Knockout, Aurelia, Mithril
Niche & legacy frameworks
Custom in-house SPAs
Hand-rolled frameworks supported as-is
"The fastest fix we've ever shipped to production. Other frameworks stayed Other frameworks. Crawlers finally got HTML."
Teams shipping Other frameworks with UpRender.
Harbor recovered 621% of lost traffic after a botched replatform
Six months post-migration, this top US podcast network was at 14% of pre-launch organic traffic. UpRender brought it back — then past baseline.
Loomscape indexed 800 pages on day one
Two weeks before launch, their React marketplace had 0 indexed pages. A 30-minute UpRender setup hit their launch milestone.
The questions teams actually ask.
UpRender doesn't have a framework allowlist. We run your app in a real browser and snapshot the resulting HTML. If a human user can see content in their browser, UpRender can deliver that content to crawlers — full stop. We've shipped customers on Mithril, Aurelia, custom frameworks, and even old jQuery-heavy stacks with client-side templating.
Open Shadow DOM is rendered with its slotted content visible to crawlers. Closed Shadow DOM can be configured per-project; if your components need their internals exposed to bots, we light-DOM-project the content into the snapshot. Lit, Stencil, and hand-authored Web Components are all production-tested.
Astro server-renders the shell, but client-hydrated islands (`client:load`, `client:visible`) are JavaScript-dependent. For Googlebot the SSR shell is enough; for Bingbot, AI crawlers, and social bots, the islands stay invisible. UpRender ensures every bot sees the fully-composed page, islands included.
Yes, and it's one of our most common use cases. Legacy SPAs that predate the SSR ecosystem benefit the most from UpRender because they have no other path to clean indexation. Hash routing, custom router libraries, and ancient templating engines all render correctly.
Qwik's resumable model means most content is in the initial HTML already, which is fantastic for Googlebot. UpRender still handles the residual cases — interactive routes that depend on container state, AI bots with strict timeouts — and offloads bot traffic from your origin.
Stencil generates Web Components that render via the browser. UpRender snapshots the fully-composed result, including Stencil component internals projected via slots. Common in Ionic and enterprise design-system stacks.
Yes. Because UpRender is framework-agnostic, a React-to-Solid (or Angular-to-Svelte) migration doesn't change anything in your UpRender setup. Your edge worker keeps detecting bots and proxying them; we keep rendering whatever your app outputs.
Yes. Whether you use module federation, single-spa, or a custom composition layer, UpRender renders the fully-composed page in the browser. It doesn't care that the page was assembled from multiple independently-deployed frontends — it snapshots the end result.
SvelteKit's form actions work server-side and don't affect crawlability. What does affect it: `+page.ts` load functions that depend on `browser` or return client-only data. UpRender catches those gaps by rendering the full page, including any client-dependent load function output, before returning HTML to the crawler.
Ship Other frameworks that bots can read.
Free trial. No credit card. Most Other frameworks teams see their first indexation lift inside 48 hours.