FOUNDATION · BUILT ON EMDASH AND CLOUDFLARE

Built on EmDash. Running on Cloudflare.

EmDash is Cloudflare's own CMS, published under the MIT licence. Praxis runs its core unmodified, as a pinned dependency, and builds everything else around it: the platform for many sites, the experience layer and the governed copilot, on Cloudflare's network.

Every figure on this page is as of October 2026.
On this pageWhat it does
  1. What it does
  2. Why EmDash
  3. Through EmDash’s own doors
  4. How Praxis runs on Cloudflare.
  5. Its own product
  6. How it works
  7. A request, end to end
  8. From a click to a page.
  9. Your own domain
  10. The models
  11. What keeps it safe
  12. Common questions

What it does

Why EmDash

  • EmDash describes itself as "a full-stack TypeScript CMS built on Astro and Cloudflare". Astro joined Cloudflare.
  • It reached version 1.0 in September 2026, and Cloudflare's own blog runs on it.
  • At 1.0, Cloudflare put it this way: "EmDash can power an individual Astro site, but it is also designed for companies building website creation and hosting products."
  • That is what Praxis is. We chose to build on EmDash, not beside it.

What EmDash gives, and what Praxis adds

What EmDash gives every Praxis site.

The content model and its collections, with relations; the editor and the admin application; the media library; users, roles, passkeys and sessions; revisions and scheduling; the content calendar; taxonomies; menus, widgets, reusable sections and bylines; comments; redirects with a 404 log; site settings, backups and site export; the plugin system and its registry; API tokens; and its own WordPress import.

What Praxis adds around it.

Hosting for many sites, each with its own database and routed by its address; sign-up, accounts, teams and billing through Stripe; your own domain from one record; the governed copilot and its gateway; the experience layer, from events and analytics to experiments and their statistics, audiences, personalization, consent, the affinity engine, live slots and exports; the Composer, sections, themes and site templates; native commerce and paid access; native forms, spam protection and the SEO workspace; the WordPress migration engine and its exporter; and the nine rooms of the admin.

Built on EmDash, Cloudflare's own CMS. Everything above the CMS, from the platform for many sites to the AI copilot and the experience layer, is Praxis.

Illustration of Praxis’s own layer around EmDash’s core: the copilot and the experience layer above it, and commerce, migration and the nine rooms below it.

Through EmDash's own doors

Through EmDash’s own doors

  • We take each EmDash release as a fixed version. As of October 2026, Praxis runs EmDash 1.4.0.
  • We extend it through its own doors: its plugin system, where two Praxis plugins carry the copilot and the experience layer; its block types; its plugin routes; and our own middleware and routes around it.
  • When we need a change inside EmDash itself, we propose it to the EmDash project.
  • Every AI action on your site goes through one governed gate.

On Cloudflare

How Praxis runs on Cloudflare.

Workers.

Every request arrives on Cloudflare's network, where our front Worker reads the hostname and sends the request to the right site. An unknown or suspended address is refused.

Containers.

EmDash and Praxis render each page in Cloudflare Containers, and every decision about what a visitor sees is made there, before the page is sent.

Durable Objects.

Each visitor's live state sits in a Durable Object of its own, named by site and visitor so that no two sites ever mix. It holds the affinity engine's scores and the live channel to the page.

A live channel that sleeps.

The channel is a WebSocket held by the visitor's Durable Object with Cloudflare's hibernation API. The server pushes, and the page listens.

Analytics Engine.

Analytics Engine holds our own platform telemetry, and your analytics are counted from your site's own database.

R2.

Uploaded and migrated files and your data exports are kept in Cloudflare's object storage.

Cloudflare for SaaS.

Your own domain from one record, with its certificate issued and renewed for you.

AI Gateway.

Every call the copilot makes to an AI model passes through Cloudflare's AI Gateway, authenticated, with payload logging switched off.

Turnstile.

An optional challenge on your forms, checked on the server.

Hyperdrive and Cron Triggers.

Our account service reaches its own database through Hyperdrive, and our scheduled sweeps run on Cron Triggers: site health every hour, backups twice a day, and experiment results each night.

Its own product

  • Praxis is its own product, built on EmDash and running on Cloudflare. It is neither an EmDash product nor a Cloudflare product.

How it works

A request, end to end

From a click to a page.

  1. It arrives on Cloudflare's network.

    The front Worker reads the hostname, which picks your site and your site's own database. An unknown or suspended address is refused.

  2. Old addresses answer first.

    Redirects run before any page is built.

  3. Consent sets the rules.

    The visitor's region gives the regime. A Global Privacy Control signal outranks the visitor's own record, which outranks the regional default.

  4. The page is decided in the container.

    An identity only where consent allows; the platform holdout and the visitor's audiences; any experiment; then the page itself, with the visitor's version, the sections arranged or swapped for their audience, a ticket for a live offer, and recommendations ranked for them. Members-only sections are removed from the page itself.

  5. It leaves with its record.

    The consent runtime, your consent-gated tags, the measurement beacon, the notice, and, for visitors who allow personalization and have a visitor id, a record of every decision and why.

  6. In the browser, very little runs.

    The notice, the beacon and your deferred tags; and, where a live offer applies, a channel to the visitor's own Durable Object, opened with a sealed ticket that must be used within 120 seconds.

Every step catches its own errors and serves the ordinary page. A newly activated test or piece of targeted content reaches visitors as the containers and the edge cache refresh.

Illustration of three sites, each joined by its own line to its own Postgres database and to no other, captioned “Each site’s own Postgres database, never in tables shared with other customers”.

A database for every site

  • Each site's content and events live in a Postgres database of its own, never in tables shared with other customers.
  • The databases are Postgres, run on Neon.
  • A new site's database is created, migrated and seeded by our jobs container, as one governed run.
  • Your analytics are computed from that database every time, with no sampling.
  • It is backed up twice a day.
  • A site's staging copy is made from a backup, and a card promotes it. Coming soon.
  • Your account's Overview shows where your data lives, with a plain note that the network, caches and AI run worldwide.

Your own domain

  • A new domain needs one record: a CNAME to app.amadalis.ai, or an ALIAS at a root domain. Ownership and the certificate are proved over HTTP.
  • A domain already serving a site keeps serving while TXT records prove it and its certificate. Then one CNAME switch moves it, with no downtime.
  • The certificate renews by itself.
  • Your registrar, your DNS and your email stay yours. We never ask for a DNS password or a token.

Account, team and domains

The models

  • The copilot's adapters speak to Anthropic and OpenAI models, and every call outside our tests goes through the authenticated Cloudflare AI Gateway, with payload logging switched off, so only metadata is logged.
  • Our team chooses which models stand behind each tier. Copilot calls are written to a cost ledger, and each account's monthly AI allowance is checked on every call.
  • With your own provider keys switched on, a call uses your key or is refused, never quietly sent on ours.

What keeps it safe

A database of its own.

No site's content or events share tables with another customer's.

Addresses that fail closed.

An unknown or suspended hostname reaches no site at all.

Visitor state that never mixes.

Each visitor's Durable Object is named by site and visitor, so sites never share one.

Your words, handled with care.

Model calls pass through Cloudflare's AI Gateway with payload logging switched off.

A fresh nonce on every page.

Each script the platform puts on a served page carries a nonce made for that response alone.

A tamper-evident trail.

In our platform's audit log, each entry is linked by a SHA-256 hash to the one before it, so editing or deleting an earlier entry breaks the chain, and the platform checks the whole log every night.

Common questions

Is Praxis a fork of EmDash?

No. EmDash's core runs unmodified, as the published package, at a fixed version.

Which version of EmDash does Praxis run?

EmDash 1.4.0, as of October 2026.

Is Praxis part of Cloudflare?

No. Praxis is its own product, made by Amadalis, built on EmDash and running on Cloudflare.

Where is personalization decided?

On the server that renders the page, before it is sent. Cloudflare's network holds each visitor's live state and the live channel.

Can I install EmDash plugins?

No. Admins can manage the installed plugins on EmDash's own Plugins screen. When the copilot changes one, it asks first, and it never grants a plugin new powers.

Can I run Praxis on my own infrastructure?

Praxis is a hosted platform: we run it for you, on Cloudflare.

Where does my data live?

In your site's own Postgres database, with your files in Cloudflare's object storage.

Are my pages cached?

Cloudflare's edge cache holds eligible public pages. Sign-in and cart cookies, and active personalized or experiment responses, bypass it.