EmDash is an open-source content management system (CMS) released by Cloudflare in April 2026, known as the “spiritual successor to WordPress.” It’s written entirely in TypeScript, built on the Astro 6 framework, and designed for serverless architecture.

This guide will walk you through creating an EmDash project and deploying it to Cloudflare Workers using the official recommended approach.


EmDash Core Features

  • Full TypeScript: End-to-end type safety
  • Built on Astro 6: Modern framework for content-driven websites
  • Sandboxed Plugins: Each plugin runs in an isolated Worker Isolate, solving WordPress plugin security issues
  • Serverless Architecture: Auto-scaling, pay-per-use billing
  • Built-in x402 Payments: Native support for content monetization in the AI era
  • MIT License: Fully open source, free to use and modify

Prerequisites

  1. Node.js >= 18.x (20.x or higher recommended)
  2. pnpm (recommended) or npm
  3. Cloudflare Account (free tier is sufficient, no credit card required)
  4. Git (optional, for version control)

Step 1: Create Project

This is the quickest and easiest way:

# Create new project (interactive)
npm create emdash@latest

# Or specify project name directly
npm create emdash@latest my-blog

The CLI will guide you through:

  1. Choose template type (blog, marketing, portfolio, or starter)
  2. Configure project name and basic settings
  3. Automatically install dependencies

Available Templates:

  • blog - Classic blog template (recommended for personal blogs)
  • marketing - Marketing landing page template
  • portfolio - Portfolio showcase template
  • starter - Blank starter (for full customization)

Method 2: From Cloudflare Dashboard

  1. Log in to Cloudflare Dashboard
  2. Go to Workers & Pages
  3. Click Create Application
  4. Select EmDash template
  5. Follow the wizard to complete configuration and deployment

Step 2: Local Development

EmDash supports fully offline local development using SQLite database, no Cloudflare connection required.

# Enter project directory
cd my-blog

# Install dependencies
pnpm install

# (Optional) Seed with sample data
pnpm seed

# Start development server
pnpm dev

Local Development Features:

  • Uses SQLite database (no configuration needed)
  • Images stored on local disk
  • Hot Module Replacement support
  • No Cloudflare account needed for development

Access URLs:

Default Admin Account:

  • First visit to admin panel will guide you to create an admin account
  • Uses Passkey authentication (no password, more secure)

Step 3: Deploy to Cloudflare Workers

Method A: One-Click Deploy (Easiest)

Via Cloudflare Dashboard:

  1. Push code to GitHub or GitLab
  2. Log in to Cloudflare Dashboard
  3. Go to Workers & PagesCreate Application
  4. Select Connect to Git
  5. Authorize and select your EmDash repository
  6. Cloudflare will auto-detect EmDash project and configure build settings
  7. Click Save and Deploy

Auto-configured Resources:

  • D1 Database (for content storage)
  • R2 Bucket (for media files)
  • KV Namespace (for session management)
  • Environment variable bindings

1. Install Wrangler

# Global installation
npm install -g wrangler

# Or using pnpm
pnpm add -g wrangler

2. Login to Cloudflare

wrangler login

This opens a browser window to authorize CLI access to your Cloudflare account.

3. Create Cloudflare Resources

EmDash requires three types of Cloudflare resources:

# 1. Create D1 database (for content storage)
wrangler d1 create emdash-db

# 2. Create R2 bucket (for media files)
wrangler r2 bucket create emdash-media

# 3. Create KV namespace (for session management)
wrangler kv:namespace create SESSIONS

Record the IDs output by each command for later configuration.

4. Configure wrangler.toml

Create or edit wrangler.toml in project root:

name = "my-blog"
main = "./dist/_worker.js"
compatibility_date = "2026-04-01"

# D1 database binding
[[d1_databases]]
binding = "DB"
database_name = "emdash-db"
database_id = "your-database-id"

# R2 bucket binding
[[r2_buckets]]
binding = "MEDIA"
bucket_name = "emdash-media"

# KV namespace binding
[[kv_namespaces]]
binding = "SESSIONS"
id = "your-kv-namespace-id"

5. Build and Deploy

# Build project
pnpm build

# Deploy to Cloudflare Workers
wrangler deploy

Deployment success will display your website URL!


Step 4: Configure Custom Domain

  1. Ensure your domain is added to Cloudflare (free)
  2. Go to Workers & Pages → Select your project
  3. SettingsCustom domainsAdd custom domain
  4. Enter domain (e.g., blog.example.com)
  5. Cloudflare automatically configures DNS and SSL certificate

SSL/TLS:

  • Cloudflare automatically provides free SSL certificate
  • Auto-renewal, no manual configuration needed
  • Supports automatic HTTPS redirect

Step 5: Migrate from WordPress

EmDash provides two WordPress migration methods:

Method 1: WXR File Import

  1. In WordPress admin: ToolsExport → Select “All content”
  2. Download WXR (WordPress eXtended RSS) file
  3. In EmDash admin /adminImport → Upload WXR file
  4. System automatically imports posts, pages, and media files

Method 2: EmDash Exporter Plugin (Recommended)

  1. Install EmDash Exporter plugin in WordPress
  2. Plugin creates a secure export endpoint
  3. In EmDash admin, enter WordPress site URL and application password
  4. Directly pull all content (suitable for large sites)

Summary

Congratulations! You’ve learned how to build a blog with EmDash. Key steps recap:

  1. ✅ Create project using npm create emdash@latest
  2. ✅ Run pnpm dev locally for development and testing
  3. ✅ Deploy to Cloudflare using wrangler deploy
  4. ✅ Configure custom domain (optional)

Next Steps:

  • Create more content in admin panel
  • Customize theme styles
  • Develop custom plugins
  • Configure CI/CD for auto-deployment (optional)

Need Help? Check our complete documentation or ask questions on GitHub.


Related Articles: