EmDash 1.3: readable revision history and a better inline editor EmDash released version 1.3 on its blog, nine days after 1.2, with 87 changes from 16 community contributors and the core team, headlined by a readable revision history that shows each saved version in the editor with changes marked and the author named. The release also brings the admin editor's toolbar and image picker to on-page visual editing, adds an SEO setting that asks AI crawlers not to train on site content, and reduces database round trips for pages on Cloudflare D1; there are no database migrations between 1.2.0 and 1.3.0, and users update via `npx upgrade-emdash@latest` or `pnpm up --latest emdash`, keeping `emdash` and `@emdash-cms/cloudflare` on the same version. Blog https://emdashcms.com/blog EmDash 1.3: readable revision history and a better inline editor See exactly what changed in each saved version, edit on the page with the admin's toolbar and image picker, ask AI crawlers not to train on your site, and get faster pages on Cloudflare D1. EmDash 1.3 shows you who changed what, and when. Nine days after 1.2, it brings 87 changes from 16 community contributors and the core team. EmDash has kept revision history with one-click restore, since the beginning. But the interface didn't make it easy to use: the Revisions panel showed changes as raw JSON, and didn't say who made them. Now each saved version opens in the editor, with its changes marked and its author named. Editing on the page has caught up with the admin editor, and a new SEO setting asks AI crawlers not to train on your content. Pages on Cloudflare make fewer database round trips, Contributors can finally save their own drafts, and WordPress imports keep much more of the original site. All of this on top of the usual load of reliability and bug fixes. Highlights include: To update, run this from the project directory: npx upgrade-emdash@latest Or update by hand: pnpm up --latest emdash or if you are using Cloudflare pnpm up --latest emdash @emdash-cms/cloudflare Keep emdash and @emdash-cms/cloudflare on the same version. From this release, astro build and astro dev warn when they differ, and print the command to fix it 4058 https://github.com/emdash-cms/emdash/pull/4058 . Database migrations: none in this release. No numbered core migration was added or changed between 1.2.0 and 1.3.0. Read the upgrade notes upgrade-notes before deploying: a few changes affect plugin MCP tool names, bylines and custom admin hosts. See what changed in each version Selecting a version in the Revisions panel now shows it in the editor itself, read-only. Added text is highlighted and removed text is struck through, in a color for each person who saved a version. The panel lists who saved each version, and the selected version lists its changes in plain words, such as "Changed the title". Selecting one scrolls to it. Restore is in a bar at the bottom of the editor, and a version that matches an earlier one is marked "Restored from" with that version's date. Save and Publish pause while you look at an older version, and anything you hadn't saved is still there when you go back. The revisions API GET / emdash/api/content/{collection}/{id}/revisions and the MCP revision list tool now include each revision's author as { id, name } , so editors without access to user management can see who saved each version. Custom admins that render ContentEditor with an onRevisionRestored callback may need a small change; see the upgrade notes upgrade-notes . This shipped in 4136 https://github.com/emdash-cms/emdash/pull/4136 . Thanks @khoinguyenpham04 https://github.com/khoinguyenpham04 , who built it along with more than 20 other changes in this release. The admin editor's tools, on the page Visual editing lets you edit rich text directly on the site. Its editor now works like the redesigned admin editor from 1.2 4117 https://github.com/emdash-cms/emdash/pull/4117 : - Selecting text shows the admin's toolbar: Turn into , link, bold, italic, underline, strikethrough, inline code, and a More menu with subscript, superscript, alignment and Clear formatting . - With the cursor in a link, a bar shows where it goes, with buttons to edit or remove it. Clicking a link no longer opens it in a new tab, and typing a bare domain such as example.com links to https://example.com . - The slash menu groups its commands, shows each one's Markdown shortcut, and matches as you type, so /bl finds Bullet List . Headings 4 to 6 can be found by name and show at their own size. - Both menus follow the system's light or dark theme. Images work like the admin too 4137 https://github.com/emdash-cms/emdash/pull/4137 . Typing /image opens a picker below the line, showing the Media Library nine images at a time, with a tab for each media provider the site uses. Images show as they will publish, with their alignment and a caption field underneath. Selecting one shows a toolbar to replace it, edit its alt text or delete it. The picker on the page doesn't upload. To use a new image, upload it to the Media Library first, then choose it with /image . When the library is empty, the picker links to it. Other visual editing fixes: - Empty rich text fields, such as the body of a new post, can now be edited on the page. Before, they had no editor at all 3942 https://github.com/emdash-cms/emdash/pull/3942 . - Saving on the page no longer adds a revision every time you click away. Saves replace the pending draft revision, like the admin's autosave 3942 https://github.com/emdash-cms/emdash/pull/3942 . - Clicking a text field puts the cursor where you clicked, instead of selecting the whole value so that the first keystroke replaced it 4014 https://github.com/emdash-cms/emdash/pull/4014 . - An image inserted in a quote or list is placed after it. Before, saving dropped it. All of these are from @khoinguyenpham04 https://github.com/khoinguyenpham04 . Ask AI crawlers not to train on your site Settings SEO has a new Disallow AI training switch 3623 https://github.com/emdash-cms/emdash/pull/3623 . When it is on, /robots.txt disallows the AI training crawlers Amazonbot , Applebot-Extended , Bytespider , CCBot , ClaudeBot , Google-Extended , GPTBot and meta-externalagent , and adds a Content-Signal: search=yes, ai-train=no line. Search engines are unaffected. The rules are added to both the default and a custom robots.txt . The setting is off by default, so your robots.txt doesn't change until you turn it on. It is also available as seo.disallowAiTraining in the settings API and the MCP settings update tool. Like everything in robots.txt , these rules are a request that crawlers can ignore. Thanks @swissky https://github.com/swissky . Fewer database round trips on Cloudflare On D1 with session: "auto" or "primary-first" and no coalesce , pages load faster for logged-out visitors 3937 https://github.com/emdash-cms/emdash/pull/3937 . A D1 session runs a request's queries one at a time, so EmDash's preload of settings, menus, widget areas and taxonomy terms held up the page's own first query. In that setup EmDash no longer preloads them, and runs those queries only when a page uses them. Sites with coalesce: true keep the preload, batched into one round trip. New Cloudflare sites from the templates now turn on sessions and coalesce , so reads issued together share one D1 round trip, with or without read replication. To do the same on an existing site, update the d1 call in astro.config.mjs : database: d1 { binding: "DB", session: "auto", coalesce: true } , coalesce does nothing without a session mode. It is experimental: a read and a write started at the same time may run write-first, so await a read before a write that must not affect it. Other speed and caching changes, several of them from @swissky https://github.com/swissky : - Pages with comments run one query instead of two when all approved comments fit on one page 3907 https://github.com/emdash-cms/emdash/pull/3907 . - The first request after a cold start makes up to two fewer database round trips on sites with the plugin marketplace or registry 3584 https://github.com/emdash-cms/emdash/pull/3584 . - Creating or duplicating an entry no longer purges cached pages on sites with a route cache such as Workers Cache, because a new draft isn't on any public page 4128 https://github.com/emdash-cms/emdash/pull/4128 . - A new or changed redirect now takes effect for pages already in the Workers Cache 3982 https://github.com/emdash-cms/emdash/pull/3982 , and the route cache no longer stores the old page at a redirect's source when a Worker hasn't yet loaded the new rules 3997 https://github.com/emdash-cms/emdash/pull/3997 , thanks @bimsonz https://github.com/bimsonz . - A save no longer reports an error when the cache provider fails to purge after the change was saved. The failed purge is logged instead 3987 https://github.com/emdash-cms/emdash/pull/3987 , thanks @danielmlr https://github.com/danielmlr . See Read replicas https://docs.emdashcms.com/deployment/database/ read-replicas for setting up D1 sessions. Contributors can edit their drafts Contributors could create an entry, but the next save, the entry lock and setting categories or tags all failed with a 403. They can now edit their own entries while they are drafts, in the admin, the REST API and the MCP content update tool. They still can't edit published or scheduled entries, or publish 4133 https://github.com/emdash-cms/emdash/pull/4133 . This uses a new content:edit own drafts permission, held by Contributor and every higher role. No other role's permissions change. The dashboard also now works for users who can't read drafts, such as Subscribers. Recent activity and collection counts include only published entries, and scheduling notices are hidden from them 4171 https://github.com/emdash-cms/emdash/pull/4171 . If you use Cloudflare Access or another external auth provider, check your role numbers. The hover text for defaultRole and roleMapping called role 30 "Editor" and role 40 "Developer". Role 30 is Author, which can publish its own content, and role 40 is Editor. If you chose 30 because the hint said Editor, use 20 Contributor for people who shouldn't publish 4053 https://github.com/emdash-cms/emdash/pull/4053 , thanks @danielmlr https://github.com/danielmlr . More complete WordPress imports Many fixes in this release bring more of a WordPress site across: - Links to the old WordPress domain in imported content become root-relative paths, keeping the WordPress permalink structure, such as /2024/05/my-post/ . Add redirects if your routes differ. The analysis step shows the real site title and address 3892 https://github.com/emdash-cms/emdash/pull/3892 . - Dynamic blocks that WordPress renders on the server, such as custom plugin blocks or Latest Posts, used to vanish. They now become an HTML block holding the original block comment, so editors can see what was there and rebuild it. They show nothing on the site 4055 https://github.com/emdash-cms/emdash/pull/4055 . - Imports through the EmDash Exporter plugin keep Advanced Custom Fields values. Every ACF field in a field group becomes a field, and structured values such as repeaters, groups and relationships are stored as JSON. Relationship, post object, user and taxonomy values keep only their IDs, without the related post's content or the user's account details 4092 https://github.com/emdash-cms/emdash/pull/4092 . If you imported ACF relationship, post object or user fields with an earlier version, check those JSON fields: re-running the import skips existing entries, so it won't fix them. - WXR file imports skip ACF's own internal post types instead of creating acf field and acf field group collections. Delete those collections if an earlier import created them 4090 https://github.com/emdash-cms/emdash/pull/4090 . - When Cloudflare's bot protection challenges the import, the importer says so and explains how to let it through, instead of saying it couldn't detect WordPress. If a challenge blocks taxonomies, menus, settings or the media list, the import stops rather than finishing without them 4150 https://github.com/emdash-cms/emdash/pull/4150 . - Importer requests send a User-Agent , so hosts that block empty ones no longer return 403 4113 https://github.com/emdash-cms/emdash/pull/4113 . - The "skipped already exists " count only counts entries whose slug already exists 4056 https://github.com/emdash-cms/emdash/pull/4056 , and a failed analysis after pasting a migration key shows the error with Back and Retry instead of a blank page 4112 https://github.com/emdash-cms/emdash/pull/4112 . Thanks @danielmlr https://github.com/danielmlr and @swissky https://github.com/swissky , who did most of this work. The admin in more languages - Croatian hr is a new admin language, covering about 99% of strings 3934 https://github.com/emdash-cms/emdash/pull/3934 , thanks @tomislavcf https://github.com/tomislavcf . - Polish is complete. Before, 2,255 of 3,384 strings fell back to English. It also uses consistent terms for site, revision and passkey 3970 https://github.com/emdash-cms/emdash/pull/3970 , thanks @marcin-misiewicz-pl https://github.com/marcin-misiewicz-pl . - French 4134 https://github.com/emdash-cms/emdash/pull/4134 , thanks @tristanremy https://github.com/tristanremy and German 4084 https://github.com/emdash-cms/emdash/pull/4084 , @danielmlr https://github.com/danielmlr are complete. - Swedish covers everything added since 1.1, including the new editor, video blocks, the calendar and domain moves 3977 https://github.com/emdash-cms/emdash/pull/3977 , thanks @kegren https://github.com/kegren . - Hindi 3973 https://github.com/emdash-cms/emdash/pull/3973 , thanks @CacheMeOwside https://github.com/CacheMeOwside and Indonesian 3954 https://github.com/emdash-cms/emdash/pull/3954 , 3961 https://github.com/emdash-cms/emdash/pull/3961 , 3984 https://github.com/emdash-cms/emdash/pull/3984 , thanks @Zahid09987 https://github.com/Zahid09987 fill in missing strings. - Italian has a first catalog for the setup wizard and sign-in screens. It isn't in the language picker yet 4026 https://github.com/emdash-cms/emdash/pull/4026 , thanks @MarioCerulo https://github.com/MarioCerulo . Every date and time in the admin is now formatted in the admin's language, rather than the browser's, and displays correctly in right-to-left layouts 3292 https://github.com/emdash-cms/emdash/pull/3292 , thanks @itaides https://github.com/itaides . Arabic item counts no longer crash the content editor or Content Types page 4015 https://github.com/emdash-cms/emdash/pull/4015 , and error messages for publishing actions follow the admin language 3926 https://github.com/emdash-cms/emdash/pull/3926 , thanks @danielmlr https://github.com/danielmlr . Upgrade notes No changelog entry in this release is marked as breaking, but some setups need attention: - Plugin MCP tool names. Tools from plugins with scoped IDs, such as @acme/calendar , are now listed as acme calendar