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
Create a form in your Formpaste dashboard and copy its access key.
- 2
Add the Alpine script tag and the form markup above to your page.
- 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.
Create your form
Sign up, verify your email, and create an access key in your dashboard.
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>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.