EmDash: The secure WordPress successor for humans and agents
Presented by: Matt Kane
Originally aired on October 23 @ 8:00 PM - 8:30 PM EDT
WordPress powers 43% of the web but was built for another age. At Cloudflare, we asked, “What would WordPress look like if it were built for the agentic era?” In this talk, Matt Kane (creator of EmDash) introduces EmDash — a full-stack TypeScript CMS powered by Astro and Cloudflare Workers. EmDash keeps what made WordPress successful (extensibility, plugin ecosystem, familiar admin UX) but rebuilds it on secure, sandboxed foundations with agents as first-class citizens.
English
Transcript (Beta)
I'm Matt. I'm a principal engineer at Cloudflare. I'm on the Astro core team and I'm going to talk about what I've been building.
So I've been on the Astro core team for a few years and we've had a running joke for a long time that we need to build a CMS because it's sort of it feels like a missing part of Astro, that Astro kind of needs a CMS in there.
But every time it came up in planning, people would laugh and we'd move on and we'd not do anything.
I started working at Cloudflare and you just realized exactly a year ago today.
And what I was surprised to find is that when I arrived here, that it was also a running joke here.
That we've wanted to build a CMS for ages.
And it wasn't possible before. So I got the scene is me in January.
I wasn't on the in the hills there. But I get a DM from Dane, our CTO.
Apparently I find out later that he was actually with he was with Matthew our CEO at the same time.
So this is my imaginary thing of where they are. And he said, just can you build a new WordPress for us?
And surprisingly, obviously, I'd been thinking about this quite a lot.
So I actually immediately said yes. And then, of course, I was like, oh, my God, what am I going to do here?
So the first big question there, though, is if you are building a new WordPress in 2026, what does it look like?
Because it certainly doesn't look like what WordPress did 20 years ago.
Because it's a different world. This is our answer to what we think it looks like.
You know, this is just one way. This is Mdash. If anybody has not seen it before, it's a full stack CMS in TypeScript.
Runs on Astro. Can be deployed to Cloudflare Workers or Node.
It's open source. And I started on this in January with me and lots of agents and a big token budget and a deadline of seeing what I could build in two months.
And we went to our first public alpha on the 1st of April and then spent the next six months trying to explain to people that this wasn't a joke.
It was actually real. We've really created this thing. And then we went to 1 .0 just a few weeks ago.
So hopefully this is our answer to it being real. It is real.
If you want to know about more details about how I built it and how we're managing it as an open source project, come and see my talk tomorrow.
I'm doing a system sketch where I'm talking about the actual behind it.
Today I'm gonna talk about what it is and why it's shaped the way that it is.
So this is surprisingly controversial, but I like WordPress.
I've said this to lots of WordPress people and they're quite surprised.
But obviously it's got a lot of issues, but I think we've got some really important things right.
And it doesn't become such a popular thing and stick around for 20 years without getting some stuff pretty right.
And I think that there are three big things that it got right. First, anybody can just go in there and edit.
It's like you can get in there, you can type, it looks kind of vaguely like what you're getting, and it comes out at the end and you don't need to talk to a dev.
And that is great. But the real killer I think is that if it doesn't do something that you want it to do, there's tens of thousands of plugins out there that can make it do whatever you want.
And so that one is absolutely crucial as well.
And then when you finish, when you publish, you've got a site right there.
You don't need to build an extra site that talks to it or anything.
You've just got the whole thing there. And I think that those are the three things that I think that really make WordPress amazing.
And that's what I want to try and try to capture in MDash.
But I didn't want to capture everything from WordPress.
So there's a lot of stuff with WordPress that just doesn't make sense in 2026.
So in WordPress, all of everything is in the same trust boundary. So your database, all of your users, your front end, all of your code, and also all of your plugins.
Every plugin you run is running in the same trust zone as all of the rest of the code.
So if your gallery plugin can access your user table and it can exfiltrate all of your password hashes if it really wants to.
And obviously most plugins are legit.
But when you've got 60 ,000 plugins, that's a lot of plugins that you need to trust.
So it's not really surprising that that's why most of the issues, most of the vulnerability you get in WordPress, like 90% plus of them are in plugins.
The core WordPress core, generally pretty solid. Doesn't get many vulnerabilities in it.
And the problem is, you just need one WordPress plugin to be owned or malicious and you've lost a lot.
So that was one thing we wanted to solve.
And so what we've done with MDash is we've kept these things as separate.
So we've kept the core data, the core things that you want to store in your CMS, all your content mainly in all of the configuration and everything.
And we've given you an edit admin interface, which is the bit that I've shown before that looks familiar to any WordPress admin.
That stuff talks to it. The thing that is different for 2026 is that MDash has been built with agents as first class citizens from the start.
So the agent doesn't need to use the admin and it doesn't need to have itself set up for an API and you don't need to install plugins or anything.
It's got built in MCP.
It can do anything that a human can do. And it's got lots of affordances to make it work better in there.
While plugins don't get access to much at all, except where it's been specifically granted.
So it is sandboxed. You tell them exactly what they have access to and that's all they get.
I'll go into that a little bit more in a moment.
And then the site itself is just an Astro site.
So if anybody has used Astro, they can use MDash. They can build an MDash site.
It's exactly the same. The interface is, you know, if you've used get entry, it's just changed to get MDash entry.
It's looks like.
It's pretty familiar. This isn't going to be rocket science to anybody.
But I think this idea is just a nice editor. We're making a lot of changes.
It's probably changed since I recorded this last week or something. But we're just polishing it, just getting it improved.
So I'm going to show a sort of way that you work with MDash on a day to day basis.
So if you look really carefully, there is a typo on the title of this up there.
So I'm going to show how you edit that.
There's also a load of metadata that we want to want to change.
So I'm going to how we move those. And to do that, I'm going to go and do my demo.
So here's the site with the with our typo.
And while we've got a full admin interface, we've also just got edit mode for the simple things.
So this is built in to MDash.
You don't need to install a separate site editor or anything. Any content there you can just do shows unpublished changes.
And then we publish it.
And that's live. But all of these entries, these metadata entries up at the top, they're going to be annoying to fill in for all of my entries in this.
But luckily, this is 2026.
So I'm going to say fill in the meta for each record. Use info from each entry.
And skip any that are on. Oh, well, you'll understand me.
Leave them as drafts. So this is running inside chat GPT here.
So this isn't a special added in feature that I've got in there. This is just rather than building in a chat bot inside the interface, we will just talk to any chat bot that you want.
Because it's got the MCP, and it just built directly into there.
So I'm loading this in the browser here in the chat GPT browser. Now it's using, so this is the codex thing.
And it's basically looking at the records here.
It's getting, finding the data inside each of the posts. And then it's going to see if it can find the metadata from out of there.
And I think the key part of this is that obviously you can use an agent to write your blog posts.
But that's not what they're great for.
They can write a blog post, but it's not going to be a great blog post.
The thing that I find it really exciting to use for is the really boring stuff.
So going through all of these things. And so if I look at the admin page here, let's expand this again.
And it's got all these pending changes. I'm going to go back and look at this.
And there we go. So it's filled in all of this metadata, and it's grabbed it from reading all of the posts.
And you can do other stuff like tell it to fill in all the SEO data.
And I think this is just an example of the way that you can make it happen.
Anything where it's got anything that human can do, it's able to just go and do the same sort of thing.
So this is just showing, and it can go and change your schema, or it can do any sort of stuff that it needs to do there.
So I think I'll wrap up from the demo here and just move on.
Okay.
So this is the point here, that they get the access that you need them to have. So here we've said this is going to get the collection, it's going to find all the content, it's going to find it all from there, skip the ones that are unclear, and then publish the changes.
But the point is this, that if it's acting as me, and I'm super admin, do I want an agent that can go in there and suddenly delete our users and all that kind of stuff?
It's like, well, no, because we can give it granular access controls.
And you can say this agent here, all they can do is edit the content it can't edit in any of the other stuff, or you are doing it for something that needs more access.
And then this is onto plugins, which are the harder part.
So that was fine. You just give them granular access and they get what they want.
Now, plugins are more difficult because they are code.
So for this, I took inspiration from mobile apps, where they are given the capability that they declare.
When you install a mobile app, you say, are you going to give it access to my camera, or am I going to give access to location or whatever?
And so this works because it runs in a sandbox. And the sandbox, when you're deploying it in Cloudflare Workers, is a dynamic worker.
But when you're running on Node, it runs WorkerD on itself, so you can self-host it as well with the full sandboxing.
And instead of having direct access to anything, any of the content, it gets provided with only the stuff that you've told it that it can do.
It's not even that you have to trust it. It gives it the exact things that they've given you access to.
So it gets its own content store. It has its own storage.
And you allow list particular domains even if you want to. And if they try and call fetch, it just doesn't work at all.
So it's locked down, and you don't need to trust it.
You basically tell it what you want, tell it what it's allowed, and that's what it can do.
So I think that that's quite an important change for the model there.
And it was probably the thing that we spent the most amount of time getting right, because plugins are so important with WordPress, and they're so important for a CMS, but they're also so dangerous.
So this is why we've gone for this model here, that we're going to do this.
But does this work for real?
I've been talking about this thing that I've built with loads of agents and stuff, and is it real?
I've said it's not an April Fool, it's 1 .0, but does it actually work in production?
So we decided that we were going to have to put our So in the summer, we migrated over the Cloudflare blog.
So this was before it was 1.0, so we were taking a bit of a chance on that one.
And these are the numbers for Agents Week in July when we first launched it.
So we posted 28 posts over the course of a week, loads and loads of editors working on it, and got lots of page views.
So around 3 million live page views on that, plus that doesn't include all the attacks that we had.
We got attacked in the middle of it, and it was very spiky as well.
So when particular posts were really popular, there was suddenly a ton of traffic.
And obviously, that would be embarrassing being Cloudflare if we couldn't handle that.
So MDash managed to handle that. So I've just given you a pretty brief introduction, but MDash is totally free, open source, MIT, so it's more flexible than WordPress.
You can use it for whatever you want. You can run it on WordPress, on Cloudflare, or you can run it on self host it yourself if you want.
All you need to do, npm create MDash, and give it a go. Thanks a lot.
