This release adds 5 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
Affected surfaces
Summary
AI summaryBroad release touches Minor Changes, Patch Changes, https://github.com/ascorbic, and https://github.com/MA2153.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
Add status, author, and date-range filtering to admin content list API. Add status, author, and date-range filtering to admin content list API. Source: llm_adapter@2026-06-12 Confidence: high |
— |
| Feature | Medium |
Add content filtering by byline credit via `getEmDashCollection` and helper function. Add content filtering by byline credit via `getEmDashCollection` and helper function. Source: llm_adapter@2026-06-12 Confidence: high |
— |
| Feature | Medium |
Introduce content-reference database schema (`_emdash_relations`, `_emdash_content_references`). Introduce content-reference database schema (`_emdash_relations`, `_emdash_content_references`). Source: llm_adapter@2026-06-12 Confidence: high |
— |
| Feature | Medium |
Generate responsive `srcset`s for media via Astro image service in Image and Portable Text components. Generate responsive `srcset`s for media via Astro image service in Image and Portable Text components. Source: llm_adapter@2026-06-12 Confidence: high |
— |
| Feature | Medium |
Drive scheduled publishing from real heartbeat; add Cloudflare Workers Cron Trigger support. Drive scheduled publishing from real heartbeat; add Cloudflare Workers Cron Trigger support. Source: llm_adapter@2026-06-12 Confidence: high |
— |
| Dependency | Low |
Updated dependencies: @emdash-cms/admin, @emdash-cms/auth, @emdash-cms/gutenberg-to-portable-text to 0.19.0. Updated dependencies: @emdash-cms/admin, @emdash-cms/auth, @emdash-cms/gutenberg-to-portable-text to 0.19.0. Source: llm_adapter@2026-06-12 Confidence: high |
— |
| Bugfix | Medium |
Read `?locale=` in content write routes and forward it for locale‑aware slug resolution. Read `?locale=` in content write routes and forward it for locale‑aware slug resolution. Source: llm_adapter@2026-06-12 Confidence: high |
— |
| Bugfix | Medium |
Fix `getTaxonomyTerms()` to return term description for flat (non‑hierarchical) taxonomies. Fix `getTaxonomyTerms()` to return term description for flat (non‑hierarchical) taxonomies. Source: llm_adapter@2026-06-12 Confidence: high |
— |
| Bugfix | Medium |
Fix seed CLI hardcoding `en` as default locale; respect project's actual default locale. Fix seed CLI hardcoding `en` as default locale; respect project's actual default locale. Source: llm_adapter@2026-06-12 Confidence: high |
— |
| Bugfix | Medium |
Fix `getEmDashEntry` / `getEmDashCollection` hydrating taxonomy terms in request‑context or default locale instead of entry's resolved locale. Fix `getEmDashEntry` / `getEmDashCollection` hydrating taxonomy terms in request‑context or default locale instead of entry's resolved locale. Source: llm_adapter@2026-06-12 Confidence: high |
— |
Full changelog
Minor Changes
-
#1442
e96587fThanks @ascorbic! - Add status, author, and date-range filtering to the admin content list (#1288). The content list API gainsauthorId,dateField,dateFrom, anddateToquery params (all additive and optional), and a newGET /_emdash/api/content/{collection}/authorsendpoint lists the distinct authors of a collection's content (gated oncontent:read). Filtering runs server-side, so it works across the whole collection rather than only the loaded page. -
#1439
023893aThanks @ascorbic! - Add content filtering by byline credit.getEmDashCollectionnow accepts a reservedbylinekey inwherethat returns entries credited to a byline in any position, including co-authored entries where the byline is a secondary credit. This makes author archive pages possible without querying the database directly. Pass a single byline translation group or an array to match any of several.const byline = await getBylineBySlug("jane-doe"); const { entries } = await getEmDashCollection("posts", { where: { byline: byline.translationGroup ?? byline.id }, orderBy: { published_at: "desc" }, });A
getEntriesByByline(collection, byline, options)helper wraps the same filter, mirroringgetEntriesByTerm. -
#1367
f41092bThanks @MA2153! - Add content-reference database schema:_emdash_relations(relationship-type definitions, row-per-locale) and_emdash_content_references(directed, locale-agnostic edges between content entries linked bytranslation_group). Additive, forward-only migration043; no existing tables change. Groundwork for reference fields — no field type, API, or admin UI yet. -
#1438
850c1b7Thanks @ascorbic! - Generate responsivesrcsets for media rendered with theImageand Portable Text image components. EmDash now routes locally/R2-stored media through Astro's configured image service (astro:assets) -- the Cloudflare Images binding on Workers, sharp on Node -- producing width-appropriate candidates and modern formats (e.g. WebP) instead of a single full-size<img>.This works automatically:
- Media served from a configured storage
publicUrl(R2 custom domain, S3/CDN) is authorized and optimized. - Same-origin proxied media (local storage, or R2 without a public URL) is optimized when
siteUrlis set; the matchingimage.remotePatternsentry is registered for you, scoped to the media route. - In
astro devit works out of the box without configuration.
When optimization isn't possible (no image service available, an unauthorized host, or unknown dimensions) the components fall back to a plain
<img>, so existing sites keep rendering exactly as before. No template changes are required. - Media served from a configured storage
-
#1312
c39789cThanks @ascorbic! - Drive scheduled publishing from a real heartbeat instead of request side effects (#1303).Content scheduled via the admin now actually transitions to
publishedwhen its time arrives. Previously nothing promoted the row —statusstayedscheduledandpublished_atstayed null forever.A new sweep (
publishDueContent) promotes due content and runs alongside the existing cron tick and system cleanup:- Node / single-process: the timer-based scheduler already drives it — no action needed.
- Cloudflare Workers: a
scheduled()handler driven by a Cron Trigger now runs the sweep. The request-drivenPiggybackScheduleris gone, so there are no maintenance side effects on visitor requests.
@emdash-cms/cloudflareships a Worker entry that wraps Astro's handler with thescheduled()handler (@emdash-cms/cloudflare/worker, pluscreateScheduledHandler()for hand-assembled Workers). When a cache provider is configured, the handler also purges edge-cache tags for whatever it published, so stale snapshots produced before the scheduled time are evicted.Migration for existing Cloudflare sites. New sites get this from the templates. Existing deployments must update two files:
// src/worker.ts export { default, PluginBridge } from "@emdash-cms/cloudflare/worker";// wrangler.jsonc "triggers": { "crons": ["* * * * *"] }Without the Cron Trigger, scheduled publishing and plugin cron do not run on Workers.
Scheduled publishing matches manual publishing exactly: it fires
content:afterPublishhooks (search indexing, webhooks, syndication), and records the scheduled time aspublished_aton first publication rather than the (later) sweep time. The sweep claims each row atomically before promoting it, so an entry unscheduled or rescheduled just before its time is never published, and overlapping sweeps can't double-publish. Localastro devkeeps running the timer-driven sweep even under the Cloudflare adapter (where production relies on the Cron Trigger).Each tick promotes at most 100 items per collection (a large backlog drains over successive ticks) so a single Worker invocation can't exhaust its CPU/subrequest budget, and edge-cache tags are purged incrementally after each collection's batch rather than only at the end. On Node, the maintenance interval is capped at 60s so scheduled-publish latency matches the Cloudflare Cron Trigger cadence instead of lagging up to five minutes when no plugin cron is due.
Patch Changes
-
#1307
cedfcc5Thanks @emdashbot! - Read?locale=in content write routes (DELETE, publish, unpublish, discard-draft, schedule, unschedule) and forward it tohandleContentGetfor locale-aware slug resolution (#1242) -
#1420
c63f9caThanks @swissky! -getTaxonomyTerms()now returns the termdescriptionfor flat
(non-hierarchical) taxonomies (#1419)The query already fetched the
datacolumn, but the non-hierarchical branch
dropped it when mapping rows toTaxonomyTerm— only hierarchical taxonomies
(viabuildTree) parsed the description. Descriptions set in the admin UI are
now returned for both kinds of taxonomies. -
#1426
61ea3c9Thanks @MA2153! - Fix seed CLI hardcodingenas the default locale (#1421)emdash export-seednow emits a top-leveldefaultLocalefor single-locale
projects, andemdash seed(applySeed) honors it when backfilling the locale
of menus, taxonomies, and content rows that omit an explicitlocale. Previously
anexport-seed→seedround-trip silently rewrote a non-endefault locale
(e.g.de) toen, since the CLI runs outside the Astro runtime and the
fallback collapsed toen. Projects whose default locale isenare unaffected. -
#1445
a4c2af2Thanks @ascorbic! - FixgetEmDashEntry/getEmDashCollectionhydrating taxonomy terms in the request-context or default locale instead of the entry's resolved locale (#1441). When querying with an explicitlocale(or via a localized route),entry.data.termscould return default-locale term variants even though the content row was correctly localized. Term hydration now uses the same resolved locale as the content query. -
Updated dependencies [
e96587f,cedfcc5,7e70abc,783e663,157237d]:- @emdash-cms/[email protected]
- @emdash-cms/[email protected]
- @emdash-cms/[email protected]
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About emdash
All releases →Related context
Earlier breaking changes
- v@emdash-cms/[email protected] Requires Cloudflare Workers sites to add Cron Trigger and update entry point for scheduled publishing.
- [email protected] Schema migration adds `locale` and `translation_group` columns to `_emdash_bylines`.
- [email protected] Byline hydration now strictly per-locale, suppressing cross‑locale fallback.
- v@emdash-cms/[email protected] Changes `_emdash_content_bylines.byline_id` to store translation_group instead of row id, enforcing strict per-locale credit hydration.
- v@emdash-cms/[email protected] Registry install handler fails closed on non-conforming aggregator release records.
Beta — feedback welcome: [email protected]