Release 26.07.04-01
Release: v26.06.30-01 → v26.07.04-01
Caution
Rollback Warning: This release contains irrevertable changes that are non-trivial to roll back from.
- Story Block: Server-side conversion of Markdown to ProseMirror JSON changes how Story Block values are persisted on the shared save path, so downgrading may misread newly stored content. (#36253)
- Search: Routing
/api/es/rawand/api/es/searchthrough the phase-awareSearchAPIalters the read/response path and cannot be cleanly reverted once traffic flows through it. (#36398)
Features & Enhancements
- Story Block: Markdown supplied to Story Block fields is now converted to ProseMirror JSON server-side, so headless imports and AI agents no longer need a human to re-save the contentlet. (#36253)
- dotAI: Added OpenRouter as a chat/streaming provider, giving access to hundreds of models behind a single OpenAI-compatible API key. (#36136)
- dotAI: Added Google AI (Gemini) as a provider with full chat, streaming, embeddings, and image generation support via an AI Studio API key. (#36137)
- dotAI: Added Anthropic as a direct chat/streaming provider using the Anthropic Messages API. (#36138)
- Image Editor: Wired the new Angular image editor's Save to the temp-file flow and completed focal-point persistence for the new Edit Content experience. (#36350)
- Search:
/api/es/rawand/api/es/searchnow route through the phase-awareSearchAPI, so both endpoints follow the active OpenSearch migration phase and survive Elasticsearch decommissioning. (#36398) - UVE: Contentlet toolbar buttons now reposition dynamically to stay visible within the iframe as the contentlet is scrolled. (#36402)
- Relationships: Saving heavily related content now uses bulk tree persistence, lean hydration, and delta-only reindexing, cutting Save/Publish times from minutes to seconds. (#36149)
- Developer Tooling: Added a
lts-backportClaude Code skill that automates backporting LTS patches from linked, merged PRs. (#36393) - Developer Tooling: The
/gh-issue-troubleshootcommand now performs a candidate-diff self-review with critical-change alerts and a configurable verbosity flag. (#36397)
Fixes and Known Issues
- Edit Content: Date, Date/Time, and Time pickers now use a fixed width and stay open until click-outside, so users can finish selecting the time portion. (#36365)
- Content Drive: The Upload button is now hidden when items are selected, avoiding uploads that landed in the wrong folder. (#36371)
- Block Editor: Applying a link to a selected image now wraps the image instead of replacing it with a text link, with a Remove-link action and layout-jump fixes. (#36368)
- Story Block: The legacy content editor now decodes the
$entity on reopen, so values like$50display correctly instead of$50. (#36408) - Edit Content: Refined the Relationship field UI — Locales chips, aligned status chips, footer-placed hints, and an empty-state link — to match Content Drive. (#36377)
- OpenSearch: A malformed
OS_ENDPOINTSvalue now falls back to Elasticsearch instead of crashing startup, thanks to lazy client construction. (#36359) - Content API: Guarded against a null
ContentTypein the Story Block refresh path, fixing a silent NPE that returned empty results during push-publish cache invalidation. (#36378) - Push Publishing: Bundles containing archived multi-language HTML pages no longer fail, as template propagation is now skipped for archived pages. (#36380)
- SDK Client:
page.get()now always returnserrorsas an array (empty when none) instead ofundefined, keeping responses serializable for Next.js Pages Router. Consumers should checkerrors.lengthrather than truthiness. (#36373) - UVE: Legacy portlet iframes now reload on site switch regardless of WebSocket state, so switching sites updates content even when the socket is down. (#36403)
- UVE: Restored hover, selection, and drag on Zone.js traditional pages after in-editor navigation by re-binding listeners to nodes that survive the iframe rewrite. (#36333)
Infrastructure & Security
- Block Editor: The new Block Editor is now enabled by default. (#36257)
- Content Types: Refactored the field editing experience into a dedicated
DotEditFieldDialogComponentopened viaDialogService, with dead-code and dependency cleanup. (#36341) - Frontend Build: Migrated several monorepo projects from legacy
.eslintrc.jsonto ESLint flat config for Nx 23 / ESLint 9. (#36390) - Search: Added deferred integration and unit coverage for the phase-aware
SearchAPI— phase routing, ES fallback, and permission filtering — with no production code changes. (#36395)