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
- Node.js >= 18.x (20.x or higher recommended)
- pnpm (recommended) or npm
- Cloudflare Account (free tier is sufficient, no credit card required)
- Git (optional, for version control)
Step 1: Create Project
Method 1: Using CLI (Recommended)
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:
- Choose template type (blog, marketing, portfolio, or starter)
- Configure project name and basic settings
- Automatically install dependencies
Available Templates:
blog- Classic blog template (recommended for personal blogs)marketing- Marketing landing page templateportfolio- Portfolio showcase templatestarter- Blank starter (for full customization)
Method 2: From Cloudflare Dashboard
- Log in to Cloudflare Dashboard
- Go to Workers & Pages
- Click Create Application
- Select EmDash template
- 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:
- Frontend: http://localhost:4321
- Admin Panel: http://localhost:4321/admin
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:
- Push code to GitHub or GitLab
- Log in to Cloudflare Dashboard
- Go to Workers & Pages → Create Application
- Select Connect to Git
- Authorize and select your EmDash repository
- Cloudflare will auto-detect EmDash project and configure build settings
- 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
Method B: Using Wrangler CLI (Recommended for Developers)
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
Via Cloudflare Dashboard (Recommended)
- Ensure your domain is added to Cloudflare (free)
- Go to Workers & Pages → Select your project
- Settings → Custom domains → Add custom domain
- Enter domain (e.g.,
blog.example.com) - 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
- In WordPress admin: Tools → Export → Select “All content”
- Download WXR (WordPress eXtended RSS) file
- In EmDash admin
/admin→ Import → Upload WXR file - System automatically imports posts, pages, and media files
Method 2: EmDash Exporter Plugin (Recommended)
- Install EmDash Exporter plugin in WordPress
- Plugin creates a secure export endpoint
- In EmDash admin, enter WordPress site URL and application password
- Directly pull all content (suitable for large sites)
Summary
Congratulations! You’ve learned how to build a blog with EmDash. Key steps recap:
- ✅ Create project using
npm create emdash@latest - ✅ Run
pnpm devlocally for development and testing - ✅ Deploy to Cloudflare using
wrangler deploy - ✅ 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: