github emdash-cms/emdash emdash@1.3.1

Patch Changes

  • #4069 30604dc Thanks @danielmlr! - Fixes sites on Cloudflare Workers in the default auto migration 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 migrate applies it.

    What should I do?

    If your site runs on Workers in auto mode and upgrades from 0.38 or earlier, run emdash migrate before 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 b01d06e Thanks @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 ed01613 Thanks @danielmlr! - Fixes emdash login and emdash logout ignoring EMDASH_URL. Without --url, they now use the site in EMDASH_URL, like the other commands, instead of always going to http://localhost:4321.

  • #4239 fedaf4c Thanks @danielmlr! - Fixes CLI commands failing behind Cloudflare Access once the EmDash access token saved by emdash login has expired. Refreshing the token now sends the custom headers from --header, EMDASH_HEADERS and emdash login, as every other request does. EmDashClient from emdash/client now also runs the interceptors you pass on its automatic token refresh request.

  • #4070 421cb0a Thanks @emdashbot! - Fixes createField on 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 a FIELD_EXISTS error.

  • #4161 974b77b Thanks @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, so next() 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 d33d0a5 Thanks @danielmlr! - Fixes the admin dashboard showing the number of users to roles that cannot list users. The Users card, and userCount in the GET /_emdash/api/dashboard response, are now limited to Administrators.

  • #4170 4045436 Thanks @emdashbot! - Fixes <Image> from emdash/ui so images with a blurhash placeholder keep their focal point. The generated style previously omitted the separating semicolon between the placeholder background and object-position, which caused browsers to discard both declarations.

  • #4013 03409e6 Thanks @emdashbot! - Fixes the admin login page so the help text under a provider's LoginForm is no longer hard-coded to "Enter your handle to sign in." for every provider.

    Providers can now export an optional loginHelp string or component from their admin entry. When loginHelp is 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/react as a peer dependency; if your package manager does not install peers automatically, install a compatible Lingui 5 version alongside the provider.

  • #4043 c958045 Thanks @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 bfc435a Thanks @emdashbot! - Fixes getEmDashCollection() returning empty results when where or orderBy uses a custom field while migration 086_relations_structural is 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 cfbd6bb Thanks @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 ee8ed8e Thanks @emdash-autofix! - Fixes locale-aware queries when Astro locales use custom paths and codes, such as { path: "en", codes: ["en-US"] }. Passing Astro.currentLocale to 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 621d12f Thanks @emdashbot! - Fixes repeated plugin storage index registration so unchanged declarations no longer rewrite the _plugin_indexes registry rows on every sync. This reduces background write traffic on D1 and other SQLite-backed deployments when index declarations have not changed.

  • #4220 b0129fb Thanks @emdash-autofix! - Reduces database round trips for the search(), searchCollection(), and getSuggestions() 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 185c709 Thanks @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-level caption; the legacy meta.caption alias 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 37c6537 Thanks @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 5be4504 Thanks @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 d45bd2d Thanks @emdash-autofix! - Fixes the Image component from emdash/ui rejecting the quality prop during astro 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, and max map to 25, 50, 80, and 100; finite numbers are rounded and clamped to 1–100.

  • #4074 f1ccf45 Thanks @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 ba4d402 Thanks @danielmlr! - Fixes Subscribers, and other users without content: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 MCP content_get returns only the published version of an entry with unpublished changes.

  • #4203 4752b90 Thanks @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 a0b6610 Thanks @emdashbot! - Stop forcing blank: true on every new text link.

    TipTap's Link extension defaults HTMLAttributes.target to "_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 with setLink() was serialized as blank: true and rendered with target="_blank" rel="noopener noreferrer". Both editors now set target: null in their Link HTMLAttributes, 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: true is unchanged and will continue to open in a new tab.

  • #4207 e5dda7b Thanks @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

Don't miss a new emdash release

NewReleases is sending notifications on new releases.