Contact forms for Alpine.js

Add a contact form to any page with Alpine.js and no backend. One script tag, x-data on the form, and an @submit.prevent handler that posts to Formpaste. There is no build step. Preview it live, copy the code, and submissions land in your inbox - spam filtered.

How to create a Alpine.js form

  1. 1

    Create a form in your Formpaste dashboard and copy its access key.

  2. 2

    Add the Alpine script tag and the form markup above to your page.

  3. 3

    Replace YOUR_ACCESS_KEY_HERE with your access key, then publish.

Prompt for your AI coding agent

Add a Formpaste contact form to my page with Alpine.js. Use a real form with action set to https://api.formpaste.com/submit and a hidden access_key input, plus x-data for state and an @submit.prevent handler that POSTs new URLSearchParams(new FormData($el)) with fetch and then shows a thank-you message. No build step, no backend.

Or connect the Formpaste MCP server to Claude Code, Codex, Cursor, Claude Desktop, VS Code, or any mcp-remote client. See the setup guide.

One script tag and x-data

Alpine adds behaviour to markup you already have. You include it with a deferred script tag, put x-data on the form to hold a little state, and handle @submit.prevent by posting the fields to Formpaste. There is no build step, no bundler, and no components to set up - it drops into a static site, a CMS template, or a hand-written page.

The form still works without it

Because the markup keeps a real action pointing at Formpaste, the browser can post it even when Alpine has not loaded. That makes the directives an upgrade rather than a dependency, and it is why the form degrades gracefully on a flaky connection.

State stays on the element

x-data holds the state next to the markup that uses it, so a thank-you message is one boolean and an x-show. For a contact form that is the whole state machine - no store, no extra library, nothing to wire up.

How it works

Three simple steps for form submissions to land in your email inbox.
Create your form, set your form's action URL to Formpaste's endpoint, and add your access key.

1

Create your form

Sign up, verify your email, and create an access key in your dashboard.

2

Copy the code

Paste the snippet above into your project. Pick CSS or Tailwind to match your site.

<script src="https://cdn.jsdelivr.net/npm/alpinejs@3/dist/cdn.min.js" defer></script>
<style>[x-cloak] { display: none !important; }</style>

<div x-data="{ sending: false, sent: false }">
  <form
    action="https://api.formpaste.com/submit"
    method="POST"
    x-show="!sent"
    @submit.prevent="sending = true; await fetch($el.action, { method: 'POST', body: new URLSearchParams(new FormData($el)) }); sending = false; sent = true" class="mx-auto flex w-full max-w-md flex-col gap-4 rounded-xl border border-gray-200 bg-white p-6 shadow-sm dark:border-gray-800 dark:bg-gray-950"
  >
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Name
    <input type="text" name="name" placeholder="Your name" required class="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Email
    <input type="email" name="email" placeholder="you@example.com" required class="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Message
    <textarea name="message" required class="min-h-28 rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100"></textarea>
  </label>
  <button type="submit" class="w-full rounded-md bg-gray-900 px-4 py-2 text-sm font-medium text-white shadow-sm transition-colors hover:bg-gray-800 disabled:opacity-60 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-200" :disabled="sending">Send</button>
  </form>
  <p x-show="sent" x-cloak>Thanks - your message was sent.</p>
</div>
3

Add your access key

Replace the placeholder with your access key to start receiving submissions.

<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">

Contact forms for Alpine.js FAQ

Paste a form. Get submissions.

Instantly without setting up any backend, servers or databases. 250 submissions/mo free - no credit card.

What you get with Formpaste

No server, no DNS

Point your form at Formpaste - no backend, no DNS, no email server to run.

Spam filtered automatically

Heuristics + a quarantine folder you control. Real messages always get through.

Quarantine you control

Suspicious submissions land in a folder you review - nothing silently dropped.

Built for AI agents

An MCP server your coding agent calls to create a form and wire it up.

Copy-paste components

Accessible, copy-paste form code for HTML, React, TypeScript, JavaScript, and Astro.

Simple dashboard

Manage forms, inbox, quarantine, and delivery from one place.

More Alpine.js forms

Other platforms