// RENDERED TWINS

If your site is a JavaScript app, AI may be reading nothing.

We read your pages the way a browser does, and publish a readable markdown twin at your edge — so an assistant that never runs your JavaScript still gets your real content.

Your site is not broken and your rankings may be fine — search engines run JavaScript. This is about the other readers: the ones that ask your server for a page and use what comes back.

check your own site free how the edge serves it
A Studio feature · your twins stay approval-gated · your audit stays a plain fetch.
// THE MEASUREMENT

What your server actually hands out.

We fetch your page without running any JavaScript, because that is what we can actually measure. On a JavaScript app, what comes back is an empty container and a script tag. We are not claiming to know what happens inside anybody's crawler — we can't see in there, and we won't pretend to. What we can say is the part we measure: if a reader does not execute your bundle, an empty container is everything it has. You can check this one yourself in a terminal: curl -s https://yoursite.com/ | wc -c.

// WITHOUT JAVASCRIPT — THE WHOLE PAGE
<!doctype html>
<html lang="en">
  <head>
    <title>Aurora Fleet — route planning</title>
    <meta name="description" content="Route planning for mid-size fleets.">
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/assets/index-8f21c0.js"></script>
  </body>
</html>

Every word a plain fetch can read: a title, a description, and a script tag. The product copy, the pricing, the FAQ — all of it arrives later, in JavaScript.

// THE TWIN WE PUBLISH
# Aurora Fleet

Route planning for mid-size fleets. Aurora Fleet builds each day's
driver routes from your depot list, vehicle constraints and delivery
windows, and re-plans when a stop is added mid-shift.

## How it works

1. Import depots, vehicles and delivery windows.
2. Aurora solves the day's routes against your constraints.
3. Drivers get turn-by-turn stops; dispatch sees live progress.

## Who it's for

Fleets of 10–200 vehicles running their own deliveries.

The same page, read the way a browser reads it, written out as markdown and served from your edge.

Both blocks above are hand-written illustrations — a made-up company, not a live render and not any customer's site. They show the SHAPE of the difference. The real before/after is the one we build from your own pages, and you see it on the approval screen before anything is published.

// HOW IT WORKS

We're already in the serving path.

This works because of where we sit, not because of anything clever. You point one DNS record at us, and we serve your site — so we can answer a request for the readable copy ourselves, without your origin changing at all.

1 — We read the page with a browser

Once, not on every request. A real headless browser loads the page, waits for it to settle, and hands back the DOM your visitors see. No screenshots, no clicking, no interaction with your site.

2 — The same pipeline as every other twin

Rendering swaps the input HTML and nothing else. Deterministic extraction still decides what the page says, the model only formats it, and the claim guard still checks the result against the extraction. You approve it, exactly as you approve the rest.

3 — Your edge serves it, from then on

The twin lives at /your-page.md and in your llms.txt index. Your origin stays exactly the JavaScript app it was — the readable copy is served by the part of your site we already run.

Twins go stale when a JavaScript app redeploys and the raw HTML never changes, which is a real problem and not one we can wish away. What we do about it: an hourly pass takes a plain-fetch fingerprint of the page's shell and its bundle URLs, and when that fingerprint moves, the twin is rebuilt — through the same plan gate and pool as any other render, paced by a daily cap so a redeploy loop can't spend an account's month in an afternoon — a rebuild on an account at its allowance waits rather than overspending. It is a mitigation and not a guarantee: a deploy that changes your wording without changing a bundle URL will not be caught this way.

// WHAT THIS IS NOT

The four limits, before you ask.

Reading a customer's page with a browser is the most invasive thing this product does. These are the rules it operates under, and they are in the code rather than in a policy document.

Your audit does not change.

Findings, facts and "what AI sees" stay a plain fetch, always. A page that serves nothing without JavaScript keeps that finding after we build a twin for it, because the finding is about your origin and the twin is a separate thing we serve. Rendering never launders a JS-shell site into a healthy audit — there are tests whose job is to fail if it ever does.

Nothing is published without your yes.

A rendered twin lands as a draft, next to the empty plain-fetch view of the same page, and goes live only when you approve it — the same gate every markdown twin has always passed through. The before/after is the review screen.

A rendered twin says it is one.

It carries a provenance label in your dashboard and in the twin's own record: built from the rendered page, because the raw page had no readable text. You always know which of your twins we had to use a browser to read.

A browser that gets nothing still gets nothing.

If your page renders to an empty screen — an infinite spinner, a hard auth wall, a client-side error — we do not invent content for it. You get the same honest refusal, now with the stronger version of it: even a browser found nothing readable here.

// WHAT YOU GET, AND WHAT IT COSTS

A Studio feature, with the numbers written down.

Rendering a page in a real browser costs us money every time, so it is metered rather than unlimited, and the meter is visible in your account rather than discovered in an invoice.

The allowance

1,000 browser renders a month on Studio, pooled across every site on the account — plenty to build and keep a real twin set current. Free and Pro include none: they can still see the finding, and the twin pipeline still works on pages that serve readable HTML.

The daily bound

Automatic rebuilds — the hourly pass that catches a redeployed JavaScript app — are capped at 50 renders per site per day, so a loose redeploy loop can't spend a month's allowance in an afternoon behind your back. A bulk build you start yourself isn't held to that daily number — it draws straight from the monthly pool, paced by your own queue. At the pool we refuse the render and say so — there is no render overage rate, because we would rather stop than bill you past a number you agreed to.

// BEFORE YOU PLAN AROUND IT
Pro launches soon, and so does Studio.

There is no checkout today, so there is nothing to buy on this page and we are not going to pretend otherwise. The free tier is real and works now — it will show you, on your own pages, whether you have this problem at all, which is the part worth knowing first. We will email you the day paid plans open.

// FIND OUT ON YOUR OWN SITE
Is your site affected?

Add a site free and we will tell you, per page, whether it serves any readable text without JavaScript. No card, and the answer is the same whether or not you ever buy anything.

start free
Read the machinery

The crawl, the rules, the twin pipeline and the edge injector are MIT-licensed and public. Weighing us against something else? See how we compare.

read the source