← All services Service · Our main CMS

EmDash CMS website development and WordPress migration

We offer EmDash CMS website development: we build sites on EmDash, the open-source (MIT) CMS for Astro that runs on Cloudflare Workers, and we move existing WordPress sites onto it. Editors get an admin with pages, media and SEO fields; visitors get an Astro site served from Cloudflare’s network. We have done a full migration of a WordPress site with more than 1,000 posts, so the process and the problems below come from that work, not from the docs. Every project is quoted after we look at the site.

What EmDash CMS website development covers

  • New EmDash websites: content model (collections, fields, authors, categories), page templates in Astro, and an admin your team can use without a developer.
  • WordPress to EmDash migration: posts, pages, media, authors and taxonomies, with every URL kept or redirected.
  • Search, sitemap and SEO: full-text search, a sitemap and robots file written for your site rather than the generic defaults, and checked SEO fields.
  • Deployment on Cloudflare: Workers, the D1 database and R2 media storage, with an error page that does not look like a 404 to Google.

How we migrate WordPress to EmDash

  1. Inventory. Export the site as WXR, count posts, pages, media and taxonomies, and crawl the live URLs so nothing that ranks today is lost.
  2. Check which content is real. On page-builder sites the stored post body can differ from what visitors see (more on that below), so we compare every post’s title against its body before importing anything.
  3. Model and import. Collections and fields in EmDash, then the import. EmDash’s WordPress importer downloads media from the export’s URLs and refuses local or private addresses, so for a site cloned to a local machine we upload media through the media API and rewrite the URLs afterwards.
  4. Audit SEO fields. The import filled SEO descriptions from summaries cut at 160 characters with an ellipsis. We review them rather than publish them as they arrive.
  5. URLs, sitemap and redirects. EmDash’s built-in sitemap lists every collection, including ones with no public page. We replace it with one that lists only real, indexable URLs, and redirect anything whose path changes.
  6. Deploy and verify. Data goes into D1 before the first request (otherwise the runtime seeds an empty database), then we check the production build, not just the dev server.

Three migration problems we hit, and the fixes

Stale Elementor content in post_content

On Elementor sites, WordPress’s post_content is a cached copy that Elementor only rewrites some of the time; the live page renders from the _elementor_data field. Posts created by duplicating an older post kept the old article’s text. On the 1,000+ post migration, about one post in eight carried another article’s body, and the live site looked fine, so nobody knew. A straight import would have published the wrong article under the right title. The fix: rebuild each body from _elementor_data and flag any post whose title doesn’t match its body.

Cloudflare D1’s free-tier read limit

D1 bills by rows read, not by page views. On the Workers Free plan the limit is 5 million rows read per day per account, across every database (Cloudflare D1 pricing, checked October 31, 2026). A content-heavy page that counts categories or filters a large archive can read thousands of rows each time. During testing, our preview hit the limit and every page that needed the database failed until the daily reset. A real site needs the Workers Paid plan, which has a minimum charge of $5 per month per account (Cloudflare Workers pricing, checked October 31, 2026), plus caching for the expensive queries.

A full-text search index that went stale

EmDash’s search runs on SQLite FTS5 in D1, and the search index we built over the migrated content used the same engine: an external-content index kept in sync by triggers. Writing rows with INSERT OR REPLACE deletes the old row without firing the delete trigger, so the index keeps entries for rows that no longer exist. Some searches then fail with a “malformed” error and others work, which looks random. We write with an upsert (ON CONFLICT … DO UPDATE) and end every bulk load with the index’s rebuild command.

EmDash development pricing

EmDash builds and migrations are quoted per project. What moves the quote: how many posts and pages there are, whether a page builder was used, custom post types and fields, the amount of media, and any integrations or search the site needs. Send us the site address and we will reply with a quote.

Running costs are Cloudflare’s, paid by you directly. For anything beyond a test site, plan on the Workers Paid plan (from $5 per month, source above); a domain is billed separately by your registrar.

When EmDash is not the right choice

EmDash reached version 1.0 in April 2026, so its plugin ecosystem is young. If your site depends on WordPress plugins such as WooCommerce, a membership system or a course platform, or your team is trained on WordPress and happy with it, stay on WordPress: we also write custom WordPress themes. If the site rarely changes and nobody needs an editor, a plain Astro site is cheaper still; our Astro vs WordPress guide walks through that decision, and our Astro templates are a starting point.

Ready to build with SI?