Can you self-host EmDash without a Cloudflare account? Yes. EmDash ships a first-class Node.js deployment target alongside its Workers one, so it runs as an ordinary Node process with a SQLite database on any Linux box. On InstaPods that is a $7/mo pod, live in about 60 seconds, with HTTPS and daily backups already on.

Almost everything written about EmDash so far describes the Cloudflare path, because that is what its own docs lead with and because Cloudflare built it. That leaves a reasonable question unanswered: what if you do not want a Cloudflare account, a Workers plan, a D1 binding and an R2 bucket in order to publish a blog? This post covers what the Node path actually involves, the one feature you give up, what it costs against the alternatives, and the single setup mistake that will cost you your admin account if you get it wrong.

What is EmDash?

EmDash is an open-source CMS built as an Astro integration. You add it to your Astro config and you get an admin panel, a REST API, authentication, a media library and a plugin system. It is MIT-licensed, sits at roughly 12,000 GitHub stars, and describes itself as the spiritual successor to WordPress: it takes the things that made WordPress dominant, extensibility, a real admin UX and a plugin model, and rebuilds them on TypeScript.

Two differences matter more than the stack. Content is stored as Portable Text, a structured JSON format, rather than as serialized HTML with metadata buried in comments the way WordPress does it. And content types are defined in the database through a visual schema builder rather than in code, so a non-developer can add a collection from the admin UI and each one becomes a real SQL table you can generate TypeScript types from.

One thing to be clear about before you invest a weekend: EmDash calls itself a beta preview and is shipping releases roughly weekly. It is a good fit for a new blog, marketing site or portfolio you are happy to keep current, and a poor fit if you need a stack that never moves.

Does EmDash need Cloudflare?

No, and this is the part that gets misreported. EmDash runs best on Cloudflare Workers with D1 as the database and R2 for media, and that is the deployment its documentation walks you through. But the project ships a Node.js target as a supported path, not as an escape hatch. On Node it is a single process with an embedded SQLite database and local file storage.

The trade is real but narrow. Sandboxed plugin isolates, where a third-party plugin runs in its own isolate rather than in your process, depend on Cloudflare’s Dynamic Worker Loaders. That is a Workers capability. On the Node runtime it does not exist, and any honest write-up should say so. Everything else, the admin panel, the REST API, Portable Text, the visual schema builder, passkey auth, the media library and the WordPress import wizard, works the same.

What does it cost to self-host EmDash?

Three routes, with the real numbers:

InstaPods, one click: a flat $7/mo. That is the Build plan: 2 vCPUs, 2 GB RAM, 25 GB of disk, unlimited bandwidth, daily backups and SSH. EmDash boots from a pre-baked image in about 60 seconds with a seeded starter blog, a per-pod encryption key generated on first boot, and HTTPS already issued. Nothing to configure.

Cloudflare Workers: it depends, and the floor is not zero. Sandboxed plugins need Dynamic Worker Loaders, which need a paid Workers plan starting at $5/mo, and your database and object storage are then billed separately on top of that. The Workers free tier will run a small EmDash site; it will not run the plugin isolates that are the reason to choose Workers in the first place.

Your own VPS: cheapest in dollars, most expensive in evenings. Install Node 22, run the create script, build the site, then write a systemd unit, put nginx or Caddy in front of port 4321, and get a Let’s Encrypt certificate. That last part is not optional: passkey sign-in is WebAuthn, and WebAuthn refuses to run over plain HTTP. If you want to go this way anyway, the best VPS for WordPress covers sizing that applies just as well here, and the real cost of self-hosting in 2026 is the honest accounting of what “just a $5 box” ends up costing.

Why $7 and not our $3 plan? Because of the update. Serving traffic, EmDash sits around 136MB of memory, which the 512MB plan would hold comfortably. Updating rebuilds the Astro site in place: on 2 GB that build finishes in about 14 seconds, and on 512MB it gets OOM-killed after roughly two minutes and leaves the service down until the snapshot rolls back. A plan whose Update button can never succeed is not a plan worth selling, so Build is the floor.

How the login works, and the one mistake to avoid

EmDash has no password authentication at all. Sign-in is passkey-first: Touch ID, Windows Hello, a security key or your password manager, with OAuth and magic links as the alternatives. There is nothing to phish and nothing to leak.

That creates one problem on a fresh install, and it is worth understanding. A brand new EmDash boots with its setup wizard open, and because there is no password to fall back on, whoever reaches that URL first claims the CMS. On a public pod that is a race with the internet. So we put a per-pod password in front of /_emdash/, which covers the setup and admin pages. The credentials arrive in your welcome email and sit on the pod’s dashboard, so put them somewhere durable - and if you want that vault on your own pod too, the best self-hosted password managers are compared here. Your public site is not password-protected; only the admin is.

The mistake to avoid: attach your custom domain before you register your passkey. Passkeys are bound to the exact hostname they were created on. Register one against my-cms.instapods.app and it will not work on cms.yourdomain.com afterwards. So if you plan to use your own domain, point it at the pod and set EMDASH_SITE_URL to it first, then run the setup wizard. If you have already set up and only realised now, you are not locked out: keep administering on the pod address, or invite a second admin from Users and open that invite link on your custom domain to register a passkey there.

Migrating from WordPress

EmDash ships a WordPress import wizard that reads a WXR export file, the WordPress REST API, or WordPress.com directly, and brings across posts, pages, media and taxonomies. That part is genuinely a wizard rather than a weekend of copying and pasting.

What does not come across is your plugins. EmDash has its own plugin system and nothing approaching the size of the WordPress catalogue, and it will not for a long time. If a plugin is doing real work on your site, WooCommerce most obviously, budget for replacing it or stay where you are. The content is portable; the functionality is not.

Worth knowing on the way out: WordPress.com now allows plugins and custom themes on every paid plan, so the old “you need the Business plan to install anything” advice is out of date. What Business still gates is SFTP and file access, at $25/mo billed yearly. That is the tier worth comparing against a $7 pod, not Personal.

How EmDash compares

EmDash on InstaPodsWordPress.comContentfulSanity
Entry price$7/mo flatFree with branding, Personal $48/yrFree tierFree tier
First real paid tier$7/moBusiness $300/yr (first with SFTP)Lite $300/moGrowth $15/seat/mo
Pricing modelPer serverPer site, per tierPer plan, meteredPer seat, metered
EditorsUnlimitedPer site10 free, 20 on Lite20 free, then $15 each
Content formatPortable TextSerialized HTMLContentful rich text JSONPortable Text
Where content livesSQLite on your podWordPress.comContentful cloudSanity Content Lake
File and SSH accessDay oneBusiness plan and upn/an/a
MaturityBeta preview, weekly releasesTwo decadesProduction-provenProduction-proven

Competitor prices verified 2026-09-01. The full versions, with the concessions where they genuinely win, are in EmDash vs Contentful, EmDash vs Sanity and EmDash vs WordPress.com.

Two of those are worth being blunt about. Sanity’s free tier beats a $7 pod outright for a solo project: 20 seats, 10,000 documents and a hosted global CDN for nothing. And WordPress.com Personal at $48 a year is cheaper than $84 a year, so if you just want a blog with a custom domain and no server to think about, take it. EmDash wins on owning the thing, not on being the cheapest line item.

Deploying it

On InstaPods it is one command, or one click from the app catalog:

instapods pods create my-cms --app emdash

The pod boots from a pre-baked image, so there is no npm install to sit through. You get a seeded starter blog, HTTPS, a per-pod encryption key for plugin secrets, and the admin password in your welcome email. Open /_emdash/admin, enter that password, and the setup wizard registers your passkey.

Full walkthrough on the EmDash install page, and the app spec with plan details is on the EmDash app page.

Should you use it?

Use EmDash if you are starting something new, you like the idea of structured content you can render anywhere, and you would rather your CMS be a file on a server you own than a row in someone’s cloud. Use it knowing it is a beta preview that moves weekly.

Do not use it if you need a specific WordPress plugin, if you need a frozen stack, or if a hosted free tier genuinely covers you. Those are real answers, and the honest one depends on which of them describes you.

If it is the first one, it is $7/mo and 60 seconds: deploy EmDash.