GitHub Pages will never run your form handler
Pages serves files, full stop. The only way a Jekyll site on GitHub Pages gets a working form is an external backend — Furrow is one built for exactly this.
Frameworks & SSGs · works with Furrow Forms
The classic GitHub Pages pairing finally gets a working contact form.
paste this into your agent
Fetch furrowforms.com/ai and set up a contact form backend for my Jekyll site.agent-readable recipe: /forms-for/jekyll.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
Jekyll is the elder statesman of static sites and the engine behind classic GitHub Pages — which means millions of sites with markdown content, Liquid templates, and no way to receive a message. GitHub Pages runs no server code at all, and Jekyll wouldn’t offer any anyway. Furrow Forms completes the picture with one include: a plain HTML form posting to a managed endpoint that filters spam, stores the submission, emails you, and sends the visitor to your thank-you page. No plugins, no build changes, no JavaScript.
Pages serves files, full stop. The only way a Jekyll site on GitHub Pages gets a working form is an external backend — Furrow is one built for exactly this.
The form is markup in an include. It works with the default GitHub Pages build, safe-mode restrictions and all.
Long-lived Jekyll sites are exactly the ones bots have found. Honeypot, optional Turnstile, domain allowlisting, and rate limits handle it — configured once, not fought in your inbox.
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 Jekyll site.free tier: 100 subs/mo · unlimited forms · full API + MCP · pricing →
FAQ
Add a plain HTML form in an include with its action pointed at a Furrow Forms endpoint. GitHub Pages keeps serving static files; Furrow receives the POST, filters spam, emails you, and redirects the visitor to your thank-you page.
Server-side form handling can’t exist as a Jekyll plugin — Jekyll runs at build time and GitHub Pages runs plugins in safe mode anyway. Form backends are the standard answer, and Furrow requires no build integration at all.
Yes — add the domain to your Furrow project’s allowlist. The allowlist is also what keeps other sites from borrowing your endpoint.
paste this into your agent
Fetch furrowforms.com/ai and set up forms for this site.