Install EmDash in 60 Seconds
EmDash is the open-source TypeScript CMS built on Astro that calls itself the spiritual successor to WordPress. Its own default target is Cloudflare Workers, but it ships a first-class Node path, and that is what runs here: a single Node 22 process with an embedded SQLite database, HTTPS and daily backups, live in about 60 seconds with no Cloudflare account involved.
The usual way to self-host EmDash
- Decide your runtime before you write a word. EmDash's documented path is Cloudflare Workers with D1 for the database and R2 for media, which means a Cloudflare account, a wrangler config, a D1 binding and an R2 bucket before the CMS exists.
- Take the Node path instead and you are back to basics: provision a VPS, install Node 22, `npm create emdash@latest`, build the Astro site, then write a systemd unit so the server survives a reboot.
- Put nginx or Caddy in front of port 4321 and get a Let's Encrypt certificate, because passkey sign-in is WebAuthn and WebAuthn refuses to run over plain HTTP.
- Gate the setup wizard yourself. A fresh EmDash install boots with the wizard open, so whoever reaches the URL first can claim your CMS - and there is no password login to fall back on if that happens.
- Own the upgrades. Updating EmDash is not a package swap, it reinstalls the dependency and rebuilds the whole Astro site in place, which needs real memory and takes minutes rather than seconds.
That is an evening of wrangler, systemd and certbot before you publish a single post - and a race with the internet over who claims your admin account first.
Or install it in one click
What you get
Recommended plan for EmDash
- 2 vCPU
- 2 GB RAM
- 25 GB storage
- HTTPS included
- Custom domain support
- SSH & web terminal access
EmDash requirements
Resource requirements
EmDash is cheap to run and expensive to update, and the update is what sets the plan. Serving traffic it sits around 136MB of memory, which the $3 Launch 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. We will not sell a plan whose Update button can never succeed, so the Build plan at $7/mo - 2 vCPUs, 2 GB RAM, 25 GB disk - is the floor for this app.
Config and environment
EmDash runs as a managed systemd service on port 4321 with its environment in /opt/emdash/.env, on the Node.js runtime with an embedded SQLite database and local file storage. There is no Cloudflare account, no Workers plan and no D1 binding. One honest consequence of the Node runtime: sandboxed plugin isolates depend on Cloudflare's Dynamic Worker Loaders, so that specific feature is a Workers capability and is not available here.
Data persistence and custom domain
Your content lives in a SQLite database on the pod's persistent disk, and updates leave the data directory alone - migrations apply themselves on the first request after a restart. Every pod gets a free HTTPS subdomain and you can attach a custom domain from the dashboard. Do that BEFORE you register your passkey, and set EMDASH_SITE_URL to the new host: passkeys are bound to the exact hostname they were created on, so one registered against the pod address will not work on your own domain afterwards.
EmDash install FAQ
Can I self-host EmDash without a Cloudflare account?
Yes. EmDash runs best on Cloudflare Workers with D1 and R2, and that is the path its own docs lead with, but the project ships a first-class Node.js deployment target and that is what runs here. Your pod is a single Node 22 process with an embedded SQLite database and local file storage, so there is no Cloudflare account, no Workers plan, no wrangler config and no D1 binding anywhere in the setup. The one feature you give up is sandboxed plugin isolates, which depend on Cloudflare's Dynamic Worker Loaders and only exist on Workers.
What does it cost to self-host EmDash?
$7/mo on the InstaPods Build plan, which is 2 vCPUs, 2 GB RAM, 25 GB of storage, unlimited bandwidth, HTTPS, a custom domain, SSH and daily backups. EmDash itself is free and MIT-licensed, so the $7 is the server. Build is the floor rather than an upsell: updating EmDash rebuilds the Astro site in place, and that build runs out of memory on a 512MB pod. New accounts get a $10 credit when they add a card.
How do I log in to EmDash?
EmDash is passkey-first: you sign in with Touch ID, Windows Hello, a security key or your password manager, and there is no password to leak. Because a fresh install's setup wizard could otherwise be claimed by whoever finds the URL first, we put a per-pod password in front of the setup and admin pages at /_emdash/. Those credentials are in your welcome email and on the pod's dashboard. Your public site is not password-protected, only the admin is.
Can I move my WordPress site into EmDash?
EmDash ships a WordPress import wizard that pulls posts, pages, media and taxonomies from a WXR export file, the WordPress REST API, or WordPress.com directly. Content moves cleanly. Functionality does not: EmDash has its own plugin system and nothing approaching the size of the WordPress plugin catalogue, so anything a plugin was doing for you needs a replacement or a rethink before you switch.
Is EmDash production-ready?
EmDash describes itself as a beta preview and is shipping releases roughly weekly, so treat it as early software: expect frequent updates and some rough edges. It is a strong 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. Your pod takes daily backups and updates are one click from the dashboard, so a bad release is a rollback rather than an outage.
Install EmDash in 60 seconds
One click. Real server. HTTPS included. No Docker, no nginx, no DevOps degree required.
Install EmDash