Skip to content

ci: release#1534

Merged
ascorbic merged 2 commits into
mainfrom
changeset-release/main
Jun 22, 2026
Merged

ci: release#1534
ascorbic merged 2 commits into
mainfrom
changeset-release/main

Conversation

@emdashbot

@emdashbot emdashbot Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@emdash-cms/cloudflare@0.22.0

Minor Changes

  • #1378 640e60a Thanks @scottbuscemi! - Add an optional distributed object cache for query results.

    Content reads (getEmDashCollection, getEmDashEntry, resolveEmDashPath) and chrome reads (site settings, menus, taxonomies) can now be served from a fast key/value store instead of hitting the database on every request. This sits beneath the per-request cache and above the database, dramatically reducing read pressure on D1/SQLite — especially valuable on Cloudflare, where KV handles far more requests than D1.

    The cache is off by default and fully opt-in. Configure a backend in astro.config.mjs:

    import { kvCache } from "@emdash-cms/cloudflare"; // Workers KV (distributed)
    import { memoryCache } from "emdash/astro"; // in-isolate (Node / local dev)
    
    emdash({
    	database: d1({ binding: "DB" }),
    	objectCache: kvCache({ binding: "CACHE" }),
    });

    with a matching KV binding in wrangler.jsonc:

    { "kv_namespaces": [{ "binding": "CACHE", "id": "<namespace-id>" }] }

    Invalidation is epoch-based and automatic: content, byline, taxonomy, menu, and settings writes bump a per-namespace version, instantly orphaning stale entries (no key enumeration needed). Preview and visual-edit requests bypass the cache, so editors previewing see live content; other reads are served from the cache, which only ever stores published content. After an edit, anonymous visitors may see stale content until isolates pick up the bumped epoch — immediate on the in-isolate memory backend, and on KV bounded by KV's edge-cache propagation (eventually consistent, up to ~60s) plus the revalidate window (default 1s, configurable).

    New public API: cachedQuery, invalidateObjectCache, invalidateCollectionCache, contentNamespace/contentNamespaces, CacheNamespace, the ObjectCache* types (from emdash), memoryCache() (from emdash/astro), and kvCache() (from @emdash-cms/cloudflare). Existing sites are unaffected until they opt in.

  • #1549 a623c6b Thanks @ascorbic! - Fixes responsive image optimization for storage-backed media on Cloudflare. EmDash now wraps Astro's image endpoint to read media bytes directly from your storage adapter instead of fetching them over HTTP, so Image and Portable Text images generate a real responsive srcset even when the site is behind Cloudflare Access (previously these 404'd and fell back to a full-size image). This is on by default and also removes an internal HTTP round-trip on Node. Set images: false in your emdash() config to leave Astro's image endpoint untouched.

Patch Changes

emdash@0.22.0

Minor Changes

  • #1540 cf17c9f Thanks @marcusbellamyshaw-cell! - Add comment reactions

    Visitors can now react to approved comments (positive-only "like" by default,
    extensible to other reaction types). Reactions are deduped per voter via IP hash.

    The <Comments> component gains two opt-in props:

    • reactions — render a like button per comment and attach live counts.
    • sort="best" — order top-level comments by a Reddit-style Wilson score
      lower bound (sort="oldest", the previous behavior, remains the default).

    Posting is progressively enhanced (a tiny inline script, no framework island)
    and emitted only when reactions is enabled, so pages that don't use reactions
    ship zero additional JavaScript. Fully additive and backward-compatible: a new
    table, a new route, and new optional props with behavior-preserving defaults.

  • #1484 d46abfd Thanks @swissky! - Forward declarative portableTextBlocks and fieldWidgets from standard and sandboxed (from-config) plugins

    Standard- and sandboxed-format plugins could already declare admin pages and dashboard widgets, but their declarative Portable Text block types and field widgets were dropped during adaptation — only native-format plugins surfaced them. Since the admin editor reads these from the manifest, the slash-menu entries and Block Kit forms never appeared for non-native plugins.

    adaptSandboxEntry now forwards both for standard plugins and sandboxed plugins resolved from config (the virtual-modules.ts codegen path), so those formats can contribute Portable Text blocks and field widgets. The site-side render component (componentsEntry) still requires native format, which is unchanged.

    Note: marketplace bundles loaded from R2 are not covered yet — the bundle manifest schema, both extractManifest() implementations, and the bundler don't carry these fields, so this is scoped to standard/sandboxed-from-config. Full marketplace support is tracked as a follow-up.

  • #1564 6a97bac Thanks @ascorbic! - Adds byline management to the MCP server: byline_list, byline_get, byline_create, byline_update, byline_delete, and byline_translations tools, plus a bylines argument on content_create so credits can be attached at creation time (previously only content_update accepted them).

  • #1378 640e60a Thanks @scottbuscemi! - Add an optional distributed object cache for query results.

    Content reads (getEmDashCollection, getEmDashEntry, resolveEmDashPath) and chrome reads (site settings, menus, taxonomies) can now be served from a fast key/value store instead of hitting the database on every request. This sits beneath the per-request cache and above the database, dramatically reducing read pressure on D1/SQLite — especially valuable on Cloudflare, where KV handles far more requests than D1.

    The cache is off by default and fully opt-in. Configure a backend in astro.config.mjs:

    import { kvCache } from "@emdash-cms/cloudflare"; // Workers KV (distributed)
    import { memoryCache } from "emdash/astro"; // in-isolate (Node / local dev)
    
    emdash({
    	database: d1({ binding: "DB" }),
    	objectCache: kvCache({ binding: "CACHE" }),
    });

    with a matching KV binding in wrangler.jsonc:

    { "kv_namespaces": [{ "binding": "CACHE", "id": "<namespace-id>" }] }

    Invalidation is epoch-based and automatic: content, byline, taxonomy, menu, and settings writes bump a per-namespace version, instantly orphaning stale entries (no key enumeration needed). Preview and visual-edit requests bypass the cache, so editors previewing see live content; other reads are served from the cache, which only ever stores published content. After an edit, anonymous visitors may see stale content until isolates pick up the bumped epoch — immediate on the in-isolate memory backend, and on KV bounded by KV's edge-cache propagation (eventually consistent, up to ~60s) plus the revalidate window (default 1s, configurable).

    New public API: cachedQuery, invalidateObjectCache, invalidateCollectionCache, contentNamespace/contentNamespaces, CacheNamespace, the ObjectCache* types (from emdash), memoryCache() (from emdash/astro), and kvCache() (from @emdash-cms/cloudflare). Existing sites are unaffected until they opt in.

  • #1549 a623c6b Thanks @ascorbic! - Fixes responsive image optimization for storage-backed media on Cloudflare. EmDash now wraps Astro's image endpoint to read media bytes directly from your storage adapter instead of fetching them over HTTP, so Image and Portable Text images generate a real responsive srcset even when the site is behind Cloudflare Access (previously these 404'd and fell back to a full-size image). This is on by default and also removes an internal HTTP round-trip on Node. Set images: false in your emdash() config to leave Astro's image endpoint untouched.

Patch Changes

  • #1579 0bfab91 Thanks @ascorbic! - Fixes a Cloudflare build failure where the bare zod import used by the type generator was not externalized, causing the bundler to fail. EmDash sites on Cloudflare now build correctly under Astro 7.

  • #1584 707edee Thanks @ascorbic! - Fixes the dev setup-bypass endpoint accumulating duplicate dev-bypass-token access tokens. Re-running it (for example after a dev reset) now replaces the previous token with a fresh one instead of adding another row.

  • #1581 a36b5f3 Thanks @naota70! - Fix the setup probe baking a redirect to /_emdash/admin/setup into prerendered pages. On a build whose database is empty (e.g. CI/first deploy), the anonymous setup probe saw a missing migrations table and returned context.redirect("/_emdash/admin/setup"); a prerendered route serializes that into static HTML and ships the redirect to production. The probe is now skipped entirely when context.isPrerendered is true — there is no live visitor to send to the wizard at build time, and the build database is legitimately empty. Live (SSR) requests are unaffected.

  • #1509 ed921d8 Thanks @ascorbic! - Speeds up public page loads on remote databases (D1, Durable Objects) by eagerly warming site-global layout data (menus, widget areas, taxonomy term lists, settings) at the start of the request, so the layout's per-component reads overlap into roughly one round trip instead of executing serially. Transparent to site code; no template changes needed.

  • #1563 c219aff Thanks @ascorbic! - Lets the MCP content_create and content_update tools accept a Markdown string for rich text (portableText) fields, converting it to Portable Text automatically — the same behaviour the EmDash client already has. Passing a Portable Text JSON array still works. Authoring rich text as a single Markdown string avoids the large nested JSON payloads that agents frequently emit as malformed JSON, causing the tool call to fail before it reaches the server. content_get and content_list gain an optional markdown flag (default false) that returns rich text fields as Markdown instead of Portable Text arrays.

  • #1580 ca47da4 Thanks @ascorbic! - Fixes query instrumentation (EMDASH_QUERY_LOG=1) so the per-query NDJSON log captures queries issued while the page is still streaming, not just those that ran before the response headers were sent. The per-query log now matches the totals already reported by the [emdash-stream-end] summary line.

  • #1538 cb1c689 Thanks @swissky! - Fix logged-in pages hanging indefinitely on Cloudflare Workers (#1274). A request cancelled mid-session.get("user") could leave the session-store read as a promise that never settles, poisoning the isolate so every later session-bearing request hung (0-CPU, multi-minute, canceled) — reliably reproducible on fresh isolates right after a deploy. Every session read on the request path (the main middleware, the auth middleware, and the preview-snapshot route) now goes through a shared resolveSessionUser() helper that anchors the read with after() so a cancelled request still drives it to completion (preventing the isolate poisoning), with a fail-closed timeout backstop that degrades a still-stalled read to "unauthenticated for this request" rather than hanging.

  • Updated dependencies [f4925b1]:

    • @emdash-cms/admin@0.22.0
    • @emdash-cms/auth@0.22.0
    • @emdash-cms/gutenberg-to-portable-text@0.22.0

@emdash-cms/admin@0.22.0

Patch Changes

  • #1545 f4925b1 Thanks @swissky! - Declare @tiptap/extension-drag-handle's collaboration peer dependencies

    @emdash-cms/admin uses @tiptap/extension-drag-handle, which declares @tiptap/extension-collaboration, @tiptap/y-tiptap (and transitively yjs, y-protocols) as peer dependencies. They were never installed because the collaboration feature is unused, and the admin bundle only worked because Rollup silently externalized the unresolved imports.

    Astro 7 switches Vite to Rolldown, which fails the build on unresolved imports instead of externalizing them, so the admin build breaks on this chain. Declaring it fixes the build under Rolldown/Astro 7 — and is correct dependency hygiene regardless of bundler. Closes #1544.

  • Updated dependencies []:

    • @emdash-cms/blocks@0.22.0

@emdash-cms/auth-atproto@0.2.18

Patch Changes

  • Updated dependencies []:
    • @emdash-cms/auth@0.22.0

@emdash-cms/plugin-embeds@0.1.26

Patch Changes

  • Updated dependencies []:
    • @emdash-cms/blocks@0.22.0

@emdash-cms/sandbox-workerd@0.1.10

Patch Changes

@emdash-cms/auth@0.22.0

@emdash-cms/blocks@0.22.0

create-emdash@0.22.0

@emdash-cms/gutenberg-to-portable-text@0.22.0

@emdash-cms/x402@0.22.0

@emdash-cms/fixture-perf-site@0.0.21

Patch Changes

@emdash-cms/perf-demo-site@0.0.21

Patch Changes

@emdash-cms/cache-demo-site@0.0.21

Patch Changes

@emdash-cms/do-demo-site@0.0.21

Patch Changes

@emdash-cms/do-solo-demo-site@0.0.21

Patch Changes


Try this PR

Open a fresh playground →

A full working EmDash site, deployed from this branch. Each visit gets its own session-scoped sandbox: no login needed and no shared state. Try the admin, edit content, hit the public site.

Tracks changeset-release/main. Updated automatically when the playground redeploys.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 18, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
docs 7d33ea5 Jun 22 2026, 06:54 PM

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 18, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
emdash-playground 7d33ea5 Jun 22 2026, 06:55 PM

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 18, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
emdash-demo-cache 7d33ea5 Jun 22 2026, 06:54 PM

@github-actions

Copy link
Copy Markdown
Contributor

Scope check

This PR touches 33 files. PRs with a broad scope are harder to review. Please confirm the scope hasn't drifted beyond the intended change.
This PR spans 5 different areas (area/core, area/admin, area/plugins, area/auth, area/cloudflare). Consider breaking it into smaller, focused PRs.

If this scope is intentional, no action needed. A maintainer will review it. If not, please consider splitting this into smaller PRs.

See CONTRIBUTING.md for contribution guidelines.

@pkg-pr-new

pkg-pr-new Bot commented Jun 18, 2026

Copy link
Copy Markdown

Open in StackBlitz

@emdash-cms/admin

npm i https://pkg.pr.new/@emdash-cms/admin@1534

@emdash-cms/auth

npm i https://pkg.pr.new/@emdash-cms/auth@1534

@emdash-cms/auth-atproto

npm i https://pkg.pr.new/@emdash-cms/auth-atproto@1534

@emdash-cms/blocks

npm i https://pkg.pr.new/@emdash-cms/blocks@1534

@emdash-cms/cloudflare

npm i https://pkg.pr.new/@emdash-cms/cloudflare@1534

@emdash-cms/contentful-to-portable-text

npm i https://pkg.pr.new/@emdash-cms/contentful-to-portable-text@1534

emdash

npm i https://pkg.pr.new/emdash@1534

create-emdash

npm i https://pkg.pr.new/create-emdash@1534

@emdash-cms/gutenberg-to-portable-text

npm i https://pkg.pr.new/@emdash-cms/gutenberg-to-portable-text@1534

@emdash-cms/plugin-cli

npm i https://pkg.pr.new/@emdash-cms/plugin-cli@1534

@emdash-cms/plugin-types

npm i https://pkg.pr.new/@emdash-cms/plugin-types@1534

@emdash-cms/registry-client

npm i https://pkg.pr.new/@emdash-cms/registry-client@1534

@emdash-cms/registry-lexicons

npm i https://pkg.pr.new/@emdash-cms/registry-lexicons@1534

@emdash-cms/sandbox-workerd

npm i https://pkg.pr.new/@emdash-cms/sandbox-workerd@1534

@emdash-cms/x402

npm i https://pkg.pr.new/@emdash-cms/x402@1534

@emdash-cms/plugin-ai-moderation

npm i https://pkg.pr.new/@emdash-cms/plugin-ai-moderation@1534

@emdash-cms/plugin-atproto

npm i https://pkg.pr.new/@emdash-cms/plugin-atproto@1534

@emdash-cms/plugin-audit-log

npm i https://pkg.pr.new/@emdash-cms/plugin-audit-log@1534

@emdash-cms/plugin-color

npm i https://pkg.pr.new/@emdash-cms/plugin-color@1534

@emdash-cms/plugin-embeds

npm i https://pkg.pr.new/@emdash-cms/plugin-embeds@1534

@emdash-cms/plugin-field-kit

npm i https://pkg.pr.new/@emdash-cms/plugin-field-kit@1534

@emdash-cms/plugin-forms

npm i https://pkg.pr.new/@emdash-cms/plugin-forms@1534

@emdash-cms/plugin-webhook-notifier

npm i https://pkg.pr.new/@emdash-cms/plugin-webhook-notifier@1534

commit: 7d33ea5

@emdashbot emdashbot Bot force-pushed the changeset-release/main branch 7 times, most recently from f6c94a2 to 5057652 Compare June 22, 2026 06:55
@github-actions github-actions Bot added size/L and removed size/M labels Jun 22, 2026
@emdashbot emdashbot Bot force-pushed the changeset-release/main branch 6 times, most recently from 737f745 to 5fed8ca Compare June 22, 2026 18:40
@emdashbot emdashbot Bot force-pushed the changeset-release/main branch from 5fed8ca to c8a994f Compare June 22, 2026 18:45
@ascorbic ascorbic merged commit 6b036c4 into main Jun 22, 2026
46 checks passed
@ascorbic ascorbic deleted the changeset-release/main branch June 22, 2026 19:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Astro 7 (Rolldown) build fails on unresolved @tiptap/extension-drag-handle collaboration peer deps

1 participant