markstageType it. Ship it.

Permissions

Who may do what in Markstage, by role: owner, administrator, editor, author and contributor, the WordPress names, decided in one place on the server.

Part of the API contract (docs/API.md: its conventions, prefix and errors apply here). Who may do what, by role (owner, administrator, editor, author, contributor, the WordPress names). Every decision is made in one file, packages/server/src/roles.mjs; this table is its human-readable copy and changes with it.

A person with a custom role (docs/API-ROLES.md) has its base as their role in this table; the role's own rules come first: a rule that denies takes a right away, one that allows gives a right the base lacks (never one that is "yes" only for the owner and administrators here).

ActionOwnerAdminEditorAuthorContributor
Read all entries, revisions, mediayesyesyesyesyes
Create / edit entries in a status collectionallallallownown drafts only
Edit collections without status (pages, settings)yesyesyesnono
Publish / schedule / unpublishallallallownno
Save raw HTML (new or changed raw HTML blocks)yesyesyesyesno
Delete to trashallallallownown drafts
Restore from trash / purgeyes / yesyes / yesyes / noown / nono
Upload media / edit altyesyesyesyesyes / own
Delete unused mediayesyesyesownno
Snippets (own) / shared, templatesyesyesyesownown
Rebuild whole siteyesyesyesnono
Find and replace across the site, bulk actionsyesyesyesnono
Redirects: list, add, change, remove, testyesyesyesnono
Authors (authors.manage): add, archive, change the slug, delete (posts given to another author or moved with the slug); see the list and profilesyesyesyessee; their own profilesee; their own profile
Change an author profile (docs/API-AUTHORS.md); see an author's private emailallallallownown
Change an existing page's type (docs/API-PAGE-TYPES.md; a new entry may be given one by anyone who makes it)yesyesyesnono
Topics (topics.manage, docs/API-LINKS.md): add, change, delete; put a page in a topic (Page settings, the Topic map); see the topics, the Link inbox and Healthyesyesyesseesee
Accept a link suggestion or a Health fix (it changes that other page, so it needs the right to edit that page, as above)as a saveas a saveas a saveas a saveas a save
Site health, CSV exports, Ask Google for speed, back up now, send a test alertyesyesnonono
Users, audit logyesyes (not owner)nonono
Inbox: read form messages, mark them handled or spam, give them to someone, add notesyesyesyesnono
Inbox: delete, CSV export, see the visitor's address; the thank-you mailyesyesnonono
Settings → Alerts: read / changeyes / yesyes / yesyes / nonono
My alerts (one's own)yesyesyesyesyes
Design & Code: read the files, tokens, revisionsyesyesyesyesyes
Design & Code: save CSS, tokens, scripts; add code to the site or a pageyesyesnonono
An AI assistant (MCP token) reads: entries, the pages a Library item is on, a release's entriesallallalllive + own draftslive + own drafts
An AI assistant (MCP token) reads promotion plansyesyesyesnono
An AI assistant (MCP token) writes: drafts (mcp:draft), and changes into a release that is not scheduledas aboveas aboveas aboveas aboveown drafts, no release
AI suggestions (in the editor): alt text, search title and description, a translation draft, for the entries one may readallallalllive + own draftslive + own drafts
AI suggestions: a promotion plan's summaryyesyesyesnono
Import entries and media from JSON (plan, run)yesyesyesnono
Translation status and the "needs translation" list (read only; writing a translation is an entry save)yesyesyesyesyes
Webhooks: add, change, remove, new secret, test, read deliveries, retryyesyesnonono
Integration fields: read the lists and pick from them (a save is checked against the list)yesyesyesyesyes
Integration fields: fetch a list again now (once a minute)yesyesyesnono
Custom roles: make, change, remove, give, dry-run (one on administrator: the owner only)yesyesnonono
Single sign-on: see and undo a person's links to the providersyesyes (not the owner or administrators)nonono
Sign in with a password when the site signs in with its providers only (sso.passwordLogin: false)yesnononono

"Own" = the entry's author field equals the user's authorSlug. Authors and contributors always create entries under their own authorSlug. "Raw HTML" = blocks the converter could not map to a known node or block pack (core rawHtmlOf(doc): block rawHtml {html} and inline rawInline {html}); a contributor's save may keep the ones already there but not add or change any (403).

An AI assistant reads more narrowly than a person in the editor does: an author's or a contributor's token shows live entries and their own drafts only, and so do the pages a Library item lists and a release's entries; plans, which name every file they move, are for editors and up. A person reads a colleague's draft in the editor to work on it with them. An agent copies what it reads into a model's context, where it can travel further, so it gets only what its person needs (docs/API-MCP.md "Reads follow the role").

Source: docs/API-PERMISSIONS.md on GitHub. Something unclear? Open an issue.