What it does
Publish asks for approval
On the content types you tick, Publish and Schedule are held wherever they come from: the editor, AI tools, other plugins and scheduled runs. A held Publish makes the request by itself. Contributors, who cannot publish, get an Ask for approval button.
Decide in one step
In the page’s Approval panel or on the Approvals page: Approve and publish, Approve (publish later), or Send back with a note. Admins can also approve without review, with a reason that is recorded and emailed to the other approvers.
What changed, in words
For example: Content: “£3.20” becomes “£3.40”; adds “pavlova”. Compared with the live page, and after an approval with the version that was approved. The page’s own Revisions panel still compares every version.
A record of what was approved
A text copy of each approved version is kept on the History tab, with who approved it. An approval belongs to one version: any change saved afterwards asks again, and says what changed since.
Approvers can fix a typo
They edit and save the page as usual, then approve. The history says the approver edited it before approving.
Two plain choices
“Others need my OK before publishing”: admins approve everyone else. “I need someone else’s OK before publishing”: everyone is held, admins too. Nobody approves their own request, and AI tools connected to the site always need a person’s OK, on every content type.
Checks and email
A missing search description or sharing picture is shown as a reminder, required, or not checked. When the site can send email, approvers hear when someone asks, writers hear the decision, and one reminder goes out after two days. Emails go out within about a minute; one that fails is tried twice more. Without email, requests show on the dashboard and the Approvals page.
Install
How to install a plugin on EmDash: the registry or npm
Install it from Registry in your EmDash admin. If you’d rather add it in code:
npm install @moorage/plugin-approvals// astro.config.mjs
import approvals from "@moorage/plugin-approvals";
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
export default defineConfig({
integrations: [emdash({ plugins: [approvals] })],
});Listed under plugins, it runs in your site’s own process, which works on any EmDash site. To run it sandboxed, list it under sandboxed instead; that needs a sandbox runner, which Cloudflare provides on Workers Paid. It behaves the same either way. It needs EmDash 1.3.0 or newer. Installed from the registry on Cloudflare, its emails need EmDash 1.4.0 or newer.
Then open Approvals in the admin sidebar, tick the content that needs approval and press Save. Nothing is held until an admin has saved the Settings tab once, AI tools included.
Screenshots




What it does not do
- It cannot hold what EmDash saves straight to a live page: the SEO panel, categories, tags and bylines of a page that is already live, and every save in a content type that keeps no drafts. Taking a page off the site (Unpublish) is not held either. The Settings tab lists these for your site.
- No discussion threads, mentions or inline comments; no chains of approvers, named approvers or approval by several people; no Slack.
- No editing inside the Approval panel: approvers edit the page in the editor.
Permissions
It asks to hold publishing (a content policy), to read content, drafts and the content structure to show what changed, to publish when an approver presses Approve and publish, to read users’ names and email addresses to write to approvers, and to send email. If it cannot check a publish that needs approval, it refuses it with a plain message instead of letting it through.
Questions
Is it free?
Yes, on any number of EmDash sites, with no account and no key. It is open source under the MIT License; the licence page says in plain words what you may do with it.
How do I make EmDash ask for approval before publishing?
Install this plugin, open Approvals, then Settings, tick the content types that need approval and press Save. From then on, pressing Publish sends the page for approval.
Who approves?
Choose “Others need my OK before publishing” and site admins approve everyone else’s changes. Choose “I need someone else’s OK before publishing” and everyone needs approval, admins too; an editor or another admin approves. Nobody approves their own request.
Why does the editor say “Failed to publish”?
That title is EmDash’s own and a plugin cannot change it. The text under it starts “Sent for approval. Not live yet.”: nothing failed, the page is waiting for approval.
What if I am the only person on the site?
Settings says approval needs a second person. Until there is one, an admin can use Approve without review.
Does it work without email?
Yes. Requests show on the dashboard and on the Approvals page. With email set up, approvers are also emailed when someone asks.
Is it in the EmDash registry?
Yes, as @moorage.dev/approvals. Install it from Registry in your EmDash admin, or from npm in the site’s code, as shown under Install.
What is the line at the foot of the plugin’s page?
Only admins see it: “Help · More free plugins · by Moorage”. Help opens the plugin’s setup guide; editors never see the line. To hide it, switch on “Hide the help line at the foot of this page” at the bottom of the Settings tab, with the other settings and press Save.
Where do I report a problem?
Open an issue on GitHub. If it is a security problem, write to security@moorage.dev instead.
Report a problem on GitHub: what happened, and your EmDash and plugin versions.
What should we make next?
Tell us the job you would like a plugin to do. We read every answer and use your email only to reply to it; release emails come only if you tick the box.