Patch Changes
-
#4069
30604dcThanks @danielmlr! - Fixes sites on Cloudflare Workers in the defaultautomigration mode serving pages without their content, with a 200 status, after an upgrade whose migrations a request could not finish.Such a site now answers with a 503 response until its migrations are applied, so uptime checks notice it. A deployed Worker also no longer starts a migration that processes every entry and revision of a large site, such as the datetime normalization from 0.39.0; it answers with 503 until
emdash migrateapplies it.What should I do?
If your site runs on Workers in
automode and upgrades from 0.38 or earlier, runemdash migratebefore you deploy, as described in Apply large content migrations from the CLI.If a site answers with 503 after an upgrade, read the Worker log. When it names a pending migration, apply it with
emdash migrate. When it reports a held migration lock, follow Release a stuck migration lock. -
#4226
b01d06eThanks @emdash-autofix! - Fixes purged pages being cached again with stale site settings, including SEO verification tags, titles, and logos, on sites with or without an object cache. Route-cache fills with an object cache read settings directly from the database. Without an object cache, responses using an outdated settings snapshot are kept out of the route cache, and the next render reloads the settings. Warm settings snapshots also revalidate in the background after 30 seconds, retaining the last good value if a reload fails. -
#4180
ed01613Thanks @danielmlr! - Fixesemdash loginandemdash logoutignoringEMDASH_URL. Without--url, they now use the site inEMDASH_URL, like the other commands, instead of always going tohttp://localhost:4321. -
#4239
fedaf4cThanks @danielmlr! - Fixes CLI commands failing behind Cloudflare Access once the EmDash access token saved byemdash loginhas expired. Refreshing the token now sends the custom headers from--header,EMDASH_HEADERSandemdash login, as every other request does.EmDashClientfromemdash/clientnow also runs theinterceptorsyou pass on its automatic token refresh request. -
#4070
421cb0aThanks @emdashbot! - FixescreateFieldon D1 leaving a field in the schema without a backing column when the collection reaches the column limit. Failed fields can now be created after freeing a column, without aFIELD_EXISTSerror. -
#4161
974b77bThanks @emdashbot! - Fix an issue where the redirect middleware would rerun a route and hide the original error when the route (or later middleware) threw. The catch block is now narrowed to the redirect lookup, sonext()is called exactly once and route errors propagate to Astro. Failures during the middleware's own post-response work (404 logging and cache handling) are still caught and logged rather than propagated. -
#4181
d33d0a5Thanks @danielmlr! - Fixes the admin dashboard showing the number of users to roles that cannot list users. The Users card, anduserCountin theGET /_emdash/api/dashboardresponse, are now limited to Administrators. -
#4170
4045436Thanks @emdashbot! - Fixes<Image>fromemdash/uiso images with a blurhash placeholder keep their focal point. The generated style previously omitted the separating semicolon between the placeholder background andobject-position, which caused browsers to discard both declarations. -
#4013
03409e6Thanks @emdashbot! - Fixes the admin login page so the help text under a provider'sLoginFormis no longer hard-coded to "Enter your handle to sign in." for every provider.Providers can now export an optional
loginHelpstring or component from their admin entry. WhenloginHelpis absent, the page falls back to a neutral "Continue with {label}." message.The built-in AT Protocol provider keeps its handle-specific prompt and translates it using the admin's active locale. It requires
@lingui/reactas a peer dependency; if your package manager does not install peers automatically, install a compatible Lingui 5 version alongside the provider. -
#4043
c958045Thanks @giffeler! - Fixes media previews and file downloads timing out on Node.js sites using S3-compatible storage, including Cloudflare R2, after repeated cache revalidation or HEAD requests. -
#4024
bfc435aThanks @emdashbot! - FixesgetEmDashCollection()returning empty results whenwhereororderByuses a custom field while migration086_relations_structuralis pending. Reference fields become available on the next request after migrating, without waiting for the object cache to expire. Missing columns unrelated to caller fields are reported as collection-loading errors rather than filter warnings. -
#4255
cfbd6bbThanks @emdash-autofix! - Fixes menu item create, update, and reorder requests accepting missing, cross-menu, or cyclic parents that can hide items from rendered menus. Invalid parent changes now return a validation error without changing the menu; reorder validation uses the final state of the batch.Unchanged parent links from older writes do not block label edits or reorders, so menus with legacy invalid data remain editable.
-
#4224
ee8ed8eThanks @emdash-autofix! - Fixes locale-aware queries when Astro locales use custom paths and codes, such as{ path: "en", codes: ["en-US"] }. PassingAstro.currentLocaleto content, menu, taxonomy, and byline queries now matches rows stored under either the configured path or its codes. New writes use the path, while existing code-stamped rows keep their IDs, locale values, and associations. Reapplying seeds using either spelling reuses existing rows instead of creating duplicates.When both path- and code-stamped rows exist for the same slug or name, lookups and seed matching prefer the path, then codes in configuration order. Public content queries consider only published rows, so a draft path row does not hide a published code row. Existing rows are not merged or deleted: listings retain both, and row-ID lookups remain available. This read-side compatibility avoids a destructive data migration or manual renaming during upgrade.
-
#4229
621d12fThanks @emdashbot! - Fixes repeated plugin storage index registration so unchanged declarations no longer rewrite the_plugin_indexesregistry rows on every sync. This reduces background write traffic on D1 and other SQLite-backed deployments when index declarations have not changed. -
#4220
b0129fbThanks @emdash-autofix! - Reduces database round trips for thesearch(),searchCollection(), andgetSuggestions()helpers, including searches with no matches, to improve response times on Cloudflare D1. Empty or whitespace-only queries no longer query the database. Autocomplete also skips collections whose search indexes are missing. -
#4201
185c709Thanks @emdash-autofix! - Fixes captions being omitted from image field values and their generated TypeScript types. Image selection, content saves, and seed export/import preserve captions, including explicitly empty captions. Seed exports keep library defaults separately from per-use captions. Image and focal-point edits retain per-use captions unless the caption is explicitly edited. Templates should read the top-levelcaption; the legacymeta.captionalias stays consistent when present.For existing image fields whose captions were previously omitted, reselect the image or explicitly edit its caption, then save and publish the content entry. Upgrading alone does not fill captions into previously stored content values.
-
#4256
37c6537Thanks @emdash-autofix! - Fixes D1 parameter-limit errors when updating the status of up to 100 comments at once or saving content with more than 100 byline credits. -
#4225
5be4504Thanks @emdash-autofix! - Fixes duplicate menu items and widgets when concurrent first requests apply the same seed through D1 bindings. Menu and widget replacements are atomic on D1 bindings, transactional SQLite, and PostgreSQL, so a failed replacement retains the previous items. This does not make replacements atomic on the Durable Object SQL backend. -
#4221
d45bd2dThanks @emdash-autofix! - Fixes theImagecomponent fromemdash/uirejecting thequalityprop duringastro check. Quality now reaches both Astro image rendering paths and providers that support it, without leaking onto unoptimized<img>elements.Fixes EmDash's internal-media transforms on Cloudflare serving the full-size original for Astro quality presets or fractional and out-of-range numbers. Presets
low,mid,high, andmaxmap to 25, 50, 80, and 100; finite numbers are rounded and clamped to 1–100. -
#4074
f1ccf45Thanks @emdashbot! - Fixes stale automatic slug-change redirects hiding new entries published at the old URL. Publishing an entry now removes the automatic redirect from its URL, so visitors can reach the new page. -
#4179
ba4d402Thanks @danielmlr! - Fixes Subscribers, and other users withoutcontent:read_drafts, seeing unpublished content through the content API and MCP tools. Asking for the terms or translations of a draft or scheduled entry now returns not found, and MCPcontent_getreturns only the published version of an entry with unpublished changes. -
#4203
4752b90Thanks @danielmlr! - Fixes pages that show categories, tags or term counts hanging with a 524 error for every visitor on a Cloudflare Workers isolate after one visitor disconnected while the isolate was loading taxonomy definitions or its list of collections. -
#4106
a0b6610Thanks @emdashbot! - Stop forcingblank: trueon every new text link.TipTap's Link extension defaults
HTMLAttributes.targetto"_blank". Because both the admin rich-text editor and the inline visual editor configured Link with only styling classes, the default survived deep-merge, so every link created withsetLink()was serialized asblank: trueand rendered withtarget="_blank" rel="noopener noreferrer". Both editors now settarget: nullin their LinkHTMLAttributes, so newly saved text links no longer open in a new tab unless an author explicitly chooses that option (available only for image links today).Existing content that already has
blank: trueis unchanged and will continue to open in a new tab. -
#4207
e5dda7bThanks @danielmlr! - Fixes edits disappearing after unpublishing an entry in a collection without revisions: the editor showed the previously published content after every save, and the next save wrote it back over the edits. Saves now keep the edits, including on entries unpublished before this release. -
Updated dependencies [
eba70bc,1390d82,d33d0a5,6b168aa,03409e6,2940ab9,66d0294,a763760,68b954e,fabbbb0,d2da24b,9310f50,9e74ea3,185c709,7846c84,a0b6610,34b218d]:- @emdash-cms/admin@1.3.1
- @emdash-cms/blocks@1.3.1
- @emdash-cms/auth@1.3.1
- @emdash-cms/gutenberg-to-portable-text@1.3.1