{"id":98041,"date":"2026-10-08T03:02:00","date_gmt":"2026-10-08T07:02:00","guid":{"rendered":"https:\/\/overcentral.com\/en\/?p=98041"},"modified":"2026-09-29T07:58:29","modified_gmt":"2026-09-29T11:58:29","slug":"emdas-portable-text-content-reuse-98041","status":"publish","type":"post","link":"https:\/\/overcentral.com\/en\/emdas-portable-text-content-reuse-98041\/","title":{"rendered":"How EmDash\u2019s Portable Text Format Makes Content Reusable"},"content":{"rendered":"<p>WordPress stores content as HTML. Every paragraph, heading, and image gets baked into markup. That works for a single website, but try reusing that same content in an email newsletter, a mobile app, or <a href=\"https:\/\/overcentral.com\/en\/ai-avatar-empire-96590\/\" title=\"Build an AI Avatar Empire Without Showing Your Face\" data-iacss-internal=\"1\">an AI<\/a> prompt. You need to strip the HTML, parse it, and rebuild it for each new destination.<\/p>\n<p><a href=\"https:\/\/emdash.com\/\" target=\"_blank\" rel=\"sponsored noopener noreferrer\" data-iacss-external=\"1\">EmDash<\/a> breaks that pattern. Its content format \u2014 portable text \u2014 stores everything as structured JSON. One source, many outputs. No rewriting required.<\/p>\n<h2>Why Content Reuse Matters<\/h2>\n<p>A single blog post rarely lives on just one channel. You publish it on your site, excerpt it in a newsletter, repurpose it for a LinkedIn article, and maybe feed it into an AI tool for a summary. With WordPress, that means four separate formatting jobs. Each channel introduces drift. The newsletter cuts sections, the AI gets a mangled version, and the original post becomes the only canonical copy.<\/p>\n<p>EmDash\u2019s portable text solves this at the storage layer. Content is stored as a JSON array of blocks \u2014 paragraphs, images, headings, lists \u2014 each with its own type and metadata. The same block structure can render to HTML for your website, plain text for an email, or markdown for an <a href=\"https:\/\/overcentral.com\/en\/meta-muse-ai-agent-80441\/\" title=\"Meta Launches Muse AI Agent, Needs User Trust\" data-iacss-internal=\"1\">AI agent<\/a>. The content never changes; only the output format does.<\/p>\n<h2>What Portable Text Actually Is<\/h2>\n<p>Portable text is an open standard originally developed at <a href=\"https:\/\/www.sanity.io\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-iacss-external=\"1\">Sanity<\/a> by engineer Christian Schuhmann. EmDash adopted it as its native rich-text format. Instead of saving a string of <code><\/p>\n<p><\/code>codecodecodecodecode and <code><img><\/code>codecodecodecodecode tags, EmDash saves a JSON structure like this:<\/p>\n<p>&#8220;`<\/p>\n<p>{<\/p>\n<p>  &#8220;type&#8221;: &#8220;paragraph&#8221;,<\/p>\n<p>  &#8220;children&#8221;: [<\/p>\n<p>    { &#8220;text&#8221;: &#8220;This is a reusable paragraph.&#8221; }<\/p>\n<p>  ]<\/p>\n<p>}<\/p>\n<p>&#8220;`<\/p>\n<p>Every block is self-contained. Images become block references. Links carry metadata. The format is machine-readable by design \u2014 no HTML parsing needed. An AI agent can read the JSON directly and understand the structure, not just the raw text.<\/p>\n<p>This is the format that powers EmDash\u2019s built-in block editor. When you write a post, every paragraph, image, or callout becomes a distinct JSON node. That structure persists through export, API calls, and AI agent interactions.<\/p>\n<h2>Real-World Reuse Scenarios<\/h2>\n<p>Take a standard blog post about a product launch. On your EmDash site, it renders as a full webpage. But the same portable text can feed into:<\/p>\n<ul>\n<li><strong>An email newsletter<\/strong> \u2014 the JSON blocks render as clean <code><br \/>\n<table><\/code>codecodecodecodecode-based HTML for email clients.<\/li>\n<li><strong>An RSS feed<\/strong> \u2014 each block becomes a structured XML element, not a messy HTML blob.<\/li>\n<li><strong>An AI agent<\/strong> \u2014 the MCP server exposes the structured data so an agent can query \u201cfind all callout blocks\u201d without regex.<\/li>\n<\/ul>\n<p>The EmDash playground includes a demo where you can edit a post and immediately see it rendered on the front end. That\u2019s because the portable text is the single source of truth. There\u2019s no separate template or custom field for the email version. It\u2019s the same data.<\/p>\n<h2>AI Agent Integration<\/h2>\n<p>This is where portable text really earns its keep. EmDash ships with a built-in MCP server \u2014 the protocol Anthropic created for <a href=\"https:\/\/overcentral.com\/en\/rogue-ai-agents-liability-vacuum-97898\/\" title=\"Rogue AI agents expose liability vacuum as OpenAI faces claims\" data-iacss-internal=\"1\">AI agents<\/a>. An agent like Claude or Copilot can connect directly to your EmDash site, read the portable text, and perform operations.<\/p>\n<p>For example, an agent can scan all posts for a specific phrase and replace it across every block, respecting the JSON structure. In WordPress, that would require a database query and regex replacement on HTML, which often breaks formatting. In EmDash, the agent sees clean blocks and can update them programmatically.<\/p>\n<p>EmDash also includes \u201cagent skills\u201d files \u2014 structured documentation that tells AI agents exactly how to interact with the CMS. The skills files describe the portable text schema, so agents know what fields are available without custom prompting.<\/p>\n<h2>The Migration Advantage<\/h2>\n<p>If you\u2019re moving from WordPress, EmDash\u2019s import tool converts your WXR export into portable text. It reads your Yoast SEO fields, your categories, your post content \u2014 and maps everything into JSON blocks. That means your old HTML gets parsed into structured blocks. A heading <code><\/p>\n<h2><\/code>codecodecodecodecode becomes a heading block. A paragraph becomes a paragraph block.<\/p>\n<p>The result: your existing content, now reusable. A site with 500 posts can be imported in minutes, and every post becomes instantly portable to any output channel.<\/p>\n<h2>One Caveat<\/h2>\n<p>Portable text handles block content well \u2014 paragraphs, headings, images, lists. But it doesn\u2019t natively support complex page layouts built with drag-and-drop builders like Elementor or Divi. Those tools create deeply nested HTML with inline styles and custom shortcodes. EmDash\u2019s import can map the text content, but the layout structure won\u2019t survive conversion. For sites built with page builders, portable text is best suited for the editorial content inside the blocks, not the grid itself.<\/p>\n<p>That\u2019s a limitation worth knowing. But for the vast majority of content \u2014 blog posts, articles, documentation \u2014 portable text makes reuse effortless. One format, every channel, no duplication.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>WordPress stores content as HTML. Every paragraph, heading, and image gets baked into markup. That works for a single website, but try reusing that same content in an email newsletter, a mobile app, or an AI prompt. You need to strip the HTML, parse it, and rebuild it for each new destination. EmDash breaks that [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":99469,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98041.png","fifu_image_alt":"How EmDash\u2019s Portable Text Format Makes Content Reusable","footnotes":""},"categories":[31],"tags":[],"class_list":["post-98041","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98041.png","fifu_image_alt":"How EmDash\u2019s Portable Text Format Makes Content Reusable","_links":{"self":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98041","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/comments?post=98041"}],"version-history":[{"count":1,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98041\/revisions"}],"predecessor-version":[{"id":99470,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98041\/revisions\/99470"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media\/99469"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media?parent=98041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/categories?post=98041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/tags?post=98041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}