Edge experimentation infrastructure
A/B test any site at the edge. Zero flicker.
Experiments are applied in the HTML stream at the CDN — before the browser sees a byte. No client SDK, no flash of the control, clean React hydration, and statistics that stay honest while you watch them.
Self-hosted · consent-first by default · GPC & DNT honoured · your data never leaves your stack
Random visitor: a fresh edge-assigned visit — you get whatever a real visitor would. This is a real page behind the real product — flip between A and B and reload as often as you like: every version arrives fully formed, because the change is made at the edge before the browser sees anything.
0
flashes of the control
the variant is in the first byte of HTML — there is nothing to swap
0.55ms
edge transform, p50
p99 2.08ms on a 38 KB document, measured on the streaming rewriter
1.6 KB
browser tag, gzipped
async, non-blocking — legacy client SDKs ship 25–80 KB that block paint
100%
on your infrastructure
your edge, your data, your keys — no third-party data path
How it works
deterministic bucketing before a byte of HTML leaves the CDN
HTML + hydration data + RSC Flight patched in one streaming pass
conversions ride your existing dataLayer — GA4 events just work
peek-safe stats, guardrails, one-click ship-the-winner
Why the edge
The browser should never see the control
Client-side testing tools load JavaScript, wait for the DOM, then swap content — users watch the original flash into the variant, and on React sites the swap fights hydration. ShiftZero moves the mutation to the CDN edge: assignment happens on the request, the HTML is rewritten as it streams, and the hydration data is patched to match. What arrives is simply… the variant.
It works the same on every stack — because it operates on the one thing every stack has in common: the HTML response.
<script async src="https://cdn.shiftzero.dev/sz.js"
data-endpoint="https://collector.yourco.com/events?wk=YOUR_KEY"></script>npx shiftzero deployOr skip the worker entirely with the managed proxy: point a CNAME at ShiftZero and your install is a DNS record.
Versus client-side testing
The honest comparison legacy tools won’t print
| Client-side tools | ShiftZero | |
|---|---|---|
| Where variants are applied | In the browser, after paint — users see the control flash into the variant | In the HTML stream at the CDN edge — first paint is the variant |
| React / Next.js hydration | DOM swaps fight hydration: mismatches, warnings, re-render flicker | Hydration data (__NEXT_DATA__, JSON islands, RSC Flight) patched with the HTML — React mounts into the variant |
| Page-weight cost | 25–80 KB of blocking JavaScript before the page can settle | No client SDK. Optional 1.6 KB async tag for measurement only |
| Watching results daily | Fixed-horizon p-values — peeking inflates false positives past 30% | Always-valid confidence sequences — peek-safe by construction, labelled on every readout |
| Your data | Events shipped to the vendor's cloud | Self-hosted end to end — collector, results and identity stay on your stack |
| Pricing | “Talk to sales” — 3 of the 4 big vendors publish no prices at all | Self-hosted and free in early access. No sales call to run your first test |
What’s in the box
Built like infrastructure, honest like a statistician
Zero flicker, by architecture
Legacy tools mutate the DOM after paint — users see the control flash, Core Web Vitals tank. ShiftZero rewrites the HTML stream at the edge, so the browser's first paint is already the variant.
Safe for hydrated React
Client-side tools corrupt hydration. ShiftZero patches the framework's hydration data — __NEXT_DATA__, JSON islands, even RSC Flight payloads — in the same pass as the HTML, so React mounts straight into the variant.
No client SDK, no app changes
Assignment never runs in the browser and your application code never changes. Install is a script tag for measurement plus an edge worker in front of your origin — or a managed CNAME flip.
Statistics you can watch live
Always-valid confidence sequences make peeking safe. CUPED cuts variance so experiments conclude sooner. Winsorization stops one whale order flipping a revenue test. SRM guardrails catch broken splits before you trust a winner.
A visual editor that tells the truth
Point and click on your live site — the selector comes from the same engine the edge validates. Serve-time diagnostics flag selectors that stop matching after a redesign, with one-click self-healing proposals.
The whole lifecycle, not just the split
Runtime estimates at authoring time, winner notifications, honest auto-stop rules, one-click ship-the-winner, and a decision log so your program keeps its memory.
The statistics engine
Watch results all day without lying to yourself
Fixed-horizon p-values are only valid at one pre-committed sample size — checking them daily inflates false positives past 30%. ShiftZero’s live view runs on always-valid confidence sequences, so the dashboard is peek-safe by construction, and it says so on the tin: every readout is labelled with the inference regime it came from.
- Always-valid sequences — stop the moment the interval excludes zero — validly
- CUPED — pre-exposure behaviour regressed out; same effect, less noise, faster calls
- Winsorization — revenue metrics capped at p99.5 so one whale can't flip the result
- Holm correction — A/B/n arms keep the promised family-wise error rate
- SRM guardrail — a broken split is flagged before any winner is claimed
- Bayesian companion — probability-to-beat and expected loss, for decision meetings
live scoreboard
variant_b ▲ +14.2% [+3.1%, +26.4%]
◈ always-valid · peek-safe · SRM ✓
92% to beat control · risk if shipped 0.4%
CUPED −31% variance · outliers capped · 3
Questions engineers actually ask
FAQ
Do I need to change my application code?+
No. The edge worker is a reverse proxy in front of your origin — assignment and content changes happen in the HTML stream. The only thing that touches your pages is an optional 1.6 KB script tag that mirrors the analytics events you already fire.
Does it really work with Next.js / React hydration?+
Yes — that's the point. ShiftZero patches the framework's hydration data (__NEXT_DATA__, JSON islands, even RSC Flight payloads) in the same pass as the HTML, so React mounts directly into the variant. No mismatch, no re-render, no flicker.
What does it do to my page speed?+
The streaming transform measures p50 0.55 ms / p99 2.08 ms on a 38 KB document, running at the CDN edge. There is no render-blocking client SDK — the browser tag is 1.6 KB gzipped and loads async. Client-side testing tools this replaces typically ship 25–80 KB of blocking JavaScript.
What about GDPR and consent?+
Consent-first by default: before analytics consent, visitors are served a consistent variant with an ephemeral id — no cookie set, no events recorded. GPC and DNT are honoured as denial signals. And it's your infrastructure end to end: no data ever touches a third party.
Can I trust the statistics?+
The live scoreboard runs on always-valid confidence sequences, so watching it continuously can't inflate false positives. CUPED, winsorization, Holm correction, and SRM guardrails are built in — and every readout is labelled with the inference regime it came from. When there isn't enough data, it says so.
What if my site isn't on a framework?+
ShiftZero operates on the HTML response — the one thing every stack shares. Shopify themes, WordPress, Rails, Django, static sites: same edge, same editor, same statistics.
Five minutes to your first flicker-free experiment
Create an experiment in the dashboard, pick an element on your live page, and start it. The edge does the rest. Self-hosted and free in early access — no sales call, no credit card.