Use datasets and variables to dynamically control content at the edge — without a CMS, without a backend, without code.
Rules without data are limited. Rules with data become a runtime engine that shapes every HTML response based on who is asking, where they are, and what they need.
{{variable}} placeholder in your HTML or rule. It points to a value in the dataset and gets resolved at the edge before delivery.A dataset is a named, structured collection of data that your rules can read and inject into any HTML response — in real time, at the edge.
You define it once. Ninja makes it available to every rule, for every page, for every user — without a database call, without a backend request.
Variables are references to dataset values — written as {{field_name}} in your HTML templates or rule actions. Ninja resolves them at request time, before the browser receives the page.
Inject a dynamic, SEO-relevant title into the <title> tag and the main heading — unique per city, product, or segment.
Render market-specific pricing without touching the backend. Combine with {{currency}} for full localization.
Replace button labels and call-to-action copy per segment — "Book in London" vs "Book in New York" — without any JavaScript.
Your HTML template stays the same. Ninja replaces every {{variable}} with the right value from your dataset — at the edge, before delivery, for every request.
<title> and <h1> per page context.href, src, content, data-* from dataset values.Datasets adapt to the shape of your content. From simple key-value pairs to nested objects, records, and collections — Ninja handles any structure your use case requires.
The simplest form. One key, one value. Fast to define, fast to resolve.
A named group of related fields — product info, page metadata, local config.
Keyed datasets — one entry per city, product ID, or route. Look up by key at request time.
Arrays of items for lists, carousels, pricing tiers, or content modules — rendered to HTML on delivery.
A rule tells Ninja what to do. A dataset tells it what to use. Together, they create a runtime content engine that responds to every request with precisely the right output.
A user visits /city/london. Ninja reads the dataset, resolves all variables, and delivers a fully rendered page — no backend involved.
One HTML template. Thousands of unique pages. Ninja uses datasets to generate distinct content for every URL — no CMS, no static generation, no backend rendering.
From request to browser, Ninja resolves every variable in a single, deterministic pass — before the page is delivered.
User requests /city/london — the request hits the Ninja edge layer before origin.
Ninja matches the URL to an active rule and identifies the correct dataset and key.
All {{variables}} are resolved from the matched dataset entry — in a single pass, at the edge.
The origin HTML is enriched with resolved values. No template placeholders remain.
The browser receives complete, rendered HTML — unique content for this exact request.
One template powers thousands of unique pages — without a build pipeline.
Every response is assembled at request time with the right values for the right user.
Deliver geo, segment, and intent-specific content — from one rule set.
Update the dataset and every page updates instantly — no deploy, no waiting.
Stop hand-editing pages. Let data drive the output — for every URL, every time.
| Dimension | Static / CMS | Ninja Data Layer |
|---|---|---|
| Content | Hardcoded per page | Driven by dataset — dynamic per request |
| Updates | Manual edits, redeploy required | Update dataset → live instantly, no deploy |
| Scale | Each page managed separately | One template, unlimited unique pages |
| CMS dependency | Required for content changes | Not needed — dataset replaces CMS for output |
| Personalization | Requires JS or server-side logic | Built into the rule — resolved at edge |
| SEO | Same meta for all variations | Unique title + description per dataset entry |
| Backend load | Rendering hits origin | Zero — all resolved at the edge |
Data doesn't rest. It executes — into output,
into HTML, into the page the user sees.
Define a dataset. Bind variables. Deliver dynamic pages — without touching your backend, without rebuilding your site.