Skip to content

Free EmDash Plugins for Sites Leaving WordPress

Moving a site from WordPress to EmDash goes smoothly until you reach the plugins. FAQ blocks, [year] shortcodes, lead magnets and contact forms have no EmDash version, so they either break or show up as raw text on the new site.

So I ported 4 of my WordPress plugins and added the email provider EmDash was missing. These EmDash plugins carry your blocks, shortcodes, leads and forms over as they are. All 5 are free and open source, and they already run on core-forms.com and nino.in.

  • EmDash 1.1+
  • Astro 7
  • GPL-2.0
  • On npm
5 plugins on npm
Installed with pnpm from the @gatilab scope.
0 runtime dependencies
Each package ships source your site’s build compiles.
GPL-2.0-or-later
Free to use, with the source on GitHub.
WordPress data carries over
Same shortcodes, block data and form IDs.

The EmDash Plugins Built to Carry Your Content

Each one is a native EmDash plugin with its own tests and documentation. They need EmDash 1.1 or later, and Content Blocks and Lead Capture also need Astro 7.

Send

Core Forms for EmDash

Free

Port of Core Forms for WordPress

You write the form fields as plain HTML, and the plugin turns them into a working form with submissions, spam protection and actions.

  • Turnstile, reCAPTCHA v3 or hCaptcha, plus a honeypot, rate limit and duplicate check
  • AJAX submission with inline messages and a no-JavaScript fallback
  • A submissions inbox with CSV export
  • Email, autoresponder and webhook actions that use the WordPress plugin’s tokens
pnpm add @gatilab/emdash-core-forms

Permissions email:send network:request:unrestricted

you@example.comGet the checklist
launch-checklist.pdf

Lead Capture for EmDash

Free

Port of the Marketers Delight Lead Capture drop-in

A lead magnet block. A visitor enters an email address and gets your PDF, template pack or spreadsheet through a personal download link.

  • The file URL never appears in the page, and each visitor gets an expiring link
  • Optional double opt-in before the file goes out
  • Newsletter forwarding to Mailchimp, Kit, MailerLite, Brevo, Beehiiv, SendFox or Emailit
  • A leads inbox with search, CSV export and privacy export or erase by email
pnpm add @gatilab/emdash-lead-capture

Permissions email:send network:request users:read

Content Blocks for EmDash

Free

Port of GT ACF Blocks

10 editorial blocks for the EmDash editor, from FAQs and callouts to product reviews, comparisons and checklists.

  • FAQ and product review blocks can output FAQPage, Product or SoftwareApplication JSON-LD
  • EmDash’s own <PortableText> renders them with no component wiring
  • Light and dark mode through CSS custom properties
  • Accessible by default: native <details> FAQs and 44px touch targets
pnpm add @gatilab/emdash-content-blocks

Permissions None

Best Hosting in [year]

Dynamic Dates for EmDash

Free

Port of Dynamic Month & Year into Posts

36 date shortcodes, including [year], [monthyear] and [age], that resolve every time a page renders. A title like “Best Hosting in [year]” stays current without a republish.

  • The same shortcodes, attributes and output as the WordPress plugin
  • Rank Math and Yoast year variables resolve too
  • Dynamic date and countdown blocks, and the countdown recomputes in the browser so a cached page stays correct
  • Your own shortcodes through the same registry
pnpm add @gatilab/emdash-dynamic-dates

Permissions None

Your sign-in link
Sign in
Sent through Emailit

Emailit for EmDash

Free

New for EmDash

Without an email provider, EmDash can only show invite links for you to share by hand. This plugin sends EmDash’s invites, magic-link sign-ins, account recovery and plugin email through Emailit.

  • The API key is stored encrypted in the admin, or read from EMAILIT_API_KEY
  • From name, From address and Reply-To are editable in the admin
  • A failed send reports Emailit’s status back to whatever sent the email
pnpm add @gatilab/emdash-emailit

Permissions hooks.email-transport:register

Moving From WordPress to EmDash

The hard part of the move is content that depends on a plugin. A title with [year] in it or a form embedded in a post only works if something on the new site understands it, so each port keeps the WordPress names, attributes and data shapes.

WordPress

Core Forms

EmDash

Core Forms for EmDash

Carries Over

  • Form IDs and field names
  • Messages, settings and action templates
  • Front-end markup and cf-* events
  • [cf_form] embeds inside imported content

Doesn’t Carry Over

  • File uploads: the inputs render but files are dropped
  • The create_comment action
  • Logged-in user tokens
  • A From address per action
WordPress

Marketers Delight Lead Capture

EmDash

Lead Capture for EmDash

Carries Over

  • Block attributes, unchanged
  • Leads, daily stats and each source page
  • Lead tokens, so download links you already emailed keep working

Doesn’t Carry Over

  • FluentCRM forwarding
  • The Optins and Content Upgrades bridges
EmDash

Dynamic Dates for EmDash

Carries Over

  • Every shortcode and attribute
  • The same output formats as the WordPress plugin
  • Rank Math and Yoast year variables

Doesn’t Carry Over

  • Automatic resolution: you swap <PortableText> for <DynamicPortableText>
  • The <title> tag, which you resolve yourself
WordPress

GT ACF Blocks

EmDash

Content Blocks for EmDash

Carries Over

  • FAQ, callout, review and the other block data
  • WordPress image objects with their alt text and size
  • Text that relied on automatic paragraphs

Doesn’t Carry Over

  • Translated labels: the renderers ship English UI text, so translating means overriding a renderer

Core Forms and Lead Capture both ship a read-only WP-CLI export script. You run it on the WordPress site and import the JSON file on the EmDash side. Emailit has no WordPress version, because WordPress sends mail on its own.

What Each Plugin Can Access

EmDash shows you the capabilities a plugin declares and asks you to approve them. These 5 are native plugins, because EmDash loads Astro rendering components only from native plugins.

Capabilities each EmDash plugin declares
PluginCapabilitiesUsed For
Content BlocksNoneRendering blocks. It registers no hooks, routes or settings.
Dynamic DatesNoneResolving shortcodes during render and in the SEO tags EmDash prints.
Emailithooks.email-transport:registerBecoming the site’s email provider.
Lead Captureemail:send network:request users:readDelivery and confirmation emails, calls to the newsletter services and Akismet only, and the first admin’s address for new-lead notices.
Core Formsemail:send network:request:unrestrictedEmail and autoresponder actions, webhooks to the URLs you set and CAPTCHA checks.

A native plugin runs inside your site’s process like any other npm package, without a sandbox around it. The capability list tells you what a plugin intends to do, and the source on GitHub is where you confirm it. Core Forms is the only one with open network access, because a webhook can point anywhere you choose.

How to Install EmDash Plugins

Every plugin installs the same way. You add the package, register it in astro.config.mjs and restart the dev server. The example adds all 5.

  1. Add the Packages

    Keep only the plugins your site needs.

    terminal
    pnpm add @gatilab/emdash-core-forms \
      @gatilab/emdash-lead-capture \
      @gatilab/emdash-content-blocks \
      @gatilab/emdash-dynamic-dates \
      @gatilab/emdash-emailit
  2. Register Them

    Native plugins go in plugins, not sandboxed. Lead Capture also adds leadCaptureSite(), a small middleware that answers download and confirmation links, because EmDash plugin routes can’t redirect a visitor to a file on another host.

    astro.config.mjs
    import { defineConfig } from "astro/config";
    import emdash from "emdash/astro";
    import { coreForms } from "@gatilab/emdash-core-forms";
    import { leadCapture } from "@gatilab/emdash-lead-capture";
    import { leadCaptureSite } from "@gatilab/emdash-lead-capture/site";
    import { contentBlocks } from "@gatilab/emdash-content-blocks";
    import { dynamicDates } from "@gatilab/emdash-dynamic-dates";
    import { emailit } from "@gatilab/emdash-emailit";
    
    export default defineConfig({
      integrations: [
        emdash({
          plugins: [
            coreForms(),
            leadCapture(),
            contentBlocks(),
            dynamicDates({ timeZone: "Asia/Kolkata" }),
            emailit({ from: "Example <noreply@example.com>" }),
          ],
        }),
        leadCaptureSite(),
      ],
    });
  3. Set an Encryption Key

    Plugins that keep API keys in the admin store them encrypted, which needs EMDASH_ENCRYPTION_KEY on the site. Keep a copy of the key somewhere safe, because secrets encrypted with a lost key can’t be read.

    terminal
    npx emdash secrets generate
  4. Restart and Approve

    Restart the dev server, then approve the capabilities EmDash asks for. A few plugins need one more step:

    • Dynamic Dates needs <DynamicPortableText> in place of <PortableText> in your templates.
    • Lead Capture needs its standalone stylesheet on any theme other than Marketers Delight.
    • Emailit needs a From address on a domain you’ve verified in Emailit.

Support From the Developer

These plugins are free, and I still take responsibility for them. Bugs and feature requests go to the plugin’s GitHub repository, where the fix stays public for the next person who hits the same thing.

Bugs With a Clear Fix

Open an issue with what you expected, what happened and your EmDash and Astro versions. I’ll work through it with you and ship the fix in the repository.

Features Worth Building

If a feature belongs in the plugin and EmDash can support it, I’ll build it. Tell me the job you need it to do.

Clear Platform Limits

Some WordPress behavior can’t move as it is yet, and file uploads in Core Forms are one example. When you hit a limit like that, I’ll explain it and suggest a workable approach.

EmDash Plugin Questions

Cost, compatibility and what happens to your WordPress content.

Have a question that isn’t here? Ask me directly.

What Is EmDash?

EmDash is an open-source CMS written in TypeScript and built on Astro, released under the MIT license as a successor to WordPress. It stores content as Portable Text, a structured JSON format, instead of HTML. That’s why WordPress shortcodes and blocks need a plugin to render on it.

Are These EmDash Plugins Free?

Yes. All 5 are free and licensed GPL-2.0-or-later, the same license as the WordPress plugins they come from. There’s no paid tier and no license key.

Do I Need to Be Moving From WordPress?

No. They work on a new EmDash site too. Content Blocks and Dynamic Dates add editor blocks, Core Forms and Lead Capture add their own admin screens, and Emailit only needs an Emailit account with a verified sending domain.

Which EmDash Version Do They Need?

EmDash 1.1 or later. Content Blocks and Lead Capture also need Astro 7, and Core Forms and Lead Capture need React 19 for their admin screens.

Will My WordPress Shortcodes Still Work?

The ones these plugins own will. Dynamic Dates resolves [year], [monthyear] and the rest of its shortcodes, and Core Forms expands [cf_form] embeds inside HTML sections. Shortcodes from other WordPress plugins need their own replacement.

Where Do I Report a Bug?

Open an issue on that plugin’s GitHub repository. Include your EmDash and Astro versions and the steps that trigger the problem.

What Are You Moving to EmDash? Start With the Plugin Your Content Needs.

If something your site depends on is missing, tell me what it is.