Enhanced Blocks Editor is a Strapi 5 plugin that extends the built-in Blocks field so authors can insert other collection entries into rich text — inline in a sentence, or as a standalone card.
released August 18, 2026
npm install @thrillworksinc/strapi-enhanced-blocks-editorA Strapi plugin that extends the native Blocks editor with embedded entry support. Authors can reference other collection entries directly inside rich text content, either inline or as standalone blocks.
Install the plugin in your Strapi project:
# Using npm
npm install @thrillworksinc/strapi-enhanced-blocks-editor
# Using yarn
yarn add @thrillworksinc/strapi-enhanced-blocks-editorEnable the plugin in config/plugins.ts. If the file already exists, add this entry alongside your other plugins:
export default {
'enhanced-blocks-editor': {
enabled: true,
},
};Rebuild the admin panel so the plugin is registered:
npm run build
# or
yarn buildThen start your application:
npm run develop
# or
yarn develop| Option | Description |
|---|---|
| Allow embedded entries | Enabled by default. When off, the embed button is hidden in the editor and the allowed-types multi-select is disabled. |
| Allowed types for embedded entry blocks | Multi-select of collection types authors can embed. All types are selected by default. The embed dialog is limited to the selected types. |
| Embedded entry data in response | When enabled (default), the stored JSON includes the full entry data alongside the reference. Disable to store only the entry reference. Applies to newly created embeds only. |
Embedded entries are stored as JSON in the same format as Strapi Blocks content, with an additional embedded-entry block type.
Embedded entries use the same JSON format as Strapi Blocks content. On your frontend, render them with @strapi/blocks-react-renderer by providing a custom component for the embedded-entry block type. You do not need to modify the renderer package itself.
Install the renderer in your frontend project:
yarn add @strapi/blocks-react-renderer
# or
npm install @strapi/blocks-react-rendererEach embedded entry is stored as a node with type: 'embedded-entry':
{
"type": "embedded-entry",
"displayMode": "inline",
"entry": {
"documentId": "abc123",
"contentType": "article",
"contentTypeUid": "api::article.article",
"titleField": "My Article Title",
"data": { }
},
"children": [{ "type": "text", "text": "" }]
}displayMode — "inline" when embedded inside a paragraph, "block" when inserted as a standalone card.entry.documentId and entry.contentType — always present; use these to link to or fetch the entry.entry.contentTypeUid — full Strapi content-type UID; present on newly created embeds. Older embeds may omit this field.entry.titleField — display title captured at embed time.entry.data — full entry payload, present only when Embedded entry data in response was enabled when the embed was created.Pass a custom embedded-entry block to BlocksRenderer. The same component handles both inline and block display modes:
import { BlocksRenderer } from '@strapi/blocks-react-renderer';
function EmbeddedEntry({ displayMode, entry }) {
if (displayMode === 'inline') {
return <span className="embedded-entry-inline">{entry.titleField}</span>;
}
return (
<article className="embedded-entry-card">
<p>{entry.contentType}</p>
<h3>{entry.titleField}</h3>
{/* Use entry.data when present, or fetch by entry.documentId */}
</article>
);
}
export function RichText({ content }) {
return (
<BlocksRenderer
content={content}
blocks={{
'embedded-entry': EmbeddedEntry,
}}
/>
);
}Without a custom embedded-entry block, @strapi/blocks-react-renderer logs a warning and skips those nodes.
image blocks, embedded entries have a placeholder children array. Your component should not render children.entry.data is missing, fetch the entry from your Strapi API using entry.documentId and entry.contentType.embedded-entry is not part of the renderer's built-in types. Define props locally in your frontend, or extend the renderer's types as needed.If you find a bug or have a feature request, open an issue on GitHub. Include steps to reproduce, expected vs. actual behavior, and your Strapi and plugin versions when reporting a bug.
MIT
Share your work with the community and get it listed in the Strapi ecosystem for everyone to discover and use.
Submit
