Skip to content

Open source · Unfinished experiment

Crafted Action Pages

I built an EmDash plugin for petitions, signup forms, fundraising pages, and event RSVPs. The project remains unfinished; some forms and integrations are incomplete.

Forms for common campaign tasks

Petition

Collect signatures with a campaign description and photos.

Fundraise

Link to ActBlue and show fundraising progress.

Letter to Congress

Draft a message using an editable letter template.

Call Your Rep

Show a phone number, call script, and talking points.

Event RSVP

Collect RSVPs and offer a calendar download.

GOTV Pledge

Collect voting pledges and show an election countdown.

Newsletter Signup

Collect newsletter subscriptions.

Multi-Step Form

Show different questions based on earlier answers.

Explore the example pages

These pages use fictional campaign content and run forms locally. The letter and call examples use fictional representatives; nothing is sent, saved, or charged.

Connections to campaign tools

The plugin includes adapters for these services. Each deployment needs its own credentials and configuration.

The application stack

Cloudflare Workers + D1 + KV + R2
Request handling and storage
Astro 6 + React 19 islands
HTML pages with interactive forms
emdash CMS
Content authoring
@adpena/action-pages
npm package (this engine)
Anthropic Claude
AI page generator + copy variants
Resend
Transactional email
Turnstile
Bot protection