No server, no exceptions
Pages will never execute your form handler — not via plugins, not via Actions at request time. An external backend is the only architecture that works, so pick one built for it.
Hosts & site builders · works with Furrow Forms
The purest static host finally gets a working contact form.
paste this into your agent
Fetch furrowforms.com/ai and set up a contact form backend for my GitHub Pages site.agent-readable recipe: /forms-for/github-pages.md
prefer clicking? start in the dashboard
<form action="https://api.furrowforms.com/s/fp_k7m2" method="POST">
<input type="text" name="_gotcha" style="display:none" tabindex="-1" />
<input type="hidden" name="_ft" value="" />
<script>document.currentScript.previousElementSibling.value = Date.now();</script>
<input name="name" type="text" required />
<input name="email" type="email" required />
<textarea name="message" required></textarea>
<button>Send</button>
</form>The gap
GitHub Pages is the purest static host there is: files in a repo, served as-is, no server-side anything — which is exactly why “github pages contact form” has been a stack-overflow evergreen for a decade. The answer hasn’t changed shape: you need an external endpoint. Furrow Forms is that endpoint with the modern conveniences attached — spam stack on by default, notification email with template tokens, a thank-you redirect, and a free tier that fits a personal or project site. Paste the form into your HTML or Jekyll template, push, done.
Pages will never execute your form handler — not via plugins, not via Actions at request time. An external backend is the only architecture that works, so pick one built for it.
Furrow’s public keys are designed to be committed: protection comes from honeypot, optional Turnstile, your domain allowlist, and rate limits — not from hiding the URL.
Get an email when someone actually writes, not a mailbox of bot noise — rejected posts are dropped before storage and never count toward the free tier’s quota.
Two ways in
Furrow’s whole control plane is an API and MCP server. Paste this prompt into Claude Code, Cursor, or any agent — it does the rest:
paste this into your agent
Fetch furrowforms.com/ai and set up a contact form backend for my GitHub Pages site.free tier: 100 subs/mo · unlimited forms · full API + MCP · pricing →
FAQ
GitHub Pages cannot run server code, so point a plain HTML form at a Furrow Forms endpoint. Furrow receives the POST, filters spam, stores the submission, emails you, and redirects the visitor to your thank-you page — the site itself stays static files in a repo.
Yes — the public key is meant to ship in client-side HTML. Abuse is handled by the spam stack and the per-project domain allowlist, which stops other sites from using your endpoint even though they can read it.
Furrow’s free tier — 100 submissions a month with unlimited forms and the full API — comfortably covers a personal or project site, and spam never counts toward it.
paste this into your agent
Fetch furrowforms.com/ai and set up forms for this site.