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, /go/ affiliate links, footnotes and contact forms have no EmDash version, so they either break or show up as raw text on the new site.

So I ported 8 of my WordPress plugins and added the email provider EmDash was missing. These EmDash plugins carry your blocks, shortcodes, short links, leads and forms over as they are. All 9 are free, MIT licensed and covered by their own test suites.

  • EmDash 1.4+
  • Astro 7
  • MIT
  • 9 on npm
9 plugins on npm
Installed with pnpm from the @gatilab scope.
0 runtime dependencies
Each package ships source your site’s build compiles.
MIT licensed
Use, change and ship them, 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, and each card names the popular WordPress plugins it stands in for. All 9 are tested on EmDash 1.4.0, the current release. The 4 newest need 1.4 or later, and the first 5 still run on 1.1. Filter by the job you’re moving.

Send

Core Forms for EmDash

Free

Port of Core Forms for WordPress

Replaces Contact Form 7, WPForms, Gravity Forms and Fluent Forms

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

Replaces OptinMonster, Thrive Leads and Bloom

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

Replaces Kadence Blocks, Spectra, Ultimate Blocks and Stackable

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

Replaces “Current Year, Symbols and IP Shortcode”, Shortcode for Current Date and WP Date and Time Shortcode

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

Replaces WP Mail SMTP, FluentSMTP and Post SMTP

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

$39.99$24.50
Amazon USAmazon India
Live price, checked today

Product Box for EmDash

NewFree

Port of the Product Box in GT ACF Blocks

Replaces AAWP, Lasso and AmaLinks Pro

A buying box for affiliate posts, with the image, rating, features, price and regional buy buttons in one block. Prices can come live from Amazon.

  • Every ACF field under its original name, with the same markup and CSS classes
  • Live Amazon US and India prices through the Creators API, never shown once they’re over 24 hours old
  • Regional buttons, such as Amazon US and Amazon India, side by side
  • Product JSON-LD with an Offer, and a rating only when there’s a review count
pnpm add @gatilab/emdash-product-box

Permissions network:request

1
Measured on five sites.
Footnotes
1
2

Footnotes for EmDash

NewFree

Port of the Marketers Delight Footnotes drop-in

Replaces the core Footnotes block, Easy Footnotes and Modern Footnotes

Type [fn]Your note[/fn] in a paragraph. Readers get a numbered reference with a preview, plus a footnotes list that links back.

  • The same shortcode, numbering, element ids and class names as the WordPress drop-in
  • Tooltip, click-to-open or margin-note display
  • Decimal, roman, letter or symbol numbering
  • Named notes you can cite more than once, each citation with its own back-link
pnpm add @gatilab/emdash-footnotes

Permissions None

CSSJSHeadFooter
.pricing {
  gap: 24px;
  color: var(--accent);
}
headbodyfooter

Scripts Manager for EmDash

NewFree

Port of the Marketers Delight Scripts Manager drop-in

Replaces WPCode, Header Footer Code Manager and Simple Custom CSS and JS

Custom CSS, JavaScript, head HTML and footer HTML on any entry, plus site-wide code for the head, the start of the body and the footer.

  • A Scripts panel beside every saved entry, in any collection
  • Classic, deferred or module JavaScript, in the head or before </body>
  • A fixed output order, so an entry’s CSS can override site-wide CSS
  • Only administrators can change code. Editors see a notice instead
pnpm add @gatilab/emdash-scripts-manager

Permissions hooks.page-fragments:register content:read

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. If you’re still deciding whether to move at all, start with my EmDash vs WordPress comparison.

Core Forms

WordPress

Core Forms

Also replaces Contact Form 7, WPForms, Gravity Forms and Fluent 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

Lead Capture

WordPress

Marketers Delight Lead Capture

Also replaces OptinMonster, Thrive Leads and Bloom
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

Dynamic Dates

WordPress

Dynamic Month & Year into Posts

Also replaces “Current Year, Symbols and IP Shortcode”, Shortcode for Current Date and WP Date and Time Shortcode
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

Content Blocks

WordPress

GT ACF Blocks

Also replaces Kadence Blocks, Spectra, Ultimate Blocks and Stackable
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

Product Box

WordPress

Product Box in GT ACF Blocks

Also replaces AAWP, Lasso and AmaLinks Pro
EmDash

Product Box for EmDash

Carries Over

  • Every field under its ACF name, repeaters included
  • The block’s markup and CSS classes, so theme styles keep working
  • Top-image layouts set through the block style class

Doesn’t Carry Over

  • Images picked by attachment ID: move them into the EmDash media library
  • A WordPress export script: boxes convert in code with fromAcfBlock()
  • Live prices outside Amazon US and India

Footnotes

WordPress

Marketers Delight Footnotes

Also replaces the core Footnotes block, Easy Footnotes and Modern Footnotes
EmDash

Footnotes for EmDash

Carries Over

  • Every [fn] shortcode, named notes included
  • Numbers, element ids and class names, so #footnote links still work
  • The drop-in’s display and list options

Doesn’t Carry Over

  • Automatic processing: you swap <PortableText> for <FootnotesPortableText>
  • A footnote button in the editor, because EmDash plugins can’t add inline marks yet
  • Footnotes inside table cells and other plugins’ blocks

Scripts Manager

WordPress

Marketers Delight Scripts Manager

Also replaces WPCode, Header Footer Code Manager and Simple Custom CSS and JS
EmDash

Scripts Manager for EmDash

Carries Over

  • Global head, body-start and footer code
  • Per-post CSS, JavaScript, head and footer HTML, matched to entries by slug
  • Named Scripts Manager 3 records with their location and priority

Doesn’t Carry Over

  • Consent categories and visibility conditions: those records arrive switched off
  • Category and tag scripts
  • The built-in GA4, Tag Manager, pixel and chat integrations

Core Forms, Lead Capture, Link Manager and Scripts Manager each ship a read-only WP-CLI export script. You run it on the WordPress site and import the JSON file on the EmDash side. Footnotes needs no export, because the [fn] shortcodes travel inside your content. 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. All 9 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.
FootnotesNoneRendering footnotes and removing [fn] from the SEO tags EmDash prints.
Link ManagerNoneIts own links, click stats and settings. The redirect runs in a small site middleware.
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.
Product Boxnetwork:requestCalls to Amazon’s Creators API hosts only, to refresh cached prices on a schedule.
Scripts Managerhooks.page-fragments:register content:readPrinting your code into pages, and reading entry titles and slugs for the admin list and the WordPress import.

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. Scripts Manager prints whatever code an administrator saves, so treat admin access to it like access to your theme files.

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 9, so delete the ones you don’t need.

  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 \
      @gatilab/emdash-link-manager \
      @gatilab/emdash-product-box \
      @gatilab/emdash-footnotes \
      @gatilab/emdash-scripts-manager
  2. Register Them

    Native plugins go in plugins, not sandboxed. Lead Capture and Link Manager also add a small site middleware each, leadCaptureSite() and linkManagerSite(). EmDash plugin routes live under /_emdash/, so download links and /go/ links need the site itself to answer them.

    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";
    import { linkManager } from "@gatilab/emdash-link-manager";
    import { linkManagerSite } from "@gatilab/emdash-link-manager/site";
    import { productBox } from "@gatilab/emdash-product-box";
    import { footnotes } from "@gatilab/emdash-footnotes";
    import { scriptsManager } from "@gatilab/emdash-scripts-manager";
    
    export default defineConfig({
      integrations: [
        emdash({
          plugins: [
            coreForms(),
            leadCapture(),
            contentBlocks(),
            dynamicDates({ timeZone: "Asia/Kolkata" }),
            emailit({ from: "Example <noreply@example.com>" }),
            linkManager(),
            productBox(),
            footnotes(),
            scriptsManager(),
          ],
        }),
        leadCaptureSite(),
        linkManagerSite(),
      ],
    });
  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.
    • Footnotes needs <FootnotesPortableText> in place of <PortableText>.
    • Scripts Manager prints through EmDash’s <EmDashHead>, <EmDashBodyStart> and <EmDashBodyEnd>, or its own components if your layout doesn’t use those.
    • Product Box needs your Amazon Creators API keys in its settings for live prices.

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 9 are free and MIT licensed, so you can use, change and ship them in client work. 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, Dynamic Dates, Footnotes and Product Box add editor blocks. Core Forms, Lead Capture and Link Manager add their own admin screens, Scripts Manager adds a panel beside each entry, and Emailit only needs an Emailit account with a verified sending domain.

Which EmDash Version Do They Need?

All 9 are tested on EmDash 1.4.0, the current release. Core Forms, Lead Capture, Content Blocks, Dynamic Dates and Emailit also run on EmDash 1.1 or later. Link Manager, Product Box, Footnotes and Scripts Manager need EmDash 1.4. Most need Astro 7, and the plugins with React admin screens (Core Forms, Lead Capture, Link Manager and Product Box) need React 19.

Will My WordPress Shortcodes Still Work?

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

Will My /go/ Affiliate Links Keep Working?

Yes, if you bring them over with Link Manager. It imports GT Link Manager’s export with every slug intact and serves the links at the same /go/ prefix. Use 302 or 307 for country-targeted links, because browsers cache a 301.

Does Product Box Need Amazon API Access?

Only for live prices. Without API keys, the box shows the prices you type in. Amazon opens the Creators API to Associates accounts with at least 10 qualifying sales in the last 30 days, checked per marketplace.

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.