Blog

Writing with Content Widgets: the blocks I actually use

A field guide to the nineteen blocks the Content Widgets plugin adds: which ones earn a place in a real article, when steps beat tabs, what the product box is honest about, and how AI drafts a widget-heavy post.

Letterpress type blocks in a grid, each stamped with a widget symbol, one being placed by hand

Articles are more than paragraphs. Tutorials need steps and warnings, reviews need spec tables and pros/cons, and every long post needs signposts. On WordPress that meant shortcodes or a page builder. On EmDash it is nineteen block types from the Content Widgets plugin - and this article is built from them, so every example below is running code, not a mockup.

The install walkthrough already covers getting the plugin onto a site. This is the other half: which blocks I reach for, when one beats another, and where an AI assistant helps draft widget-heavy posts without flattening them into plain text.

The five I reach for first

  • Notice - the colored callout carrying every warning and tip in this article; four kinds, a sentence or two of body
  • Steps - the numbered procedure; anything with an order gets this instead of a bulleted list
  • Code - filename, language tag, server-rendered so there is no flash of unstyled text
  • Cards - related-reading grids with icons; how most posts on this site end
  • Facts - the spec table: label/value pairs for versions, plans, requirements

Structure and signposts

Long posts need scaffolding before decoration. Prose blocks carry the paragraphs and headings, the table of contents above built itself from them, and the series block chains related posts so a reader can walk the set in order. The divider is the quiet one: a line, dots or space, no other fields.

Teaching blocks

Steps, checklist, accordion and tabs overlap on paper but not in use. Steps when order matters, checklist for unordered must-dos, accordion for questions the reader may skip, and tabs when one slot has to hold alternatives - like the two install paths below.

Admin, Plugins, Registry - search for Content Widgets, install, approve. The registry path keeps the plugin sandboxed and updates arrive through the same UI.

Clone the repo and add it as a file dependency, registered under sandboxed: or in-process. Pick this when you want to read or patch the code - it is the same package either way.

That was a real widget_tabs block: one slot, two alternatives, arrow-key navigation when JavaScript is on, anchored sections when it is not. The accordion works the same way for content a reader might skip - see the FAQ at the bottom.

Callouts and proof

Two blocks carry persuasion. The notice is the callout, and the quote block is for reader-voice lines that would look silly as a paragraph:

Notices for warnings, quotes for voices. Keep the two separate and the article stays honest.

House ruleEmDash HQ style guide

Anatomy of a block

This table
A widget_facts block: title plus a label/value repeater
Rendered
Server-side, straight into the HTML
Client JavaScript
None for this one
Editor shape
Fields in a block form, not markup you type
The widget gallery post on the live site showing the article header
The widget gallery post is the kitchen-sink demo - all nineteen blocks in order, which is how most people meet them.

Media and embeds

Images carry a caption and a wide flag - the screenshots in this post are widget_image blocks. The YouTube block is a facade: a thumbnail and a link until the visitor chooses to play, with a site setting that swaps the iframe to youtube-nocookie.com. Code blocks take a filename and a language:

astro.config.mjstypescript
plugins: [
	cloudflareEmail({ from: { email: "dragos@emdashhq.com", name: "EmDash HQ" } }),
	siteScriptsPlugin,
],
sandboxed: [contactFormsPlugin, widgetsPlugin],
sandboxRunner: sandbox(),

The embed block covers the rest - a URL, a title and an aspect ratio for anything that needs a plain iframe.

The money blocks, honestly

Cards and buttons are the traffic directors - most posts here end in a cards grid. The product box is the one block that can look like an ad, so the plugin puts an affiliate disclosure field in its settings and prints it small inside the box. This is a real product box reviewing the thing it runs on:

This post contains affiliate links. If you buy through them, the site may earn a commission at no extra cost to you.

Cloudflare Workers Paid

$5/month

The $5-a-month tier this site runs on. You need it for sandboxed registry plugins like the one this post is about - the honest price of the sandbox.

Pros

  • Sandboxed plugins actually run
  • D1 and R2 included for a site this size
  • Still cheaper than my old shared hosting

Cons

  • Not free like the Workers tier was
  • The sandbox ties you to Workers
The full cost breakdown
The Content Widgets block picker in the EmDash post editor
In the editor these are just entries in the block picker - previews come from the same catalog the plugin's admin page shows.
The Content Widgets settings page: YouTube nocookie, affiliate disclosure and posts collection
Three settings for the whole plugin: the YouTube nocookie toggle, the affiliate disclosure line, and which collection latest posts reads.

Where AI actually helps

Worth automating

  • Outline to blocks: paste a markdown outline and let it draft the widget body - steps for procedures, facts for specs, accordion for the FAQ
  • Shortcode cleanup: it converts WordPress shortcode soup into the matching widget blocks faster than any find-and-replace
  • FAQ drafting: feed it a doc or a comment thread and keep the five questions that keep recurring
  • Alt text and captions: first drafts for every figure, then fix the three that matter by hand

Do not automate

  • Ratings and pros/cons: that is your judgment - a plausible four stars you did not earn is just a nicer lie
  • Links: it invents plausible URLs, and every href it writes gets clicked by a human. That human is you, first
  • The prose: let it place blocks, not write paragraphs - the voice flattens within two sections

Common questions

FAQ

Do the blocks work on pages, not just posts?

Yes - widget types can be allowed in any blocks field. This site's pages take them; what gets allowed is a schema decision, not a plugin limitation.

How heavy is the output?

Server-rendered and small. The only client JavaScript covers tabs, the accordion toggle and the YouTube facade - everything else is plain HTML and CSS.

Can I restyle them?

They take the site's design tokens and ship their own scoped styles. The components live in the package's site/ directory, so copying and editing them is the supported path.

What happens if I uninstall the plugin?

The block data stays in your content; the renderers stop. Types are declared per collection, so you can also remove a single widget from the picker without touching the rest.

Keep going

The links from this guide